     1                                  ; ****************************************************************************
     2                                  ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.8
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; Last Update: 22/05/2024 (Previous: 07/12/2023)
     5                                  ; ----------------------------------------------------------------------------
     6                                  ; Beginning: 04/01/2016
     7                                  ; ----------------------------------------------------------------------------
     8                                  ; Assembler: NASM version 2.15 (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                                  ; nasm trdos386.s -l trdos386.txt -o TRDOS386.SYS
    22                                  
    23                                  KLOAD	equ 10000h ; Kernel loading address
    24                                  	; NOTE: Retro UNIX 8086 v1 boot code loads kernel at 1000h:0000h 
    25                                  KCODE	equ 08h	; Code segment descriptor (ring 0)
    26                                  KDATA	equ 10h	; Data segment descriptor (ring 0)
    27                                  ; 19/03/2015
    28                                  UCODE	equ 1Bh ; 18h + 3h  (ring 3)
    29                                  UDATA	equ 23h ; 20h + 3h  (ring 3)
    30                                  ; 24/03/2015
    31                                  TSS	equ 28h	; Task state segment descriptor (ring 0)
    32                                  ; 19/03/2015
    33                                  CORE	equ 400000h  ; Start of USER's virtual/linear address space 
    34                                  		     ; (at the end of the 1st 4MB)
    35                                  ECORE	equ 0FFC00000h ; End of USER's virtual address space (4GB - 4MB)
    36                                  		     ; ULIMIT = (ECORE/4096) - 1 = 0FFBFFh (in GDT)
    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                                  ; IBM PC/AT BIOS ----- 10/06/85 (postequ.inc)
    43                                  ;--------- CMOS TABLE LOCATION ADDRESS'S -------------------------------------
    44                                  CMOS_SECONDS	EQU	00H		; SECONDS (BCD)
    45                                  CMOS_SEC_ALARM	EQU	01H		; SECONDS ALARM (BCD)
    46                                  CMOS_MINUTES	EQU	02H		; MINUTES (BCD)
    47                                  CMOS_MIN_ALARM	EQU	03H		; MINUTES ALARM (BCD) 	
    48                                  CMOS_HOURS	EQU	04H		; HOURS (BCD
    49                                  CMOS_HR_ALARM	EQU	05H		; HOURS ALARM   (BCD)
    50                                  CMOS_DAY_WEEK	EQU	06H		; DAY OF THE WEEK  (BCD)
    51                                  CMOS_DAY_MONTH	EQU	07H		; DAY OF THE MONTH (BCD) 
    52                                  CMOS_MONTH	EQU	08H		; MONTH (BCD)
    53                                  CMOS_YEAR	EQU	09H		; YEAR (TWO DIGITS) (BCD)
    54                                  CMOS_CENTURY	EQU	32H		; DATE CENTURY BYTE (BCD)
    55                                  CMOS_REG_A	EQU	0AH		; STATUS REGISTER A
    56                                  CMOS_REG_B	EQU	0BH		; STATUS REGISTER B  ALARM
    57                                  CMOS_REG_C	EQU	0CH		; STATUS REGISTER C  FLAGS
    58                                  CMOS_REG_D	EQU	0DH		; STATUS REGISTER D  BATTERY
    59                                  CMOS_SHUT_DOWN	EQU	0FH		; SHUTDOWN STATUS COMMAND BYTE
    60                                  ;----------------------------------------
    61                                  ;	CMOS EQUATES FOR THIS SYSTEM	;
    62                                  ;-----------------------------------------------------------------------------
    63                                  CMOS_PORT	EQU	070H		; I/O ADDRESS OF CMOS ADDRESS PORT
    64                                  CMOS_DATA	EQU	071H		; I/O ADDRESS OF CMOS DATA PORT
    65                                  NMI		EQU	10000000B	; DISABLE NMI INTERRUPTS MASK -
    66                                  					; HIGH BIT OF CMOS LOCATION ADDRESS
    67                                  
    68                                  ; Memory Allocation Table Address
    69                                  ; 05/11/2014
    70                                  ; 31/10/2014
    71                                  MEM_ALLOC_TBL	equ	100000h		; Memory Allocation Table at the end of
    72                                  					; the 1st 1 MB memory space.
    73                                  					; (This address must be aligned
    74                                  					;  on 128 KB boundary, if it will be
    75                                  					;  changed later.)
    76                                  					; ((lower 17 bits of 32 bit M.A.T.
    77                                  					;   address must be ZERO)).
    78                                  					; ((((Reason: 32 bit allocation 
    79                                  					;     instructions, dword steps)))
    80                                  					; (((byte >> 12 --> page >> 5)))  
    81                                  ;04/11/2014	
    82                                  PDE_A_PRESENT	equ	1		; Present flag for PDE
    83                                  PDE_A_WRITE	equ 	2		; Writable (write permission) flag
    84                                  PDE_A_USER	equ	4		; User (non-system/kernel) page flag
    85                                  ;
    86                                  PTE_A_PRESENT	equ	1		; Present flag for PTE (bit 0)
    87                                  PTE_A_WRITE	equ 	2		; Writable (write permission) flag (bit 1)
    88                                  PTE_A_USER	equ	4		; User (non-system/kernel) page flag (bit 2)
    89                                  PTE_A_ACCESS    equ	32		; Accessed flag (bit 5) ; 09/03/2015
    90                                  
    91                                  ; 17/02/2015 (unix386.s)
    92                                  ; 10/12/2014 - 30/12/2014 (0B000h -> 9000h) (dsectrm2.s)
    93                                  DPT_SEGM equ 09000h  ; FDPT segment (EDD v1.1, EDD v3)
    94                                  ;
    95                                  HD0_DPT	 equ 0	    ; Disk parameter table address for hd0
    96                                  HD1_DPT	 equ 32	    ; Disk parameter table address for hd1
    97                                  HD2_DPT	 equ 64	    ; Disk parameter table address for hd2
    98                                  HD3_DPT	 equ 96	    ; Disk parameter table address for hd3
    99                                  
   100                                  ; 15/11/2020
   101                                  VBE3INFOSEG equ 97E0h ; 512 bytes before Video_Pg_Backup
   102                                  ; 15/12/2020
   103                                  VBE3MODEINFOSEG equ 97C0h ; 512 bytes before VBE3INFOBLOCK 
   104                                  
   105                                  ; 29/11/2020
   106                                  VBE3INFOBLOCK equ 97E00h ; linear address (512 bytes)
   107                                  VBE3MODEINFOBLOCK equ 97C00h ; linear address (256 bytes)
   108                                  VBE3SAVERESTOREBLOCK equ 97600h ; linear address (2048 bytes)
   109                                  VBE3CRTCINFOBLOCK equ 97D80h ; linear address (64 bytes) ; 17/01/2021 
   110                                  VBE3BIOSDATABLOCK equ 97000h ; linear address (1536 bytes)
   111                                  VBE3STACKADDR equ 96000h ; linear address (1024 bytes)
   112                                  ; VBE3 32 bit Protected Mode Interface (16 bit) Selectors (in GDT)
   113                                  VBE3CS equ 30h ; _vbe3_CS:
   114                                  VBE3BDS equ 38h ; _vbe3_BDS:
   115                                  VBE3A000 equ 40h ; _A0000Sel:
   116                                  VBE3B000 equ 48h ; _B0000Sel:
   117                                  VBE3B800 equ 50h ; _B8000Sel:
   118                                  VBE3DS equ 58h ; _vbe3_DS:
   119                                  VBE3SS equ 60h ; _vbe3_SS:
   120                                  VBE3ES equ 68h ; _vbe3_ES:
   121                                  KCODE16 equ 70h ; _16bit_CS:
   122                                  ; 14/01/2021
   123                                  ; 06/12/2020
   124                                  VBE3VIDEOSTATE equ 95800h ; 2048 bytes
   125                                  ; 05/01/2021
   126                                  VGAFONT16USER equ 94000h ; 8x16 pixels user font (256 chars)	
   127                                  			 ; (reserved/allocated font space: 4096 bytes) 
   128                                  
   129                                  VGAFONT8USER equ 95000h	; 8x8 pixels user font (256 chars)	
   130                                  			; (reserved/allocated font space: 2048 bytes)
   131                                  ; 17/01/2021
   132                                  ; temporary (initial) location for EDID information
   133                                  VBE3EDIDINFOBLOCK equ 97D00h ; linear address (128 bytes)
   134                                   
   135                                  ; FDPT (Phoenix, Enhanced Disk Drive Specification v1.1, v3.0)
   136                                  ;      (HDPT: Programmer's Guide to the AMIBIOS, 1993)
   137                                  ;
   138                                  FDPT_CYLS	equ 0 ; 1 word, number of cylinders
   139                                  FDPT_HDS	equ 2 ; 1 byte, number of heads
   140                                  FDPT_TT		equ 3 ; 1 byte, A0h = translated FDPT with logical values
   141                                  		      ; otherwise it is standard FDPT with physical values 	
   142                                  FDPT_PCMP	equ 5 ; 1 word, starting write precompensation cylinder
   143                                  		      ; (obsolete for IDE/ATA drives)
   144                                  FDPT_CB		equ 8 ; 1 byte, drive control byte
   145                                  			; Bits 7-6 : Enable or disable retries (00h = enable)
   146                                  			; Bit 5	: 1 = Defect map is located at last cyl. + 1
   147                                  			; Bit 4 : Reserved. Always 0
   148                                  			; Bit 3 : Set to 1 if more than 8 heads
   149                                  			; Bit 2-0 : Reserved. Always 0
   150                                  FDPT_LZ		equ 12 ; 1 word, landing zone (obsolete for IDE/ATA drives)
   151                                  FDPT_SPT	equ 14 ; 1 byte, sectors per track
   152                                  
   153                                  ; Floppy Drive Parameters Table (Programmer's Guide to the AMIBIOS, 1993)
   154                                  ; (11 bytes long) will be used by diskette handler/bios
   155                                  ; which is derived from IBM PC-AT BIOS (DISKETTE.ASM, 21/04/1986).
   156                                  
   157                                  ; 01/02/2016
   158                                  Logical_DOSDisks equ 90000h + 100h ; 26*256 = 6656 bytes
   159                                  Directory_Buffer equ 80000h ; max = 64K Bytes
   160                                  FAT_Buffer	 equ 91C00h ; 1536 bytes (3 sectors)
   161                                  ; 15/02/2016
   162                                  Cluster_Buffer	 equ 70000h ; max = 64K Bytes ; buffer for file read & write
   163                                  ; 11/04/2016
   164                                  Env_Page:	 equ 93000h ; 512 bytes (4096 bytes)
   165                                  Env_Page_Size	 equ 512    ; (4096 bytes)
   166                                  ; 30/07/2016
   167                                  Video_Pg_Backup	 equ 98000h ; Mode 3h, video page backup (32K, 8 pages)
   168                                  
   169                                  ; 29/11/2020
   170                                  ; Free/Reserved memory blocks (in 1st 1MB): 93200h to 96000h (available)
   171                                  ; 06/12/2020
   172                                  ; Free/Reserved memory blocks (in 1st 1MB): 93200h to 95800h (available)
   173                                  
   174                                  ; 15/12/2020
   175                                  LFB_ADDR	equ LFB_Info+LFBINFO.LFB_addr
   176                                  LFB_SIZE	equ LFB_Info+LFBINFO.LFB_size
   177                                  
   178                                  ; 04/12/2023 - TRDOS 386 v2.0.7
   179                                  SYSTEMSTACK_ADDR  equ 97000h	; max. 3072 bytes (96400h-97000h)
   180                                  VBE3BIOSCODE_ADDR equ 60000h	; Protected Mode Video Bios (64KB)
   181                                  ;AC97DMABUFFR_ADDR equ 40000h	; AC97 & VIA VT8233 DMA Buffer (128KB)
   182                                  SB16DMABUFFR_ADDR equ 50000h	; Sound Blaster 16 DMA Buffer (64KB)
   183                                  sb16_dma_buffer equ SB16DMABUFFR_ADDR
   184                                  
   185                                  ; 29/08/2023 - TRDOS 386 v2.0.6
   186                                  	; 30/11/2020
   187                                  	; 29/11/2020 - TRDOS 386 v2.0.3
   188                                  
   189                                  struc PMInfo  ;  VESA VBE3 PMInfoBlock ('PMID' block)
   190                                  
   191 00000000 ????????                 .Signature:	resb 4  ; db 'PMID' ; PM Info Block Signature
   192 00000004 ????                     .EntryPoint:	resw 1	; Offset of PM entry point within BIOS
   193 00000006 ????                     .PMInitialize: resw 1	; Offset of PM initialization entry point
   194 00000008 ????                     .BIOSDataSel:	resw 1 	; Selector to BIOS data area emulation block
   195 0000000A ????                     .A0000Sel:	resw 1	; Selector to access A0000h physical mem
   196 0000000C ????                     .B0000Sel:	resw 1  ; Selector to access B0000h physical mem
   197 0000000E ????                     .B8000Sel:	resw 1	; Selector to access B8000h physical mem
   198 00000010 ????                     .CodeSegSel:	resw 1	; Selector to access code segment as data
   199 00000012 ??                       .InProtectMode: resb 1 ; Set to 1 when in protected mode
   200 00000013 ??                       .Checksum:	resb 1	; Checksum byte for structure
   201                                   .size:
   202                                  
   203                                  endstruc
   204                                   
   205                                  [BITS 16]       ; We need 16-bit intructions for Real mode
   206                                  
   207                                  [ORG 0] 
   208                                  	; 12/11/2014
   209                                  	; Save boot drive number (that is default root drive)
   210 00000000 8816[1866]              	mov	[boot_drv], dl ; physical drv number
   211                                  
   212                                  	; Determine installed memory
   213                                  	; 31/10/2014
   214                                  	;
   215 00000004 B801E8                  	mov	ax, 0E801h ; Get memory size 
   216 00000007 CD15                    	int	15h	   ; for large configurations
   217 00000009 7308                    	jnc	short chk_ms
   218 0000000B B488                    	mov	ah, 88h    ; Get extended memory size 
   219 0000000D CD15                    	int	15h
   220                                  	;	   
   221                                  	;mov	al, 17h	; Extended memory (1K blocks) low byte
   222                                  	;out	70h, al ; select CMOS register
   223                                  	;in	al, 71h ; read data (1 byte)
   224                                  	;mov	cl, al
   225                                  	;mov	al, 18h ; Extended memory (1K blocks) high byte
   226                                  	;out	70h, al ; select CMOS register
   227                                  	;in	al, 71h ; read data (1 byte)
   228                                  	;mov	ch, al
   229                                   	;      
   230 0000000F 89C1                    	mov	cx, ax
   231 00000011 31D2                    	xor	dx, dx
   232                                  chk_ms:
   233 00000013 890E[1466]              	mov	[mem_1m_1k], cx
   234 00000017 8916[1666]              	mov	[mem_16m_64k], dx
   235                                  	; 24/11/2023
   236 0000001B 8916[0F0F]              	mov	[real_mem_16m_64k], dx
   237                                  
   238                                  	; 05/11/2014
   239                                  	;and	dx, dx
   240                                  	;jz	short L2
   241 0000001F 81F90004                        cmp     cx, 1024
   242                                  	;jnb	short L0
   243 00000023 7351                    	jnb	short V0 ; 14/11/2020
   244                                  		 ; insufficient memory_error	
   245                                  		 ; Minimum 2 MB memory is needed... 
   246                                  	; 05/11/2014
   247                                  	; (real mode error printing)
   248 00000025 FB                      	sti
   249 00000026 BE[3A00]                	mov	si, msg_out_of_memory
   250 00000029 BB0700                  	mov	bx, 7
   251 0000002C B40E                    	mov	ah, 0Eh	; write tty
   252                                  oom_1:
   253 0000002E AC                      	lodsb
   254 0000002F 08C0                    	or	al, al
   255 00000031 7404                    	jz	short oom_2
   256 00000033 CD10                    	int	10h
   257 00000035 EBF7                    	jmp	short oom_1
   258                                  oom_2:
   259 00000037 F4                              hlt
   260 00000038 EBFD                    	jmp	short oom_2
   261                                  
   262                                  ; 20/02/2017
   263                                  ; 05/11/2014
   264                                  msg_out_of_memory:
   265 0000003A 070D0A                  	db 	07h, 0Dh, 0Ah
   266 0000003D 496E73756666696369-             db      'Insufficient memory !'
   266 00000046 656E74206D656D6F72-
   266 0000004F 792021             
   267 00000052 0D0A                    	db	0Dh, 0Ah
   268                                  _int13h_48h_buffer: ; 07/07/2016
   269 00000054 284D696E696D756D20-     	db	'(Minimum 2MB memory is needed.)'
   269 0000005D 324D42206D656D6F72-
   269 00000066 79206973206E656564-
   269 0000006F 65642E29           
   270 00000073 0D0A00                   	db	0Dh, 0Ah, 0
   271                                  V0:
   272                                  	; 18/10/2023 - TRDOS 386 v2.0.7
   273                                  	; set video mode to 03h again 
   274                                  	; (to reset video bios data in ROMBIOS DATA AREA)
   275 00000076 B80300                  	mov	ax, 3
   276 00000079 CD10                    	int	10h
   277                                  	; copy IVT and ROMBIOS DATA AREA to VBE3 BIOS data area
   278 0000007B BF0097                  	mov	di, VBE3BIOSDATABLOCK>>4
   279 0000007E 8EC7                    	mov	es, di
   280 00000080 31F6                    	xor	si, si
   281 00000082 31FF                    	xor	di, di
   282 00000084 8EDE                    	mov	ds, si ; 0
   283 00000086 B90003                  	mov	cx, 300h ; 600h / 2
   284 00000089 F3A5                    	rep	movsw
   285 0000008B 0E                      	push	cs
   286 0000008C 1F                      	pop	ds
   287                                  	
   288                                  	; 24/11/2023
   289                                  	; 15/12/2020
   290                                  	;mov	si, [mem_16m_64k]
   291                                  	;mov	[real_mem_16m_64k], si
   292                                  	
   293                                  	; 15/11/2020
   294                                  	; 14/11/2020 (TRDOS 386 v2.0.3)
   295                                  	; check VESA (VBE) VIDEO BIOS version
   296                                  
   297 0000008D B8034F                  	mov	ax, 4F03h  ; Return current VBE mode
   298 00000090 CD10                    	int	10h
   299 00000092 83F84F                  	cmp	ax, 004Fh  ; successful (vbe) function call
   300                                  	;jne	short L0   ; not a VESA VBE compatible bios	
   301                                  	; 18/10/2023
   302 00000095 7561                    	jne	short V1   ; restore es
   303                                  
   304                                  	; 27/11/2023
   305                                  	; 24/11/2023 - temporary
   306                                  	;jmp	short V1
   307                                  
   308                                  	;mov	ah, 3
   309                                  	;;jmp	short V1	
   310                                  	
   311                                  	; 15/11/2020
   312 00000097 BBE097                  	mov	bx, VBE3INFOSEG  ; 97E0h for current version 
   313 0000009A 8EC3                    	mov	es, bx
   314 0000009C 31FF                    	xor	di, di
   315 0000009E 2666C70556424532        	mov	dword [es:di], 'VBE2' ; request VESA VBE3 info
   316                                  		; es:di = buffer address (512 bytes)
   317                                  	;mov	ax, 4F00h ; Return VBE controller information
   318 000000A6 86C4                    	xchg	al, ah
   319 000000A8 CD10                    	int	10h
   320                                  	
   321                                  	; dx = cs
   322                                  	; es = VBE3INFOSEG (97E0h)
   323                                  	; di = 0
   324                                  	; ss = (endofkernelfile/16)+16
   325                                  	; sp = 0FFFEh
   326                                  
   327 000000AA 83F84F                  	cmp	ax, 004Fh
   328 000000AD 7549                    	jne	short V1 ; old vga bios (not VESA compatible)
   329                                  
   330                                  	; 15/11/2020
   331 000000AF 2666813D56455341        	cmp	dword [es:di], 'VESA'
   332 000000B7 753F                    	jne	short V1
   333                                  	
   334                                  	;mov	ax, [es:di+4]
   335                                  	;	; ax = vbe version in BCD format (0200h or 0300h)
   336                                  	;mov	[vbe3], ah ; version number (major) 	
   337                                  
   338                                  	; 15/11/2020
   339 000000B9 268A4505                	mov	al, [es:di+5]
   340                                  		; al = high byte of VBE version number (02h or 03h)
   341                                  
   342 000000BD A2[8609]                	mov	[vbe3], al ; version number (major) 	
   343                                  			   ; 02h or 03h is expected
   344                                  	; 17/01/2021
   345                                  	; Read EDID
   346 000000C0 B301                    	mov	bl, 01h	; Read EDID
   347 000000C2 31C9                    	xor	cx, cx	; Controller unit number
   348                                  			; (00 = primary controller)
   349 000000C4 31D2                    	xor	dx, dx	; EDID block number = 0
   350 000000C6 B8C097                  	mov	ax, VBE3MODEINFOSEG  ; 97C0h for current version
   351 000000C9 8EC0                    	mov	es, ax
   352 000000CB BF0001                  	mov	di, VBE3EDIDINFOBLOCK - VBE3MODEINFOBLOCK
   353                                  	; es:di = temporary address of 128 bytes EDID information 
   354 000000CE B8154F                  	mov	ax, 4F15h ; VBE/DDC Services 
   355 000000D1 CD10                    	int	10h
   356                                  	;cmp	ax, 4Fh
   357                                  	;jne	short v2
   358 000000D3 A2[CA41]                	mov	[edid], al ; 4Fh > 0
   359                                  ;V2:
   360                                  	; 17/01/2021
   361 000000D6 31FF                    	xor	di, di
   362                                  	; 15/12/2020
   363                                  	; Get linear frame buffer info (for VESA VBE mode 118h)
   364                                  	;mov	si, VBE3MODEINFOSEG  ; 97C0h for current version
   365                                  	;mov	es, si
   366                                   	; di = 0
   367 000000D8 B91841                  	mov	cx, 04118h  ; 1024*768, 24 bpp, LFB
   368 000000DB B8014F                  	mov	ax, 4F01h ; Return VBE mode information
   369 000000DE CD10                    	int	10h
   370                                  	;cmp	ax, 4Fh
   371                                  	;jne	short V1
   372                                  	; 19/12/2020
   373                                  	;mov	si, [es:di+MODEINFO.PhysBasePtr+2]
   374                                  			; hw of LFB base address
   375                                  	; MODEINFO structure starts from offset -2
   376 000000E0 268B752A                	mov	si, [es:di+MODEINFO.PhysBasePtr] ; hw of LFB addr
   377 000000E4 8936[110F]              	mov	[def_LFB_addr], si ; k_LFB_size = 3145728 bytes
   378 000000E8 81EE0001                	sub	si, 256
   379                                  	
   380                                  	; 15/12/2020
   381                                  	; check memory and decrease it to 3.5 GB if it is 4GB
   382                                  	; (reserve upper memory for LFB)
   383 000000EC 8B3E[1666]              	mov	di, [mem_16m_64k]
   384                                  	; 24/11/2023
   385                                  	;mov	[real_mem_16m_64k], di
   386                                  
   387 000000F0 39F7                    	cmp	di, si
   388 000000F2 7604                    	jna	short V1
   389                                  
   390 000000F4 8936[1666]              	mov	[mem_16m_64k], si
   391                                  
   392                                  	; VESA VBE3 video hardware 
   393                                  	; (example: NVIDIA GEFORCE FX550, 256 MB)
   394                                  	; uses upper memory from 0D0000000h to 0DFFFFFFFh
   395                                  	
   396                                  	;;cmp	di, 0CF00h ; 3328 MB - 16MB
   397                                  	;jna	short V1  ; <= 3328 MB memory, it is not required
   398                                  			  ; decrease
   399                                  	;cmp	al, 3 
   400                                  	;jb	short V2 
   401                                  	; VESA VBE 3
   402                                  	;mov	word [mem_16m_64k], 0CF00h ; 3328 MB - 16MB
   403                                  	;jmp	short V1 	
   404                                  ;V2:
   405                                  	; VESA VBE 2
   406                                  	; Check Bochs/Qemu/VirtualBox Emulator
   407                                  	; LFB base address: 0E0000000h
   408                                  	;sub	ax, ax ; 0
   409                                  	;mov	dx, 1CEh ; VBE_DISPI_IOPORT_INDEX
   410                                  	;out	dx, ax ; VBE_DISPI_INDEX_ID register
   411                                  	;inc	dx
   412                                  	;in	ax, dx
   413                                  	;and	al, 0F0h
   414                                  	;cmp	ax, 0B0C0h
   415                                  	;jne	short V1
   416                                  	;
   417                                  	; BOCHS/QEMU/VIRTUALBOX
   418                                  	;mov	word [mem_16m_64k], 0DF00h ; 3584 MB - 16MB	
   419                                  V1:
   420 000000F8 1E                      	push	ds
   421 000000F9 07                      	pop	es ; restore extra data segment	
   422                                  L0:
   423                                  
   424                                  %include 'diskinit.s' ; 07/03/2015
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.5 - diskinit.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 09/08/2022 (Previous: 29/08/2020 - Kernel v2.0.4)
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 24/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.15 (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: 12/07/2022 (Previous: 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> 	; 09/08/2022
    27                              <1> 	; 08/08/2022
    28                              <1> 	; 14/07/2022 (TRDOS 386 v2.0.5)
    29                              <1> 	; 12/07/2022 (Retro UNIX 386 v1.2)
    30                              <1> 	; 29/08/2020
    31                              <1> 	; 17/07/2020
    32                              <1> 	; 14/07/2020 (TRDOS 386 v2.0.2)
    33                              <1> 	; 10/12/2014 - 02/02/2015 - dsectrm2.s
    34                              <1> ;L0:
    35                              <1> 	; 12/11/2014 (Retro UNIX 386 v1 - beginning)
    36                              <1> 	; Detecting disk drives... (by help of ROM-BIOS)
    37 000000FA BA7F00              <1> 	mov	dx, 7Fh
    38                              <1> L1:	
    39 000000FD FEC2                <1> 	inc	dl
    40 000000FF B441                <1> 	mov	ah, 41h ; Check extensions present
    41                              <1> 			; Phoenix EDD v1.1 - EDD v3
    42 00000101 BBAA55              <1> 	mov	bx, 55AAh
    43 00000104 CD13                <1> 	int 	13h
    44 00000106 721A                <1> 	jc	short L2
    45                              <1> 
    46 00000108 81FB55AA            <1> 	cmp	bx, 0AA55h
    47 0000010C 7514                <1> 	jne	short L2
    48 0000010E FE06[1B66]          <1> 	inc	byte [hdc]	; count of hard disks (EDD present)
    49 00000112 8816[1A66]          <1>         mov     [last_drv], dl  ; last hard disk number
    50 00000116 BB[9E65]            <1> 	mov	bx, hd0_type - 80h
    51 00000119 01D3                <1> 	add	bx, dx	 
    52 0000011B 880F                <1> 	mov	[bx], cl ; Interface support bit map in CX
    53                              <1> 			 ; Bit 0 - 1, Fixed disk access subset ready
    54                              <1> 			 ; Bit 1 - 1, Drv locking and ejecting ready
    55                              <1> 			 ; Bit 2 - 1, Enhanced Disk Drive Support
    56                              <1>                          ;            (EDD) ready (DPTE ready)
    57                              <1> 			 ; Bit 3 - 1, 64bit extensions are present
    58                              <1>                          ;            (EDD-3)
    59                              <1> 			 ; Bit 4 to 15 - 0, Reserved
    60 0000011D 80FA83              <1> 	cmp	dl, 83h	 ; drive number < 83h
    61 00000120 72DB                <1> 	jb	short L1
    62                              <1> L2:
    63                              <1> 	; 23/11/2014
    64                              <1> 	; 19/11/2014
    65 00000122 30D2                <1> 	xor	dl, dl  ; 0
    66                              <1> 	; 04/02/2016 (esi -> si)
    67 00000124 BE[1C66]            <1> 	mov	si, fd0_type
    68                              <1> L3:
    69                              <1> 	; 14/01/2015
    70 00000127 8816[1966]          <1> 	mov	[drv], dl
    71                              <1> 	;
    72 0000012B B408                <1> 	mov 	ah, 08h ; Return drive parameters
    73 0000012D CD13                <1> 	int	13h	
    74 0000012F 7210                <1> 	jc	short L4
    75                              <1> 		; BL = drive type (for floppy drives)
    76                              <1> 		; DL = number of floppy drives
    77                              <1> 		;		
    78                              <1> 		; ES:DI = Address of DPT from BIOS
    79                              <1> 		;
    80 00000131 881C                <1> 	mov	[si], bl ;  Drive type
    81                              <1> 			; 4 = 1.44 MB, 80 track, 3 1/2"
    82                              <1> 	; 14/01/2015
    83 00000133 E8DD01              <1> 	call	set_disk_parms
    84                              <1> 	; 10/12/2014
    85 00000136 81FE[1C66]          <1> 	cmp	si, fd0_type
    86 0000013A 7705                <1> 	ja	short L4
    87 0000013C 46                  <1> 	inc	si ; fd1_type
    88 0000013D B201                <1> 	mov	dl, 1
    89 0000013F EBE6                <1> 	jmp	short L3
    90                              <1> L4:
    91 00000141 B27F                <1> 	mov	dl, 7Fh
    92                              <1> 	; 24/12/2014
    93 00000143 803E[1B66]00        <1> 	cmp	byte [hdc], 0 ; EDD present or not ?	
    94                              <1> 	;ja	L10	  ; yes, all fixed disk operations
    95                              <1> 			  ; will be performed according to
    96                              <1> 			  ; present EDD specification
    97                              <1> 	; 14/07/2022
    98 00000148 7603                <1> 	jna	short L5
    99 0000014A E98B00              <1> 	jmp	L10
   100                              <1> 
   101                              <1> L5:
   102                              <1> 	; 17/07/2020
   103                              <1> 	; Note: Virtual CPU will not come here while 
   104                              <1> 	; running in QEMU, Bochs, VirtualBox emulators !!!
   105                              <1> 	
   106                              <1> 	; 17/07/2020
   107                              <1> 	; Older BIOS (INT 13h, AH = 48h is not available)
   108                              <1> 
   109 0000014D FEC2                <1> 	inc 	dl
   110 0000014F 8816[1966]          <1>         mov     [drv], dl
   111 00000153 8816[1A66]          <1>         mov     [last_drv], dl ; 14/01/2015
   112 00000157 B408                <1> 	mov 	ah, 08h ; Return drive parameters
   113 00000159 CD13                <1> 	int	13h	; (conventional function)
   114                              <1> 	;jc	L13	; fixed disk drive not ready
   115                              <1> 	; 14/07/2022
   116 0000015B 7303                <1> 	jnc	short L6
   117 0000015D E9A501              <1> 	jmp	L13
   118                              <1> L6:
   119 00000160 8816[1B66]          <1>         mov     [hdc], dl ; number of drives
   120                              <1> 	;; 14/01/2013
   121                              <1> 	;;push	cx
   122 00000164 E8AC01              <1> 	call	set_disk_parms
   123                              <1> 	;;pop	cx
   124                              <1> 	;
   125                              <1> 	;;and	cl, 3Fh	 ; sectors per track (bits 0-6)
   126 00000167 8A16[1966]          <1>         mov     dl, [drv]
   127 0000016B BB0401              <1> 	mov	bx, 65*4 ; hd0 parameters table (INT 41h)	
   128 0000016E 80FA80              <1> 	cmp	dl, 80h
   129 00000171 7603                <1> 	jna	short L7
   130 00000173 83C314              <1> 	add	bx, 5*4	 ; hd1 parameters table (INT 46h)
   131                              <1> L7:	
   132 00000176 31C0                <1> 	xor	ax, ax
   133 00000178 8ED8                <1> 	mov	ds, ax
   134 0000017A 8B37                <1>         mov     si, [bx]
   135 0000017C 8B4702              <1>         mov     ax, [bx+2] 
   136 0000017F 8ED8                <1> 	mov	ds, ax
   137 00000181 3A4C0E              <1>         cmp     cl, [si+FDPT_SPT] ; sectors per track 
   138                              <1> 	;jne	L12 ; invalid FDPT
   139                              <1> 	; 14/07/2022
   140 00000184 7403                <1> 	je	short L7_8
   141 00000186 E97801              <1> 	jmp	L12
   142                              <1> L7_8:
   143 00000189 BF0000              <1> 	mov	di, HD0_DPT
   144 0000018C 80FA80              <1> 	cmp	dl, 80h
   145 0000018F 7603                <1> 	jna	short L8
   146 00000191 BF2000              <1> 	mov	di, HD1_DPT 
   147                              <1> L8:
   148                              <1> 	; 30/12/2014
   149 00000194 B80090              <1> 	mov	ax, DPT_SEGM
   150 00000197 8EC0                <1> 	mov	es, ax
   151                              <1> 	; 24/12/2014
   152 00000199 B90800              <1> 	mov	cx, 8
   153 0000019C F3A5                <1> 	rep	movsw  ; copy 16 bytes to the kernel's DPT location
   154 0000019E 8CC8                <1> 	mov	ax, cs
   155 000001A0 8ED8                <1> 	mov	ds, ax
   156                              <1> 
   157                              <1> 	; 02/02/2015
   158                              <1> 	;mov	cl, [drv]
   159                              <1> 	;mov	bl, cl
   160                              <1> 	;mov	ax, 1F0h
   161                              <1> 	;and	bl, 1
   162                              <1> 	;jz	short L9
   163                              <1> 	;shl	bl, 4
   164                              <1> 	;sub	ax, 1F0h-170h
   165                              <1> 
   166                              <1> 	; 17/07/2020 
   167                              <1> 	; (Only 1F0h port address must be valid for old ROM BIOSes)
   168 000001A2 B8F001              <1> 	mov	ax, 1F0h
   169 000001A5 B3A0                <1> 	mov	bl, 0A0h
   170 000001A7 80FA80              <1> 	cmp	dl, 80h
   171 000001AA 7603                <1> 	jna	short L9
   172                              <1> 	; dl = 81h
   173 000001AC 80C310              <1> 	add	bl, 10h  ; slave disk
   174                              <1> 	;sub	ax, 1F0h-170h
   175                              <1> L9:
   176 000001AF AB                  <1> 	stosw	; I/O PORT Base Address (1F0h, 170h)
   177 000001B0 050602              <1> 	add	ax, 206h
   178 000001B3 AB                  <1> 	stosw	; CONTROL PORT Address (3F6h, 376h)	
   179 000001B4 88D8                <1> 	mov	al, bl  ; bit 4, master/slave disk bit
   180                              <1> 	;add	al, 0A0h ; 17/07/2020
   181 000001B6 AA                  <1> 	stosb	; Device/Head Register upper nibble
   182                              <1> 	;
   183 000001B7 FE06[1966]          <1> 	inc	byte [drv]
   184                              <1> 	;mov	bx, hd0_type - 80h
   185                              <1> 	;add	bx, cx
   186                              <1> 	; 09/08/2022 - BugFix
   187 000001BB 30FF                <1> 	xor	bh, bh
   188 000001BD 88D3                <1> 	mov	bl, dl
   189 000001BF 81C3[9E65]          <1> 	add	bx, hd0_type - 80h
   190 000001C3 800F80              <1> 	or      byte [bx], 80h  ; present sign (when lower nibble is 0)
   191 000001C6 A0[1B66]            <1> 	mov	al, [hdc]
   192 000001C9 FEC8                <1> 	dec	al
   193                              <1> 	;jz	L13
   194                              <1> 	; 14/07/2022
   195 000001CB 7408                <1> 	jz	short L9_10
   196 000001CD 80FA80              <1> 	cmp	dl, 80h
   197                              <1>         ;jna	L5 ; Max. 2 hard disks  ; 17/07/2020
   198                              <1> 	; 14/07/2022
   199 000001D0 7703                <1> 	ja	short L9_10
   200 000001D2 E978FF              <1> 	jmp	L5
   201                              <1> L9_10:
   202 000001D5 E92D01              <1>         jmp     L13
   203                              <1> L10:
   204 000001D8 FEC2                <1> 	inc 	dl
   205                              <1> 	; 25/12/2014
   206 000001DA 8816[1966]          <1> 	mov	[drv], dl
   207 000001DE B408                <1> 	mov 	ah, 08h ; Return drive parameters
   208 000001E0 CD13                <1> 	int	13h	; (conventional function)
   209                              <1> 	;jc	L13
   210                              <1> 	; 14/07/2022
   211 000001E2 72F1                <1> 	jc	short L9_10
   212                              <1> 	; 14/01/2015
   213                              <1> 	;mov	dl, [drv]
   214                              <1> 	; 09/08/2022
   215                              <1> 	;push	dx
   216 000001E4 51                  <1> 	push	cx
   217 000001E5 E82B01              <1> 	call	set_disk_parms
   218 000001E8 59                  <1> 	pop	cx
   219                              <1> 	;pop	dx
   220                              <1> 	; 09/08/2022
   221 000001E9 8A16[1966]          <1> 	mov	dl, [drv]	
   222                              <1> 	; 06/07/2016 (BugFix for >64K kernel files)
   223                              <1> 	; 04/02/2016 (esi -> si)
   224                              <1> 	;mov	si, _end ; 30 byte temporary buffer address 	
   225                              <1> 	;		 ; at the '_end' of kernel.
   226                              <1> 	;mov	word [si], 30
   227                              <1> 	; 06/07/2016
   228 000001ED BE[5400]            <1> 	mov	si, _int13h_48h_buffer
   229                              <1> 	; 09/07/2016
   230 000001F0 B81E00              <1> 	mov	ax, 001Eh
   231 000001F3 8824                <1> 	mov	[si], ah ; 0
   232 000001F5 46                  <1> 	inc	si
   233 000001F6 8904                <1> 	mov	[si], ax
   234                              <1>  	; word [si] = 30
   235                              <1> 	;
   236 000001F8 B448                <1> 	mov	ah, 48h	 ; Get drive parameters (EDD function)
   237 000001FA CD13                <1> 	int	13h
   238                              <1> 	;jc	L13
   239                              <1> 	; 14/07/2022
   240 000001FC 72D7                <1> 	jc	short L9_10
   241                              <1> 
   242                              <1> 	; 29/08/2020
   243                              <1> 	; 04/02/2016 (ebx -> bx)
   244                              <1> 	; 14/01/2015
   245 000001FE 28FF                <1> 	sub	bh, bh
   246 00000200 88D3                <1> 	mov	bl, dl
   247                              <1> 	;sub	bl, 80h
   248                              <1> 	; 29/08/2020
   249 00000202 81C3[9E65]          <1> 	add	bx, (hd0_type - 80h)
   250                              <1> 	;mov 	al, [bx]
   251 00000206 8A07                <1> 	mov	al, [bx]
   252 00000208 0C80                <1> 	or	al, 80h
   253 0000020A 8807                <1> 	mov 	[bx], al	
   254 0000020C 81EB[1C66]          <1> 	sub	bx, hd0_type - 2 ; 15/01/2015
   255                              <1> 	;add	bx, drv.status
   256                              <1> 	;mov	[bx], al
   257                              <1> 	; 29/08/2020
   258 00000210 8887[3E66]          <1> 	mov	[bx+drv.status], al
   259                              <1> 	; 04/02/2016 (eax -> ax)
   260                              <1> 	;mov	ax, [si+16]
   261                              <1> 	; 14/07/2020
   262                              <1> 	;mov	di, [si+18] 
   263                              <1> 	;;test	ax, [si+18]
   264                              <1> 	;test	ax, di ; 14/07/2020
   265                              <1> 	;jz	short L10_A0h ; (!) ; 17/07/2020
   266                              <1> 			; 'CHS only' disks on EDD system 
   267                              <1> 			;  are reported with ZERO disk size
   268                              <1> 			; (if so, we must not overwrite
   269                              <1> 			; calculated disk size in 'set_disk_parms')
   270                              <1> 	; 29/08/2020
   271 00000214 8B4410              <1> 	mov	ax, [si+16]
   272 00000217 8B7C12              <1> 	mov	di, [si+18]
   273 0000021A 09C0                <1> 	or	ax, ax
   274 0000021C 7504                <1> 	jnz	short L10_LBA
   275 0000021E 09FF                <1> 	or	di, di
   276 00000220 740B                <1> 	jz	short L10_A0h
   277                              <1> L10_LBA:
   278                              <1> 	;sub	bx, drv.status
   279 00000222 C1E302              <1> 	shl	bx, 2
   280                              <1> 	;add	bx, drv.size ; disk size (in sectors)
   281                              <1> 	;mov	[bx], ax
   282                              <1> 	; 29/08/2020
   283 00000225 8987[2266]          <1> 	mov	[bx+drv.size], ax
   284                              <1> 	;mov	ax, [si+18]
   285                              <1> 	;;mov	[bx], ax
   286                              <1> 	;mov	[bx+2], ax ; BugFix ; 15/07/2020
   287                              <1> 	; 14/07/2020
   288                              <1> 	;mov	[bx+2], di ; 15/07/2020
   289                              <1> 	; 29/08/2020
   290 00000229 89BF[2466]          <1> 	mov	[bx+drv.size+2], di
   291                              <1> L10_A0h: 
   292                              <1> 	; 17/07/2020
   293                              <1> 	; Note: Virtual CPU will jump here from above (!) test
   294                              <1> 	;	while running in QEMU
   295                              <1> 
   296                              <1> 	; Jump here to fix a ZERO (LBA) disk size problem 
   297                              <1> 	; for CHS disks (28/02/2015)
   298                              <1> 	
   299                              <1> 	; 30/12/2014
   300 0000022D BF0000              <1> 	mov	di, HD0_DPT
   301 00000230 88D0                <1> 	mov	al, dl
   302 00000232 83E003              <1> 	and 	ax, 3
   303 00000235 C0E005              <1> 	shl	al, 5 ; * 32
   304 00000238 01C7                <1> 	add 	di, ax
   305 0000023A B80090              <1> 	mov	ax, DPT_SEGM
   306 0000023D 8EC0                <1> 	mov	es, ax
   307                              <1> 	;
   308 0000023F 88E8                <1> 	mov	al, ch	; max. cylinder number (bits 0-7)
   309 00000241 88CC                <1> 	mov	ah, cl	
   310 00000243 C0EC06              <1> 	shr	ah, 6	; max. cylinder number (bits 8-9)
   311 00000246 40                  <1>  	inc	ax	; logical cylinders (limit 1024)
   312 00000247 AB                  <1> 	stosw		
   313 00000248 88F0                <1> 	mov	al, dh	; max. head number
   314                              <1> 	;
   315 0000024A 30F6                <1> 	xor	dh, dh  ; 29/08/2020 (dh = 0 is needed here)
   316                              <1> 	;
   317 0000024C FEC0                <1> 	inc	al
   318 0000024E AA                  <1> 	stosb		; logical heads (limits 256)
   319 0000024F B0A0                <1> 	mov	al, 0A0h ; Indicates translated table
   320 00000251 AA                  <1> 	stosb
   321 00000252 8A440C              <1> 	mov	al, [si+12]
   322 00000255 AA                  <1> 	stosb		 ; physical sectors per track
   323 00000256 31C0                <1>  	xor	ax, ax
   324                              <1> 	;dec	ax	 ; 02/01/2015 
   325 00000258 AB                  <1> 	stosw		 ; precompensation (obsolete)
   326                              <1> 	;xor	al, al	 ; 02/01/2015	
   327 00000259 AA                  <1> 	stosb		 ; reserved
   328 0000025A B008                <1> 	mov	al, 8	 ; drive control byte
   329                              <1> 		         ; (do not disable retries, 
   330                              <1> 			 ; more than 8 heads)
   331 0000025C AA                  <1> 	stosb
   332 0000025D 8B4404              <1> 	mov	ax, [si+4]
   333 00000260 AB                  <1> 	stosw		 ; physical number of cylinders	
   334                              <1> 	;push	ax	 ; 02/01/2015
   335 00000261 8A4408              <1> 	mov	al, [si+8]
   336 00000264 AA                  <1> 	stosb		 ; physical num. of heads (limit 16)
   337 00000265 29C0                <1> 	sub 	ax, ax
   338                              <1> 	;pop	ax	 ; 02/01/2015	
   339 00000267 AB                  <1> 	stosw		 ; landing zone (obsolete)
   340 00000268 88C8                <1> 	mov	al, cl	 ; logical sectors per track (limit 63)
   341 0000026A 243F                <1> 	and 	al, 3Fh	
   342 0000026C AA                  <1> 	stosb
   343                              <1> 	;sub	al, al	 ; checksum
   344                              <1> 	;stosb
   345                              <1> 	;
   346 0000026D 83C61A              <1> 	add	si, 26   ; (BIOS) DPTE address pointer
   347 00000270 AD                  <1> 	lodsw
   348 00000271 50                  <1> 	push	ax ; *	 ; (BIOS) DPTE offset
   349 00000272 AD                  <1> 	lodsw
   350 00000273 50                  <1> 	push	ax ; **	 ; (BIOS) DPTE segment
   351                              <1> 	;
   352                              <1> 	; checksum calculation
   353 00000274 89FE                <1> 	mov	si, di
   354 00000276 06                  <1> 	push	es
   355 00000277 1F                  <1> 	pop	ds
   356                              <1> 	;mov	cx, 16
   357 00000278 B90F00              <1> 	mov 	cx, 15
   358 0000027B 29CE                <1> 	sub	si, cx
   359 0000027D 30E4                <1> 	xor	ah, ah
   360                              <1> 	;del	cl
   361                              <1> L11:		
   362 0000027F AC                  <1> 	lodsb
   363 00000280 00C4                <1> 	add	ah, al
   364 00000282 E2FB                <1> 	loop	L11
   365                              <1> 	;
   366 00000284 88E0                <1> 	mov	al, ah
   367 00000286 F6D8                <1> 	neg	al	; -x+x = 0
   368 00000288 AA                  <1> 	stosb		; put checksum in byte 15 of the tbl
   369                              <1> 	;
   370 00000289 1F                  <1> 	pop	ds ; **	; (BIOS) DPTE segment
   371 0000028A 5E                  <1> 	pop	si ; *	; (BIOS) DPTE offset	
   372                              <1> 
   373                              <1> 	; 08/08/2022 (TRDOS 386 v2.0.5)
   374                              <1> 	; (Recent version of Retro UNIX 386 v1 'diskinit.s' file
   375                              <1> 	; -12/07/2022- does not contain following 2020 code) (*)
   376                              <1> 
   377                              <1> 	; 14/07/2020 (TRDOS 386 v2.0.2)
   378                              <1> 	; 0FFFFh:0FFFFh = invalid DPTE address
   379 0000028B 8B0C                <1> 	mov	cx, [si]
   380 0000028D 8B4402              <1> 	mov	ax, [si+2]
   381 00000290 21C1                <1> 	and	cx, ax
   382 00000292 41                  <1> 	inc	cx 
   383 00000293 7404                <1> 	jz	short L11c ; 0FFFFh:0FFFFh
   384 00000295 0B04                <1> 	or	ax, [si]
   385 00000297 752A                <1> 	jnz	short L11e ; <> 0
   386                              <1> L11c:
   387                              <1> 	; 17/07/2020
   388                              <1> 	; TRDOS 386 v2 DRVINIT assumptions:
   389                              <1> 	; (also by regarding QEMU, Bochs and VirtualBox settings)
   390                              <1> 	;	Hard disk 0 port address: 1F0h
   391                              <1> 	;	Hard disk 1 port address: 1F0h
   392                              <1> 	;	Hard disk 2 port address: 170h
   393                              <1> 	;	Hard disk 3 port address: 170h
   394                              <1> 
   395                              <1> 	; in QEMU, hda=hd0 (1F0h) and hdb=hd1 (1F0h) -IRQ14-
   396                              <1> 	;      and hdc=hd2 (170h) and hdd=hd3 (170h) -IRQ15-
   397                              <1> 
   398 00000299 B8F001              <1> 	mov	ax, 1F0h
   399                              <1> 
   400                              <1> 	; 15/07/2020
   401                              <1> 	; 14/07/2020
   402                              <1> 	; Invalid DPTE address...
   403                              <1> 	; Default DPTE parms must be set for DISK_IO_CONT
   404                              <1> 	; (diskio.s)
   405                              <1> 	; 17/07/2020
   406                              <1> 
   407                              <1> 	;mov	bl, dl
   408                              <1> 	;and	bl, 1
   409                              <1> 	;jz	short L11d
   410                              <1> 
   411 0000029C B3A0                <1> 	mov	bl, 0A0h
   412                              <1> 
   413 0000029E F6C201              <1> 	test	dl, 1
   414 000002A1 7403                <1> 	jz	short L11g  ; Master (as default, for 80h & 82h))
   415                              <1> 	;shl	bl, 4 ; bl = 16 (bit 4 = 1 -> slave)
   416 000002A3 80C310              <1> 	add	bl, 10h  ; Slave (as default, for 81h & 83h)
   417                              <1> L11g:
   418                              <1> 	; 17/07/2020
   419 000002A6 80FA82              <1> 	cmp	dl, 82h	; Hard disk 3 or 4 ?
   420 000002A9 7203                <1> 	jb	short L11d ; Primary ATA channel (hd0, hd1)
   421                              <1> 			   ; (port address = 1F0h)
   422                              <1> 	
   423                              <1> 	; Secondary ATA channel (hd2, hd3)
   424                              <1> 	; (port address = 170h)
   425                              <1> 
   426 000002AB 2D8000              <1> 	sub	ax, 1F0h-170h
   427                              <1> L11d:
   428                              <1> 	; 14/07/2020
   429 000002AE AB                  <1> 	stosw	; I/O PORT Base Address (1F0h, 170h)
   430 000002AF 050602              <1> 	add	ax, 206h
   431 000002B2 AB                  <1> 	stosw	; CONTROL PORT Address (3F6h, 376h)	
   432 000002B3 88D8                <1> 	mov	al, bl  ; Master/Slave bit (0 = Master)
   433                              <1> 	; 17/07/2020
   434                              <1> 	;or	al, 0A0h ; CHS (LBA enable bit = 0)
   435                              <1> 			 ; (Bits 5&7, reserved bits  =  1)
   436 000002B5 30E4                <1> 	xor	ah, ah
   437                              <1> 	;stosb	; Device/Head Register upper nibble
   438 000002B7 AB                  <1> 	stosw
   439 000002B8 30C0                <1> 	xor	al, al
   440 000002BA B90500              <1> 	mov	cx, 5
   441 000002BD F3AB                <1> 	rep	stosw ; clear remain part of the (fake) DPTE
   442 000002BF 0E                  <1> 	push	cs
   443 000002C0 1F                  <1> 	pop	ds
   444 000002C1 EB2E                <1> 	jmp	short L11f
   445                              <1> 
   446                              <1> 	; 08/08/2022 (TRDOS 386 v2.0.5)
   447                              <1> 	; (Recent version of Retro UNIX 386 v1 'diskinit.s' file
   448                              <1> 	; -12/07/2022- does not contain above 2020 code) (*)
   449                              <1> L11e:
   450                              <1> 	; 23/02/2015
   451 000002C3 57                  <1> 	push	di
   452                              <1> 	; ES:DI points to DPTE (FDPTE) location
   453                              <1> 	;;mov	cx, 8
   454                              <1> 	;mov	cl, 8
   455 000002C4 B90800              <1> 	mov	cx, 8 ; 14/07/2020
   456 000002C7 F3A5                <1> 	rep	movsw	
   457                              <1> 	;
   458                              <1> 	; 23/02/2015
   459                              <1> 	; (P)ATA drive and LBA validation
   460                              <1> 	; (invalidating SATA drives and setting
   461                              <1> 	; CHS type I/O for old type fixed disks)
   462 000002C9 5B                  <1> 	pop	bx
   463 000002CA 8CC8                <1> 	mov	ax, cs
   464 000002CC 8ED8                <1> 	mov	ds, ax
   465 000002CE 268B07              <1> 	mov	ax, [es:bx]
   466 000002D1 3DF001              <1> 	cmp	ax, 1F0h
   467 000002D4 7413                <1> 	je	short L11a
   468 000002D6 3D7001              <1> 	cmp	ax, 170h
   469 000002D9 740E                <1> 	je	short L11a
   470                              <1> 	; invalidation 
   471                              <1> 	; (because base port address is not 1F0h or 170h)
   472                              <1> 	;xor	bh, bh
   473                              <1> 	;mov	bl, dl
   474                              <1> 	; 29/08/2020
   475                              <1> 	;xor	dh, dh ; 0
   476 000002DB 89D3                <1> 	mov	bx, dx
   477                              <1> 	;sub	bl, 80h
   478                              <1> 	;mov	byte [bx+hd0_type], 0 ; not a valid disk drive !		
   479                              <1>         ;or	byte [bx+drv.status+2], 0F0h ; (failure sign)
   480                              <1> 	; 29/08/2020
   481 000002DD C687[9E65]00        <1> 	mov	byte [bx+hd0_type-80h], 0
   482 000002E2 808F[C065]F0        <1> 	or	byte [bx+drv.status-7Eh], 0F0h
   483 000002E7 EB0F                <1> 	jmp	short L11b
   484                              <1> L11a:	
   485                              <1> 	; LBA validation
   486 000002E9 268A4704            <1> 	mov	al, [es:bx+4] ; Head register upper nibble
   487 000002ED A840                <1> 	test	al, 40h ; LBA bit (bit 6)
   488 000002EF 7507                <1> 	jnz	short L11b ; LBA type I/O is OK! (E0h or F0h)
   489                              <1> L11f:
   490                              <1> 	; force CHS type I/O for this drive (A0h or B0h)
   491                              <1> 	;sub	bh, bh
   492                              <1> 	;mov	bl, dl
   493                              <1> 	; 29/08/2020
   494                              <1> 	;xor	dh, dh ; 0
   495 000002F1 89D3                <1> 	mov	bx, dx
   496                              <1> 	;sub	bl, 80h ; 26/02/2015
   497                              <1>         ;and	byte [bx+drv.status+2], 0FEh ; clear bit 0
   498                              <1> 				; bit 0 = LBA ready bit
   499                              <1> 	; 29/08/2020
   500 000002F3 80A7[C065]FE        <1> 	and	byte [bx+drv.status-7Eh], 0FEh
   501                              <1> 	; 'diskio' procedure will check this bit !
   502                              <1> L11b:
   503 000002F8 3A16[1A66]          <1> 	cmp	dl, [last_drv] ; 25/12/2014
   504 000002FC 7307                <1>         jnb     short L13
   505 000002FE E9D7FE              <1>         jmp     L10
   506                              <1> 
   507                              <1> L12:
   508                              <1> 	; Restore data registers
   509 00000301 8CC8                <1> 	mov	ax, cs
   510 00000303 8ED8                <1> 	mov	ds, ax	
   511                              <1> L13:
   512                              <1> 	; 13/12/2014
   513 00000305 0E                  <1> 	push	cs
   514 00000306 07                  <1> 	pop	es
   515                              <1> L14:
   516                              <1> 	; clear keyboard buffer
   517 00000307 B411                <1> 	mov 	ah, 11h
   518 00000309 CD16                <1> 	int 	16h
   519 0000030B 7440                <1> 	jz 	short L16 ; no keys in keyboard buffer
   520 0000030D B010                <1> 	mov	al, 10h
   521 0000030F CD16                <1> 	int 	16h
   522 00000311 EBF4                <1> 	jmp 	short L14
   523                              <1> 
   524                              <1> set_disk_parms:
   525                              <1> 	; 08/08/2022 - TRDOS 386 v2.0.5
   526                              <1> 	; 09/05/2022 - Retro UNIX 386 v1.2
   527                              <1> 	; 29/08/2020 - TRDOS 386 v2.0.2
   528                              <1> 	; 04/02/2016 (ebx -> bx)
   529                              <1> 	; 10/07/2015
   530                              <1> 	; 14/01/2015
   531                              <1> 	;push	bx
   532 00000313 28FF                <1> 	sub	bh, bh
   533 00000315 8A1E[1966]          <1> 	mov	bl, [drv]
   534 00000319 80FB80              <1> 	cmp	bl, 80h
   535 0000031C 7203                <1> 	jb	short sdp0
   536 0000031E 80EB7E              <1> 	sub	bl, 7Eh
   537                              <1> sdp0:	
   538                              <1> 	;add	bx, drv.status
   539                              <1>   	;mov	byte [bx], 80h ; 'Present' flag
   540                              <1> 	; 29/08/2020
   541 00000321 C687[3E66]80        <1> 	mov	byte [bx+drv.status], 80h
   542                              <1> 	;
   543 00000326 88E8                <1> 	mov	al, ch ; last cylinder (bits 0-7)
   544 00000328 88CC                <1> 	mov	ah, cl ; 
   545 0000032A C0EC06              <1> 	shr	ah, 6  ; last cylinder (bits 8-9)
   546                              <1> 	;sub	bx, drv.status
   547 0000032D D0E3                <1> 	shl	bl, 1
   548                              <1> 	;add	bx, drv.cylinders
   549 0000032F 40                  <1> 	inc	ax  ; convert max. cyl number to cyl count
   550                              <1> 	;mov	[bx], ax
   551                              <1> 	; 08/08/2022
   552                              <1> 	; 29/08/2020
   553                              <1> 	;mov	[bx+drv.cylinders], ax
   554                              <1> 	;
   555 00000330 50                  <1> 	push	ax ; ** cylinders
   556                              <1> 	;sub	bx, drv.cylinders
   557                              <1> 	;add	bx, drv.heads
   558 00000331 30E4                <1> 	xor	ah, ah
   559 00000333 88F0                <1> 	mov	al, dh ; heads
   560 00000335 40                  <1> 	inc	ax
   561                              <1> 	;mov	[bx], ax
   562                              <1> 	; 08/08/2022
   563                              <1> 	; 29/08/2020
   564                              <1> 	;mov	[bx+drv.heads], ax
   565                              <1> 	;sub	bx, drv.heads
   566                              <1>         ;add	bx, drv.spt
   567 00000336 30ED                <1> 	xor	ch, ch
   568 00000338 80E13F              <1> 	and	cl, 3Fh	; sectors (bits 0-6)
   569                              <1> 	;mov	[bx], cx
   570                              <1>         ; 08/08/2022
   571                              <1> 	; 29/08/2020
   572                              <1> 	;mov	[bx+drv.spt], cx
   573                              <1> 	;sub	bx, drv.spt
   574 0000033B D1E3                <1> 	shl	bx, 1
   575                              <1> 	;add	bx, drv.size ; disk size (in sectors)
   576                              <1> 	; LBA size = cylinders * heads * secpertrack
   577 0000033D F7E1                <1> 	mul	cx 
   578 0000033F 89C2                <1> 	mov	dx, ax	; heads*spt
   579 00000341 58                  <1> 	pop	ax ; ** cylinders
   580                              <1> 	; 09/05/2022 (fd0&fd1 drv.size = cyls*spt*heads)
   581                              <1> 	;dec	ax ; 1 cylinder reserved (!?) ; (*)
   582 00000342 F7E2                <1> 	mul	dx ; cylinders * (heads*spt)
   583                              <1> 	;mov	[bx], ax
   584                              <1> 	;mov	[bx+2], dx
   585                              <1> 	; 29/08/2020
   586 00000344 8987[2266]          <1> 	mov	[bx+drv.size], ax
   587 00000348 8997[2466]          <1> 	mov	[bx+drv.size+2], dx
   588                              <1> 	;
   589                              <1> 	;pop	bx
   590 0000034C C3                  <1> 	retn
   591                              <1> 
   592                              <1> L16:	; 28/05/2016
   425                                  
   426                                  	; 10/11/2014
   427 0000034D FA                           	cli	; Disable interrupts (clear interrupt flag)
   428                                  		; Reset Interrupt MASK Registers (Master&Slave)
   429                                  	;mov	al, 0FFh	; mask off all interrupts
   430                                  	;out	21h, al		; on master PIC (8259)
   431                                  	;jmp 	$+2  ; (delay)
   432                                  	;out	0A1h, al	; on slave PIC (8259)
   433                                  	;
   434                                  	; Disable NMI 
   435 0000034E B080                    	mov   	al, 80h 
   436 00000350 E670                    	out   	70h, al		; set bit 7 to 1 for disabling NMI
   437                                  	;23/02/2015
   438                                  	;nop			;
   439                                  	;in	al, 71h		; read in 71h just after writing out to 70h
   440                                  				; for preventing unknown state (!?)
   441                                  	;
   442                                   	; 20/08/2014
   443                                  	; Moving the kernel 64 KB back (to physical address 0)
   444                                  	; DS = CS = 1000h
   445                                  	; 05/11/2014
   446 00000352 31C0                    	xor	ax, ax
   447 00000354 8EC0                    	mov	es, ax ; ES = 0
   448                                  	;
   449                                  	; 04/07/2016 - TRDOS 386 (64K - 128K kernel)
   450 00000356 31F6                          	xor	si, si
   451 00000358 31FF                    	xor	di, di
   452                                  	;mov	cx, 16384
   453                                  	;rep	movsd
   454                                  	; 02/12/2023
   455 0000035A B90080                  	mov	cx, 32768
   456 0000035D F3A5                    	rep	movsw
   457                                  	;
   458 0000035F 06                      	push	es ; 0
   459 00000360 68[6403]                	push	L17
   460 00000363 CB                      	retf
   461                                  L17:
   462 00000364 B90010                  	mov	cx, 1000h
   463 00000367 8EC1                    	mov	es, cx  ; 1000h 
   464 00000369 01C9                    	add	cx, cx
   465 0000036B 8ED9                    	mov	ds, cx  ; 2000h
   466                                  	;sub	si, si
   467                                  	;sub	di, di
   468                                  	;mov	cx, 16384
   469                                  	;rep	movsd
   470                                  	; 02/12/2023
   471                                  	; si = di = 0
   472 0000036D B90080                  	mov	cx, 32768
   473 00000370 F3A5                    	rep	movsw	
   474                                  
   475                                  	; Turn off the floppy drive motor
   476 00000372 BAF203                          mov     dx, 3F2h
   477 00000375 EE                              out     dx, al ; 0 ; 31/12/2013
   478                                  
   479                                  	; Enable access to memory above one megabyte
   480                                  L18:
   481 00000376 E464                    	in	al, 64h
   482 00000378 A802                    	test	al, 2
   483 0000037A 75FA                            jnz     short L18
   484 0000037C B0D1                    	mov	al, 0D1h	; Write output port
   485 0000037E E664                    	out	64h, al
   486                                  L19:
   487 00000380 E464                    	in	al, 64h
   488 00000382 A802                    	test	al, 2
   489 00000384 75FA                            jnz     short L19
   490 00000386 B0DF                    	mov	al, 0DFh	; Enable A20 line
   491 00000388 E660                    	out	60h, al
   492                                  ;L20:
   493                                  	;
   494                                  	; Load global descriptor table register
   495                                  
   496                                          ;mov     ax, cs
   497                                          ;mov     ds, ax
   498                                  
   499 0000038A 2E0F0116[8865]                  lgdt    [cs:gdtd]
   500                                  
   501 00000390 0F20C0                          mov     eax, cr0
   502                                  	;or 	al, 1	; 24/07/2023
   503 00000393 40                      	inc     ax
   504 00000394 0F22C0                  	mov     cr0, eax
   505                                  
   506                                  	; Jump to 32 bit code
   507                                  	
   508 00000397 66                      	db 66h 			; Prefix for 32-bit
   509 00000398 EA                      	db 0EAh 		; Opcode for far jump
   510 00000399 [9F030000]              	dd StartPM 		; Offset to start, 32-bit
   511                                  				; (1000h:StartPM = StartPM + 10000h)
   512 0000039D 0800                    	dw KCODE		; This is the selector for CODE32_DESCRIPTOR,
   513                                  				; assuming that StartPM resides in code32
   514                                  
   515                                  ; 20/02/2017
   516                                  
   517                                  
   518                                  [BITS 32] 
   519                                  
   520                                  StartPM:
   521                                  	; Kernel Base Address = 0 ; 30/12/2013
   522 0000039F 66B81000                	mov ax, KDATA           ; Save data segment identifier
   523 000003A3 8ED8                            mov ds, ax              ; Move a valid data segment into DS register
   524 000003A5 8EC0                           	mov es, ax              ; Move data segment into ES register
   525 000003A7 8EE0                           	mov fs, ax              ; Move data segment into FS register
   526 000003A9 8EE8                          	mov gs, ax              ; Move data segment into GS register
   527 000003AB 8ED0                            mov ss, ax              ; Move data segment into SS register
   528                                  	;mov esp, 90000h        ; Move the stack pointer to 090000h
   529                                  	; 04/12/2023 - TRDOS 386 v2.0.7
   530                                  	;mov esp, 97000h	; 3072 bytes system stack (96400h-97000h)
   531 000003AD BC00700900              	mov esp, SYSTEMSTACK_ADDR ; 97000h (max. 3072 bytes)
   532                                  
   533                                  clear_bss: ; Clear uninitialized data area
   534                                  	; 11/03/2015
   535 000003B2 31C0                    	xor	eax, eax ; 0
   536 000003B4 B9710A0000              	mov	ecx, (bss_end - bss_start)/4
   537                                  	;shr	ecx, 2 ; bss section is already aligned for double words
   538 000003B9 BF[9E750100]            	mov	edi, bss_start	
   539 000003BE F3AB                    	rep	stosd  		
   540                                  
   541                                  memory_init:
   542                                  	; Initialize memory allocation table and page tables
   543                                  	; 04/12/2023
   544                                  	; 29/11/2023
   545                                  	; 27/11/2023
   546                                  	; 23/11/2023 (TRDOS 386 v2.0.7)
   547                                  	; 24/07/2022 (TRDOS 386 v2.0.5)
   548                                  	; 18/04/2021 (TRDOS 386 v2.0.4)
   549                                  	; 16/11/2014
   550                                  	; 15/11/2014
   551                                  	; 07/11/2014
   552                                  	; 06/11/2014
   553                                  	; 05/11/2014
   554                                  	; 04/11/2014
   555                                  	; 31/10/2014 (Retro UNIX 386 v1 - Beginning) 
   556                                  	;
   557                                  ;	xor	eax, eax
   558                                  ;	xor 	ecx, ecx
   559 000003C0 B108                    	mov	cl, 8
   560 000003C2 BF00001000              	mov	edi, MEM_ALLOC_TBL	
   561 000003C7 F3AB                    	rep	stosd		   ; clear Memory Allocation Table
   562                                  				   ; for the first 1 MB memory
   563                                  	;
   564 000003C9 668B0D[14660000]        	mov	cx, [mem_1m_1k]	   ; Number of contiguous KB between
   565                                  				   ; 1 and 16 MB, max. 3C00h = 15 MB.
   566                                  	;shr	cx, 2		   ; convert 1 KB count to 4 KB count
   567                                  	; 24/07/2022
   568 000003D0 C1E902                  	shr	ecx, 2
   569 000003D3 890D[90780100]          	mov	[free_pages], ecx
   570 000003D9 668B15[16660000]        	mov	dx, [mem_16m_64k]  ; Number of contiguous 64 KB blocks
   571                                  				   ; between 16 MB and 4 GB.	
   572 000003E0 6609D2                  	or	dx, dx
   573 000003E3 7425                    	jz	short mi_0
   574                                  
   575                                  ; 04/12/2023
   576                                  %if 1
   577                                  	; 02/12/2023 - temporary (2816MB limit)
   578                                  	;cmp	dx, 44800 ; 0AF00h	
   579 000003E5 6681FA009F              	cmp	dx, 40704	; (2560MB limit)
   580 000003EA 7604                    	jna	short mi_x
   581                                  	;mov	dx, 44800
   582 000003EC 66BA009F                	mov	dx, 40704
   583                                  mi_x:
   584                                  %endif
   585                                  	; 23/11/2023 - temporary
   586                                  	;and	dx, 3FFFh
   587                                  
   588 000003F0 668915[16660000]        	mov	[mem_16m_64k], dx
   589                                  
   590 000003F7 6689D0                  	mov	ax, dx
   591 000003FA C1E004                  	shl	eax, 4		   ; 64 KB -> 4 KB (page count)
   592 000003FD 0105[90780100]          	add	[free_pages], eax
   593 00000403 0500100000              	add	eax, 4096	   ; 16 MB = 4096 pages
   594 00000408 EB06                    	jmp	short mi_1
   595                                  mi_0:
   596                                  	;mov	ax, cx
   597                                  	; 24/07/2022
   598 0000040A 89C8                    	mov	eax, ecx
   599 0000040C 66050001                	add	ax, 256		   ; add 256 pages for the first 1 MB
   600                                  	;add	eax, 256
   601                                  mi_1:			 
   602 00000410 A3[8C780100]            	mov	[memory_size], eax ; Total available memory in pages
   603                                  				   ; 1 alloc. tbl. bit = 1 memory page
   604                                  				   ; 32 allocation bits = 32 mem. pages   
   605                                  	;
   606 00000415 05FF7F0000              	add	eax, 32767	   ; 32768 memory pages per 1 M.A.T. page 	
   607 0000041A C1E80F                  	shr	eax, 15		   ; ((32768 * x) + y) pages (y < 32768)
   608                                  				   ;  --> x + 1 M.A.T. pages, if y > 0
   609                                  				   ;  --> x M.A.T. pages, if y = 0
   610 0000041D 66A3[A0780100]          	mov	[mat_size], ax	   ; Memory Alloc. Table Size in pages		
   611 00000423 C1E00C                  	shl	eax, 12		   ; 1 M.A.T. page = 4096 bytes
   612                                  	;			   ; Max. 32 M.A.T. pages (4 GB memory)
   613 00000426 89C3                    	mov	ebx, eax	   ; M.A.T. size in bytes
   614                                  	; Set/Calculate Kernel's Page Directory Address
   615 00000428 81C300001000            	add	ebx, MEM_ALLOC_TBL
   616 0000042E 891D[88780100]          	mov	[k_page_dir], ebx  ; Kernel's Page Directory address
   617                                  				   ; just after the last M.A.T. page
   618                                  	;
   619 00000434 83E804                  	sub	eax, 4		   ; convert M.A.T. size to offset value
   620 00000437 A3[98780100]            	mov	[last_page], eax   ; last page offset in the M.A.T.
   621                                  	;			   ; (allocation status search must be 
   622                                  				   ; stopped after here)	
   623 0000043C 31C0                    	xor	eax, eax
   624 0000043E 48                      	dec	eax		   ; FFFFFFFFh (set all bits to 1)	
   625                                  	;push	cx
   626                                  	; 18/04/2021
   627 0000043F 51                      	push	ecx
   628                                  	; ecx = 3840 ; 27/11/2023
   629                                  	; (Note: ecx < 3840 if the total memory is less than 16 MB)
   630 00000440 C1E905                  	shr	ecx, 5		   ; convert 1 - 16 MB page count to 
   631                                  				   ; count of 32 allocation bits
   632                                  	; ecx = 120 ; 27/11/2023
   633 00000443 F3AB                    	rep	stosd
   634                                  	;pop	cx
   635                                  	; 18/04/2021
   636 00000445 59                      	pop	ecx
   637 00000446 40                      	inc	eax		   ; 0	
   638 00000447 80E11F                  	and	cl, 31		   ; remain bits
   639 0000044A 7412                    	jz	short mi_4
   640 0000044C 8907                    	mov	[edi], eax	   ; reset	
   641                                  mi_2:
   642 0000044E 0FAB07                  	bts	[edi], eax	   ; 06/11/2014		
   643 00000451 FEC9                    	dec	cl
   644 00000453 7404                    	jz	short mi_3
   645 00000455 FEC0                    	inc	al
   646 00000457 EBF5                    	jmp	short mi_2
   647                                  mi_3:
   648 00000459 28C0                    	sub	al, al	   	   ; 0
   649 0000045B 83C704                  	add	edi, 4		   ; 15/11/2014
   650                                  mi_4:
   651 0000045E 6609D2                  	or	dx, dx		  ; check 16 MB to 4 GB memory space	
   652 00000461 7421                    	jz	short mi_6	  ; max. 16 MB memory, no more...
   653                                  	;	
   654 00000463 B900021000              	mov	ecx, MEM_ALLOC_TBL + 512 ; End of first 16 MB memory
   655                                  	;	
   656 00000468 29F9                    	sub	ecx, edi	  ; displacement (to end of 16 MB)
   657 0000046A 7406                    	jz	short mi_5	  ; jump if EDI points to 
   658                                  				  ;         end of first 16 MB	
   659 0000046C D1E9                    	shr	ecx, 1		  ; convert to dword count
   660 0000046E D1E9                    	shr	ecx, 1		  ; (shift 2 bits right) 
   661 00000470 F3AB                    	rep 	stosd		  ; reset all bits for reserved pages
   662                                  				  ; (memory hole under 16 MB)
   663                                  mi_5:
   664 00000472 6689D1                  	mov	cx, dx		  ; count of 64 KB memory blocks
   665 00000475 D1E9                    	shr	ecx, 1		  ; 1 alloc. dword per 128 KB memory
   666 00000477 9C                      	pushf			  ; 16/11/2014		
   667 00000478 48                      	dec	eax		  ; FFFFFFFFh (set all bits to 1)
   668 00000479 F3AB                    	rep	stosd
   669 0000047B 40                      	inc	eax		  ; 0
   670 0000047C 9D                      	popf			  ; 16/11/2014
   671 0000047D 7305                    	jnc	short mi_6
   672 0000047F 6648                    	dec	ax		  ; eax = 0000FFFFh
   673 00000481 AB                      	stosd
   674 00000482 6640                    	inc	ax		  ; 0		
   675                                  mi_6:
   676 00000484 39DF                    	cmp	edi, ebx	  ; check if EDI points to 	
   677 00000486 730A                    	jnb	short mi_7	  ; end of memory allocation table
   678                                  	;			  ; (>= MEM_ALLOC_TBL + 4906) 
   679 00000488 89D9                    	mov	ecx, ebx	  ; end of memory allocation table
   680 0000048A 29F9                    	sub	ecx, edi	  ; convert displacement/offset
   681 0000048C D1E9                    	shr	ecx, 1		  ; to dword count 	 		
   682 0000048E D1E9                    	shr	ecx, 1		  ; (shift 2 bits right) 
   683 00000490 F3AB                    	rep 	stosd		  ; reset all remain M.A.T. bits
   684                                  mi_7:
   685                                  	; Reset M.A.T. bits in M.A.T. (allocate M.A.T. pages)
   686 00000492 BA00001000              	mov	edx, MEM_ALLOC_TBL
   687                                  	;sub	ebx, edx	  ; Mem. Alloc. Tbl. size in bytes
   688                                  	;shr	ebx, 12		  ; Mem. Alloc. Tbl. size in pages	
   689 00000497 668B0D[A0780100]        	mov	cx, [mat_size]	  ; Mem. Alloc. Tbl. size in pages
   690 0000049E 89D7                    	mov	edi, edx
   691 000004A0 C1EF0F                  	shr	edi, 15		  ; convert M.A.T. address to
   692                                  				  ; byte offset in M.A.T.
   693                                  				  ; (1 M.A.T. byte points to 
   694                                  				  ;	      32768 bytes)
   695                                  				  ; Note: MEM_ALLOC_TBL address 
   696                                  				  ; must be aligned on 128 KB 
   697                                  				  ; boundary!
   698 000004A3 01D7                    	add	edi, edx	  ; points to M.A.T.'s itself	
   699                                  	; eax = 0
   700 000004A5 290D[90780100]          	sub	[free_pages], ecx ; 07/11/2014
   701                                  mi_8:
   702 000004AB 0FB307                  	btr	[edi], eax	  ; clear bit 0 to bit x (1 to 31)
   703                                  	;dec	bl
   704 000004AE FEC9                    	dec	cl
   705 000004B0 7404                    	jz	short mi_9
   706 000004B2 FEC0                    	inc	al
   707 000004B4 EBF5                    	jmp	short mi_8
   708                                  mi_9:
   709                                  	;
   710                                  	; Reset Kernel's Page Dir. and Page Table bits in M.A.T.
   711                                  	;		(allocate pages for system page tables)
   712                                  
   713                                  	; edx = MEM_ALLOC_TBL
   714 000004B6 8B0D[8C780100]          	mov	ecx, [memory_size] ; memory size in pages (PTEs)
   715 000004BC 81C1FF030000            	add	ecx, 1023	 ; round up (1024 PTEs per table)	 	
   716 000004C2 C1E90A                  	shr	ecx, 10		 ; convert memory page count to 
   717                                  				 ; page table count (PDE count)
   718                                  	;
   719 000004C5 51                      	push	ecx		 ; (**) PDE count (<= 1024)
   720                                  	;
   721 000004C6 41                      	inc	ecx		 ; +1 for kernel page directory
   722                                  	;
   723 000004C7 290D[90780100]          	sub	[free_pages], ecx ; 07/11/2014
   724                                  	;
   725 000004CD 8B35[88780100]          	mov	esi, [k_page_dir] ; Kernel's Page Directory address
   726 000004D3 C1EE0C                  	shr	esi, 12		 ; convert to page number
   727                                  mi_10:
   728 000004D6 89F0                    	mov	eax, esi	 ; allocation bit offset
   729 000004D8 89C3                    	mov	ebx, eax
   730 000004DA C1EB03                  	shr	ebx, 3		 ; convert to alloc. byte offset
   731 000004DD 80E3FC                  	and	bl, 0FCh	 ; clear bit 0 and bit 1
   732                                  				 ;   to align on dword boundary
   733 000004E0 83E01F                  	and	eax, 31		 ; set allocation bit position 
   734                                  				 ;  (bit 0 to bit 31)
   735                                  	;
   736 000004E3 01D3                    	add	ebx, edx	 ; offset in M.A.T. + M.A.T. address
   737                                  	;
   738 000004E5 0FB303                  	btr 	[ebx], eax	 ; reset relevant bit (0 to 31)
   739                                  	;
   740 000004E8 46                      	inc	esi		 ; next page table
   741 000004E9 E2EB                    	loop	mi_10		 ; allocate next kernel page table
   742                                  				 ; (ecx = page table count + 1)
   743                                  	;
   744 000004EB 59                      	pop	ecx		 ; (**) PDE count (= pg. tbl. count)
   745                                  	;
   746                                  	; Initialize Kernel Page Directory and Kernel Page Tables
   747                                  	;
   748                                  	; Initialize Kernel's Page Directory
   749 000004EC 8B3D[88780100]          	mov	edi, [k_page_dir]
   750 000004F2 89F8                    	mov	eax, edi
   751 000004F4 0C03                    	or	al, PDE_A_PRESENT + PDE_A_WRITE
   752                                  				; supervisor + read&write + present
   753 000004F6 89CA                    	mov	edx, ecx 	; (**) PDE count (= pg. tbl. count)	
   754                                  mi_11:
   755 000004F8 0500100000              	add	eax, 4096	; Add page size (PGSZ)
   756                                  			        ; EAX points to next page table
   757 000004FD AB                      	stosd
   758 000004FE E2F8                    	loop	mi_11
   759 00000500 29C0                    	sub	eax, eax	; Empty PDE
   760                                  	;mov	cx, 1024	; Entry count (PGSZ/4)
   761                                  	; 29/11/2023
   762 00000502 B504                    	mov	ch, 4 ; cx = 4*256 = 1024
   763 00000504 29D1                    	sub	ecx, edx
   764 00000506 7402                    	jz	short mi_12
   765 00000508 F3AB                    	rep	stosd 		; clear remain (empty) PDEs
   766                                  	;
   767                                  	; Initialization of Kernel's Page Directory is OK, here.
   768                                  mi_12:
   769                                  	; Initialize Kernel's Page Tables
   770                                  	;
   771                                  	; (EDI points to address of page table 0)
   772                                  	; eax = 0
   773 0000050A 8B0D[8C780100]          	mov	ecx, [memory_size] ; memory size in pages
   774 00000510 89CA                    	mov	edx, ecx	; (***)
   775 00000512 B003                    	mov	al, PTE_A_PRESENT + PTE_A_WRITE
   776                                  			     ; supervisor + read&write + present 	
   777                                  mi_13:
   778 00000514 AB                      	stosd
   779 00000515 0500100000              	add	eax, 4096	
   780 0000051A E2F8                    	loop	mi_13	
   781                                  	;and	dx, 1023	; (***)
   782                                  	; 30/08/2023
   783 0000051C 81E2FF030000            	and	edx, 1023
   784 00000522 7408                    	jz	short mi_14
   785                                  	;mov	cx, 1024	
   786                                  	; 30/08/2023
   787 00000524 B504                    	mov	ch, 4 ; 4*256 = 1024
   788                                  	;sub	cx, dx		; from dx (<= 1023) to 1024
   789                                  	; 24/07/2022
   790 00000526 29D1                    	sub	ecx, edx
   791 00000528 31C0                    	xor	eax, eax
   792 0000052A F3AB                    	rep	stosd		; clear remain (empty) PTEs 
   793                                  				; of the last page table
   794                                  mi_14:
   795                                  	;  Initialization of Kernel's Page Tables is OK, here.
   796                                  	;
   797 0000052C 89F8                    	mov	eax, edi	; end of the last page table page
   798                                  			        ; (beginging of user space pages)
   799                                  
   800 0000052E C1E80F                  	shr	eax, 15		; convert to M.A.T. byte offset
   801 00000531 24FC                    	and	al, 0FCh	; clear bit 0 and bit 1 for
   802                                  				; aligning on dword boundary	
   803 00000533 A3[9C780100]            	mov	[first_page], eax
   804 00000538 A3[94780100]            	mov	[next_page], eax ; The first free page pointer
   805                                  				 ; for user programs
   806                                  				 ; (Offset in Mem. Alloc. Tbl.)	
   807                                  	;
   808                                  	; Linear/FLAT (1 to 1) memory paging for the kernel is OK, here.
   809                                  	;
   810                                  	
   811                                  	; Enable paging
   812                                  	;
   813 0000053D A1[88780100]                    mov     eax, [k_page_dir]
   814 00000542 0F22D8                  	mov	cr3, eax
   815 00000545 0F20C0                  	mov	eax, cr0
   816 00000548 0D00000080              	or	eax, 80000000h	; set paging bit (bit 31)
   817 0000054D 0F22C0                  	mov	cr0, eax
   818                                          ;jmp    KCODE:StartPMP
   819                                  
   820 00000550 EA                      	db 0EAh 		; Opcode for far jump
   821 00000551 [57050000]                      dd StartPMP		; 32 bit offset
   822 00000555 0800                    	dw KCODE		; kernel code segment descriptor
   823                                  
   824                                  StartPMP:
   825                                  	; 06/11//2014
   826                                  	; Clear video page 0
   827                                  	;
   828                                  	; Temporary Code
   829                                  	;
   830 00000557 B9E8030000              	mov	ecx, 80*25/2
   831 0000055C BF00800B00              	mov	edi, 0B8000h
   832                                  	; 30/01/2016
   833                                  	;xor	eax, eax	; black background, black fore color
   834 00000561 B800070007              	mov	eax, 07000700h  ; black background, light gray fore color
   835 00000566 F3AB                    	rep	stosd
   836                                  	
   837                                  	; 19/08/2014
   838                                  	; Kernel Base Address = 0
   839                                  	; It is mapped to (physically) 0 in the page table.
   840                                  	; So, here is exactly 'StartPMP' address.
   841                                  
   842                                   	; 29/01/2016 (TRDOS 386 = TRDOS v2.0)
   843 00000568 BE[8A3B0100]            	mov	esi, starting_msg
   844                                  	;; 14/08/2015 (kernel version message will appear
   845                                  	;;	       when protected mode and paging is enabled)
   846 0000056D BF00800B00              	mov	edi, 0B8000h ; 27/08/2014
   847                                  	
   848                                  	; 30/11/2020
   849                                  	; 14/11/2020 (TRDOS 386 v2.0.3)
   850                                  	;cmp	byte [vbe3], 3 ; 03h
   851                                  	;jne	short pkv_1
   852                                  	;;mov	ah, 0Bh ; Black background, light cyan forecolor
   853                                  	;; Light red TRDOS 386 version text shows VBE3 is ready !
   854                                  	;mov	ah, 0Ch ; Black background, light red forecolor
   855                                  	;jmp	short pkv_2
   856                                  ;pkv_1:
   857 00000572 B40A                    	mov	ah, 0Ah ; Black background, light green forecolor
   858                                  ;pkv_2:
   859                                  	; 20/08/2014
   860 00000574 E8BE030000              	call	printk
   861                                  
   862                                  	; 'UNIX v7/x86' source code by Robert Nordier (1999)
   863                                  	; // Set IRQ offsets
   864                                  	;
   865                                  	;  Linux (v0.12) source code by Linus Torvalds (1991)
   866                                  	;
   867                                  					;; ICW1
   868 00000579 B011                    	mov	al, 11h			; Initialization sequence
   869 0000057B E620                    	out	20h, al			; 	8259A-1
   870                                  	; jmp 	$+2
   871 0000057D E6A0                    	out	0A0h, al		; 	8259A-2
   872                                  					;; ICW2
   873 0000057F B020                    	mov	al, 20h			; Start of hardware ints (20h)
   874 00000581 E621                    	out	21h, al			;	for 8259A-1
   875                                  	; jmp 	$+2
   876 00000583 B028                    	mov	al, 28h			; Start of hardware ints (28h)
   877 00000585 E6A1                    	out	0A1h, al		; 	for 8259A-2
   878                                  					;
   879 00000587 B004                    	mov	al, 04h			;; ICW3
   880 00000589 E621                    	out	21h, al			; 	IRQ2 of 8259A-1 (master)
   881                                  	; jmp 	$+2
   882 0000058B B002                    	mov	al, 02h			; 	is 8259A-2 (slave)
   883 0000058D E6A1                    	out	0A1h, al		;
   884                                  					;; ICW4
   885 0000058F B001                    	mov	al, 01h	 		;
   886 00000591 E621                    	out	21h, al			; 	8086 mode, normal EOI	
   887                                  	; jmp 	$+2
   888 00000593 E6A1                    	out	0A1h, al		;	for both chips.
   889                                  
   890                                  	;mov	al, 0FFh	; mask off all interrupts for now
   891                                  	;out	21h, al
   892                                  	;; jmp 	$+2
   893                                  	;out	0A1h, al
   894                                  
   895                                  	; 02/04/2015
   896                                  	; 26/03/2015 System call (INT 30h) modification
   897                                  	;  DPL = 3 (Interrupt service routine can be called from user mode)			
   898                                  	;
   899                                  	;; Linux (v0.12) source code by Linus Torvalds (1991)
   900                                  	;  setup_idt:
   901                                  	;
   902                                          ;; 16/02/2015
   903                                  	;;mov     dword [DISKETTE_INT], fdc_int ; IRQ 6 handler
   904                                  	; 21/08/2014 (timer_int)
   905 00000595 BE[28380100]            	mov	esi, ilist
   906 0000059A 8D3D[A0750100]          	lea	edi, [idt]
   907                                  	; 26/03/2015
   908 000005A0 B930000000              	mov	ecx, 48		; 48 hardware interrupts (INT 0 to INT 2Fh)
   909                                  	; 02/04/2015
   910 000005A5 BB00000800              	mov	ebx, 80000h
   911                                  rp_sidt1:
   912 000005AA AD                      	lodsd
   913 000005AB 89C2                    	mov	edx, eax
   914 000005AD 66BA008E                	mov	dx, 8E00h
   915 000005B1 6689C3                  	mov	bx, ax
   916 000005B4 89D8                    	mov	eax, ebx	; /* selector = 0x0008 = cs */
   917                                         			        ; /* interrupt gate - dpl=0, present */
   918 000005B6 AB                      	stosd	; selector & offset bits 0-15 	
   919 000005B7 89D0                    	mov	eax, edx
   920 000005B9 AB                      	stosd	; attributes & offset bits 16-23
   921 000005BA E2EE                    	loop	rp_sidt1
   922                                  	; 15/04/2016
   923                                  	; TRDOS 386 (TRDOS v2.0) /// 32 sofware interrupts ///
   924                                  	;mov	cl, 16        ; 16 software interrupts (INT 30h to INT 3Fh)
   925 000005BC B120                    	mov	cl, 32	      ; 32 software interrupts (INT 30h to INT 4Fh)	
   926                                  rp_sidt2:
   927 000005BE AD                      	lodsd
   928 000005BF 21C0                    	and	eax, eax
   929 000005C1 7413                    	jz	short rp_sidt3
   930 000005C3 89C2                    	mov	edx, eax
   931 000005C5 66BA00EE                	mov	dx, 0EE00h	; P=1b/DPL=11b/01110b
   932 000005C9 6689C3                  	mov	bx, ax
   933 000005CC 89D8                    	mov	eax, ebx	; selector & offset bits 0-15 	
   934 000005CE AB                      	stosd
   935 000005CF 89D0                    	mov	eax, edx
   936 000005D1 AB                      	stosd
   937 000005D2 E2EA                    	loop	rp_sidt2
   938 000005D4 EB16                    	jmp	short sidt_OK
   939                                  rp_sidt3:
   940 000005D6 B8[A50D0000]            	mov	eax, ignore_int
   941 000005DB 89C2                    	mov	edx, eax
   942 000005DD 66BA00EE                	mov	dx, 0EE00h	; P=1b/DPL=11b/01110b
   943 000005E1 6689C3                  	mov	bx, ax
   944 000005E4 89D8                    	mov	eax, ebx	; selector & offset bits 0-15 	
   945                                  rp_sidt4:
   946 000005E6 AB                      	stosd
   947 000005E7 92                      	xchg	eax, edx
   948 000005E8 AB                      	stosd
   949 000005E9 92                      	xchg	edx, eax
   950 000005EA E2FA                    	loop	rp_sidt4
   951                                  sidt_OK: 
   952 000005EC 0F011D[8E650000]        	lidt 	[idtd]
   953                                  	;
   954                                  	; TSS descriptor setup ; 24/03/2015
   955 000005F3 B8[20780100]            	mov	eax, task_state_segment
   956 000005F8 66A3[3A650000]          	mov	[gdt_tss0], ax
   957 000005FE C1C010                  	rol	eax, 16
   958 00000601 A2[3C650000]            	mov	[gdt_tss1], al
   959 00000606 8825[3F650000]          	mov	[gdt_tss2], ah
   960 0000060C 66C705[86780100]68-     	mov	word [tss.IOPB], tss_end - task_state_segment
   960 00000614 00                 
   961                                  		; 
   962                                  		; IO Map Base address (When this address points
   963                                  		; to end of the TSS, CPU does not use IO port 
   964                                  		; permission bit map for RING 3 IO permissions, 
   965                                  		; access to any IO ports in ring 3 will be forbidden.)
   966                                   		;
   967                                  	;mov	[tss.esp0], esp ; TSS offset 4
   968                                  	;mov	word [tss.ss0], KDATA ; TSS offset 8 (SS)
   969 00000615 66B82800                   	mov	ax, TSS  ; It is needed when an interrupt 
   970                                  			 ; occurs (or a system call -software INT- is requested)
   971                                  			 ; while cpu running in ring 3 (in user mode).				
   972                                  			 ; (Kernel stack pointer and segment will be loaded
   973                                  			 ; from offset 4 and 8 of the TSS, by the CPU.)	 
   974 00000619 0F00D8                  	ltr	ax  ; Load task register
   975                                  	;
   976                                  esp0_set0:
   977                                  
   978                                  ; 29/11/2023 - Erdogan Tan
   979                                  ; ------------------------
   980                                  ; If we read following -disabled- stack page setting code...
   981                                  ; When the memory size >= 3GB, one of page tables conflicts with the stack page
   982                                  ; at 4MB-4096 address. So, to leave stack pointer at 90000h is better/default.
   983                                  ; (Problem may not appears for <= 2.5GB main memory but following code is also
   984                                  ; defective because kernel stack page would be seen as unallocated in the M.A.T.
   985                                  ; without by adding a memory allocation code.)
   986                                  ;
   987                                  ; 1st 4MB layout: 1MB kernel -base- reserved + max. 128 KB M.A.T. (at 100000h)
   988                                  ;                 + Kernel's page directory (4KB) -just after the M.A.T.-
   989                                  ;		  + Kernel's page tables (main memory size / 1024)
   990                                  ; Note:
   991                                  ; 1 or 2 additional kernel page table(s) may be needed for Linear Frame Buffer
   992                                  ; .. but, it/they will not have to be contiguous with other kernel page tables.
   993                                  ; ------------------------ 	 
   994                                  
   995                                  ; 27/11/2023 - TRDOS 386 v2.0.7
   996                                  %if 0
   997                                  	; 30/07/2015
   998                                  	mov 	ecx, [memory_size] ; memory size in pages
   999                                  	shl 	ecx, 12 ; convert page count to byte count
  1000                                  	cmp	ecx, CORE ; beginning of user's memory space (400000h)
  1001                                  			  ; (kernel mode virtual address)
  1002                                  	jna	short esp0_set1
  1003                                  	;
  1004                                  	; If available memory > CORE (end of the 1st 4 MB)
  1005                                  	; set stack pointer to CORE
  1006                                  	;(Because, PDE 0 is reserved for kernel space in user's page directory)
  1007                                  	;(PDE 0 points to page table of the 1st 4 MB virtual address space)
  1008                                  	mov	ecx, CORE
  1009                                  esp0_set1:
  1010                                  	mov	esp, ecx ; top of kernel stack (**tss.esp0**)
  1011                                  %endif
  1012                                  
  1013                                  esp0_set_ok:
  1014                                  	; 30/07/2015 (**tss.esp0**) 
  1015 0000061C 8925[24780100]          	mov	[tss.esp0], esp	; 90000h ; 29/11/2023
  1016                                  				; <-- 97000h ; 04/12/2023 (max. 3072 bytes)
  1017 00000622 66C705[28780100]10-             mov     word [tss.ss0], KDATA
  1017 0000062A 00                 
  1018                                  	; 14/08/2015
  1019                                  	; 10/11/2014 (Retro UNIX 386 v1 - Erdogan Tan)
  1020                                  	;
  1021                                  	;cli	; Disable interrupts (for CPU)
  1022                                  	;    (CPU will not handle hardware interrupts, except NMI!)
  1023                                  	;
  1024 0000062B 30C0                    	xor	al, al		; Enable all hardware interrupts!
  1025 0000062D E621                    	out	21h, al		; (IBM PC-AT compatibility)
  1026 0000062F EB00                    	jmp 	$+2		; (All conventional PC-AT hardware
  1027 00000631 E6A1                    	out	0A1h, al	;  interrupts will be in use.)	
  1028                                  				; (Even if related hardware component
  1029                                  				;  does not exist!)
  1030                                  	; Enable NMI 
  1031 00000633 B07F                    	mov	al, 7Fh		; Clear bit 7 to enable NMI (again)
  1032 00000635 E670                    	out  	70h, al
  1033                                  	; 23/02/2015
  1034 00000637 90                      	nop
  1035 00000638 E471                    	in	al, 71h		; read in 71h just after writing out to 70h
  1036                                  				; for preventing unknown state (!?)
  1037                                  	;
  1038                                  	; Only a NMI can occur here... (Before a 'STI' instruction)
  1039                                  	;
  1040                                  	; 02/09/2014
  1041                                  	;xor	bx, bx
  1042                                  	; 24/07/2022
  1043 0000063A 31DB                    	xor	ebx, ebx
  1044 0000063C 66BA0002                	mov	dx, 0200h	; Row 2, column 0  ; 07/03/2015
  1045 00000640 E8DF1C0000              	call	_set_cpos	; 24/01/2016
  1046                                  
  1047                                  	; 14/11/2020 (TRDOS 386 v2.0.3)
  1048                                  	; Check VBE3 protected mode interface/feature(s)
  1049                                  
  1050                                  	;cmp	byte [vbe3], 3 ; 03h
  1051                                  	;jne	short display_mem_info
  1052                                  
  1053                                  	; 20/11/2020
  1054 00000645 803D[86090000]02        	cmp	byte [vbe3], 2 ; 02h
  1055 0000064C 7707                    	ja	short vbe3_pmid_chk
  1056                                  	;;jb	short display_mem_info
  1057                                  	;jb	display_mem_info ; 02/12/2020
  1058 0000064E 7220                    	jb	short jmp_display_mem_info ; 24/07/2022
  1059 00000650 E9EE010000              	jmp	check_boch_plex86_vbe
  1060                                  
  1061                                  vbe3_pmid_chk:	
  1062 00000655 B9EA7F0000              	mov	ecx, 32768 - (20+2) ; 32766 - PMInfoBlockSize
  1063 0000065A BE02000C00              	mov	esi, 0C0002h ; 1st word of the video bios rom is 0AA55h
  1064                                  	
  1065                                  chk_pmi_sign:
  1066                                  	;mov	eax, [esi] 
  1067                                  	;cmp	eax, 'PMID'
  1068                                  	; 30/11/2020
  1069                                  	;cmp	al, 'P'
  1070                                  	;jne	short chk_pmi_sign_next
  1071 0000065F 813E504D4944            	cmp	dword [esi], 'PMID'
  1072                                  	;je	short display_vbios_product_name
  1073 00000665 740E                    	je	short verify_pmib_chksum ; 15/11/2020
  1074                                  ;chk_pmi_sign_next:
  1075 00000667 46                      	inc	esi  ; inc si
  1076 00000668 E2F5                    	loop	chk_pmi_sign
  1077                                  
  1078                                  not_valid_pmib:
  1079 0000066A FE0D[86090000]          	dec	byte [vbe3] ; 2 = VBE2 compatible 
  1080                                  			    ; (vbe3 feature is defective in this vbios)
  1081                                  	;jmp	short display_mem_info
  1082                                  jmp_display_mem_info:	; 24/07/2022
  1083                                  	; 02/12/2020
  1084 00000670 E987010000              	jmp	display_mem_info
  1085                                  
  1086                                  verify_pmib_chksum:
  1087                                  	; 18/10/2023
  1088                                  	; (ATI RV370 video bios contains ZERO at Checksum offset.)
  1089 00000675 31C0                    	xor	eax, eax
  1090 00000677 384613                  	cmp	byte [esi+19], al ; 0 ; Checksum byte
  1091 0000067A 7611                    	jna	short skip_verify_pmib_chksum ; may be ATI video bios
  1092                                  	;cmp	dword [esi+16], 0C000h
  1093                                  	;	; CodeSegSel = 0C000h, InProtectMode = 0, Checksum = 0
  1094                                  	;je	short skip_verify_pmib_chksum ; may be ATI video bios
  1095                                  	; 18/10/2023
  1096                                  	; 15/11/2020
  1097                                  	;xor	eax, eax
  1098                                  	;;mov	ecx, eax 
  1099                                  	;mov	cl, 20
  1100 0000067C 66B91400                	mov	cx, 20 ; 30/11/2020
  1101 00000680 56                      	push	esi
  1102                                  pmib_sum_bytes:
  1103 00000681 AC                      	lodsb
  1104 00000682 00C4                    	add	ah, al
  1105 00000684 E2FB                    	loop	pmib_sum_bytes
  1106 00000686 5E                      	pop	esi
  1107 00000687 08E4                    	or	ah, ah
  1108 00000689 75DF                    	jnz	short not_valid_pmib ; AH must be 0
  1109                                  
  1110                                  	; 18/10/2023
  1111 0000068B 30C0                    	xor	al, al  ; eax = 0
  1112                                  
  1113                                  	; 28/02/2021
  1114                                  	; Set default (initial) truecolor bpp value to 32
  1115                                  	; (for VBE3 video bios.. because vbe3 video bioses
  1116                                  	;  use 32bpp -for truecolor modes- instead of 24bpp)
  1117                                  	; (This setting may be changed via 'sysvideo' bx=0908h)
  1118                                  
  1119                                  skip_verify_pmib_chksum: ; 18/10/2023
  1120                                  		
  1121 0000068D C605[4F750100]20        	mov	byte [truecolor], 32 ; (RGB: 00RRGGBBh)
  1122                                  
  1123                                  display_vbios_product_name: ; 14/11/2020
  1124                                  
  1125                                  	; ESI points to 'PMID' (0C0000h + 'PMID' offset)
  1126                                  
  1127                                  	; 15/11/2020
  1128                                  	;mov	[pmid_addr], si	; PMInfoBlock offset
  1129                                  	;		; (in VGA bios, 0C0000h + offset)
  1130                                  	; 02/12/2020
  1131                                  	;push	esi ; * pmid_addr
  1132 00000694 89F7                    	mov	edi, esi
  1133                                  
  1134                                  	;mov	esi, [VBE3INFOBLOCK+22] ; 097E00h + 16h
  1135                                  	;		; OemVendorNamePtr (seg16:off16)
  1136 00000696 8B35067E0900            	mov	esi, [VBE3INFOBLOCK+6] ; 097E00h + 06h
  1137                                  			; OemStringPtr (seg16:off16)
  1138                                  	; 18/10/2023
  1139                                  	;xor	al, al  ; eax = 0
  1140 0000069C 6696                    	xchg	ax, si	; ax = offset, si = 0
  1141 0000069E C1EE0C                  	shr	esi, 12 ; (to convert segment to base addr)
  1142 000006A1 6601C6                  	add	si, ax  ; esi has an address < 1 MB limit
  1143                                  			; (OemVendorName is in VBE3INFOBLOCK)
  1144                                  			; Example: 
  1145                                  			; TRDOS 386 v2.0.3 VESA VBE3 protected mode
  1146                                  			; interface development reference is ...
  1147                                  			; NVIDIA GeForce FX5500 VGA BIOS -C000h:029Ch-
  1148                                  			; Version 4.34.20.54.00 -C000h:02EDh- 	  
  1149                                  			; ((OemString is 'NVIDIA'))
  1150                                  			; ((OemVendorName is 'NVIDIA Corporation'))
  1151                                  			; ((OemProductName is 'NV34 Board - p162-1nz))
  1152                                  
  1153                                  	;mov	ah, 0Eh ; Black background, yellow forecolor
  1154                                  	; 30/11/2020
  1155 000006A4 B40C                    	mov	ah, 0Ch ; Black background, light red forecolor
  1156                                  
  1157 000006A6 E8873A0000              	call	print_kmsg
  1158                                  
  1159                                  	;mov	ah, 07h
  1160                                  
  1161 000006AB BE[31750100]            	mov	esi, vesa_vbe3_bios_msg
  1162                                  	;call	print_kmsg
  1163 000006B0 E8833A0000              	call	pkmsg_loop ; 30/11/2020
  1164                                  
  1165                                  	; 02/12/2020
  1166                                  	;pop	edi ; * pmid_addr
  1167                                  
  1168                                  ; 04/12/2023 - TRDOS 386 v2.0.7
  1169                                  %if 0
  1170                                  	; 24/07/2022
  1171                                  	; 29/11/2020
  1172                                  vbe3pminit:
  1173                                  	; 30/11/2020
  1174                                  	;cmp	byte [vbe3], 3 ; is VESA VBE3 PMI ready ?
  1175                                  	;jne	short di4
  1176                                  
  1177                                  	; Allocate 64KB contiguous (kernel) memory block
  1178                                  	xor	eax, eax
  1179                                  	mov	ecx, 65536
  1180                                  	call	allocate_memory_block
  1181                                  	;jc	short di4
  1182                                  	;jc	di0 ; 30/11/2020
  1183                                  	; 24/07/2022
  1184                                  	jnc	short vbe3pminit0
  1185                                  	jmp	di0
  1186                                  
  1187                                  vbe3pminit0:
  1188                                  	; of course this block must be in the 1st 16MB
  1189                                  	; because vbe3 pmi segments will be 16 bit segments
  1190                                  	; (80286 type segment descriptors in GDT)
  1191                                  
  1192                                  	mov	[vbe3bios_addr], eax
  1193                                  %endif
  1194                                  
  1195                                  	; 04/12/2023 - TRDOS 386 v2.0.7	; (+!*!+)
  1196                                  	; fixed PM-VBIOS address (no need to add a memory block)
  1197                                  	; in the reserved -and already allocated- area under 1MB
  1198                                  	; (purpose: to prevent page faults if memory size > 2.5GB)
  1199                                  	; ((User's page dir contains only the 1st 4MB of system mem
  1200                                  	; as PDE. So, this causes to page faults during an interrupt
  1201                                  	; in user mode, because if memory size > 2.5GB, kernel
  1202                                  	; page tables overs/passes 4MB limit and PM-VBIOS
  1203                                  	; is located after kernel page tables.))
  1204                                  vbe3pminit:
  1205 000006B5 B800000600              	mov	eax, VBE3BIOSCODE_ADDR ; 60000h	; (+!*!+)
  1206                                  
  1207                                  	; set [pmid_addr] to the new location
  1208 000006BA BE00000C00              	mov	esi, 0C0000h
  1209                                  
  1210                                  	; 30/11/2020
  1211 000006BF 29F7                    	sub	edi, esi ; izolate offset
  1212 000006C1 01C7                    	add	edi, eax ; new address
  1213 000006C3 893D[DC9E0100]          	mov	[pmid_addr], edi ; new 'PMID' location	
  1214                                  
  1215                                  	; Move VIDEO BIOS from 0C0000h to EAX
  1216 000006C9 B900400000              	mov	ecx, 65536/4
  1217 000006CE 89C7                    	mov	edi, eax ; 30/11/2020
  1218 000006D0 F3A5                    	rep	movsd
  1219                                  
  1220                                  	; 02/12/2020
  1221                                  	; 30/11/2020
  1222                                  	; set vbe3 segment selectors
  1223                                  
  1224                                  ; 04/12/2023 - TRDOS 386 v2.0.7	; (+!*!+)
  1225                                  %if 0
  1226                                  	; VBE3CS (VESA VBE3 video bios code segment)
  1227                                  	mov	edi, _vbe3_CS+2 ; base address bits 0..15
  1228                                  	stosw	; edi = _vbe3_CS+4
  1229                                  	ror	eax, 16
  1230                                  	mov	[edi], al ; base address, bits 16..23
  1231                                  
  1232                                  	; VBE3DS ('CodeSegSel' in PMInfoBlock)
  1233                                  	mov	edi, _vbe3_DS+4 ; base addr bits 16..23
  1234                                  	mov	[edi], al 
  1235                                  	rol	eax, 16
  1236                                  	mov	[edi-2], ax ; base address, bits 0..15
  1237                                  %endif
  1238                                  	; VBE3BDS (BIOSDataSel in PMInfoBlock)
  1239 000006D2 BF[4A650000]            	mov	edi, _vbe3_BDS+2 ; base addr bits 0..15
  1240 000006D7 B800700900              	mov	eax, VBE3BIOSDATABLOCK ; 1536 bytes
  1241 000006DC 66AB                    	stosw	; edi = _vbe3_BDS+4
  1242 000006DE C1E810                  	shr	eax, 16
  1243 000006E1 8807                    	mov	[edi], al ; base address, bits 16..23
  1244                                  
  1245                                  	; VBE3SS (1024 bytes)
  1246 000006E3 BF[72650000]            	mov	edi, _vbe3_SS+2 ; base addr bits 0..15
  1247 000006E8 B800600900              	mov	eax, VBE3STACKADDR ; size = 1024 bytes
  1248 000006ED 66AB                    	stosw	; edi = _vbe3_SS+4
  1249 000006EF C1E810                  	shr	eax, 16
  1250 000006F2 8807                    	mov	[edi], al ; base address, bits 16..23
  1251                                  
  1252                                  	; stack pointer (esp) will be set to 1020
  1253                                  	; (before VBE3 PMI call)
  1254                                  
  1255                                  	; VBE3ES (max: 2048 bytes)
  1256 000006F4 BF[7A650000]            	mov	edi, _vbe3_ES+2 ; base addr bits 0..15
  1257 000006F9 B800760900              	mov	eax, VBE3SAVERESTOREBLOCK
  1258 000006FE 66AB                    	stosw	; edi = _vbe3_ES+4
  1259 00000700 C1E810                  	shr	eax, 16
  1260 00000703 8807                    	mov	[edi], al ; base address, bits 16..23 	
  1261                                  
  1262                                  	;Note: low word of _VBE3_ES base address will be
  1263                                  	;      set -again- by VBE3 PMI caller routine 
  1264                                  
  1265                                  	; 09/12/2020
  1266                                  	;; set pmi32 (as VBE3 PMI is ready)
  1267                                  	;inc	byte [pmi32] ; = 1 
  1268                                  
  1269                                  	; KCODE16 (set PMI far return segment)
  1270 00000705 BF[82650000]            	mov	edi, _16bit_CS+2 ; base addr bits 0..15
  1271 0000070A B8[92070000]            	mov	eax, pminit_return_addr16
  1272 0000070F 66AB                    	stosw	; edi = _16bit_CS+4
  1273 00000711 C1E810                  	shr	eax, 16
  1274 00000714 8807                    	mov	[edi], al ; base address, bits 16..23 
  1275                                  
  1276                                  	; 30/11/2020
  1277                                  	; clear mem from VBE3 BIOS data area emu block
  1278                                  	; to end of vbe3 buffers
  1279                                  
  1280                                  	; 18/10/2023 - TRDOS v2.0.7
  1281                                  	; (VBE3BIOSDATABLOCK contains a copy of the 1st
  1282                                  	; 1536 bytes of the memory, IVT, ROMBIOS DATA etc.)
  1283                                  	; ((it must not be cleared here))
  1284                                  %if 0	
  1285                                  	; 01/12/2020
  1286                                  	mov	edi, VBE3BIOSDATABLOCK ; 97000h
  1287                                  	;mov	cx, (VBE3INFOBLOCK-VBE3BIOSDATABLOCK)/4
  1288                                  	;	; ecx = 3584/4 double words
  1289                                  	; 21/12/2020
  1290                                  	mov	cx, (VBE3MODEINFOBLOCK-VBE3BIOSDATABLOCK)/4
  1291                                  		; ecx = 3072/4 double words
  1292                                  	;xor	eax, eax
  1293                                  	xor	al, al
  1294                                  	rep	stosd
  1295                                  %endif
  1296                                  	; 18/10/2023 - TRDOS v2.0.7
  1297                                  	; (VBE3BIOSDATABLOCK contains a copy of the 1st
  1298                                  	; 1536 bytes of the memory, IVT, ROMBIOS DATA etc.)
  1299                                  	; ((it must not be cleared here))
  1300 00000716 BF00760900              	mov	edi, VBE3SAVERESTOREBLOCK ; 97600h
  1301 0000071B 66B98001                	mov	cx, (VBE3MODEINFOBLOCK-VBE3SAVERESTOREBLOCK)/4
  1302                                  		 ; ecx = 1536/4 = 384 double words
  1303                                  	;xor	eax, eax
  1304 0000071F 30C0                    	xor	al, al
  1305 00000721 F3AB                    	rep	stosd	
  1306                                  
  1307                                  	; Filling PMInfoBlock selector fields
  1308 00000723 8B3D[DC9E0100]          	mov	edi, [pmid_addr]
  1309 00000729 66C747083800            	mov	word [edi+PMInfo.BIOSDataSel], VBE3BDS
  1310 0000072F 66C7470A4000            	mov	word [edi+PMInfo.A0000Sel], VBE3A000
  1311 00000735 66C7470C4800            	mov	word [edi+PMInfo.B0000Sel], VBE3B000
  1312 0000073B 66C7470E5000            	mov	word [edi+PMInfo.B8000Sel], VBE3B800	
  1313 00000741 66C747105800            	mov	word [edi+PMInfo.CodeSegSel], VBE3DS
  1314 00000747 C6471201                	mov	byte [edi+PMInfo.InProtectMode], 1
  1315                                  
  1316                                  	; Calculate and write checksum byte
  1317 0000074B 89FE                    	mov	esi, edi
  1318 0000074D B113                    	mov	cl, PMInfo.size - 1
  1319                                  	;xor	ah, ah
  1320                                  pmid_chksum:
  1321 0000074F AC                      	lodsb	
  1322 00000750 00C4                    	add	ah, al
  1323 00000752 E2FB                    	loop	pmid_chksum
  1324 00000754 F6DC                    	neg	ah ; 1 -> 255, 255 -> 1
  1325 00000756 8826                    	mov	[esi], ah  ; checksum
  1326                                  
  1327                                  	; far call PM initialization
  1328                                  	; (VBE3 video bios will return via 'retf')
  1329                                  
  1330 00000758 668B4706                	mov	ax, [edi+PMInfo.PMInitialize]
  1331                                  	; 30/11/2020
  1332 0000075C C1E010                  	shl	eax, 16 ; save entry address in hw
  1333                                  	; ax = 0 
  1334                                  
  1335                                  	; 02/12/2020
  1336 0000075F 68[B6070000]            	push	pminit_ok ; normal, near return address
  1337                                  
  1338                                  	; 30/11/2020
  1339                                  _VBE3PMI_fcall:
  1340                                  	; ax = function, hw of eax = entry address
  1341 00000764 9C                      	pushf	; save 32 bit flags
  1342 00000765 56                      	push	esi ; *
  1343 00000766 55                      	push	ebp ; **
  1344                                  
  1345 00000767 89E5                    	mov	ebp, esp ; save 32 bit stack pointer
  1346                                  	
  1347 00000769 89C6                    	mov	esi, eax
  1348                                  
  1349 0000076B FA                      	cli
  1350                                  
  1351                                  	; Disable interrupts (clear interrupt flag)
  1352                                  	; Reset Interrupt MASK Registers (Master&Slave)
  1353 0000076C B0FF                    	mov	al, 0FFh	; mask off all interrupts
  1354 0000076E E621                    	out	21h, al		; on master PIC (8259)
  1355 00000770 EB00                    	jmp 	$+2  ; (delay)
  1356 00000772 E6A1                    	out	0A1h, al	; on slave PIC (8259)
  1357                                  
  1358                                  	; 02/12/2020
  1359 00000774 66B86000                	mov	ax, VBE3SS
  1360 00000778 8ED0                    	mov	ss, ax
  1361                                  	
  1362 0000077A BCFC030000              	mov	esp, 1020 ; 30/11/2020
  1363                                  
  1364                                  	; 01/12/2020
  1365                                  	;lss	esp, [stack16]
  1366                                  
  1367 0000077F C1E810                  	shr	eax, 16	; now, entry address is in lw
  1368                                  
  1369                                  	; 30/11/2020 - 16 bit pm selector test (OK)
  1370                                  	; (32 bit stack push/pop & retf with 32 bit code segment)
  1371                                  	; (16 bit stack push/pop with 16 bit code segment)
  1372                                  	
  1373                                  	; return
  1374                                  	;push	KCODE16
  1375                                  	;push	0 ; 30/11/2020 (pminit_return_addr16)
  1376                                  
  1377                                  	; 30/11/2020 (16 bit stack during retf from video bios)
  1378 00000782 C7042400007000          	mov	dword [esp], KCODE16 << 16
  1379                                  				; ip = 0, cs = KCODE16 
  1380                                  	; 01/12/2020
  1381                                  	;mov	dword [VBE3STACKADDR+1020], KCODE16*65536
  1382                                  
  1383                                  	;mov	[jumpfar16], eax
  1384                                  
  1385                                  	; 02/12/2020
  1386                                  	; 30/11/2020 (32 bit stack during retf from kernel)
  1387                                  	; far jump/call via retf
  1388 00000789 6A30                    	push	VBE3CS ; VBE3 video bios's code segment
  1389 0000078B 50                      	push	eax ; PMInitialize or EntryPoint
  1390                                  
  1391                                  	;mov	ax, si ; restore function
  1392                                  	; 24/07/2022
  1393 0000078C 89F0                    	mov	eax, esi
  1394                                  
  1395                                  	; 02/12/2020
  1396 0000078E 31F6                    	xor	esi, esi ; (not necessary, it is not used)
  1397                                  	
  1398 00000790 CB                      	retf 	; far return (to 16 bit code segment)
  1399                                  
  1400                                  	; 01/12/2020
  1401                                  	;db	0EAh  ; far jump to 16 bit code segment
  1402                                  ;jumpfar16:
  1403                                  	;dd	0		
  1404                                  	;dw	VBE3CS
  1405                                  
  1406                                  ;stack16:
  1407                                  	;dd	1020
  1408                                  	;dw	VBE3SS
  1409                                  
  1410 00000791 90                      	align 2	
  1411                                  
  1412                                  pminit_return_addr16:
  1413                                  	; 02/12/2020
  1414                                  	; 30/11/2020
  1415                                  	;;db	66h 		     ; Prefix for 32-bit
  1416                                  	;db	0EAh 		     ; Opcode for far jump
  1417                                  	;dd	pminit_return_addr32 ; 32 bit Offset
  1418                                  	;dw	KCODE		     ; 32 bit code segment
  1419                                  	; 01/12/2020
  1420 00000792 EA[99070000]0800        	jmp	KCODE:pminit_return_addr32
  1421                                  
  1422                                  pminit_return_addr32:
  1423                                  	; restore 32 bit kernel selectors and 32 bit stack addr
  1424 00000799 BE10000000              	mov	esi, KDATA
  1425 0000079E 8EDE                    	mov	ds, si
  1426 000007A0 8EC6                    	mov	es, si
  1427 000007A2 8ED6                    	mov	ss, si
  1428 000007A4 89EC                    	mov	esp, ebp  ; top of stack = iretd return addr
  1429                                  
  1430 000007A6 5D                      	pop	ebp ; **
  1431 000007A7 5E                      	pop	esi ; *
  1432 000007A8 9D                      	popf	; restore 32 bit flags
  1433                                  
  1434                                  	; enable interrupts
  1435                                  
  1436 000007A9 FA                      	cli
  1437                                  
  1438                                  	; 21/12/2020
  1439 000007AA 50                      	push	eax
  1440                                  
  1441 000007AB 30C0                    	xor	al, al	   ; Enable all hardware interrupts!
  1442 000007AD E621                    	out	21h, al	   ; (IBM PC-AT compatibility)
  1443 000007AF EB00                    	jmp 	$+2	   ; (All conventional PC-AT hardware
  1444 000007B1 E6A1                    	out	0A1h, al   ;  interrupts will be in use.)	
  1445                                  			   ; (Even if related hardware component
  1446                                  			   ;  does not exist!)
  1447 000007B3 58                      	pop	eax
  1448                                  	
  1449 000007B4 FB                      	sti
  1450                                  
  1451                                  	; top of stack = return address 
  1452                                  	; ('pminit_ok' for PMinit)
  1453                                  
  1454 000007B5 C3                      	retn
  1455                                  
  1456                                  pminit_ok:
  1457                                  	; 03/12/2020
  1458                                  	; (set [pmid_addr] to PMI entry point for next calls)
  1459 000007B6 8305[DC9E0100]04        	add	dword [pmid_addr], PMInfo.EntryPoint ; + 4
  1460                                  
  1461                                  	; 17/01/2021
  1462                                  	; copy EDID data from temporary location to final address
  1463 000007BD 803D[CA410000]4F        	cmp	byte [edid], 4Fh
  1464 000007C4 7510                    	jne	short vbe3h_chcl
  1465                                  	;mov	ecx, 32 ; 128 bytes, 32 dwords
  1466                                  	; 24/07/2022
  1467 000007C6 31C9                    	xor	ecx, ecx
  1468 000007C8 B120                    	mov	cl, 32
  1469 000007CA BE007D0900              	mov	esi, VBE3EDIDINFOBLOCK ; 97D00h
  1470 000007CF BF[549E0100]            	mov	edi, edid_info
  1471 000007D4 F3A5                    	rep	movsd
  1472                                  	; 17/01/2021
  1473                                  vbe3h_chcl:
  1474                                  	; 16/01/2021
  1475                                  	;; 06/12/2020
  1476                                  	;; Save video mode 03h regs/dac/bios state
  1477                                  	;
  1478                                  	;mov	ax, 4F04h ; VESA VBE Function 04h
  1479                                  	;		  ; Save/Restore State
  1480                                  	;sub	dl, dl	; 0 = return buffer size
  1481                                  	;mov	cx, 0Fh  ; ctrl/bios/dac/regs
  1482                                  	;
  1483                                  	;call	int10h_32bit_pmi
  1484                                   	;; bx = number of 64-byte blocks to hold the state buff
  1485                                  	;	
  1486                                  	;;mov	[vbe3stbufsize], bx
  1487                                  	;; 16/01/2021
  1488                                  	;or	word [vbe3stbsflags], 32768  ; set bit 15
  1489                                  	;mov	ax, bx
  1490                                  	;shl	ax, 6  ; * 64
  1491                                  	;mov	[vbestatebufsize+30], ax
  1492                                  	;
  1493                                  	;; 06/12/2020	
  1494                                  	;; check 'vbe3stbufsize' (it must be <= 32)
  1495                                  	;
  1496                                  	;cmp	bx, 32
  1497                                  	;ja	short display_mem_info ; light red forecolor
  1498                                  	;
  1499                                  	;; 16/01/2021
  1500                                  	;or	byte [vbe3stbsflags], 1 ; set bit 0
  1501                                  
  1502                                  	; 30/11/2020
  1503                                  	; Change VESA VBE3 BIOS text color in order to give
  1504                                  	; "VBE3 PMI initialization has been successed" meaning 	
  1505                                  
  1506 000007D6 BE40810B00              	mov	esi, 0B8000h + 160*2 ; row 2
  1507 000007DB 89F7                    	mov	edi, esi
  1508                                  vbe3h_chcl_next:
  1509 000007DD 66AD                    	lodsw
  1510 000007DF 80FC0C                  	cmp	ah, 0Ch	; light red forecolor
  1511 000007E2 7518                    	jne	short display_mem_info
  1512 000007E4 B40E                    	mov	ah, 0Eh ; yellow forecolor
  1513 000007E6 66AB                    	stosw
  1514 000007E8 EBF3                    	jmp	short vbe3h_chcl_next
  1515                                  
  1516                                  di5:
  1517                                  	; 18/10/2023 - TRDOS 386 v2.0.7
  1518                                  	; ATI RV370 Video BIOS (VESA VBE2)
  1519                                  	; has PMI. (as described in VESA VBE3 specification)
  1520                                  	;
  1521 000007EA FE05[86090000]          	inc	byte [vbe3]  ; [vbe3] = 2 -> 3
  1522                                  			; will be decreased to 2 again if 'PMID'
  1523                                  			; signature will not be found. 	
  1524 000007F0 E960FEFFFF              	jmp	vbe3_pmid_chk ; check for ATI Video BIOS
  1525                                  
  1526                                  di0:
  1527                                  	; 30/11/2020
  1528                                  	; Memory allocation error !
  1529 000007F5 C605[86090000]00        	mov	byte [vbe3], 0 ; disable VBE3
  1530                                  
  1531                                  display_mem_info:
  1532                                  	; 19/12/2020
  1533                                  	; temporary
  1534                                  	; 24/11/2023
  1535 000007FC 803D[86090000]02        	cmp	byte [vbe3], 2
  1536 00000803 7205                    	jb	short dmi
  1537 00000805 E844390000              	call	default_lfb_info
  1538                                  dmi:
  1539                                  	; 06/11/2014
  1540 0000080A E8CA380000              	call	memory_info
  1541                                  	; 14/08/2015
  1542                                  	;call	getch ; 28/02/2015
  1543                                  
  1544                                  	; 07/12/2023
  1545                                  	; check EDID info for LCD monitor -screen resolution-
  1546                                  	;	for modifying VGA mode 13h CRTC parameters
  1547                                  	;	(if it is needed or not)
  1548                                  
  1549 0000080F E82D010000              	call	video_mode_13h_parms
  1550                                  
  1551                                  drv_init:
  1552 00000814 FB                      	sti	; Enable Interrupts 
  1553                                  	; 06/02/2015
  1554 00000815 8B15[1E660000]          	mov	edx, [hd0_type] ; hd0, hd1, hd2, hd3
  1555 0000081B 668B1D[1C660000]        	mov	bx, [fd0_type] ; fd0, fd1
  1556                                  	; 22/02/2015
  1557 00000822 6621DB                  	and	bx, bx
  1558 00000825 756C                    	jnz	short di1
  1559                                  	;
  1560 00000827 09D2                    	or 	edx, edx
  1561 00000829 757A                    	jnz	short di2
  1562                                  	;
  1563                                  setup_error:
  1564 0000082B BE[2E3B0100]            	mov 	esi, setup_error_msg
  1565                                  psem:	
  1566 00000830 AC                      	lodsb
  1567 00000831 08C0                    	or	al, al
  1568                                  	;jz	short haltx ; 22/02/2015
  1569 00000833 747C                    	jz	short di3
  1570 00000835 56                      	push	esi
  1571                                  	; 13/05/2016
  1572 00000836 BB07000000              	mov	ebx, 7	; Black background, 
  1573                                  			; light gray forecolor
  1574                                  			; Video page 0 (BH=0)
  1575 0000083B E84C1A0000              	call	_write_tty
  1576 00000840 5E                      	pop	esi
  1577 00000841 EBED                    	jmp	short psem
  1578                                  
  1579                                  check_boch_plex86_vbe:
  1580                                  	; 20/10/2023
  1581                                  	; 18/10/2023
  1582                                  	; 20/11/2020
  1583                                  	; check Bochs/Plex86 VGABios VBE extension
  1584                                  	; (check if TRDOS 386 v2 is running on emulators)
  1585                                  	; BOCHS/QEMU/VIRTUALBOX
  1586                                  	;
  1587                                  	; ref: vbe_display_api.txt
  1588                                  
  1589                                  	; bochs/plex86 VGAbios VBE source code
  1590                                  	;  by Jeroen Janssen (2002)
  1591                                  	;  and Volker Ruppert (2003-2020)
  1592                                  
  1593                                  	; 20/10/2023
  1594                                  	; (ATI RV370 video bios has PMI support but
  1595                                  	; it is a VESA VBE2 bios. So, even if [vbe3] is set
  1596                                  	; to 3 for PMI functionality, it is better to display
  1597                                  	; VESA VBE number as it is declared by the video bios.)
  1598                                  
  1599 00000843 C605[3A750100]32        	mov	byte [vbe_vnumber], "2" ; 20/10/2023
  1600                                  
  1601 0000084A 29C0                    	sub	eax, eax ; 0
  1602 0000084C 66BACE01                	mov	dx, 1CEh ; VBE_DISPI_IOPORT_INDEX
  1603 00000850 66EF                    	out	dx, ax ; VBE_DISPI_INDEX_ID register
  1604                                  	;mov	ax, 0B0C0h ; VBE_DISPI_ID0
  1605                                  	;mov	dx, 1CFh ; VBE_DISPI_IOPORT_DATA
  1606 00000852 6642                    	inc	dx
  1607                                  	;out	dx, ax
  1608                                  	;nop
  1609 00000854 66ED                    	in	ax, dx
  1610 00000856 80FCB0                  	cmp	ah, 0B0h
  1611                                  	;jne	short not_boch_qemu_vbe
  1612                                  	; 18/10/2023
  1613                                  	;jne	short display_mem_info
  1614 00000859 758F                    	jne	short di5  ; ATI VESA VBE2 bios or another
  1615                                  
  1616 0000085B 3CC5                    	cmp	al, 0C5h ; it must be 0B0C4h or 0B0C5h ..
  1617                                  	;ja	short not_boch_qemu_vbe
  1618 0000085D 779D                    	ja	short display_mem_info
  1619 0000085F 3CC0                    	cmp	al, 0C0h ; 0B0C0h to 0B0C5h .. ; Qemu
  1620                                  	;cmp	al, 0C4h ; 0BC04h or 0B0C5h is OK ; Bochs
  1621                                  	;jb	short not_boch_qemu_vbe
  1622 00000861 7299                    	jb	short display_mem_info
  1623                                  
  1624                                  	; save VESA VBE2 bios (bochs/qemu) signature
  1625                                  	; for enabling VBE2 functions in TRDOS 386 v2 kernel
  1626 00000863 A2[87090000]            	mov	[vbe2bios], al ; 0C4h or 0C5h (for BOCHS) 
  1627                                  			       ; (0C0h-0C5h for QEMU)
  1628                                  	; 20/10/2023
  1629                                  	;mov	byte [vbe_vnumber], "2"
  1630                                  
  1631                                  	; 26/11/2020
  1632                                  	; "BOCHS/QEMU/VIRTUALBOX VBE2 Video BIOS ..".
  1633 00000868 BE[1C750100]            	mov	esi, vbe2_bochs_vbios ; BOCH/QEMU vbios msg
  1634 0000086D B40E                    	mov	ah, 0Eh  ; Yellow font
  1635 0000086F E8BE380000              	call	print_kmsg
  1636                                  	
  1637                                  	; this is not necessary ! (20/11/2020)
  1638 00000874 803D[87090000]C4        	cmp	byte [vbe2bios], 0C4h 
  1639                                  	;jb	display_mem_info	; (QEMU)
  1640                                  	; 02/12/2023
  1641 0000087B 720E                    	jb	short not_boch_qemu_vbe
  1642                                  
  1643                                  	; Display kernel version message if 0E9h hack port
  1644                                  	; is enabled (bochs emulator feature)
  1645 0000087D 66BAE900                	mov	dx, 0E9h ; hack port for BOCHS
  1646 00000881 BE[75750100]            	mov	esi, kernel_version_msg
  1647                                  kvmsg_next_char:
  1648 00000886 AC                      	lodsb	
  1649 00000887 08C0                    	or	al, al
  1650 00000889 7505                    	jnz	short put_kvmsg_in_hack_port
  1651                                  not_boch_qemu_vbe:
  1652 0000088B E96CFFFFFF               	jmp	display_mem_info
  1653                                  put_kvmsg_in_hack_port:	
  1654 00000890 EE                      	out	dx, al
  1655 00000891 EBF3                    	jmp	short kvmsg_next_char
  1656                                  
  1657                                  di1:
  1658                                  	; supress 'jmp short T6'
  1659                                  	;  (activate fdc motor control code)
  1660 00000893 66C705[E8090000]90-     	mov	word [T5], 9090h ; nop
  1660 0000089B 90                 
  1661                                  	;
  1662                                  	;mov	ax, int_0Eh	; IRQ 6 handler
  1663                                  	;mov	di, 0Eh*4	; IRQ 6 vector
  1664                                  	;stosw
  1665                                  	;mov 	ax, cs
  1666                                  	;stosw
  1667                                  	;; 16/02/2015
  1668                                          ;;mov     dword [DISKETTE_INT], fdc_int ; IRQ 6 handler
  1669                                  	;
  1670 0000089C E8C6450000              	CALL	DSKETTE_SETUP	; Initialize Floppy Disks
  1671                                  	;
  1672 000008A1 09D2                    	or	edx, edx
  1673 000008A3 740C                            jz      short di3
  1674                                  di2:
  1675 000008A5 E8F2450000              	call   	DISK_SETUP	; Initialize Fixed Disks
  1676                                          ;jc	setup_error
  1677                                  	; 24/07/2022
  1678 000008AA 7305                    	jnc	short di3
  1679 000008AC E97AFFFFFF              	jmp	setup_error
  1680                                  di3:
  1681 000008B1 E8F7370000              	call	setup_rtc_int	; 22/05/2015 (dsectrpm.s)
  1682                                  	;
  1683 000008B6 E809310100              	call	display_disks ; 07/03/2015  (Temporary)
  1684                                  ;haltx:
  1685                                  	; 14/08/2015
  1686                                  	;call	getch ; 22/02/2015
  1687                                  	;sti	; Enable interrupts (for CPU)
  1688                                  ;	; 29/01/2016
  1689                                  ;	sub	ah, ah ;  read time count
  1690                                  ;	call	int1Ah
  1691                                  ;	mov	edx, ecx ; 18.2 * seconds
  1692                                  ;md_info_msg_wait1:
  1693                                  ;	; 29/01/2016
  1694                                  ;	mov	ah, 1
  1695                                  ;	call	int16h
  1696                                  ;	jz	short md_info_msg_wait2
  1697                                  ;	xor	ah, ah ; 0
  1698                                  ;       call    int16h
  1699                                  ;	jmp 	short md_info_msg_ok
  1700                                  ;md_info_msg_wait2:
  1701                                  ;	sub	ah, ah  ; read time count
  1702                                  ;	call	int1Ah
  1703                                  ;	cmp	edx, ecx ; ; 18.2 * seconds
  1704                                  ;	jna	short md_info_msg_wait3
  1705                                  ;	xchg 	edx, ecx	
  1706                                  ;md_info_msg_wait3:
  1707                                  ;	sub	ecx, edx
  1708                                  ;	cmp	ecx, 127 ; 7 seconds (18.2 * 7)
  1709                                  ;	jb	short md_info_msg_wait1		
  1710                                  ;md_info_msg_ok:
  1711                                  
  1712                                  	; 15/12/2020
  1713                                  	; set initial values of LFB parameters
  1714                                  
  1715 000008BB 803D[86090000]02        	cmp	byte [vbe3], 2
  1716 000008C2 7225                    	jb	short di4
  1717                                  
  1718                                  	;mov	ax, [def_LFB_addr]
  1719                                  	;shl	eax, 16
  1720                                  	;mov	[LFB_ADDR], eax
  1721                                  	;mov	eax, 1024*768*3
  1722                                  	;mov	[LFB_SIZE], eax
  1723                                  
  1724 000008C4 BEFE7B0900              	mov	esi, VBE3MODEINFOBLOCK - 2
  1725 000008C9 66C7061801              	mov	word [esi], 0118h ; default vbe mode
  1726                                  				  ; 1024*768, 24bpp
  1727 000008CE E885300000              	call	set_lfbinfo_table
  1728                                  
  1729                                  	;;;
  1730                                  	; 28/11/2023
  1731                                  	; 20/10/2023 - TRDOS 386 v2.0.7
  1732 000008D3 8B35[E49E0100]          	mov	esi, [LFB_ADDR] ; LFB base address (in bytes)
  1733                                  	;mov	edx, [LFB_SIZE] ; 28/11/2023
  1734                                  	;add	edx, 4095
  1735                                  	;;;
  1736                                  	;mov	edx, ((1024*768*4)+4095)>>12 ; 28/11/2023
  1737 000008D9 BAE9070000              	mov	edx, ((1920*1080*4)+4095)>>12 ; 28/11/2023
  1738                                  	; edx = LFB size in pages
  1739                                  
  1740                                  	; 29/11/2023
  1741                                  	;mov	ebx, esi
  1742                                  	;;add	ebx, 4095 ; LFB start addr is always in page boundary
  1743                                  	;shr	ebx, 12	; convert byte address to page address
  1744 000008DE 8B0D[8C780100]          	mov	ecx, [memory_size]
  1745                                  	;cmp	ebx, ecx
  1746                                  	;jnb	short di4 ; LFB addr >= main memory size	
  1747                                  	
  1748                                  	; (set the overlapped pages as allocated for kernel)
  1749                                  	;;;
  1750                                  	; 28/11/2023
  1751                                  	; (and set all of LFB pages in the kernel's page tables)
  1752                                  
  1753 000008E4 E82E590000              	call	allocate_lfb_pages_for_kernel
  1754                                  di4:
  1755                                  	; 08/09/2016
  1756 000008E9 0F20C0                  	mov	eax, cr0
  1757 000008EC A810                    	test	al, 10h  ; Bit 4, ET (Extension Type)
  1758 000008EE 7408                    	jz	short sysinit
  1759                                  	; 27/02/2017
  1760 000008F0 FE05[40850100]          	inc	byte [fpready]
  1761                                  	; 80387 (FPU) is ready
  1762 000008F6 DBE3                    	fninit ; Initialize Floating-Point Unit
  1763                                  sysinit:
  1764                                  	; 30/06/2015
  1765 000008F8 E82D630000              	call	sys_init
  1766                                  	;
  1767                                  	;jmp 	cpu_reset ; 22/02/2015
  1768                                  hang:  
  1769                                  	; 23/02/2015
  1770                                  	;sti			; Enable interrupts
  1771 000008FD F4                      	hlt
  1772                                  	;
  1773                                  	;nop
  1774                                  	;; 03/12/2014
  1775                                  	;; 28/08/2014
  1776                                  	;mov	ah, 11h
  1777                                  	;call	getc
  1778                                  	;jz      _c8
  1779                                  	;
  1780                                  	; 23/02/2015
  1781                                  	; 06/02/2015
  1782                                  	; 07/09/2014
  1783 000008FE 31DB                    	xor	ebx, ebx
  1784 00000900 8A1D[B6780100]          	mov	bl, [ptty]	; active_page
  1785 00000906 89DE                    	mov	esi, ebx
  1786                                  	;shl 	si, 1
  1787                                  	; 24/07/2022
  1788 00000908 D1E6                    	shl	esi, 1
  1789 0000090A 81C6[B8780100]          	add	esi, ttychr
  1790 00000910 668B06                  	mov	ax, [esi]
  1791 00000913 6621C0                  	and	ax, ax
  1792                                  	;jz	short _c8
  1793 00000916 74E5                    	jz	short hang
  1794 00000918 66C7060000              	mov	word [esi], 0
  1795 0000091D 80FB03                  	cmp	bl, 3		; Video page 3
  1796                                  	;jb	short _c8
  1797 00000920 72DB                    	jb	short hang
  1798                                  	;	
  1799                                  	; 13/05/2016
  1800                                  	; 07/09/2014
  1801                                  nxtl:
  1802                                  	;push	bx
  1803                                  	; 18/04/2021
  1804 00000922 53                      	push	ebx
  1805 00000923 66BB0E00                	mov	bx, 0Eh 	; Yellow character 
  1806                                  				; on black background
  1807                                  				; bh = 0 (video page 0)
  1808                                  				; Retro UNIX 386 v1 - Video Mode 0
  1809                                  				; (PC/AT Video Mode 3 - 80x25 Alpha.)
  1810                                  	;push	ax
  1811                                  	; 18/04/2021
  1812 00000927 50                      	push	eax
  1813 00000928 E85F190000              	call 	_write_tty
  1814                                  	;pop	ax
  1815                                  	; 18/04/2021
  1816 0000092D 58                      	pop	eax
  1817                                  	;pop	bx
  1818 0000092E 5B                      	pop	ebx
  1819 0000092F 3C0D                    	cmp	al, 0Dh		; carriage return (enter)
  1820                                  	;jne	short _c8
  1821 00000931 75CA                    	jne	short hang
  1822 00000933 B00A                    	mov	al, 0Ah		; next line
  1823 00000935 EBEB                    	jmp	short nxtl
  1824                                  	
  1825                                  ;_c8:
  1826                                  ;	; 25/08/2014
  1827                                  ;	cli			; Disable interrupts
  1828                                  ;	mov	al, [scounter + 1]
  1829                                  ;	and	al, al
  1830                                  ;	jnz	hang
  1831                                  ;	call	rtc_p
  1832                                  ;	jmp     hang
  1833                                  
  1834                                  	; 27/08/2014
  1835                                  	; 20/08/2014
  1836                                  printk:
  1837                                          ;mov    edi, [scr_row]
  1838                                  pkl:
  1839 00000937 AC                      	lodsb
  1840 00000938 08C0                    	or 	al, al
  1841 0000093A 7404                    	jz	short pkr
  1842 0000093C 66AB                    	stosw
  1843 0000093E EBF7                    	jmp	short pkl
  1844                                  pkr:
  1845 00000940 C3                      	retn
  1846                                  
  1847                                  ; *************************************
  1848                                  video_mode_13h_parms:
  1849                                  	; 07/12/2023 - TRDOS 386 v2.0.7
  1850                                  	; Check EDID information for LCD monitors
  1851                                  	; and change mode 13h parameters if it is required
  1852                                  	; (if resolution > 1280x1024, it is LCD/panel monitor
  1853                                  	; and Video Mode 13h parameters will be modified for 60HZ
  1854                                  	; because LCD monitors does/can not display 320x200 70HZ
  1855                                  	; standard VGA mode)
  1856                                  
  1857 00000941 803D[CA410000]4F        	cmp	byte [edid], 4Fh
  1858 00000948 753B                    	jne	short CRT_monitor	
  1859                                  
  1860 0000094A BE[549E0100]            	mov	esi, edid_info
  1861 0000094F 83C626                  	add	esi, 26h ; EDID Standard Timing Identification
  1862 00000952 B908000000              	mov	ecx, 8
  1863                                  chk_edid:
  1864 00000957 66AD                    	lodsw
  1865 00000959 3C81                    	cmp	al, 129	; (1280/8)-31
  1866 0000095B 770E                    	ja	short LCD_monitor ; 16:9
  1867 0000095D 3C01                    	cmp	al, 1
  1868 0000095F 7624                    	jna	short CRT_monitor
  1869 00000961 E2F4                    	loop	chk_edid
  1870                                  	;jmp	short CRT_monitor
  1871 00000963 C3                      	retn
  1872                                  mode13h_crtc_60hz:
  1873 00000964 0B3EB9858FB8E2          	db	0Bh, 3Eh, 0B9h, 85h, 8Fh, 0B8h, 0E2h
  1874                                  LCD_monitor:
  1875                                  	; modify default (CRTC register) parameters for 60HZ
  1876                                  	; (320x200 letterbox type screen will appear on LCD screen)
  1877                                  	;
  1878                                  	; Note: When/While [PMI32] -protected mode video bios-
  1879                                  	;	feature is enabled -by user- for MODE 13h, internal
  1880                                  	;	(TRDOS 386) VGA -video mode setting- parameters
  1881                                  	;	will not be used (will be bypassed)
  1882                                  	;	by TRDOS 386 kernel for all standard VGA modes.
  1883                                  	;	((NVIDIA/ATI Video Bios PMI will be used.))
  1884                                  	;
  1885                                  	; 	ref: github, juj/60hz.cpp
  1886                                  	;	     https://gist.github.com/juj/
  1887                                  	;
  1888 0000096B B107                    	mov	cl, 7
  1889 0000096D BE[64090000]            	mov	esi, mode13h_crtc_60hz
  1890 00000972 BF[5A690000]            	mov	edi, vga_mode_13h+10+6 ; CRTC Registers (index: 6)
  1891 00000977 A4                      	movsb		; Vertical Total Register
  1892 00000978 A4                      	movsb		; Overflow Register
  1893 00000979 BF[64690000]            	mov	edi, vga_mode_13h+10+16 ; CRTC Regs (index: 16)
  1894 0000097E A4                      	movsb		; Vertical Retrace Start Register
  1895 0000097F A4                      	movsb		; Vertical Retrace End Register
  1896 00000980 A4                      	movsb		; Vertical Display Enable/End Register
  1897 00000981 47                      	inc	edi
  1898 00000982 47                      	inc	edi
  1899 00000983 A4                      	movsb		; Vertical Blanking Start Register
  1900 00000984 A4                      	movsb		; Vertical Blanking End Register		
  1901                                  CRT_monitor:
  1902 00000985 C3                      	retn
  1903                                  ; *************************************
  1904                                  
  1905                                  ; 14/11/2020 (TRDOS 386 v2.0.3)
  1906 00000986 00                      vbe3:	db 0  ; VESA VBE version (must be 03h)
  1907                                  	      ; for using video bios calls in protected mode
  1908                                  vbe2bios:
  1909 00000987 B0                      	db 0B0h ; 
  1910                                  ;pmid_addr: 		
  1911                                  	;dw 0  ; > 0 if 'PMID' sign is found 
  1912                                  	;     ;	('pmid' offset addr in VGA bios seg, 0C000h)
  1913                                  	;; 02/12/2020
  1914                                  	;dw 0	; 32 bit address in pmid_addr
  1915                                  		
  1916                                  ; 28/02/2017
  1917                                  ; 22/01/2017
  1918                                  ; 15/01/2017
  1919                                  ; 14/01/2017
  1920                                  ; 02/01/2017
  1921                                  ; 25/12/2016
  1922                                  ; 19/12/2016
  1923                                  ; 10/12/2016 (callback)
  1924                                  ; 06/06/2016
  1925                                  ; 23/05/2016
  1926                                  ; 22/05/2016 - TRDOS 386 (TRDOS v2.0) Timer Event Modifications
  1927                                  ; 25/07/2015
  1928                                  ; 14/05/2015 (multi tasking -time sharing- 'clock', x_timer)
  1929                                  ; 17/02/2015
  1930                                  ; 06/02/2015 (unix386.s)
  1931                                  ; 11/12/2014 - 22/12/2014 (dsectrm2.s) 
  1932                                  ;
  1933                                  ; IBM PC-XT Model 286 Source Code - BIOS2.ASM (06/10/85)
  1934                                  ;
  1935                                  ;-- HARDWARE INT  08 H - ( IRQ LEVEL 0 ) ---------------------------------------
  1936                                  ;	THIS ROUTINE HANDLES THE TIMER INTERRUPT FROM FROM CHANNEL 0 OF        :
  1937                                  ;	THE 8254 TIMER.  INPUT FREQUENCY IS 1.19318 MHZ AND THE DIVISOR        :
  1938                                  ;	IS 65536, RESULTING IN APPROXIMATELY 18.2 INTERRUPTS EVERY SECOND.     :
  1939                                  ;									       :
  1940                                  ;	THE INTERRUPT HANDLER MAINTAINS A COUNT (40:6C) OF INTERRUPTS SINCE    :
  1941                                  ;	POWER ON TIME, WHICH MAY BE USED TO ESTABLISH TIME OF DAY.	       :
  1942                                  ;	THE INTERRUPT HANDLER ALSO DECREMENTS THE MOTOR CONTROL COUNT (40:40)  :
  1943                                  ;	OF THE DISKETTE, AND WHEN IT EXPIRES, WILL TURN OFF THE 	       :
  1944                                  ;	DISKETTE MOTOR(s), AND RESET THE MOTOR RUNNING FLAGS.		       :
  1945                                  ;	THE INTERRUPT HANDLER WILL ALSO INVOKE A USER ROUTINE THROUGH	       :
  1946                                  ;	INTERRUPT 1CH AT EVERY TIME TICK.  THE USER MUST CODE A 	       :
  1947                                  ;	ROUTINE AND PLACE THE CORRECT ADDRESS IN THE VECTOR TABLE.	       :
  1948                                  ;-------------------------------------------------------------------------------
  1949                                  ;
  1950                                  
  1951                                  timer_int:	; IRQ 0
  1952                                  ;int_08h:	; Timer
  1953                                  	; 14/10/2015
  1954                                  	; Here, we are simulating system call entry (for task switch)
  1955                                  	; (If multitasking is enabled, 
  1956                                  	; 'clock' procedure may jump to 'sysrelease')
  1957                                  
  1958 00000988 1E                      	push	ds
  1959 00000989 06                      	push	es
  1960 0000098A 0FA0                    	push	fs
  1961 0000098C 0FA8                    	push	gs
  1962                                  
  1963 0000098E 60                      	pushad	; eax, ecx, edx, ebx, esp -before pushad-, ebp, esi, edi
  1964 0000098F 66B91000                	mov     cx, KDATA
  1965 00000993 8ED9                            mov     ds, cx
  1966 00000995 8EC1                            mov     es, cx
  1967 00000997 8EE1                            mov     fs, cx
  1968 00000999 8EE9                            mov     gs, cx
  1969                                  
  1970 0000099B 0F20D9                  	mov	ecx, cr3
  1971 0000099E 890D[2C910100]          	mov	[cr3reg], ecx ; save current cr3 register value/content
  1972                                  
  1973                                  	; 14/01/2017
  1974 000009A4 3B0D[88780100]          	cmp 	ecx, [k_page_dir]
  1975 000009AA 7409                    	je	short T3
  1976                                  
  1977 000009AC 8B0D[88780100]          	mov	ecx, [k_page_dir]
  1978 000009B2 0F22D9                  	mov	cr3, ecx
  1979                                  T3:
  1980                                  	;sti				; INTERRUPTS BACK ON
  1981 000009B5 66FF05[08790100]        	INC	word [TIMER_LOW]	; INCREMENT TIME
  1982 000009BC 7507                    	JNZ	short T4		; GO TO TEST_DAY
  1983 000009BE 66FF05[0A790100]        	INC	word [TIMER_HIGH]	; INCREMENT HIGH WORD OF TIME
  1984                                  T4:					; TEST_DAY
  1985 000009C5 66833D[0A790100]18      	CMP	word [TIMER_HIGH],018H	; TEST FOR COUNT EQUALING 24 HOURS
  1986 000009CD 7519                    	JNZ	short T5		; GO TO DISKETTE_CTL
  1987 000009CF 66813D[08790100]B0-     	CMP	word [TIMER_LOW],0B0H
  1987 000009D7 00                 
  1988 000009D8 750E                    	JNZ	short T5		; GO TO DISKETTE_CTL
  1989                                  
  1990                                  ;-----	TIMER HAS GONE 24 HOURS
  1991                                  	;;SUB	AX,AX
  1992                                  	;MOV	[TIMER_HIGH],AX
  1993                                  	;MOV	[TIMER_LOW],AX
  1994 000009DA 29C0                    	sub	eax, eax
  1995 000009DC A3[08790100]            	mov	[TIMER_LH], eax
  1996                                  	;	
  1997 000009E1 C605[0C790100]01        	MOV	byte [TIMER_OFL],1
  1998                                  
  1999                                  ;-----	TEST FOR DISKETTE TIME OUT
  2000                                  
  2001                                  T5:
  2002                                  	; 23/12/2014
  2003 000009E8 EB1D                    	jmp	short T6		; will be replaced with nop, nop
  2004                                  					; (9090h) if a floppy disk
  2005                                  					; is detected.
  2006                                  	;mov	al,[CS:MOTOR_COUNT]
  2007 000009EA A0[0F790100]            	mov	al, [MOTOR_COUNT]
  2008 000009EF FEC8                    	dec	al
  2009                                  	;mov	[CS:MOTOR_COUNT], al	; DECREMENT DISKETTE MOTOR CONTROL
  2010 000009F1 A2[0F790100]            	mov	[MOTOR_COUNT], al
  2011                                  	;mov	[ORG_MOTOR_COUNT], al
  2012 000009F6 750F                    	JNZ	short T6		; RETURN IF COUNT NOT OUT
  2013 000009F8 B0F0                    	mov 	al,0F0h
  2014                                  	;AND	[CS:MOTOR_STATUS],al 	; TURN OFF MOTOR RUNNING BITS
  2015 000009FA 2005[0E790100]          	and	[MOTOR_STATUS], al
  2016                                  	;and	[ORG_MOTOR_STATUS], al
  2017 00000A00 B00C                    	MOV	AL,0CH			; bit 3 = enable IRQ & DMA, 
  2018                                  					; bit 2 = enable controller
  2019                                  					;	1 = normal operation
  2020                                  					;	0 = reset	
  2021                                  					; bit 0, 1 = drive select
  2022                                  					; bit 4-7 = motor running bits 
  2023 00000A02 66BAF203                	MOV	DX,03F2H		; FDC CTL PORT
  2024 00000A06 EE                      	OUT	DX,AL			; TURN OFF THE MOTOR
  2025                                  T6:	
  2026                                  	;inc	word [CS:wait_count]	; 22/12/2014 (byte -> word)
  2027                                  					; TIMER TICK INTERRUPT
  2028                                  	;;inc	word [wait_count] ;;27/02/2015
  2029                                  	;INT	1CH			; TRANSFER CONTROL TO A USER ROUTINE
  2030                                  	;cli
  2031 00000A07 E855040000              	call 	u_timer			; TRANSFER CONTROL TO A USER ROUTINE
  2032                                  	; 23/05/2016
  2033 00000A0C E8CF150100              	call	clock			; Multi Tasking control procedure
  2034                                  T7:
  2035                                  	; 14/10/2015
  2036 00000A11 B020                    	MOV	AL,EOI			; GET END OF INTERRUPT MASK
  2037 00000A13 FA                      	CLI				; DISABLE INTERRUPTS TILL STACK CLEARED
  2038 00000A14 E620                    	OUT	INTA00,AL		; END OF INTERRUPT TO 8259 - 1	
  2039                                  	;
  2040                                  rtc_int_2:
  2041                                  	; 26/12/2016
  2042                                  	;mov	ecx, [cr3reg]
  2043                                  	; 13/01/2017
  2044 00000A16 803D[94900100]00        	cmp	byte [u.t_lock], 0  	; T_LOCK
  2045 00000A1D 7730                    	ja	short timer_int_return  ; Timer Lock : 'sysrele' is needed !
  2046                                  	; 28/02/2017
  2047                                  	; We need to exit if the user's IRQ callback service is in progress!
  2048                                  	; (To prevent a conflict!)
  2049 00000A1F 803D[98900100]00        	cmp	byte [u.r_lock], 0	; R_LOCK, IRQ callback service lock !
  2050 00000A26 7727                    	ja	short timer_int_return  ; Timer Lock : 'sysrele' is needed !	
  2051                                  	; 15/01/2017
  2052 00000A28 803D[14850100]02        	cmp	byte [priority], 2
  2053 00000A2F 733A                    	jnb	short T8  ; current process has a timer event (15/01/2017)
  2054                                  	; 22/05/2016
  2055 00000A31 803D[15850100]00        	cmp	byte [p_change], 0 ; in 'set_run_sequence', in 'rtc_p'
  2056 00000A38 7615                    	jna	short timer_int_return ; 23/05/2016
  2057                                  
  2058                                  	; 15/01/2017
  2059                                  	
  2060                                  	; present process must be changed with high priority process	
  2061                                  	;xor	al, al
  2062 00000A3A 31C0                    	xor	eax, eax ; 26/12/2016
  2063 00000A3C A2[15850100]            	mov	[p_change], al ; 0
  2064                                  	;mov	byte [priority], 2 ; 15/01/2017 (there is a timer event)
  2065                                  
  2066 00000A41 803D[14900100]FF        	cmp     byte [sysflg], 0FFh ; user or system space ?
  2067 00000A48 7416                    	je	short rtc_int_3     ; user space ([sysflg]= 0FFh)
  2068                                  
  2069                                  	; system space, wait for 'sysret'
  2070                                  	; to change running process 	
  2071                                  	; with high priority (event) process
  2072                                  
  2073 00000A4A A2[68900100]            	mov	[u.quant], al ; 0
  2074                                  
  2075                                  timer_int_return: ; 23/05/2016 - jump from 'rtc_int' ('rtc_int_2')
  2076 00000A4F 8B0D[2C910100]          	mov 	ecx, [cr3reg] 	; previous value/content of cr3 register
  2077 00000A55 0F22D9                   	mov	cr3, ecx	; restore cr3 register content
  2078                                  	;
  2079 00000A58 61                      	popad ; edi, esi, ebp, temp (icrement esp by 4), ebx, edx, ecx, eax
  2080                                  	;
  2081 00000A59 0FA9                    	pop	gs
  2082 00000A5B 0FA1                    	pop	fs
  2083 00000A5D 07                      	pop	es
  2084 00000A5E 1F                      	pop	ds
  2085                                  	;
  2086 00000A5F CF                      	iretd	; return from interrupt
  2087                                  
  2088                                  rtc_int_3:
  2089 00000A60 FE05[14900100]          	inc	byte [sysflg] 	; now, we are in system space
  2090                                  	;
  2091 00000A66 E90DC40000                      jmp     sysrelease ; change running process immediatelly 
  2092                                  
  2093                                  T8:
  2094                                  	; 13/01/2017 (eax -> ebx)
  2095                                  	; callback checking... (19/12/2016)
  2096 00000A6B 31DB                    	xor	ebx, ebx
  2097 00000A6D 871D[90900100]          	xchg	ebx, [u.tcb] ; callback address (0 = normal return)
  2098 00000A73 09DB                    	or	ebx, ebx
  2099 00000A75 74D8                    	jz	short timer_int_return
  2100                                  
  2101                                  	; Set user's callback routine as return address from this interrupt
  2102                                  	; and set normal return address as return address from callback
  2103                                  	; routine!!! (19/12/2016)
  2104                                  	
  2105                                  	; 14/01/2017
  2106                                  	; 13/01/2017 - Timer Lock (T_LOCK)
  2107 00000A77 FE05[94900100]          	inc	byte [u.t_lock]
  2108 00000A7D 8A0D[14900100]          	mov	cl, [sysflg]
  2109 00000A83 880D[95900100]          	mov	[u.t_mode], cl 
  2110                                  
  2111 00000A89 8B2D[24780100]          	mov	ebp, [tss.esp0] ; kernel stack address (for ring 0)
  2112 00000A8F 83ED14                  	sub	ebp, 20		; eip, cs, eflags, esp, ss
  2113 00000A92 892D[18900100]           	mov	[u.sp], ebp
  2114 00000A98 8925[1C900100]          	mov	[u.usp], esp
  2115                                  
  2116                                  	;or	word [ebp+8], 200h ; 22/01/2017, force enabling interrupts
  2117                                  
  2118 00000A9E 8B44241C                	mov	eax, [esp+28] ; pushed eax
  2119 00000AA2 A3[20900100]            	mov	[u.r0], eax
  2120                                  
  2121 00000AA7 E8A1020100              	call	wswap ; save user's registers & status
  2122                                  
  2123                                  	; software int is in ring 0 but timer int must return to ring 3
  2124                                  	; so, ring 3 return address and stack registers
  2125                                  	; (eip, cs, eflags, esp, ss) 
  2126                                  	; must be copied to timer int return
  2127                                  	; eip will be replaced by callback service routine address
  2128                                  
  2129 00000AAC C605[14900100]FF        	mov	byte [sysflg], 0FFh ; user mode
  2130                                  
  2131                                  	; system mode (system call)
  2132                                  	;mov	ebp, [u.sp] ; EIP (u), CS (UCODE), EFLAGS (u),
  2133                                  			    ; ESP (u), SS (UDATA)
  2134                                  
  2135 00000AB3 8B4510                  	mov	eax, [ebp+16]	; SS (UDATA
  2136 00000AB6 89E6                    	mov	esi, esp
  2137 00000AB8 50                      	push	eax
  2138 00000AB9 50                      	push	eax
  2139 00000ABA 89E7                    	mov	edi, esp
  2140 00000ABC 893D[1C900100]          	mov	[u.usp], edi
  2141 00000AC2 B908000000              	mov	ecx, ((ESPACE/4) - 4) ; except DS, ES, FS, GS
  2142 00000AC7 F3A5                    	rep	movsd
  2143 00000AC9 B104                    	mov	cl, 4	
  2144 00000ACB F3AB                    	rep	stosd
  2145 00000ACD 893D[18900100]          	mov	[u.sp], edi
  2146 00000AD3 89EE                    	mov	esi, ebp
  2147 00000AD5 B105                    	mov	cl, 5 ; EIP (u), CS (UCODE), EFLAGS (u), ESP (u), SS (UDATA)
  2148 00000AD7 F3A5                    	rep	movsd
  2149                                  
  2150 00000AD9 8B0D[78900100]          	mov	ecx, [u.pgdir]
  2151 00000ADF 890D[2C910100]          	mov	[cr3reg], ecx
  2152                                  
  2153                                  	; 13/01/207 (eax -> ebx)
  2154                                  	; EBX = callback routine address (virtual, not physical address!)
  2155                                  
  2156                                  	; 09/01/2017
  2157                                  	; !!! CALLBACK ROUTINE MUST BE ENDED/RETURNED WITH 'sysrele'
  2158                                  	;     system call !!!	
  2159                                  	; 25/12/2016
  2160                                  	; Callback Note: (19/12/2016)
  2161                                  	; !!! CALLBACK ROUTINE MUST BE ENDED/RETURNED WITH 'RETN' !!!
  2162                                  	;	pushf ; save flags	
  2163                                  	; 	<callback service code>
  2164                                  	; 	popf  ; restore flags
  2165                                  	; 	retn ; return to normal running address
  2166                                  	;
  2167                                  
  2168                                  	; 15/01/2017
  2169                                  	; 14/01/2017
  2170                                  	; 13/01/2017 (eax -> ebx)
  2171                                  	; 10/01/2017
  2172                                  set_callback_addr:
  2173                                  	; 09/01/2017 (**)
  2174                                  	; 02/01/2017 (*)
  2175                                  	; 25/12/2016 (*)
  2176                                  	; 19/12/2016 (TRDOS 386 feature only!)
  2177                                  	;
  2178                                  	; This routine sets return address
  2179                                  	; to start of user's interrupt
  2180                                  	; service (callback) address
  2181                                  	;; and sets callback 'retn' address to normal
  2182                                  	;; return address of user's running code! 
  2183                                  	;
  2184                                  	; INPUT:
  2185                                  	;	EBX = callback routine/service address
  2186                                  	;	      (virtual, not physical address!)	
  2187                                  	;	[u.sp] = kernel stack, points to
  2188                                  	;		 user's EIP,CS,EFLAGS,ESP,SS
  2189                                  	;		 registers.
  2190                                  	; OUTPUT:
  2191                                  	;	EIP (user) = callback (service) address
  2192                                  	;	CS (user) = UCODE
  2193                                  	;	EFLAGS (user) = flags before callback 	 
  2194                                  	;       ESP (user) = ESP-4 (user, before callback) 
  2195                                  	;	[ESP](user) = EIP (user) before callback
  2196                                  	;
  2197                                  	; Note: If CPU was in user mode while entering 
  2198                                  	;	the timer interrupt service routine,
  2199                                  	;	'IRET' will get return to callback routine
  2200                                  	;	immediately. If CPU was in system/kernel mode  
  2201                                  	;	'iret' will get return to system call and
  2202                                  	;	then, callback routine will be return address
  2203                                  	;	from system call. (User's callback/service code
  2204                                  	;	will be able to return to normal return address
  2205                                  	;	via an 'retn' at the end.) 
  2206                                  	;
  2207                                  	; Note(**): User's callback service code must be ended
  2208                                  	;	with a 'sysrele' sytstem call ! (09/01/2017)
  2209                                  	;
  2210                                  	;	For example:
  2211                                  	;
  2212                                  	;	timer_callback:
  2213                                  	;	    ...	 
  2214                                    	;	    inc	dword [time_counter]
  2215                                  	;	    ...
  2216                                  	;	    mov eax, 39 ; 'sysrele'
  2217                                  	;	    int 40h ; TRDOS 386 system call (interrupt)		
  2218                                  	;
  2219                                  	;
  2220                                  	;; Note(*): User's callback service code must preserve cpu 
  2221                                  	;;	flags if it has any instructions which changes
  2222                                  	;;	flags in the service code. (25/12/2016)
  2223                                  	;;
  2224                                  	;;	For example:
  2225                                  	;;
  2226                                  	;;	timer_callback:
  2227                                  	;;	    pushf ; save flags
  2228                                  	;;	    ; this instruction changes zero flag
  2229                                    	;;	    inc	dword [time_counter]
  2230                                  	;;	    popf ; restore flags
  2231                                  	;;	    retn ; return to normal user code
  2232                                  	;;		  (which is interrupted by the 
  2233                                  	;;		   timer interput) 	
  2234                                  	;;
  2235                                  
  2236                                  	; 15/01/2017
  2237 00000AE5 8B2D[18900100]          	mov	ebp, [u.sp]; kernel's stack, points to EIP (user)
  2238 00000AEB 895D00                  	mov	[ebp], ebx
  2239 00000AEE E95CFFFFFF              	jmp	timer_int_return
  2240                                  
  2241                                  	; 15/01/2017
  2242                                  	; 13/01/2017
  2243                                  	; 19/12/2016
  2244                                  	; 06/06/2016
  2245                                  	; 23/05/2016
  2246                                  	; 22/05/2016
  2247                                  	; 19/05/2016 - TRDOS 386 (TRDOS v2.0)
  2248                                  	; 26/02/2015
  2249                                  	; 07/09/2014
  2250                                  	; 25/08/2014
  2251                                  rtc_int:       ; Real Time Clock Interrupt (IRQ 8)
  2252                                  	; 22/05/2016
  2253 00000AF3 1E                      	push	ds ; ** ; 23/05/2016
  2254 00000AF4 50                      	push	eax ; *
  2255 00000AF5 66B81000                	mov	ax, KDATA
  2256 00000AF9 8ED8                    	mov	ds, ax
  2257                                  	;
  2258 00000AFB 8A25[06790100]          	mov	ah, [RTC_2Hz] ;  2 Hz interrupt to 1 Hz function
  2259 00000B01 80F401                  	xor	ah, 1
  2260 00000B04 8825[06790100]          	mov	[RTC_2Hz], ah ; 1 = 0.5 second, 0 = 1 second
  2261 00000B0A 753B                    	jnz	short rtc_int_return ; half second
  2262                                  	; 1 second
  2263                                  rtc_int_0:
  2264                                  	; 22/05/2016
  2265 00000B0C 58                      	pop	eax ; *
  2266                                  	;
  2267                                  	; 14/10/2015 ('timer_int')
  2268                                  	; Here, we are simulating system call entry (for task switch)
  2269                                  	; (If multitasking is enabled, 
  2270                                  	; 'clock' procedure may jump to 'sysrelease')
  2271                                  	;push	ds ; ** ; 23/05/2016
  2272 00000B0D 06                      	push	es
  2273 00000B0E 0FA0                    	push	fs
  2274 00000B10 0FA8                    	push	gs
  2275 00000B12 60                      	pushad  ; eax, ecx, edx, ebx, esp -before pushad-, ebp, esi, edi
  2276 00000B13 66B91000                	mov     cx, KDATA
  2277                                          ;mov    ds, cx ; 06/06/2016
  2278 00000B17 8EC1                            mov     es, cx
  2279 00000B19 8EE1                            mov     fs, cx
  2280 00000B1B 8EE9                            mov     gs, cx
  2281                                  	;
  2282 00000B1D 0F20D9                  	mov	ecx, cr3
  2283 00000B20 890D[2C910100]          	mov	[cr3reg], ecx ; save current cr3 register value/content
  2284                                  	;
  2285 00000B26 803D[94900100]00        	cmp	byte [u.t_lock], 0 ; timer lock (callback) status ?
  2286 00000B2D 7711                    	ja	short rtc_int_1	   ; yes
  2287                                  
  2288                                  	; 15/01/2017
  2289 00000B2F 3B0D[88780100]          	cmp 	ecx, [k_page_dir]
  2290 00000B35 7409                    	je	short rtc_int_1
  2291                                  
  2292 00000B37 8B0D[88780100]          	mov	ecx, [k_page_dir]
  2293 00000B3D 0F22D9                  	mov	cr3, ecx
  2294                                  rtc_int_1:
  2295                                  	; Timer event (kernel) functions must be performed with
  2296                                  	; 1 second intervals - TRDOS 386 (TRDOS v2.0) feature ! -
  2297                                   	;	
  2298                                  	; 25/08/2014
  2299 00000B40 E818030000              	call	rtc_p  ; 19/05/2016 - major modification 
  2300                                  	
  2301                                  	; 23/05/2016
  2302 00000B45 28E4                    	sub	ah, ah ; 0
  2303                                  	; 22/05/2016 - TRDOS 386 timer event modifications
  2304                                  rtc_int_return: ; 19/05/2016
  2305                                  	; 22/02/2015 - dsectpm.s
  2306                                  	; [ source: http://wiki.osdev.org/RTC ]
  2307                                  	; read status register C to complete procedure
  2308                                  	;(it is needed to get a next IRQ 8) 
  2309 00000B47 B00C                    	mov	al, 0Ch ; 
  2310 00000B49 E670                    	out	70h, al ; select register C
  2311 00000B4B 90                      	nop
  2312 00000B4C E471                    	in	al, 71h ; just throw away contents
  2313                                  	; 22/02/2015
  2314 00000B4E B020                    	MOV	AL,EOI		; END OF INTERRUPT
  2315                                  	;CLI			; DISABLE INTERRUPTS TILL STACK CLEARED
  2316 00000B50 E6A0                    	OUT	INTB00,AL	; FOR CONTROLLER #2
  2317                                  
  2318                                  	; 23/05/2016
  2319 00000B52 B020                    	MOV	AL,EOI		; GET END OF INTERRUPT MASK
  2320 00000B54 FA                      	CLI			; DISABLE INTERRUPTS TILL STACK CLEARED
  2321 00000B55 E620                    	OUT	INTA00,AL	; END OF INTERRUPT TO 8259 - 1	
  2322                                  	;
  2323                                  	; 23/05/2016
  2324 00000B57 20E4                    	and	ah, ah
  2325                                  	;jz	rtc_int_2
  2326                                  	; 24/07/2022
  2327 00000B59 7505                    	jnz	short rtc_int_4
  2328 00000B5B E9B6FEFFFF              	jmp	rtc_int_2
  2329                                  rtc_int_4:
  2330                                  	; ah = 1 (half second)
  2331 00000B60 58                      	pop	eax ; *
  2332 00000B61 1F                      	pop	ds  ; **
  2333 00000B62 CF                      	iretd
  2334                                  
  2335                                  ; ////////////////
  2336                                  
  2337                                  	; 28/08/2014
  2338                                  irq0:
  2339 00000B63 6A00                            push 	dword 0
  2340 00000B65 EB48                    	jmp	short which_irq
  2341                                  irq1:
  2342 00000B67 6A01                            push 	dword 1
  2343 00000B69 EB44                    	jmp	short which_irq
  2344                                  irq2:
  2345 00000B6B 6A02                            push 	dword 2
  2346 00000B6D EB40                    	jmp	short which_irq
  2347                                  irq3:
  2348                                  	; 20/11/2015
  2349                                  	; 24/10/2015
  2350 00000B6F 2EFF15[50210100]        	call	dword [cs:com2_irq3]
  2351 00000B76 6A03                    	push 	dword 3
  2352 00000B78 EB35                    	jmp	short which_irq
  2353                                  irq4:
  2354                                  	; 20/11/2015
  2355                                  	; 24/10/2015
  2356 00000B7A 2EFF15[4C210100]        	call	dword [cs:com1_irq4]
  2357 00000B81 6A04                            push 	dword 4
  2358 00000B83 EB2A                    	jmp	short which_irq
  2359                                  irq5:
  2360 00000B85 6A05                            push 	dword 5
  2361 00000B87 EB26                    	jmp	short which_irq
  2362                                  irq6:
  2363 00000B89 6A06                            push 	dword 6
  2364 00000B8B EB22                    	jmp	short which_irq
  2365                                  irq7:
  2366 00000B8D 6A07                            push 	dword 7
  2367 00000B8F EB1E                    	jmp	short which_irq
  2368                                  irq8:
  2369 00000B91 6A08                            push 	dword 8
  2370 00000B93 EB1A                    	jmp	short which_irq
  2371                                  irq9:
  2372 00000B95 6A09                            push 	dword 9
  2373 00000B97 EB16                    	jmp	short which_irq
  2374                                  irq10:
  2375 00000B99 6A0A                            push 	dword 10
  2376 00000B9B EB12                    	jmp	short which_irq
  2377                                  irq11:
  2378 00000B9D 6A0B                            push 	dword 11
  2379 00000B9F EB0E                    	jmp	short which_irq
  2380                                  irq12:
  2381 00000BA1 6A0C                            push 	dword 12
  2382 00000BA3 EB0A                    	jmp	short which_irq
  2383                                  irq13:
  2384 00000BA5 6A0D                            push 	dword 13
  2385 00000BA7 EB06                    	jmp	short which_irq
  2386                                  irq14:
  2387 00000BA9 6A0E                            push 	dword 14
  2388 00000BAB EB02                    	jmp	short which_irq
  2389                                  irq15:
  2390 00000BAD 6A0F                            push 	dword 15
  2391                                  	;jmp	short which_irq
  2392                                  
  2393                                  	; 22/01/2017
  2394                                  	; 19/10/2015
  2395                                  	; 29/08/2014
  2396                                  	; 21/08/2014
  2397                                  which_irq:
  2398 00000BAF 870424                  	xchg	eax, [esp]  ; 28/08/2014
  2399 00000BB2 53                      	push	ebx
  2400 00000BB3 56                      	push	esi
  2401 00000BB4 57                      	push	edi
  2402 00000BB5 1E                      	push 	ds
  2403 00000BB6 06                      	push 	es
  2404                                  	;
  2405 00000BB7 88C3                    	mov	bl, al
  2406                                  	;
  2407 00000BB9 B810000000              	mov	eax, KDATA
  2408 00000BBE 8ED8                    	mov	ds, ax
  2409 00000BC0 8EC0                    	mov	es, ax
  2410                                  	; 19/10/2015
  2411 00000BC2 FC                      	cld
  2412                                          ; 27/08/2014
  2413 00000BC3 8105[20380100]A000-             add     dword [scr_row], 0A0h
  2413 00000BCB 0000               
  2414                                  	;
  2415 00000BCD B417                    	mov	ah, 17h	; blue (1) background, 
  2416                                  			; light gray (7) forecolor
  2417 00000BCF 8B3D[20380100]                  mov     edi, [scr_row]
  2418 00000BD5 B049                    	mov	al, 'I'
  2419 00000BD7 66AB                    	stosw
  2420 00000BD9 B052                    	mov	al, 'R'
  2421 00000BDB 66AB                    	stosw
  2422 00000BDD B051                    	mov	al, 'Q'
  2423 00000BDF 66AB                    	stosw
  2424 00000BE1 B020                    	mov	al, ' '
  2425 00000BE3 66AB                    	stosw
  2426 00000BE5 88D8                    	mov	al, bl
  2427 00000BE7 3C0A                    	cmp	al, 10
  2428 00000BE9 7208                    	jb	short ii1
  2429 00000BEB B031                    	mov	al, '1'
  2430 00000BED 66AB                    	stosw
  2431 00000BEF 88D8                    	mov	al, bl
  2432 00000BF1 2C0A                    	sub	al, 10
  2433                                  ii1:
  2434 00000BF3 0430                    	add	al, '0'
  2435 00000BF5 66AB                    	stosw
  2436 00000BF7 B020                    	mov	al, ' '
  2437 00000BF9 66AB                    	stosw
  2438 00000BFB B021                    	mov	al, '!'
  2439 00000BFD 66AB                    	stosw
  2440 00000BFF B020                    	mov	al, ' '
  2441 00000C01 66AB                    	stosw
  2442                                  	; 23/02/2015
  2443 00000C03 80FB07                  	cmp	bl, 7 ; check for IRQ 8 to IRQ 15 
  2444 00000C06 7604                    	jna	ii2
  2445                                  	; 22/01/2017
  2446 00000C08 B020                    	mov	al, 20h  ; END OF INTERRUPT COMMAND TO
  2447 00000C0A E6A0                    	out	0A0h, al ; the 2nd 8259
  2448                                  ii2:
  2449 00000C0C B020                    	mov	al, 20h  ; END OF INTERRUPT COMMAND TO
  2450 00000C0E E620                    	out	20h, al ; the 2nd 8259
  2451 00000C10 E9CA010000              	jmp     iiret
  2452                                  	;
  2453                                  	; 22/08/2014
  2454                                  	;mov	al, 20h ; END OF INTERRUPT COMMAND TO 8259
  2455                                  	;out	20h, al	; 8259 PORT
  2456                                  	;
  2457                                  	;pop	es
  2458                                  	;pop	ds
  2459                                  	;pop	edi
  2460                                  	;pop	esi
  2461                                  	;pop	ebx
  2462                                  	;pop 	eax
  2463                                  	;iret
  2464                                  
  2465                                  	; 02/04/2015
  2466                                  	; 25/08/2014
  2467                                  exc0:
  2468 00000C15 6A00                            push 	dword 0
  2469 00000C17 E990000000                      jmp     cpu_except
  2470                                  exc1:
  2471 00000C1C 6A01                            push 	dword 1
  2472 00000C1E E989000000                      jmp     cpu_except
  2473                                  exc2:
  2474 00000C23 6A02                            push 	dword 2
  2475 00000C25 E982000000                      jmp     cpu_except
  2476                                  exc3:
  2477 00000C2A 6A03                            push 	dword 3
  2478 00000C2C EB7E                            jmp     cpu_except
  2479                                  exc4:
  2480 00000C2E 6A04                            push 	dword 4
  2481 00000C30 EB7A                            jmp     cpu_except
  2482                                  exc5:
  2483 00000C32 6A05                            push 	dword 5
  2484 00000C34 EB76                            jmp     cpu_except
  2485                                  exc6:
  2486 00000C36 6A06                            push 	dword 6
  2487 00000C38 EB72                            jmp     cpu_except
  2488                                  exc7:
  2489 00000C3A 6A07                            push 	dword 7
  2490 00000C3C EB6E                            jmp     cpu_except
  2491                                  exc8:
  2492                                  	; [esp] = Error code
  2493 00000C3E 6A08                            push 	dword 8
  2494 00000C40 EB5C                            jmp     cpu_except_en
  2495                                  exc9:
  2496 00000C42 6A09                            push 	dword 9
  2497 00000C44 EB66                            jmp     cpu_except
  2498                                  exc10:
  2499                                  	; [esp] = Error code
  2500 00000C46 6A0A                            push 	dword 10
  2501 00000C48 EB54                            jmp     cpu_except_en
  2502                                  exc11:
  2503                                  	; [esp] = Error code
  2504 00000C4A 6A0B                            push 	dword 11
  2505 00000C4C EB50                            jmp     cpu_except_en
  2506                                  exc12:
  2507                                  	; [esp] = Error code
  2508 00000C4E 6A0C                            push 	dword 12
  2509 00000C50 EB4C                            jmp     cpu_except_en
  2510                                  exc13:
  2511                                  	; [esp] = Error code
  2512 00000C52 6A0D                            push 	dword 13
  2513 00000C54 EB48                            jmp     cpu_except_en
  2514                                  exc14:
  2515                                  	; [esp] = Error code
  2516 00000C56 6A0E                            push 	dword 14
  2517 00000C58 EB44                    	jmp	short cpu_except_en
  2518                                  exc15:
  2519 00000C5A 6A0F                            push 	dword 15
  2520 00000C5C EB4E                            jmp     cpu_except
  2521                                  exc16:
  2522 00000C5E 6A10                            push 	dword 16
  2523 00000C60 EB4A                            jmp     cpu_except
  2524                                  exc17:
  2525                                  	; [esp] = Error code
  2526 00000C62 6A11                            push 	dword 17
  2527 00000C64 EB38                    	jmp	short cpu_except_en
  2528                                  exc18:
  2529 00000C66 6A12                            push 	dword 18
  2530 00000C68 EB42                    	jmp	short cpu_except
  2531                                  exc19:
  2532 00000C6A 6A13                            push 	dword 19
  2533 00000C6C EB3E                    	jmp	short cpu_except
  2534                                  exc20:
  2535 00000C6E 6A14                            push 	dword 20
  2536 00000C70 EB3A                    	jmp	short cpu_except
  2537                                  exc21:
  2538 00000C72 6A15                            push 	dword 21
  2539 00000C74 EB36                    	jmp	short cpu_except
  2540                                  exc22:
  2541 00000C76 6A16                            push 	dword 22
  2542 00000C78 EB32                    	jmp	short cpu_except
  2543                                  exc23:
  2544 00000C7A 6A17                            push 	dword 23
  2545 00000C7C EB2E                    	jmp	short cpu_except
  2546                                  exc24:
  2547 00000C7E 6A18                            push 	dword 24
  2548 00000C80 EB2A                    	jmp	short cpu_except
  2549                                  exc25:
  2550 00000C82 6A19                            push 	dword 25
  2551 00000C84 EB26                    	jmp	short cpu_except
  2552                                  exc26:
  2553 00000C86 6A1A                            push 	dword 26
  2554 00000C88 EB22                    	jmp	short cpu_except
  2555                                  exc27:
  2556 00000C8A 6A1B                            push 	dword 27
  2557 00000C8C EB1E                    	jmp	short cpu_except
  2558                                  exc28:
  2559 00000C8E 6A1C                            push 	dword 28
  2560 00000C90 EB1A                    	jmp	short cpu_except
  2561                                  exc29:
  2562 00000C92 6A1D                            push 	dword 29
  2563 00000C94 EB16                    	jmp	short cpu_except
  2564                                  exc30:
  2565 00000C96 6A1E                            push 	dword 30
  2566 00000C98 EB04                    	jmp	short cpu_except_en
  2567                                  exc31:
  2568 00000C9A 6A1F                            push 	dword 31
  2569 00000C9C EB0E                            jmp     short cpu_except
  2570                                  
  2571                                  	; 19/10/2015
  2572                                  	; 19/09/2015
  2573                                  	; 01/09/2015
  2574                                  	; 28/08/2015
  2575                                  	; 28/08/2014
  2576                                  cpu_except_en:
  2577 00000C9E 87442404                	xchg	eax, [esp+4] ; Error code
  2578 00000CA2 36A3[30920100]          	mov	[ss:error_code], eax
  2579 00000CA8 58                      	pop	eax  ; Exception number
  2580 00000CA9 870424                  	xchg	eax, [esp]
  2581                                  		; eax = eax before exception
  2582                                  		; [esp] -> exception number
  2583                                  		; [esp+4] -> EIP to return
  2584                                  	; 22/01/2017
  2585                                  	; 19/10/2015
  2586                                  	; 19/09/2015
  2587                                  	; 01/09/2015
  2588                                  	; 28/08/2015
  2589                                  	; 29/08/2014
  2590                                  	; 28/08/2014
  2591                                  	; 25/08/2014
  2592                                  	; 21/08/2014
  2593                                  cpu_except:	; CPU Exceptions
  2594 00000CAC FC                      	cld
  2595 00000CAD 870424                  	xchg	eax, [esp] 
  2596                                  		; eax = Exception number
  2597                                  		; [esp] = eax (before exception)	
  2598 00000CB0 53                      	push	ebx
  2599 00000CB1 56                      	push	esi
  2600 00000CB2 57                      	push	edi
  2601 00000CB3 1E                      	push 	ds
  2602 00000CB4 06                      	push 	es
  2603                                  	; 28/08/2015
  2604 00000CB5 66BB1000                	mov	bx, KDATA
  2605 00000CB9 8EDB                    	mov	ds, bx
  2606 00000CBB 8EC3                    	mov	es, bx
  2607 00000CBD 0F20DB                  	mov	ebx, cr3
  2608 00000CC0 53                      	push	ebx ; (*) page directory
  2609                                  	; 19/10/2015
  2610 00000CC1 FC                      	cld
  2611                                  	; 25/03/2015
  2612 00000CC2 8B1D[88780100]          	mov	ebx, [k_page_dir]
  2613 00000CC8 0F22DB                  	mov	cr3, ebx
  2614                                  	; 28/08/2015
  2615 00000CCB 83F80E                  	cmp	eax, 0Eh ; 14, PAGE FAULT	
  2616 00000CCE 7510                    	jne	short cpu_except_nfp
  2617 00000CD0 E88A4D0000              	call	page_fault_handler
  2618 00000CD5 21C0                    	and 	eax, eax
  2619                                  	;jz	iiretp ; 01/09/2015
  2620                                  	; 24/07/2022
  2621 00000CD7 7505                    	jnz	short cpu_except_pf
  2622 00000CD9 E9FD000000              	jmp	iiretp
  2623                                  cpu_except_pf:	; 24/07/2022
  2624 00000CDE B00E                    	mov	al, 0Eh ; 14
  2625                                  cpu_except_nfp:
  2626                                  	; 23/08/2016
  2627 00000CE0 803D[BE670000]03        	cmp	byte [CRT_MODE], 3
  2628 00000CE7 7409                    	je	short cpu_except_mode_3
  2629 00000CE9 50                      	push	eax
  2630 00000CEA B003                    	mov	al, 3
  2631 00000CEC E8490E0000              	call	_set_mode
  2632 00000CF1 58                      	pop	eax
  2633                                  cpu_except_mode_3:
  2634                                  	; 02/04/2015
  2635 00000CF2 BB[FD080000]            	mov	ebx, hang
  2636 00000CF7 875C241C                	xchg	ebx, [esp+28]
  2637                                  		; EIP (points to instruction which faults)
  2638                                  	  	; New EIP (hang)
  2639 00000CFB 891D[34920100]          	mov	[FaultOffset], ebx
  2640 00000D01 C744242008000000        	mov	dword [esp+32], KCODE ; kernel's code segment
  2641 00000D09 814C242400020000        	or	dword [esp+36], 200h ; enable interrupts (set IF)
  2642                                  	;
  2643 00000D11 88C4                    	mov	ah, al
  2644 00000D13 240F                    	and	al, 0Fh
  2645 00000D15 3C09                    	cmp	al, 9
  2646 00000D17 7602                    	jna	short h1ok
  2647 00000D19 0407                    	add	al, 'A'-':'
  2648                                  h1ok:
  2649 00000D1B C0EC04                  	shr	ah, 4
  2650 00000D1E 80FC09                  	cmp	ah, 9
  2651 00000D21 7603                    	jna	short h2ok
  2652 00000D23 80C407                  	add	ah, 'A'-':'
  2653                                  h2ok:	
  2654 00000D26 86E0                    	xchg 	ah, al	
  2655 00000D28 66053030                	add	ax, '00'
  2656 00000D2C 66A3[783A0100]          	mov	[excnstr], ax
  2657                                  	;
  2658                                  	; 29/08/2014
  2659 00000D32 A1[34920100]            	mov	eax, [FaultOffset]
  2660 00000D37 51                      	push	ecx
  2661 00000D38 52                      	push	edx
  2662 00000D39 89E3                    	mov	ebx, esp
  2663                                  	; 28/08/2015
  2664 00000D3B B910000000              	mov	ecx, 16	  ; divisor value to convert binary number
  2665                                  			  ; to hexadecimal string
  2666                                  	;mov	ecx, 10	    ; divisor to convert	
  2667                                  			    ; binary number to decimal string
  2668                                  b2d1:
  2669 00000D40 31D2                    	xor	edx, edx
  2670 00000D42 F7F1                    	div	ecx
  2671                                  	;push	dx
  2672                                  	; 18/04/2021
  2673 00000D44 52                      	push	edx
  2674 00000D45 39C8                    	cmp	eax, ecx
  2675 00000D47 73F7                    	jnb	short b2d1
  2676 00000D49 BF[833A0100]            	mov	edi, EIPstr ; EIP value
  2677                                  			    ; points to instruction which faults	
  2678                                  	; 28/08/2015
  2679 00000D4E 89C2                    	mov	edx, eax
  2680                                  b2d2:
  2681                                  	;add	al, '0'
  2682 00000D50 8A82[BA410000]          	mov	al, [edx+hexchrs]
  2683 00000D56 AA                      	stosb		    ; write hexadecimal digit to its place	
  2684 00000D57 39E3                    	cmp	ebx, esp
  2685 00000D59 7605                    	jna	short b2d3
  2686                                  	;pop	ax
  2687                                  	; 18/04/2021
  2688 00000D5B 58                      	pop	eax
  2689 00000D5C 88C2                    	mov	dl, al
  2690 00000D5E EBF0                    	jmp	short b2d2
  2691                                  b2d3:
  2692 00000D60 B068                    	mov 	al, 'h' ; 28/08/2015
  2693 00000D62 AA                      	stosb
  2694 00000D63 B020                    	mov	al, 20h	    ; space
  2695 00000D65 AA                      	stosb
  2696 00000D66 30C0                    	xor	al, al	    ; to do it an ASCIIZ string	
  2697 00000D68 AA                      	stosb
  2698                                  	;
  2699 00000D69 5A                      	pop	edx
  2700 00000D6A 59                      	pop	ecx
  2701                                  	;
  2702 00000D6B B44F                    	mov	ah, 4Fh	; red (4) background, 
  2703                                  			; white (F) forecolor
  2704 00000D6D BE[683A0100]            	mov	esi, exc_msg ; message offset
  2705                                  	;
  2706                                  	; 20/01/2017 (!cpu exception!)
  2707                                  	;
  2708 00000D72 8105[20380100]A000-             add	dword [scr_row], 0A0h
  2708 00000D7A 0000               
  2709 00000D7C 8B3D[20380100]                  mov	edi, [scr_row]
  2710                                  	;	
  2711 00000D82 C605[14900100]00        	mov	byte [sysflg], 0  ; system mode
  2712 00000D89 FB                              sti
  2713                                  	;
  2714 00000D8A E8A8FBFFFF              	call 	printk
  2715                                  	;
  2716 00000D8F B410                    	mov	ah, 10h
  2717 00000D91 E87D010000              	call	int16h ; getc
  2718                                  	;
  2719 00000D96 B003                    	mov	al, 3
  2720 00000D98 E89D0D0000              	call	_set_mode
  2721                                  	;
  2722                                  	;mov	eax, 1
  2723                                  	; 30/11/2023
  2724 00000D9D 31C0                    	xor	eax, eax
  2725 00000D9F 40                      	inc	eax
  2726                                  	; eax = 1	
  2727 00000DA0 E9EFC10000              	jmp	sysexit ; terminate process !!!
  2728                                  	
  2729                                  	; 22/01/2017
  2730                                  	; 18/04/2016
  2731                                  	; 28/08/2015
  2732                                  	; 23/02/2015
  2733                                  	; 20/08/2014
  2734                                  ignore_int:
  2735 00000DA5 50                      	push	eax
  2736 00000DA6 53                      	push	ebx ; 23/02/2015
  2737 00000DA7 56                      	push	esi
  2738 00000DA8 57                      	push	edi
  2739 00000DA9 1E                      	push 	ds
  2740 00000DAA 06                      	push 	es
  2741                                  	; 18/04/2016
  2742 00000DAB 66B81000                	mov	ax, KDATA
  2743 00000DAF 8ED8                    	mov	ds, ax
  2744 00000DB1 8EC0                    	mov	es, ax
  2745                                  	; 28/08/2015
  2746 00000DB3 0F20D8                  	mov	eax, cr3
  2747 00000DB6 50                      	push	eax ; (*) page directory
  2748                                  	;
  2749 00000DB7 B467                    	mov	ah, 67h	; brown (6) background, 
  2750                                  			; light gray (7) forecolor
  2751 00000DB9 BE[30390100]            	mov	esi, int_msg ; message offset
  2752                                  piemsg:
  2753                                          ; 27/08/2014
  2754 00000DBE 8105[20380100]A000-             add     dword [scr_row], 0A0h
  2754 00000DC6 0000               
  2755 00000DC8 8B3D[20380100]                  mov     edi, [scr_row]
  2756                                          ;
  2757 00000DCE E864FBFFFF              	call 	printk
  2758                                  	;
  2759                                  	; 23/02/2015
  2760 00000DD3 B020                    	mov	al, 20h  ; END OF INTERRUPT COMMAND TO
  2761 00000DD5 E6A0                    	out	0A0h, al ; the 2nd 8259
  2762                                  	; 22/08/2014
  2763 00000DD7 B020                    	mov	al, 20h ; END OF INTERRUPT COMMAND TO 8259
  2764 00000DD9 E620                    	out	20h, al	; 8259 PORT
  2765                                  iiretp: 
  2766                                  	; 22/01/2017
  2767                                  	; 01/09/2015
  2768                                  	; 28/08/2015
  2769 00000DDB 58                      	pop	eax ; (*) page directory
  2770 00000DDC 0F22D8                  	mov	cr3, eax
  2771                                  iiret:
  2772 00000DDF 07                      	pop	es
  2773 00000DE0 1F                      	pop	ds
  2774 00000DE1 5F                      	pop	edi
  2775 00000DE2 5E                      	pop	esi
  2776 00000DE3 5B                      	pop	ebx ; 29/08/2014
  2777 00000DE4 58                      	pop 	eax
  2778 00000DE5 CF                      	iretd
  2779                                  
  2780                                  	; 23/05/2016
  2781                                  	; 22/08/2014
  2782                                  	; IBM PC/AT BIOS source code ----- 10/06/85 (bios.asm)
  2783                                  	; (INT 1Ah)
  2784                                  	;; Linux (v0.12) source code (main.c) by Linus Torvalds (1991)
  2785                                  time_of_day:
  2786 00000DE6 E8CA560000              	call	UPD_IPR			; WAIT TILL UPDATE NOT IN PROGRESS
  2787 00000DEB 726F                            jc      short time_of_day_retn ; 23/05/2016
  2788 00000DED B000                    	mov	al, CMOS_SECONDS
  2789 00000DEF E8F7560000              	call	CMOS_READ
  2790 00000DF4 A2[F8780100]            	mov	[time_seconds], al 
  2791 00000DF9 B002                    	mov	al, CMOS_MINUTES
  2792 00000DFB E8EB560000              	call	CMOS_READ
  2793 00000E00 A2[F9780100]            	mov	[time_minutes], al 
  2794 00000E05 B004                    	mov	al, CMOS_HOURS
  2795 00000E07 E8DF560000              	call	CMOS_READ
  2796 00000E0C A2[FA780100]                    mov     [time_hours], al
  2797 00000E11 B006                    	mov	al, CMOS_DAY_WEEK 
  2798 00000E13 E8D3560000              	call	CMOS_READ
  2799 00000E18 A2[FB780100]            	mov	[date_wday], al
  2800 00000E1D B007                     	mov	al, CMOS_DAY_MONTH
  2801 00000E1F E8C7560000              	call	CMOS_READ
  2802 00000E24 A2[FC780100]            	mov	[date_day], al
  2803 00000E29 B008                    	mov	al, CMOS_MONTH
  2804 00000E2B E8BB560000              	call	CMOS_READ
  2805 00000E30 A2[FD780100]            	mov	[date_month], al
  2806 00000E35 B009                    	mov	al, CMOS_YEAR
  2807 00000E37 E8AF560000              	call	CMOS_READ
  2808 00000E3C A2[FE780100]            	mov	[date_year], al
  2809 00000E41 B032                    	mov	al, CMOS_CENTURY
  2810 00000E43 E8A3560000              	call	CMOS_READ
  2811 00000E48 A2[FF780100]            	mov	[date_century], al
  2812                                  	;
  2813 00000E4D B000                    	mov	al, CMOS_SECONDS
  2814 00000E4F E897560000              	call 	CMOS_READ
  2815 00000E54 3A05[F8780100]          	cmp	al, [time_seconds]
  2816 00000E5A 758A                    	jne	short time_of_day
  2817                                  
  2818                                  time_of_day_retn:
  2819 00000E5C C3                      	retn
  2820                                  
  2821                                  	; 15/01/2017
  2822                                  	; 10/06/2016
  2823                                  	; 07/06/2016
  2824                                  	; 06/06/2016
  2825                                  	; 23/05/2016
  2826                                  rtc_p:
  2827 00000E5D B101                    	mov	cl, 1 ; 15/01/2017
  2828 00000E5F EB02                    	jmp	short rtc_p0
  2829                                  u_timer: 
  2830                                  	; Timer Events with 18.2 Hz Timer Ticks
  2831                                  	; (and also timer events with RTC seconds)
  2832 00000E61 28C9                    	sub	cl, cl ; mov cl, 0 ; 15/01/2017
  2833                                  rtc_p0:
  2834                                  	; 19/05/2016 - TRDOS 386 (TRDOS v2.0)
  2835                                  	; Major Modification:
  2836                                  	; Check and Perform Timer Events (for RTC)
  2837                                  	; 25/08/2014 - 07/09/2014
  2838                                  	; Retro UNIX 386 v1:
  2839                                   	; Print Real Time Clock content
  2840                                  	
  2841                                  	; 15/01/2017
  2842 00000E63 880D[14850100]          	mov	byte [priority], cl ; 0 or 1 (not 2)
  2843 00000E69 8A2D[17850100]          	mov	ch, [timer_events]
  2844 00000E6F 20ED                    	and	ch, ch
  2845 00000E71 7420                    	jz	short rtc_p3
  2846                                  
  2847 00000E73 BE[30910100]            	mov	esi, timer_set  ; beginning address of
  2848                                  				; timer events space
  2849                                  rtc_p1:
  2850 00000E78 8B06                    	mov	eax, [esi]	
  2851 00000E7A 20C0                    	and	al, al ; 0 = free, >0 = process no.
  2852 00000E7C 7416                    	jz	short rtc_p4
  2853                                  	;
  2854 00000E7E C1C810                  	ror	eax, 16
  2855                                  	; ah = response value, al = interrupt type
  2856                                  	; 15/01/2017
  2857                                  	; cl = interrupt source
  2858                                  	;       1 = RTC, 0 = PIT  	 	
  2859 00000E81 38C8                    	cmp	al, cl 
  2860 00000E83 750A                    	jne	short rtc_p2 ; not as requested or undefined !
  2861 00000E85 3C01                    	cmp	al, 1 ; 1 ; RTC interrupt ?
  2862 00000E87 7410                    	je	short rtc_p5 ; yes, check for response
  2863                                  	; 06/06/2016 - 18.2 Hz Timer Ticks
  2864 00000E89 836E080A                	sub	dword [esi+8], 10 ; 1 tick = 10
  2865 00000E8D 7613                    	jna	short rtc_p6  ; continue for responding
  2866                                  rtc_p2:
  2867                                  	; 15/01/2017 (cl -> ch)
  2868                                  	; 07/06/2016
  2869 00000E8F FECD                    	dec	ch    ; remain count of timer events	
  2870 00000E91 7501                    	jnz	short rtc_p4
  2871                                  rtc_p3:	 
  2872 00000E93 C3                      	retn
  2873                                  rtc_p4:	
  2874                                  	;cmp	esi, timer_set + 240 ; 15*16 (last event)
  2875                                  	;jnb	short rtc_p3 ; end of timer event space
  2876 00000E94 83C610                  	add	esi, 16 ; next timer event
  2877 00000E97 EBDF                    	jmp	short rtc_p1
  2878                                  rtc_p5:	 
  2879                                  	; current timer count ; 06/06/2016 (182)
  2880 00000E99 816E08B6000000          	sub	dword [esi+8], 182 ; 1 second (10*18.2)
  2881 00000EA0 77ED                    	ja	short rtc_p2  ; check for the next 
  2882                                  rtc_p6:	
  2883                                  	; it is the time of response! 
  2884 00000EA2 8B5E04                  	mov	ebx, [esi+4] ; set (count limit) value
  2885 00000EA5 895E08                  	mov	[esi+8], ebx ; reset count down value
  2886                                  			     ; to count limit
  2887                                  	; 19/12/2016
  2888                                  	; 10/12/2016 - timer callback modification
  2889 00000EA8 8B7E0C                  	mov	edi, [esi+12] ; response (or callback) address	
  2890 00000EAB 807E0100                	cmp	byte [esi+1], 0 ; >0 = callback
  2891 00000EAF 762A                    	jna	short rtc_p8
  2892                                  
  2893                                  	; timer callback !
  2894 00000EB1 0FB61E                  	movzx	ebx, byte [esi] ; process number (>0)
  2895 00000EB4 89D8                    	mov	eax, ebx
  2896 00000EB6 C0E302                  	shl	bl, 2 ; *4
  2897 00000EB9 89BB[C08F0100]          	mov	[ebx+p.tcb-4], edi ; user's callback service addr
  2898 00000EBF 3A05[71900100]          	cmp	al, [u.uno]
  2899 00000EC5 7521                    	jne	short rtc_p9
  2900 00000EC7 893D[90900100]          	mov	[u.tcb], edi
  2901                                  rtc_p7:
  2902                                  	; 15/01/2017
  2903 00000ECD B002                    	mov	al, 2
  2904 00000ECF A2[14850100]            	mov	[priority], al ; 2
  2905                                  	; 10/01/2017
  2906                                  	;mov	byte [u.pri], 2
  2907 00000ED4 A2[6A900100]            	mov	[u.pri], al ; 2
  2908 00000ED9 EBB4                    	jmp	short rtc_p2
  2909                                  rtc_p8:
  2910                                  	; response address is physical address of
  2911                                  	; the program's response (signal return) byte
  2912                                  	; 06/06/2016
  2913                                  	;mov	edi, [esi+12] ; response address
  2914 00000EDB 8827                    	mov	[edi], ah     ; response value 
  2915                                  	;
  2916 00000EDD C1C010                  	rol	eax, 16
  2917                                  	; 15/01/2017
  2918 00000EE0 3A05[71900100]          	cmp	al, [u.uno] ; running process ?
  2919 00000EE6 74E5                    	je	short rtc_p7
  2920                                  rtc_p9:
  2921                                  	; al = process number  ; 10/06/2016
  2922 00000EE8 B202                    	mov	dl, 2 ; priority, 2 = event (high)	
  2923 00000EEA E8A6100100              	call	set_run_sequence ; 19/05/2016
  2924 00000EEF EB9E                    	jmp	short rtc_p2 ; 10/06/2016
  2925                                  
  2926                                  ; Default IRQ 7 handler against spurious IRQs (from master PIC)
  2927                                  ; 25/02/2015 (source: http://wiki.osdev.org/8259_PIC)
  2928                                  default_irq7:
  2929                                  	;push	ax
  2930                                  	; 18/04/2021
  2931 00000EF1 50                      	push	eax
  2932 00000EF2 B00B                    	mov	al, 0Bh  ; In-Service register
  2933 00000EF4 E620                    	out	20h, al
  2934 00000EF6 EB00                            jmp short $+2
  2935 00000EF8 EB00                    	jmp short $+2
  2936 00000EFA E420                    	in	al, 20h
  2937 00000EFC 2480                    	and 	al, 80h ; bit 7 (is it real IRQ 7 or fake?)
  2938 00000EFE 7404                            jz      short irq7_iret ; Fake (spurious) IRQ, do not send EOI 
  2939 00000F00 B020                            mov     al, 20h ; EOI
  2940 00000F02 E620                    	out	20h, al 
  2941                                  irq7_iret:
  2942                                  	;pop	ax
  2943                                  	; 18/04/2021
  2944 00000F04 58                      	pop	eax
  2945 00000F05 CF                      	iretd
  2946                                  	
  2947                                  bcd_to_ascii:
  2948                                  	; 25/08/2014
  2949                                  	; INPUT ->
  2950                                  	;	al = Packed BCD number
  2951                                  	; OUTPUT ->
  2952                                  	;	ax  = ASCII word/number
  2953                                  	;
  2954                                  	; Erdogan Tan - 1998 (proc_hex) - TRDOS.ASM (2004-2011)
  2955                                  	;
  2956 00000F06 D410                    	db	0D4h, 10h	; Undocumented inst. AAM
  2957                                  				; AH = AL / 10h
  2958                                  				; AL = AL MOD 10h
  2959 00000F08 660D3030                	or	ax, '00'	; Make it ASCII based
  2960                                  
  2961 00000F0C 86E0                            xchg	ah, al 
  2962                                  	
  2963 00000F0E C3                      	retn
  2964                                  
  2965                                  ; 15/12/2020
  2966                                  real_mem_16m_64k: 
  2967 00000F0F 0000                    	dw	0	; Real size of system memory (if > 16MB)
  2968                                  			; as number of 64K blocks - 256
  2969                                  			; (This is for saving real system memory
  2970                                  			; because if system memory is larger than
  2971                                  			; 3 GB and if a VESA VBE video bios
  2972                                  			; is detected, 'mem_16m_64K' may be
  2973                                  			; decreased to reserve LFB space 
  2974                                  			; at the end of system memory.)
  2975                                  			; Upper memory space from LFB base address
  2976                                  			; to 4GB will not be included by M.A.T.
  2977                                  def_LFB_addr:	
  2978 00000F11 0000                    	dw	0 	; HW of default LFB addr (for mode 118h)	
  2979                                  	
  2980                                  
  2981                                  %include 'keyboard.s' ; 07/03/2015
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.5 - keyboard.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 07/08/2022 (Previous: 12/04/2021)
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 17/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.15 (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> ; Ref: Retro UNIX 386 v1.2 - keyboard.s - 11/06/2022
    20                              <1> 
    21                              <1> ; Retro UNIX 386 v1 Kernel - KEYBOARD.INC
    22                              <1> ; Last Modification: 17/10/2015
    23                              <1> ;		    (Keyboard Data is in 'KYBDATA.INC')	
    24                              <1> ;
    25                              <1> ; ///////// KEYBOARD FUNCTIONS (PROCEDURES) ///////////////
    26                              <1> 
    27                              <1> ; 17/01/2016 (TRDOS 386 = TRDOS v2.0)
    28                              <1> 
    29                              <1> ; 03/12/2014
    30                              <1> ; 26/08/2014
    31                              <1> ; KEYBOARD I/O
    32                              <1> ; (INT_16h - Retro UNIX 8086 v1 - U9.ASM, 30/06/2014)
    33                              <1> 
    34                              <1> ;NOTE: 'k0' to 'k7' are name of OPMASK registers.
    35                              <1> ;	(The reason of using '_k' labels!!!) (27/08/2014)    
    36                              <1> ;NOTE: 'NOT' keyword is '~' unary operator in NASM.
    37                              <1> ;	('NOT LC_HC' --> '~LC_HC') (bit reversing operator)
    38                              <1> 
    39                              <1> int16h:	; 30/06/2015
    40                              <1> ;getc:
    41 00000F13 9C                  <1> 	pushfd	; 28/08/2014
    42 00000F14 0E                  <1> 	push 	cs
    43 00000F15 E826000000          <1> 	call 	KEYBOARD_IO_1 ; getc_int
    44 00000F1A C3                  <1> 	retn	
    45                              <1> 
    46                              <1> ; 24/07/2022 - TRDOS 386 v2.0.5
    47                              <1> 
    48                              <1> 	;-----	SHIFT STATUS
    49                              <1> _K3E:                                   ; GET THE EXTENDED SHIFT STATUS FLAGS
    50 00000F1B 8A25[8A670000]      <1> 	mov	ah, [KB_FLAG_1]		; GET SYSTEM SHIFT KEY STATUS
    51 00000F21 80E404              <1> 	and	ah, SYS_SHIFT		; MASK ALL BUT SYS KEY BIT
    52                              <1> 	;mov	cl, 5			; SHIFT THEW SYSTEMKEY BIT OVER TO
    53                              <1> 	;shl	ah, cl			; BIT 7 POSITION
    54 00000F24 C0E405              <1>         shl	ah, 5
    55 00000F27 A0[8A670000]        <1> 	mov	al, [KB_FLAG_1]		; GET SYSTEM SHIFT STATES BACK
    56 00000F2C 2473                <1> 	and	al, 01110011b		; ELIMINATE SYS SHIFT, HOLD_STATE AND INS_SHIFT
    57 00000F2E 08C4                <1> 	or	ah, al                  ; MERGE REMAINING BITS INTO AH
    58 00000F30 A0[8C670000]        <1> 	mov	al, [KB_FLAG_3]		; GET RIGHT CTL AND ALT
    59 00000F35 240C                <1> 	and	al, 00001100b		; ELIMINATE LC_E0 AND LC_E1
    60 00000F37 08C4                <1> 	or	ah, al			; OR THE SHIFT FLAGS TOGETHER
    61                              <1> _K3:
    62 00000F39 A0[89670000]        <1> 	mov	al, [KB_FLAG]		; GET THE SHIFT STATUS FLAGS
    63                              <1> 	; 24/07/2022
    64 00000F3E EB38                <1> 	jmp	short _KIO_EXIT		; RETURN TO CALLER
    65                              <1> 
    66                              <1> getc_int:
    67                              <1> 	; 28/02/2015
    68                              <1> 	; 03/12/2014 (derivation from pc-xt-286 bios source code -1986-, 
    69                              <1> 	;	      instead of pc-at bios - 1985-)
    70                              <1> 	; 28/08/2014 (_k1d)
    71                              <1> 	; 30/06/2014
    72                              <1> 	; 03/03/2014
    73                              <1> 	; 28/02/2014
    74                              <1> 	; Derived from "KEYBOARD_IO_1" procedure of IBM "pc-xt-286" 
    75                              <1> 	; rombios source code (21/04/1986)
    76                              <1> 	;	 'keybd.asm', INT 16H, KEYBOARD_IO
    77                              <1> 	;
    78                              <1> 	; KYBD --- 03/06/86  KEYBOARD BIOS
    79                              <1> 	;
    80                              <1> 	;--- INT 16 H -----------------------------------------------------------------
    81                              <1> 	; KEYBOARD I/O								      :
    82                              <1> 	;	THESE ROUTINES PROVIDE READ KEYBOARD SUPPORT			      :
    83                              <1> 	; INPUT									      :
    84                              <1> 	;	(AH)= 00H  READ THE NEXT ASCII CHARACTER ENTERED FROM THE KEYBOARD,   :
    85                              <1> 	;		   RETURN THE RESULT IN (AL), SCAN CODE IN (AH).              :
    86                              <1> 	;		   THIS IS THE COMPATIBLE READ INTERFACE, EQUIVALENT TO THE   :
    87                              <1> 	;                  STANDARD PC OR PCAT KEYBOARD				      :	
    88                              <1> 	;-----------------------------------------------------------------------------:
    89                              <1> 	;	(AH)= 01H  SET THE ZERO FLAG TO INDICATE IF AN ASCII CHARACTER IS     :
    90                              <1> 	;		   AVAILABLE TO BE READ FROM THE KEYBOARD BUFFER.	      :
    91                              <1> 	;		   (ZF)= 1 -- NO CODE AVAILABLE			              :
    92                              <1> 	;		   (ZF)= 0 -- CODE IS AVAILABLE  (AX)= CHARACTER              :
    93                              <1> 	;		   IF (ZF)= 0, THE NEXT CHARACTER IN THE BUFFER TO BE READ IS :
    94                              <1> 	;		   IN (AX), AND THE ENTRY REMAINS IN THE BUFFER.              :
    95                              <1> 	;		   THIS WILL RETURN ONLY PC/PCAT KEYBOARD COMPATIBLE CODES    :
    96                              <1> 	;-----------------------------------------------------------------------------:	
    97                              <1> 	;	(AH)= 02H  RETURN THE CURRENT SHIFT STATUS IN AL REGISTER             :
    98                              <1> 	;		   THE BIT SETTINGS FOR THIS CODE ARE INDICATED IN THE        :
    99                              <1> 	;		   EQUATES FOR @KB_FLAG		                              :
   100                              <1> 	;-----------------------------------------------------------------------------:	
   101                              <1> 	;	(AH)= 03H  SET TYPAMATIC RATE AND DELAY                               :
   102                              <1> 	;	      (AL) = 05H                                                      :
   103                              <1> 	;	      (BL) = TYPAMATIC RATE (BITS 5 - 7 MUST BE RESET TO 0)           :
   104                              <1> 	;		       							      :
   105                              <1> 	;                     REGISTER     RATE      REGISTER     RATE                :
   106                              <1> 	;                      VALUE     SELECTED     VALUE     SELECTED              :
   107                              <1> 	;                     --------------------------------------------            :
   108                              <1> 	;			00H        30.0        10H        7.5                 :
   109                              <1> 	;			01H        26.7        11H        6.7                 :
   110                              <1> 	;			02H        24.0        12H        6.0                 :
   111                              <1> 	;			03H        21.8        13H        5.5                 :
   112                              <1> 	;			04H        20.0        14H        5.0                 :
   113                              <1> 	;			05H        18.5        15H        4.6                 :
   114                              <1> 	;			06H        17.1        16H        4.3                 :
   115                              <1> 	;			07H        16.0        17H        4.0                 :
   116                              <1> 	;			08H        15.0        18H        3.7                 :
   117                              <1> 	;			09H        13.3        19H        3.3                 :
   118                              <1> 	;			0AH        12.0        1AH        3.0                 :
   119                              <1> 	;			0BH        10.9        1BH        2.7                 :
   120                              <1>         ;			0CH        10.0        1CH        2.5                 :
   121                              <1> 	;			0DH         9.2        1DH        2.3                 :
   122                              <1> 	;			0EH         8.6        1EH        2.1                 :
   123                              <1> 	;			0FH         8.0        1FH        2.0                 :
   124                              <1> 	;									      :
   125                              <1> 	;	      (BH) = TYPAMATIC DELAY  (BITS 2 - 7 MUST BE RESET TO 0)         :
   126                              <1> 	;		       							      :
   127                              <1> 	;                     REGISTER     DELAY                                      :
   128                              <1> 	;                      VALUE       VALUE                                      :
   129                              <1> 	;                     ------------------                                      :
   130                              <1> 	;			00H        250 ms                                     :
   131                              <1> 	;			01H        500 ms                                     :
   132                              <1> 	;			02H        750 ms                                     :
   133                              <1> 	;			03H       1000 ms                                     :
   134                              <1> 	;-----------------------------------------------------------------------------:
   135                              <1> 	;	(AH)= 05H  PLACE ASCII CHARACTER/SCAN CODE COMBINATION IN KEYBOARD    :
   136                              <1> 	;		   BUFFER AS IF STRUCK FROM KEYBOARD                          :
   137                              <1> 	;		   ENTRY:  (CL) = ASCII CHARACTER		              :
   138                              <1> 	;		           (CH) = SCAN CODE                                   :
   139                              <1> 	;		   EXIT:   (AH) = 00H = SUCCESSFUL OPERATION                  :
   140                              <1> 	;		           (AL) = 01H = UNSUCCESSFUL - BUFFER FULL            :
   141                              <1> 	;		   FLAGS:  CARRY IF ERROR                                     :
   142                              <1> 	;-----------------------------------------------------------------------------:		
   143                              <1> 	;	(AH)= 10H  EXTENDED READ INTERFACE FOR THE ENHANCED KEYBOARD,         :
   144                              <1> 	;		   OTHERWISE SAME AS FUNCTION AH=0                            :
   145                              <1> 	;-----------------------------------------------------------------------------:
   146                              <1> 	;	(AH)= 11H  EXTENDED ASCII STATUS FOR THE ENHANCED KEYBOARD,           :
   147                              <1> 	;		   OTHERWISE SAME AS FUNCTION AH=1                            :
   148                              <1> 	;-----------------------------------------------------------------------------:	
   149                              <1> 	;	(AH)= 12H  RETURN THE EXTENDED SHIFT STATUS IN AX REGISTER            :
   150                              <1> 	;		   AL = BITS FROM KB_FLAG, AH = BITS FOR LEFT AND RIGHT       :
   151                              <1> 	;		   CTL AND ALT KEYS FROM KB_FLAG_1 AND KB_FLAG_3              :
   152                              <1> 	; OUTPUT					                              :
   153                              <1> 	;	AS NOTED ABOVE, ONLY (AX) AND FLAGS CHANGED	                      :
   154                              <1> 	;	ALL REGISTERS RETAINED		                                      :
   155                              <1> 	;------------------------------------------------------------------------------
   156                              <1> 
   157                              <1> ; 07/08/2022
   158                              <1> ; 24/07/2022 - TRDOS 386 v2.0.5
   159                              <1> ; 12/04/2021 - TRDOS 386 v2.0.3 (32 bit push/pop)
   160                              <1> ; 15/01/2017
   161                              <1> ; 14/01/2017
   162                              <1> ; 02/01/2017
   163                              <1> ; 29/05/2016
   164                              <1> ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
   165                              <1> int32h:  ; Keyboard BIOS
   166                              <1> 
   167                              <1> KEYBOARD_IO_1:	
   168                              <1> 	;sti				; INTERRUPTS BACK ON
   169                              <1> 	; 29/05/2016
   170 00000F40 80642408BE          <1>         and     byte [esp+8], 10111110b ; clear zero flag and cary flag
   171                              <1> 	;
   172 00000F45 1E                  <1> 	push	ds			; SAVE CURRENT DS
   173 00000F46 53                  <1> 	push	ebx			; SAVE BX TEMPORARILY
   174                              <1> 	;push	ecx			; SAVE CX TEMPORARILY
   175 00000F47 66BB1000            <1>         mov     bx, KDATA
   176 00000F4B 8EDB                <1> 	mov	ds, bx			; PUT SEGMENT VALUE OF DATA AREA INTO DS
   177                              <1> 	; 14/01/2017
   178 00000F4D 8B1C24              <1> 	mov	ebx, [esp]
   179                              <1> 	;; 15/01/2017
   180                              <1> 	; 02/01/2017
   181                              <1> 	;;mov	byte [intflg], 32h	; keyboard interrupt 
   182 00000F50 FB                  <1> 	sti
   183                              <1> 	;
   184 00000F51 08E4                <1> 	or	ah, ah			; CHECK FOR (AH)= 00H
   185 00000F53 7433                <1> 	jz	short _K1		; ASCII_READ
   186 00000F55 FECC                <1> 	dec	ah                      ; CHECK FOR (AH)= 01H
   187 00000F57 744C                <1>         jz      short _K2               ; ASCII_STATUS
   188 00000F59 FECC                <1> 	dec	ah			; CHECK FOR (AH)= 02H
   189 00000F5B 74DC                <1>         jz	short _K3		; SHIFT STATUS
   190 00000F5D FECC                <1> 	dec	ah			; CHECK FOR (AH)= 03H	
   191 00000F5F 746F                <1>         jz      short _K300		; SET TYPAMATIC RATE/DELAY
   192 00000F61 80EC02              <1> 	sub	ah, 2			; CHECK FOR (AH)= 05H	
   193                              <1>         ;jz	short _K500		; KEYBOARD WRITE
   194                              <1> 	; 07/08/2022
   195 00000F64 7505                <1> 	jnz	short _KIO1
   196 00000F66 E988000000          <1> 	jmp	_K500         
   197                              <1> _KIO1:	
   198 00000F6B 80EC0B              <1> 	sub	ah, 11			; AH =  10H
   199 00000F6E 740C                <1> 	jz	short _K1E		; EXTENDED ASCII READ
   200 00000F70 FECC                <1> 	dec	ah			; CHECK FOR (AH)= 11H
   201 00000F72 7422                <1> 	jz	short _K2E		; EXTENDED_ASCII_STATUS
   202 00000F74 FECC                <1> 	dec	ah			; CHECK FOR (AH)= 12H
   203 00000F76 74A3                <1> 	jz	short _K3E		; EXTENDED_SHIFT_STATUS
   204                              <1> _KIO_EXIT:
   205                              <1> 	; 02/01/2017
   206 00000F78 FA                  <1> 	cli
   207                              <1> 	;;mov	byte [intflg], 0 ;; 15/01/2017
   208                              <1> 	;
   209                              <1> 	;pop	ecx			; RECOVER REGISTER
   210 00000F79 5B                  <1> 	pop	ebx			; RECOVER REGISTER
   211 00000F7A 1F                  <1> 	pop	ds			; RECOVER SEGMENT
   212 00000F7B CF                  <1> 	iretd				; INVALID COMMAND, EXIT
   213                              <1> 
   214                              <1> ; 24/07/2022
   215                              <1> ;
   216                              <1> ;	;-----	SHIFT STATUS
   217                              <1> ;_K3E:					; GET THE EXTENDED SHIFT STATUS FLAGS
   218                              <1> ;	mov	ah, [KB_FLAG_1]		; GET SYSTEM SHIFT KEY STATUS
   219                              <1> ;	and	ah, SYS_SHIFT		; MASK ALL BUT SYS KEY BIT
   220                              <1> ;	;mov	cl, 5			; SHIFT THEW SYSTEMKEY BIT OVER TO
   221                              <1> ;	;shl	ah, cl			; BIT 7 POSITION
   222                              <1> ;       shl	ah, 5
   223                              <1> ;	mov	al, [KB_FLAG_1]		; GET SYSTEM SHIFT STATES BACK
   224                              <1> ;	and	al, 01110011b		; ELIMINATE SYS SHIFT, HOLD_STATE AND INS_SHIFT
   225                              <1> ;	or	ah, al                  ; MERGE REMAINING BITS INTO AH
   226                              <1> ;	mov	al, [KB_FLAG_3]		; GET RIGHT CTL AND ALT
   227                              <1> ;	and	al, 00001100b		; ELIMINATE LC_E0 AND LC_E1
   228                              <1> ;	or	ah, al			; OR THE SHIFT FLAGS TOGETHER
   229                              <1> ;_K3:
   230                              <1> ;	mov	al, [KB_FLAG]		; GET THE SHIFT STATUS FLAGS
   231                              <1> ;	; 24/07/2022
   232                              <1> ;	jmp	short _KIO_EXIT		; RETURN TO CALLER
   233                              <1> 
   234                              <1> 	;-----	ASCII CHARACTER
   235                              <1> _K1E:	
   236 00000F7C E89F000000          <1> 	call	_K1S			; GET A CHARACTER FROM THE BUFFER (EXTENDED)
   237 00000F81 E812010000          <1> 	call	_KIO_E_XLAT		; ROUTINE TO XLATE FOR EXTENDED CALLS
   238 00000F86 EBF0                <1> 	jmp	short _KIO_EXIT         ; GIVE IT TO THE CALLER
   239                              <1> _K1:	
   240 00000F88 E893000000          <1> 	call	_K1S			; GET A CHARACTER FROM THE BUFFER
   241 00000F8D E811010000          <1> 	call	_KIO_S_XLAT		; ROUTINE TO XLATE FOR STANDARD CALLS
   242 00000F92 72F4                <1> 	jc	short _K1		; CARRY SET MEANS TROW CODE AWAY
   243                              <1> _K1A:
   244 00000F94 EBE2                <1> 	jmp	short _KIO_EXIT         ; RETURN TO CALLER
   245                              <1> 
   246                              <1> 	;-----	ASCII STATUS
   247                              <1> _K2E:	
   248 00000F96 E8D0000000          <1> 	call	_K2S			; TEST FOR CHARACTER IN BUFFER (EXTENDED)
   249 00000F9B 7420                <1> 	jz	short _K2B		; RETURN IF BUFFER EMPTY
   250 00000F9D 9C                  <1> 	pushf				; SAVE ZF FROM TEST
   251 00000F9E E8F5000000          <1> 	call	_KIO_E_XLAT		; ROUTINE TO XLATE FOR EXTENDED CALLS
   252 00000FA3 EB17                <1> 	jmp	short _K2A	        ; GIVE IT TO THE CALLER
   253                              <1> _K2:	
   254 00000FA5 E8C1000000          <1> 	call	_K2S			; TEST FOR CHARACTER IN BUFFER
   255 00000FAA 7411                <1> 	jz	short _K2B		; RETURN IF BUFFER EMPTY
   256 00000FAC 9C                  <1> 	pushf				; SAVE ZF FROM TEST
   257 00000FAD E8F1000000          <1> 	call	_KIO_S_XLAT		; ROUTINE TO XLATE FOR STANDARD CALLS
   258 00000FB2 7308                <1> 	jnc	short _K2A	        ; CARRY CLEAR MEANS PASS VALID CODE
   259 00000FB4 9D                  <1> 	popf				; INVALID CODE FOR THIS TYPE OF CALL
   260 00000FB5 E866000000          <1> 	call	_K1S			; THROW THE CHARACTER AWAY
   261 00000FBA EBE9                <1> 	jmp	short _K2		; GO LOOK FOR NEXT CHAR, IF ANY
   262                              <1> _K2A:
   263 00000FBC 9D                  <1> 	popf				; RESTORE ZF FROM TEST
   264                              <1> _K2B:
   265                              <1> 	; 02/01/2017
   266 00000FBD FA                  <1> 	cli
   267                              <1> 	;; mov	byte [intflg], 0 ;; 15/01/2017
   268                              <1> 	;
   269                              <1> 	;pop	ecx			; RECOVER REGISTER
   270 00000FBE 5B                  <1> 	pop	ebx			; RECOVER REGISTER
   271 00000FBF 1F                  <1> 	pop	ds			; RECOVER SEGMENT
   272                              <1> 	; (*) 29/05/2016
   273                              <1> 	; (*) retf 4			; THROW AWAY (e)FLAGS
   274 00000FC0 7208                <1> 	jc	short _k2d
   275 00000FC2 7505                <1> 	jnz	short _k2c
   276 00000FC4 804C240840          <1> 	or	byte [esp+8], 01000000b	; set zero flag bit of eflags register
   277                              <1> _k2c:
   278 00000FC9 CF                  <1> 	iretd
   279                              <1> _k2d:
   280                              <1> 	; 29/05/2016 -set carry flag on stack-
   281                              <1> 	; [esp] = EIP
   282                              <1> 	; [esp+4] = CS
   283                              <1> 	; [esp+8] = E-FLAGS
   284 00000FCA 804C240801          <1> 	or	byte [esp+8], 1  ; set carry bit of eflags register
   285                              <1> 	; [esp+12] = ESP (user)
   286                              <1> 	; [esp+16] = SS (User)
   287 00000FCF CF                  <1> 	iretd
   288                              <1> 	
   289                              <1> 	; (*) 29/05/2016 - 'retf 4' intruction causes to stack fault
   290                              <1> 	; (OUTER-PRIVILEGE-LEVEL)
   291                              <1> 	; INTEL 80386 PROGRAMMER'S REFERENCE MANUAL 1986
   292                              <1> 	; // RETF instruction:
   293                              <1> 	;
   294                              <1> 	; IF OperandMode=32 THEN
   295                              <1>  	;    Load CS:EIP from stack;
   296                              <1>  	;    Set CS RPL to CPL;
   297                              <1>  	;    Increment ESP by 8 plus the immediate offset if it exists;
   298                              <1>  	;    Load SS:ESP from stack;
   299                              <1>  	; ELSE (* OperandMode=16 *)
   300                              <1>  	;    Load CS:IP from stack;
   301                              <1>  	;    Set CS RPL to CPL;
   302                              <1>  	;    Increment SP by 4 plus the immediate offset if it exists;
   303                              <1> 	;    Load SS:SP from stack;
   304                              <1>  	; FI;
   305                              <1> 	;
   306                              <1> 	; //
   307                              <1> 
   308                              <1> 	; 24/07/2022
   309                              <1> 	;-----	SET TYPAMATIC RATE AND DELAY
   310                              <1> _K300:
   311 00000FD0 3C05                <1> 	cmp	al, 5			; CORRECT FUNCTION CALL?
   312 00000FD2 75A4                <1> 	jne	short _KIO_EXIT		; NO, RETURN
   313 00000FD4 F6C3E0              <1> 	test	bl, 0E0h		; TEST FOR OUT-OF-RANGE RATE
   314 00000FD7 759F                <1> 	jnz	short _KIO_EXIT		; RETURN IF SO
   315 00000FD9 F6C7FC              <1> 	test	bh, 0FCh		; TEST FOR OUT-OF-RANGE DELAY
   316 00000FDC 759A                <1> 	jnz	short _KIO_EXIT		; RETURN IF SO
   317 00000FDE B0F3                <1> 	mov	al, KB_TYPA_RD		; COMMAND FOR TYPAMATIC RATE/DELAY		
   318 00000FE0 E875060000          <1> 	call	SND_DATA		; SEND TO KEYBOARD	
   319                              <1> 	;mov	cx, 5			; SHIFT COUNT
   320                              <1> 	;shl	bh, cl			; SHIFT DELAY OVER
   321 00000FE5 C0E705              <1> 	shl	bh, 5
   322 00000FE8 88D8                <1> 	mov	al, bl			; PUT IN RATE
   323 00000FEA 08F8                <1> 	or	al, bh			; AND DELAY
   324 00000FEC E869060000          <1> 	call	SND_DATA		; SEND TO KEYBOARD	
   325 00000FF1 EB85                <1>         jmp     _KIO_EXIT               ; RETURN TO CALLER
   326                              <1> 
   327                              <1> 	;-----	WRITE TO KEYBOARD BUFFER
   328                              <1> _K500:
   329 00000FF3 56                  <1> 	push	esi			; SAVE SI (esi)
   330 00000FF4 FA                  <1> 	cli				; 
   331 00000FF5 8B1D[9A670000]      <1>      	mov	ebx, [BUFFER_TAIL]	; GET THE 'IN TO' POINTER TO THE BUFFER
   332 00000FFB 89DE                <1> 	mov	esi, ebx		; SAVE A COPY IN CASE BUFFER NOT FULL
   333 00000FFD E8D1000000          <1> 	call	_K4			; BUMP THE POINTER TO SEE IF BUFFER IS FULL
   334 00001002 3B1D[96670000]      <1> 	cmp	ebx, [BUFFER_HEAD]	; WILL THE BUFFER OVERRUN IF WE STORE THIS?
   335 00001008 740D                <1> 	je	short _K502		; YES - INFORM CALLER OF ERROR		
   336 0000100A 66890E              <1> 	mov	[esi], cx		; NO - PUT ASCII/SCAN CODE INTO BUFFER	
   337 0000100D 891D[9A670000]      <1> 	mov	[BUFFER_TAIL], ebx	; ADJUST 'IN TO' POINTER TO REFLECT CHANGE
   338 00001013 28C0                <1> 	sub	al, al			; TELL CALLER THAT OPERATION WAS SUCCESSFUL
   339 00001015 EB02                <1> 	jmp	short _K504		; SUB INSTRUCTION ALSO RESETS CARRY FLAG
   340                              <1> _K502:
   341 00001017 B001                <1> 	mov	al, 01h			; BUFFER FULL INDICATION
   342                              <1> _K504:
   343 00001019 FB                  <1> 	sti				
   344 0000101A 5E                  <1> 	pop	esi			; RECOVER SI (esi)
   345 0000101B E958FFFFFF          <1>         jmp     _KIO_EXIT               ; RETURN TO CALLER WITH STATUS IN AL
   346                              <1> 
   347                              <1> 	;-----	READ THE KEY TO FIGURE OUT WHAT TO DO -----
   348                              <1> _K1S:
   349 00001020 FA                  <1> 	cli	; 03/12/2014
   350 00001021 8B1D[96670000]      <1>         mov     ebx, [BUFFER_HEAD] 	; GET POINTER TO HEAD OF BUFFER
   351 00001027 3B1D[9A670000]      <1>         cmp     ebx, [BUFFER_TAIL] 	; TEST END OF BUFFER
   352                              <1> 	;jne	short _K1U		; IF ANYTHING IN BUFFER SKIP INTERRUPT
   353 0000102D 750F                <1> 	jne	short _k1x ; 03/12/2014
   354                              <1> 	;
   355                              <1> 	; 03/12/2014
   356                              <1> 	; 28/08/2014
   357                              <1> 	; PERFORM OTHER FUNCTION ?? here !
   358                              <1> 	;; MOV	AX, 9002h		; MOVE IN WAIT CODE & TYPE
   359                              <1> 	;; INT 	15H			; PERFORM OTHER FUNCTION
   360                              <1> _K1T:                                   ; ASCII READ
   361 0000102F FB                  <1> 	sti				; INTERRUPTS BACK ON DURING LOOP
   362 00001030 90                  <1> 	nop				; ALLOW AN INTERRUPT TO OCCUR
   363                              <1> _K1U:	
   364 00001031 FA                  <1> 	cli				; INTERRUPTS BACK OFF
   365 00001032 8B1D[96670000]      <1>         mov    	ebx, [BUFFER_HEAD] 	; GET POINTER TO HEAD OF BUFFER
   366 00001038 3B1D[9A670000]      <1>         cmp     ebx, [BUFFER_TAIL] 	; TEST END OF BUFFER
   367                              <1> _k1x:
   368 0000103E 53                  <1> 	push	ebx			; SAVE ADDRESS		
   369 0000103F 9C                  <1> 	pushf				; SAVE FLAGS
   370 00001040 E8C9060000          <1> 	call	MAKE_LED		; GO GET MODE INDICATOR DATA BYTE
   371 00001045 8A1D[8B670000]      <1> 	mov	bl, [KB_FLAG_2] 	; GET PREVIOUS BITS
   372 0000104B 30C3                <1> 	xor	bl, al			; SEE IF ANY DIFFERENT
   373 0000104D 80E307              <1> 	and	bl, 07h	; KB_LEDS	; ISOLATE INDICATOR BITS
   374 00001050 7406                <1> 	jz	short _K1V		; IF NO CHANGE BYPASS UPDATE
   375 00001052 E863060000          <1> 	call	SND_LED1
   376 00001057 FA                  <1> 	cli				; DISABLE INTERRUPTS
   377                              <1> _K1V:
   378 00001058 9D                  <1> 	popf				; RESTORE FLAGS
   379 00001059 5B                  <1> 	pop	ebx			; RESTORE ADDRESS
   380 0000105A 74D3                <1>         je      short _K1T              ; LOOP UNTIL SOMETHING IN BUFFER
   381                              <1> 	;
   382 0000105C 668B03              <1> 	mov	ax, [ebx] 		; GET SCAN CODE AND ASCII CODE
   383 0000105F E86F000000          <1>         call    _K4                     ; MOVE POINTER TO NEXT POSITION
   384 00001064 891D[96670000]      <1>         mov     [BUFFER_HEAD], ebx      ; STORE VALUE IN VARIABLE
   385 0000106A C3                  <1> 	retn				; RETURN
   386                              <1> 
   387                              <1> 	;-----	READ THE KEY TO SEE IF ONE IS PRESENT -----
   388                              <1> _K2S:
   389 0000106B FA                  <1> 	cli				; INTERRUPTS OFF
   390 0000106C 8B1D[96670000]      <1>         mov     ebx, [BUFFER_HEAD]      ; GET HEAD POINTER
   391 00001072 3B1D[9A670000]      <1>         cmp     ebx, [BUFFER_TAIL]      ; IF EQUAL (Z=1) THEN NOTHING THERE
   392 00001078 668B03              <1> 	mov	ax, [ebx]
   393 0000107B 9C                  <1> 	pushf				; SAVE FLAGS
   394                              <1> 	;push	ax			; SAVE CODE
   395                              <1> 	; 12/04/2021
   396 0000107C 50                  <1> 	push	eax
   397 0000107D E88C060000          <1> 	call	MAKE_LED		; GO GET MODE INDICATOR DATA BYTE
   398 00001082 8A1D[8B670000]      <1> 	mov	bl, [KB_FLAG_2] 	; GET PREVIOUS BITS
   399 00001088 30C3                <1> 	xor	bl, al			; SEE IF ANY DIFFERENT
   400 0000108A 80E307              <1> 	and	bl, 07h ; KB_LEDS	; ISOLATE INDICATOR BITS
   401 0000108D 7405                <1> 	jz	short _K2T		; IF NO CHANGE BYPASS UPDATE
   402 0000108F E80F060000          <1> 	call	SND_LED			; GO TURN ON MODE INDICATORS
   403                              <1> _K2T:
   404                              <1> 	;pop	ax			; RESTORE CODE
   405                              <1> 	; 12/04/2021
   406 00001094 58                  <1> 	pop	eax
   407 00001095 9D                  <1> 	popf				; RESTORE FLAGS
   408 00001096 FB                  <1> 	sti				; INTERRUPTS BACK ON
   409 00001097 C3                  <1> 	retn				; RETURN
   410                              <1> 
   411                              <1> 	;-----	ROUTINE TO TRANSLATE SCAN CODE PAIRS FOR EXTENDED CALLS -----
   412                              <1> _KIO_E_XLAT:
   413 00001098 3CF0                <1> 	cmp	al, 0F0h		; IS IT ONE OF THE FILL-INs?
   414 0000109A 7506                <1> 	jne	short _KIO_E_RET	; NO, PASS IT ON
   415 0000109C 08E4                <1>         or 	ah, ah			; AH = 0 IS SPECIAL CASE
   416 0000109E 7402                <1>         jz	short _KIO_E_RET        ; PASS THIS ON UNCHANGED
   417 000010A0 30C0                <1> 	xor	al, al			; OTHERWISE SET AL = 0
   418                              <1> _KIO_E_RET:				
   419 000010A2 C3                  <1> 	retn				; GO BACK
   420                              <1> 
   421                              <1> 	;-----	ROUTINE TO TRANSLATE SCAN CODE PAIRS FOR STANDARD CALLS -----
   422                              <1> _KIO_S_XLAT:
   423 000010A3 80FCE0              <1> 	cmp	ah, 0E0h		; IS IT KEYPAD ENTER OR / ?
   424 000010A6 750F                <1> 	jne	short _KIO_S2		; NO, CONTINUE
   425 000010A8 3C0D                <1> 	cmp	al, 0Dh			; KEYPAD ENTER CODE?
   426 000010AA 7408                <1>         je	short _KIO_S1		; YES, MASSAGE A BIT
   427 000010AC 3C0A                <1> 	cmp	al, 0Ah			; CTRL KEYPAD ENTER CODE?
   428 000010AE 7404                <1>         je	short _KIO_S1		; YES, MASSAGE THE SAME
   429 000010B0 B435                <1> 	mov	ah, 35h			; NO, MUST BE KEYPAD /
   430                              <1> _kio_ret: ; 03/12/2014
   431 000010B2 F8                  <1> 	clc
   432 000010B3 C3                  <1> 	retn
   433                              <1> 	;jmp	short _KIO_USE		; GIVE TO CALLER
   434                              <1> _KIO_S1:				
   435 000010B4 B41C                <1> 	mov	ah, 1Ch			; CONVERT TO COMPATIBLE OUTPUT
   436                              <1> 	;jmp	short _KIO_USE		; GIVE TO CALLER
   437 000010B6 C3                  <1> 	retn
   438                              <1> _KIO_S2:		
   439 000010B7 80FC84              <1> 	cmp	ah, 84h			; IS IT ONE OF EXTENDED ONES?
   440 000010BA 7715                <1> 	ja	short _KIO_DIS		; YES, THROW AWAY AND GET ANOTHER CHAR
   441 000010BC 3CF0                <1> 	cmp	al, 0F0h		; IS IT ONE OF THE FILL-INs?
   442 000010BE 7506                <1>         jne	short _KIO_S3		; NO, TRY LAST TEST
   443 000010C0 08E4                <1> 	or	ah, ah			; AH = 0 IS SPECIAL CASE
   444 000010C2 740C                <1>         jz	short _KIO_USE		; PASS THIS ON UNCHANGED
   445 000010C4 EB0B                <1> 	jmp	short _KIO_DIS		; THROW AWAY THE REST
   446                              <1> _KIO_S3:
   447 000010C6 3CE0                <1> 	cmp	al, 0E0h		; IS IT AN EXTENSION OF A PREVIOUS ONE?
   448                              <1> 	;jne	short _KIO_USE		; NO, MUST BE A STANDARD CODE
   449 000010C8 75E8                <1> 	jne	short _kio_ret
   450 000010CA 08E4                <1> 	or	ah, ah			; AH = 0 IS SPECIAL CASE
   451 000010CC 7402                <1>         jz	short _KIO_USE		; JUMP IF AH = 0
   452 000010CE 30C0                <1> 	xor	al, al			; CONVERT TO COMPATIBLE OUTPUT
   453                              <1> 	;jmp	short _KIO_USE		; PASS IT ON TO CALLER
   454                              <1> _KIO_USE:
   455                              <1> 	;clc				; CLEAR CARRY TO INDICATE GOOD CODE
   456 000010D0 C3                  <1> 	retn				; RETURN	
   457                              <1> _KIO_DIS:
   458 000010D1 F9                  <1> 	stc				; SET CARRY TO INDICATE DISCARD CODE
   459 000010D2 C3                  <1> 	retn				; RETURN
   460                              <1> 
   461                              <1> 	;-----	INCREMENT BUFFER POINTER ROUTINE -----
   462                              <1> _K4:    
   463 000010D3 43                  <1> 	inc     ebx
   464 000010D4 43                  <1> 	inc	ebx			; MOVE TO NEXT WORD IN LIST
   465 000010D5 3B1D[92670000]      <1>         cmp     ebx, [BUFFER_END] 	; AT END OF BUFFER?
   466                              <1>         ;jne    short _K5               ; NO, CONTINUE
   467 000010DB 7206                <1> 	jb	short _K5
   468 000010DD 8B1D[8E670000]      <1>         mov     ebx, [BUFFER_START]     ; YES, RESET TO BUFFER BEGINNING
   469                              <1> _K5:
   470 000010E3 C3                  <1> 	retn
   471                              <1> 
   472                              <1> ; 20/02/2015
   473                              <1> ; 05/12/2014
   474                              <1> ; 26/08/2014
   475                              <1> ; KEYBOARD (HARDWARE) INTERRUPT -  IRQ LEVEL 1
   476                              <1> ; (INT_09h - Retro UNIX 8086 v1 - U9.ASM, 07/03/2014)
   477                              <1> ;
   478                              <1> ; Derived from "KB_INT_1" procedure of IBM "pc-at" 
   479                              <1> ; rombios source code (06/10/1985)
   480                              <1> ; 'keybd.asm', HARDWARE INT 09h - (IRQ Level 1)
   481                              <1> 
   482                              <1> ; EQUATES (IBM PC-XT-286 BIOS, 1986, 'POSQEQU.INC')
   483                              <1> 
   484                              <1> ;--------- 8042 COMMANDS -------------------------------------------------------
   485                              <1> ENA_KBD		equ	0AEh		; ENABLE KEYBOARD COMMAND
   486                              <1> DIS_KBD		equ	0ADh		; DISABLE KEYBOARD COMMAND
   487                              <1> SHUT_CMD	equ	0FEh		; CAUSE A SHUTDOWN COMMAND
   488                              <1> ;--------- 8042 KEYBOARD INTERFACE AND DIAGNOSTIC CONTROL REGISTERS ------------
   489                              <1> STATUS_PORT	equ	064h		; 8042 STATUS PORT
   490                              <1> INPT_BUF_FULL	equ	00000010b 	; 1 = +INPUT BUFFER FULL
   491                              <1> PORT_A		equ	060h		; 8042 KEYBOARD SCAN CODE/CONTROL PORT
   492                              <1> ;---------- 8042 KEYBOARD RESPONSE ---------------------------------------------
   493                              <1> KB_ACK		equ	0FAh		; ACKNOWLEDGE PROM TRANSMISSION
   494                              <1> KB_RESEND	equ	0FEh		; RESEND REQUEST
   495                              <1> KB_OVER_RUN	equ	0FFh		; OVER RUN SCAN CODE
   496                              <1> ;---------- KEYBOARD/LED COMMANDS ----------------------------------------------
   497                              <1> KB_ENABLE	equ	0F4h		; KEYBOARD ENABLE
   498                              <1> LED_CMD		equ	0EDh		; LED WRITE COMMAND
   499                              <1> KB_TYPA_RD	equ	0F3h		; TYPAMATIC RATE/DELAY COMMAND
   500                              <1> ;---------- KEYBOARD SCAN CODES ------------------------------------------------
   501                              <1> NUM_KEY		equ	69		; SCAN CODE FOR	 NUMBER LOCK KEY
   502                              <1> SCROLL_KEY	equ	70		; SCAN CODE FOR	 SCROLL LOCK KEY
   503                              <1> ALT_KEY		equ	56		; SCAN CODE FOR	 ALTERNATE SHIFT KEY
   504                              <1> CTL_KEY		equ	29		; SCAN CODE FOR	 CONTROL KEY
   505                              <1> CAPS_KEY	equ	58		; SCAN CODE FOR	 SHIFT LOCK KEY
   506                              <1> DEL_KEY		equ	83		; SCAN CODE FOR	 DELETE KEY
   507                              <1> INS_KEY		equ	82		; SCAN CODE FOR	 INSERT KEY
   508                              <1> LEFT_KEY	equ	42		; SCAN CODE FOR	 LEFT SHIFT
   509                              <1> RIGHT_KEY	equ	54		; SCAN CODE FOR	 RIGHT SHIFT
   510                              <1> SYS_KEY		equ	84		; SCAN CODE FOR	 SYSTEM KEY
   511                              <1> ;---------- ENHANCED KEYBOARD SCAN CODES ---------------------------------------
   512                              <1> ID_1		equ	0ABh		; 1ST ID CHARACTER FOR KBX
   513                              <1> ID_2		equ	041h		; 2ND ID CHARACTER FOR KBX
   514                              <1> ID_2A		equ	054h		; ALTERNATE 2ND ID CHARACTER FOR KBX
   515                              <1> F11_M		equ	87		; F11 KEY MAKE
   516                              <1> F12_M		equ	88		; F12 KEY MAKE
   517                              <1> MC_E0		equ	224		; GENERAL MARKER CODE
   518                              <1> MC_E1		equ	225		; PAUSE KEY MARKER CODE
   519                              <1> ;---------- FLAG EQUATES WITHIN @KB_FLAG----------------------------------------
   520                              <1> RIGHT_SHIFT	equ	00000001b	; RIGHT SHIFT KEY DEPRESSED
   521                              <1> LEFT_SHIFT	equ	00000010b	; LEFT SHIFT KEY DEPRESSED
   522                              <1> CTL_SHIFT	equ	00000100b	; CONTROL SHIFT KEY DEPRESSED
   523                              <1> ALT_SHIFT	equ	00001000b	; ALTERNATE SHIFT KEY DEPRESSED
   524                              <1> SCROLL_STATE	equ	00010000b	; SCROLL LOCK STATE IS ACTIVE
   525                              <1> NUM_STATE	equ	00100000b	; NUM LOCK STATE IS ACTIVE
   526                              <1> CAPS_STATE	equ	01000000b	; CAPS LOCK STATE IS ACTIVE
   527                              <1> INS_STATE	equ	10000000b	; INSERT STATE IS ACTIVE
   528                              <1> ;---------- FLAG EQUATES WITHIN	@KB_FLAG_1 -------------------------------------
   529                              <1> L_CTL_SHIFT	equ	00000001b	; LEFT CTL KEY DOWN
   530                              <1> L_ALT_SHIFT	equ	00000010b	; LEFT ALT KEY DOWN
   531                              <1> SYS_SHIFT	equ	00000100b	; SYSTEM KEY DEPRESSED AND HELD
   532                              <1> HOLD_STATE	equ	00001000b	; SUSPEND KEY HAS BEEN TOGGLED
   533                              <1> SCROLL_SHIFT	equ	00010000b	; SCROLL LOCK KEY IS DEPRESSED
   534                              <1> NUM_SHIFT	equ	00100000b	; NUM LOCK KEY IS DEPRESSED
   535                              <1> CAPS_SHIFT	equ	01000000b	; CAPS LOCK KEY IS DEPRE55ED
   536                              <1> INS_SHIFT	equ	10000000b	; INSERT KEY IS DEPRESSED
   537                              <1> ;---------- FLAGS EQUATES WITHIN @KB_FLAG_2 -----------------------------------
   538                              <1> KB_LEDS		equ	00000111b	; KEYBOARD LED STATE BITS
   539                              <1> ;		equ	00000001b	; SCROLL LOCK INDICATOR
   540                              <1> ;		equ	00000010b	; NUM LOCK INDICATOR
   541                              <1> ;		equ	00000100b	; CAPS LOCK INDICATOR
   542                              <1> ;		equ	00001000b	; RESERVED (MUST BE ZERO)
   543                              <1> KB_FA		equ	00010000b	; ACKNOWLEDGMENT RECEIVED
   544                              <1> KB_FE		equ	00100000b	; RESEND RECEIVED FLAG
   545                              <1> KB_PR_LED	equ	01000000b	; MODE INDICATOR UPDATE
   546                              <1> KB_ERR		equ	10000000b	; KEYBOARD TRANSMIT ERROR FLAG
   547                              <1> ;----------- FLAGS EQUATES WITHIN @KB_FLAG_3 -----------------------------------
   548                              <1> LC_E1		equ	00000001b	; LAST CODE WAS THE E1 HIDDEN CODE
   549                              <1> LC_E0		equ	00000010b	; LAST CODE WAS THE E0 HIDDEN CODE
   550                              <1> R_CTL_SHIFT	equ	00000100b	; RIGHT CTL KEY DOWN
   551                              <1> R_ALT_SHIFT	equ	00001000b	; RIGHT ALT KEY DOWN
   552                              <1> GRAPH_ON	equ	00001000b	; ALT GRAPHICS KEY DOWN (WT ONLY)	
   553                              <1> KBX		equ	00010000b	; ENHANCED KEYBOARD INSTALLED
   554                              <1> SET_NUM_LK	equ	00100000b	; FORCE NUM LOCK IF READ ID AND KBX
   555                              <1> LC_AB		equ	01000000b	; LAST CHARACTER WAS FIRST ID CHARACTER
   556                              <1> RD_ID		equ	10000000b	; DOING A READ ID (MUST BE BIT0)
   557                              <1> ;
   558                              <1> ;----------- INTERRUPT EQUATES -------------------------------------------------
   559                              <1> EOI		equ	020h		; END OF INTERRUPT COMMAND TO 8259
   560                              <1> INTA00		equ	020h		; 8259 PORT
   561                              <1> 
   562                              <1> 
   563                              <1> kb_int:
   564                              <1> 
   565                              <1> ; 24/07/2022 - TRDOS 386 v2.0.5
   566                              <1> ; 12/04/2021 - TRDOS 386 v2.0.3 (32 bit push/pop)
   567                              <1> ; 17/10/2015 ('ctrlbrk') 
   568                              <1> ; 05/12/2014
   569                              <1> ; 04/12/2014 (derived from pc-xt-286 bios source code -1986-)
   570                              <1> ; 26/08/2014
   571                              <1> ;
   572                              <1> ; 03/06/86  KEYBOARD BIOS
   573                              <1> ;
   574                              <1> ;--- HARDWARE INT 09H -- (IRQ LEVEL 1) ------------------------------------------
   575                              <1> ;										;
   576                              <1> ;	KEYBOARD INTERRUPT ROUTINE						;
   577                              <1> ;										;
   578                              <1> ;--------------------------------------------------------------------------------
   579                              <1> 
   580                              <1> KB_INT_1:
   581 000010E4 FB                  <1> 	sti				; ENABLE INTERRUPTS
   582                              <1> 	;push	ebp
   583 000010E5 50                  <1> 	push	eax
   584 000010E6 53                  <1> 	push	ebx
   585 000010E7 51                  <1> 	push	ecx
   586 000010E8 52                  <1> 	push	edx
   587 000010E9 56                  <1> 	push	esi
   588 000010EA 57                  <1> 	push	edi
   589 000010EB 1E                  <1> 	push	ds
   590 000010EC 06                  <1> 	push	es
   591 000010ED FC                  <1> 	cld				; FORWARD DIRECTION
   592 000010EE 66B81000            <1> 	mov	ax, KDATA
   593 000010F2 8ED8                <1> 	mov	ds, ax
   594 000010F4 8EC0                <1> 	mov	es, ax
   595                              <1> 	;
   596                              <1> 	;-----	WAIT FOR KEYBOARD DISABLE COMMAND TO BE ACCEPTED
   597 000010F6 B0AD                <1> 	mov	al, DIS_KBD		; DISABLE THE KEYBOARD COMMAND
   598 000010F8 E84B050000          <1> 	call	SHIP_IT			; EXECUTE DISABLE
   599 000010FD FA                  <1> 	cli				; DISABLE INTERRUPTS
   600 000010FE B900000100          <1> 	mov	ecx, 10000h		; SET MAXIMUM TIMEOUT
   601                              <1> KB_INT_01:
   602 00001103 E464                <1> 	in	al, STATUS_PORT		; READ ADAPTER STATUS
   603 00001105 A802                <1> 	test	al, INPT_BUF_FULL	; CHECK INPUT BUFFER FULL STATUS BIT
   604 00001107 E0FA                <1> 	loopnz	KB_INT_01		; WAIT FOR COMMAND TO BE ACCEPTED
   605                              <1> 	;
   606                              <1> 	;-----	READ CHARACTER FROM KEYBOARD INTERFACE
   607 00001109 E460                <1> 	in	al, PORT_A		; READ IN THE CHARACTER
   608                              <1> 	;
   609                              <1> 	;-----	SYSTEM HOOK INT 15H - FUNCTION 4FH (ON HARDWARE INT LEVEL 9H) 	
   610                              <1> 	;mov	ah, 04Fh		; SYSTEM INTERCEPT - KEY CODE FUNCTION
   611                              <1> 	;stc				; SET CY=1 (IN CASE OF IRET)
   612                              <1> 	;int	15h			; CASETTE CALL (AL)=KEY SCAN CODE
   613                              <1> 	;				; RETURNS CY=1 FOR INVALID FUNCTION
   614                              <1> 	;jc	KB_INT_02		; CONTINUE IF CARRY FLAG SET ((AL)=CODE)
   615                              <1> 	;jmp	K26			; EXIT IF SYSTEM HANDLES SCAN CODE
   616                              <1> 	;				; EXT HANDLES HARDWARE EOI AND ENABLE		
   617                              <1> 	;
   618                              <1> 	;-----	CHECK FOR A RESEND COMMAND TO KEYBOARD
   619                              <1> KB_INT_02:				; 	  (AL)= SCAN CODE
   620 0000110B FB                  <1> 	sti				; ENABLE INTERRUPTS AGAIN
   621 0000110C 3CFE                <1> 	cmp	al, KB_RESEND		; IS THE INPUT A RESEND
   622 0000110E 740E                <1>         je      short KB_INT_4          ; GO IF RESEND
   623                              <1> 	;
   624                              <1> 	;-----	CHECK FOR RESPONSE TO A COMMAND TO KEYBOARD
   625 00001110 3CFA                <1> 	cmp	al, KB_ACK		; IS THE INPUT AN ACKNOWLEDGE
   626 00001112 7514                <1>         jne     short KB_INT_2          ; GO IF NOT
   627                              <1> 	;
   628                              <1> 	;-----	A COMMAND TO THE KEYBOARD WAS ISSUED
   629 00001114 FA                  <1> 	cli				; DISABLE INTERRUPTS
   630 00001115 800D[8B670000]10    <1> 	or	byte [KB_FLAG_2], KB_FA ; INDICATE ACK RECEIVED
   631                              <1>         ;jmp	K26                     ; RETURN IF NOT ACK RETURNED FOR DATA)
   632                              <1> 	; 12/04/2021
   633 0000111C EB76                <1> 	jmp	short ID_EX  ; K26
   634                              <1> 	;
   635                              <1> 	;-----	RESEND THE LAST BYTE
   636                              <1> KB_INT_4:
   637 0000111E FA                  <1> 	cli				; DISABLE INTERRUPTS
   638 0000111F 800D[8B670000]20    <1> 	or	byte [KB_FLAG_2], KB_FE ; INDICATE RESEND RECEIVED
   639                              <1>         ;jmp	K26                     ; RETURN IF NOT ACK RETURNED FOR DATA)
   640                              <1> 	; 12/04/2021
   641 00001126 EB6C                <1> 	jmp	short ID_EX  ; K26
   642                              <1> 	;
   643                              <1> ;-----	UPDATE MODE INDICATORS IF CHANGE IN STATE
   644                              <1> KB_INT_2:
   645                              <1> 	;push 	ax			; SAVE DATA IN
   646                              <1> 	; 12/04/2021
   647 00001128 50                  <1> 	push	eax
   648 00001129 E8E0050000          <1> 	call	MAKE_LED		; GO GET MODE INDICATOR DATA BYTE
   649 0000112E 8A1D[8B670000]      <1> 	mov	bl, [KB_FLAG_2] 	; GET PREVIOUS BITS
   650 00001134 30C3                <1> 	xor	bl, al			; SEE IF ANY DIFFERENT
   651 00001136 80E307              <1> 	and	bl, KB_LEDS		; ISOLATE INDICATOR BITS
   652 00001139 7405                <1> 	jz	short UP0		; IF NO CHANGE BYPASS UPDATE
   653 0000113B E863050000          <1> 	call	SND_LED			; GO TURN ON MODE INDICATORS
   654                              <1> UP0:
   655                              <1> 	;pop	ax			; RESTORE DATA IN
   656                              <1> 	; 12/04/2021
   657 00001140 58                  <1> 	pop	eax
   658                              <1> ;------------------------------------------------------------------------
   659                              <1> ;	START OF KEY PROCESSING						;
   660                              <1> ;------------------------------------------------------------------------
   661 00001141 88C4                <1> 	mov	ah, al			; SAVE SCAN CODE IN AH ALSO
   662                              <1> 	;
   663                              <1> 	;-----	TEST FOR OVERRUN SCAN CODE FROM KEYBOARD
   664 00001143 3CFF                <1> 	cmp	al, KB_OVER_RUN		; IS THIS AN OVERRUN CHAR
   665                              <1>         ;je	K62			; BUFFER_FULL_BEEP
   666                              <1> 	; 12/04/2021
   667 00001145 7505                <1> 	jne	short K16
   668 00001147 E9E8040000          <1> 	jmp	K62
   669                              <1> K16:	
   670 0000114C 8A3D[8C670000]      <1> 	mov	bh, [KB_FLAG_3]		; LOAD FLAGS FOR TESTING
   671                              <1> 	;
   672                              <1> 	;-----	TEST TO SEE IF A READ_ID IS IN PROGRESS
   673 00001152 F6C7C0              <1> 	test 	bh, RD_ID+LC_AB 	; ARE WE DOING A READ ID?
   674 00001155 7442                <1> 	jz	short NOT_ID		; CONTINUE IF NOT
   675 00001157 7914                <1> 	jns	short TST_ID_2		; IS THE RD_ID FLAG ON?
   676 00001159 3CAB                <1> 	cmp	al, ID_1		; IS THIS THE 1ST ID CHARACTER?
   677 0000115B 7507                <1> 	jne	short RST_RD_ID
   678 0000115D 800D[8C670000]40    <1> 	or	byte [KB_FLAG_3], LC_AB ; INDICATE 1ST ID WAS OK
   679                              <1> RST_RD_ID:
   680 00001164 8025[8C670000]7F    <1> 	and	byte [KB_FLAG_3], ~RD_ID ; RESET THE READ ID FLAG
   681 0000116B EB27                <1>         jmp	short ID_EX		; AND EXIT
   682                              <1> 	; 12/04/2021
   683                              <1> 	;jmp	K26
   684                              <1> 	;
   685                              <1> TST_ID_2:
   686 0000116D 8025[8C670000]BF    <1> 	and	byte [KB_FLAG_3], ~LC_AB ; RESET FLAG
   687 00001174 3C54                <1> 	cmp	al, ID_2A		; IS THIS THE 2ND ID CHARACTER?
   688 00001176 7415                <1>         je	short KX_BIT		; JUMP IF SO
   689 00001178 3C41                <1> 	cmp	al, ID_2		; IS THIS THE 2ND ID CHARACTER?
   690 0000117A 7518                <1>         jne	short ID_EX		; LEAVE IF NOT
   691                              <1> 	; 12/04/2021
   692                              <1> 	;jne	K26
   693                              <1> 	;
   694                              <1> 	;-----	A READ ID SAID THAT IT WAS ENHANCED KEYBOARD
   695 0000117C F6C720              <1> 	test	bh, SET_NUM_LK 		; SHOULD WE SET NUM LOCK?
   696 0000117F 740C                <1>         jz      short KX_BIT		; EXIT IF NOT
   697 00001181 800D[89670000]20    <1> 	or	byte [KB_FLAG], NUM_STATE ; FORCE NUM LOCK ON
   698 00001188 E816050000          <1> 	call	SND_LED			; GO SET THE NUM LOCK INDICATOR
   699                              <1> KX_BIT:
   700 0000118D 800D[8C670000]10    <1> 	or	byte [KB_FLAG_3], KBX	; INDICATE ENHANCED KEYBOARD WAS FOUND
   701 00001194 E9CB010000          <1> ID_EX:	jmp     K26			; EXIT
   702                              <1> 	;
   703                              <1> NOT_ID:
   704 00001199 3CE0                <1> 	cmp	al, MC_E0		; IS THIS THE GENERAL MARKER CODE?
   705 0000119B 7509                <1> 	jne	short TEST_E1
   706 0000119D 800D[8C670000]12    <1> 	or	byte [KB_FLAG_3], LC_E0+KBX ; SET FLAG BIT, SET KBX, AND
   707 000011A4 EB0B                <1> 	jmp	short EXIT		; THROW AWAY THIS CODE
   708                              <1> 	; 12/04/2021
   709                              <1> 	;jmp	K26A	
   710                              <1> TEST_E1:	
   711 000011A6 3CE1                <1> 	cmp	al, MC_E1		; IS THIS THE PAUSE KEY?
   712 000011A8 750C                <1> 	jne	short NOT_HC
   713 000011AA 800D[8C670000]11    <1> 	or	byte [KB_FLAG_3], LC_E1+KBX ; SET FLAG BIT, SET KBX, AND
   714 000011B1 E9B5010000          <1> EXIT:	jmp	K26A			; THROW AWAY THIS CODE
   715                              <1> 	;
   716                              <1> NOT_HC:
   717 000011B6 247F                <1> 	and	al, 07Fh		; TURN OFF THE BREAK BIT
   718 000011B8 F6C702              <1> 	test	bh, LC_E0		; LAST CODE THE E0 MARKER CODE
   719 000011BB 7410                <1> 	jz	short NOT_LC_E0		; JUMP IF NOT
   720                              <1> 	;
   721 000011BD BF[76660000]        <1> 	mov	edi, _K6+6		; IS THIS A SHIFT KEY?
   722 000011C2 AE                  <1> 	scasb
   723                              <1> 	;je	K26 ; K16B              ; YES, THROW AWAY & RESET FLAG
   724                              <1> 	; 12/04/2021
   725 000011C3 745B                <1> 	je	short K16B ; K26
   726 000011C5 AE                  <1> 	scasb
   727 000011C6 756D                <1> 	jne	short K16A		; NO, CONTINUE KEY PROCESSING
   728                              <1> 	;jmp	short K16B		; YES, THROW AWAY & RESET FLAG
   729 000011C8 E997010000          <1> 	jmp	K26
   730                              <1> 	;
   731                              <1> NOT_LC_E0:
   732 000011CD F6C701              <1> 	test	bh, LC_E1		; LAST CODE THE E1 MARKER CODE?
   733 000011D0 7425                <1> 	jz	short T_SYS_KEY		; JUMP IF NOT
   734 000011D2 B904000000          <1> 	mov	ecx, 4			; LENGHT OF SEARCH
   735 000011D7 BF[74660000]        <1> 	mov	edi, _K6+4		; IS THIS AN ALT, CTL, OR SHIFT?
   736 000011DC F2AE                <1> 	repne	scasb			; CHECK IT
   737 000011DE 74D1                <1> 	je	short EXIT		; THROW AWAY IF SO
   738                              <1> 	; 12/04/2021
   739                              <1> 	;je	K26A			
   740                              <1> 	;
   741 000011E0 3C45                <1> 	cmp	al, NUM_KEY		; IS IT THE PAUSE KEY?
   742 000011E2 753C                <1> 	jne	short K16B		; NO, THROW AWAY & RESET FLAG
   743                              <1> 	; 12/04/2021
   744                              <1> 	;jne	K26
   745 000011E4 F6C480              <1> 	test	ah, 80h			; YES, IS IT THE BREAK OF THE KEY?
   746 000011E7 7537                <1> 	jnz	short K16B		; YES, THROW THIS AWAY, TOO	
   747                              <1> 	; 24/07/2022
   748                              <1> 	;jnz	K26
   749                              <1>         ; 20/02/2015 
   750 000011E9 F605[8A670000]08    <1> 	test	byte [KB_FLAG_1],HOLD_STATE ; NO, ARE WE PAUSED ALREADY?
   751 000011F0 752E                <1> 	jnz	short K16B		; YES, THROW AWAY
   752                              <1> 	; 12/04/2021
   753                              <1> 	;jnz	K26
   754 000011F2 E9B1020000          <1> 	jmp     K39P                    ; NO, THIS IS THE REAL PAUSE STATE
   755                              <1> 	;
   756                              <1> 	;-----	TEST FOR SYSTEM KEY
   757                              <1> T_SYS_KEY:
   758 000011F7 3C54                <1> 	cmp	al, SYS_KEY		; IS IT THE SYSTEM KEY?
   759 000011F9 753A                <1> 	jnz	short K16A		; CONTINUE IF NOT
   760                              <1> 	;
   761 000011FB F6C480              <1> 	test	ah, 80h			; CHECK IF THIS A BREAK CODE
   762 000011FE 7525                <1> 	jnz	short K16C		; DO NOT TOUCH SYSTEM INDICATOR IF TRUE
   763                              <1> 	;
   764 00001200 F605[8A670000]04    <1> 	test	byte [KB_FLAG_1], SYS_SHIFT ; SEE IF IN SYSTEM KEY HELD DOWN 
   765 00001207 7517                <1> 	jnz	short K16B		; IF YES, DO NOT PROCESS SYSTEM INDICATOR	
   766                              <1> 	; 12/04/2021
   767                              <1> 	;jnz	K26		
   768                              <1> 	;
   769 00001209 800D[8A670000]04    <1> 	or	byte [KB_FLAG_1], SYS_SHIFT ; INDICATE SYSTEM KEY DEPRESSED
   770 00001210 B020                <1> 	mov	al, EOI			; END OF INTERRUPT COMMAND
   771 00001212 E620                <1> 	out	20h, al ;out INTA00, al	; SEND COMMAND TO INTERRUPT CONTROL PORT
   772                              <1> 					; INTERRUPT-RETURN-NO-EOI
   773 00001214 B0AE                <1> 	mov	al, ENA_KBD		; INSURE KEYBOARD IS ENABLED
   774 00001216 E82D040000          <1> 	call	SHIP_IT			; EXECUTE ENABLE
   775                              <1> 	; !!! SYSREQ !!! function/system call (INTERRUPT) must be here !!!
   776                              <1> 	;MOV	AL, 8500H		; FUNCTION VALUE FOR MAKE OF SYSTEM KEY
   777                              <1> 	;STI				; MAKE SURE INTERRUPTS ENABLED
   778                              <1> 	;INT	15H			; USER INTERRUPT	
   779 0000121B E957010000          <1>         jmp     K27A                    ; END PROCESSING
   780                              <1> 	;
   781 00001220 E93F010000          <1> K16B:	jmp	K26			; IGNORE SYSTEM KEY
   782                              <1> 	;
   783                              <1> K16C:
   784 00001225 8025[8A670000]FB    <1> 	and	byte [KB_FLAG_1], ~SYS_SHIFT ; TURN OFF SHIFT KEY HELD DOWN
   785 0000122C B020                <1> 	mov	al, EOI			; END OF INTERRUPT COMMAND
   786 0000122E E620                <1> 	out	20h, al ;out INTA00, al ; SEND COMMAND TO INTERRUPT CONTROL PORT
   787                              <1> 					; INTERRUPT-RETURN-NO-EOI
   788                              <1> 	;MOV	AL, ENA_KBD		; INSURE KEYBOARD IS ENABLED
   789                              <1> 	;CALL	SHIP_IT			; EXECUTE ENABLE
   790                              <1> 	;
   791                              <1> 	;MOV	AX, 8501H		; FUNCTION VALUE FOR BREAK OF SYSTEM KEY
   792                              <1> 	;STI				; MAKE SURE INTERRUPTS ENABLED
   793                              <1> 	;INT	15H			; USER INTERRUPT
   794                              <1> 	;JMP	K27A			; INGONRE SYSTEM KEY				
   795                              <1> 	;
   796 00001230 E93B010000          <1> 	jmp     K27			; IGNORE SYSTEM KEY
   797                              <1> 	;
   798                              <1> 	;-----	TEST FOR SHIFT KEYS
   799                              <1> K16A:
   800 00001235 8A1D[89670000]      <1> 	mov	bl, [KB_FLAG]		; PUT STATE FLAGS IN BL
   801 0000123B BF[70660000]        <1> 	mov	edi, _K6		; SHIFT KEY TABLE offset
   802 00001240 B908000000          <1> 	mov	ecx, _K6L		; LENGTH
   803 00001245 F2AE                <1> 	repne	scasb			; LOOK THROUGH THE TABLE FOR A MATCH
   804 00001247 88E0                <1> 	mov	al, ah			; RECOVER SCAN CODE
   805                              <1>         ;jne	K25                     ; IF NO MATCH, THEN SHIFT NOT FOUND
   806                              <1> 	; 12/04/2021
   807 00001249 7405                <1> 	je	short K17
   808 0000124B E9FC000000          <1> 	jmp	K25
   809                              <1> 	;
   810                              <1> 	;------	SHIFT KEY FOUND
   811                              <1> K17:
   812 00001250 81EF[71660000]      <1>         sub     edi, _K6+1              ; ADJUST PTR TO SCAN CODE MATCH
   813 00001256 8AA7[78660000]      <1>        	mov     ah, [edi+_K7]       	; GET MASK INTO AH
   814 0000125C B102                <1> 	mov	cl, 2			; SETUP COUNT FOR FLAG SHIFTS
   815 0000125E A880                <1> 	test	al, 80h			; TEST FOR BREAK KEY
   816                              <1> 	;jnz	short K23		; JUMP OF BREAK
   817                              <1> 	; 12/04/2021
   818 00001260 7405                <1> 	jz	short K17C
   819 00001262 E981000000          <1> 	jmp	K23
   820                              <1> 	;
   821                              <1> 	;-----	SHIFT MAKE FOUND, DETERMINE SET OR TOGGLE
   822                              <1> K17C:
   823 00001267 80FC10              <1> 	cmp	ah, SCROLL_SHIFT
   824 0000126A 7324                <1> 	jae	short K18		; IF SCROLL SHIFT OR ABOVE, TOGGLE KEY
   825                              <1> 	;
   826                              <1> 	;-----	PLAIN SHIFT KEY, SET SHIFT ON
   827 0000126C 0825[89670000]      <1> 	or	[KB_FLAG], ah		; TURN ON SHIFT BIT
   828 00001272 A80C                <1>         test	al, CTL_SHIFT+ALT_SHIFT ; IS IT ALT OR CTRL?
   829                              <1> 	;;jnz	short K17D		; YES, MORE FLAGS TO SET
   830                              <1> 	;jz	K26			; NO, INTERRUPT RETURN
   831                              <1> 	; 12/04/2021
   832 00001274 7415                <1> 	jz	short k17f
   833                              <1> K17D:
   834 00001276 F6C702              <1> 	test	bh, LC_E0		; IS THIS ONE OF NEW KEYS?
   835 00001279 7408                <1> 	jz 	short K17E		; NO, JUMP
   836 0000127B 0825[8C670000]      <1> 	or	[KB_FLAG_3], ah		; SET BITS FOR RIGHT CTRL, ALT
   837                              <1> 	;jmp	K26			; INTERRUPT RETURN
   838                              <1> 	; 12/04/2021
   839 00001281 EB08                <1> 	jmp	short k17f
   840                              <1> K17E:
   841 00001283 D2EC                <1> 	shr	ah, cl			; MOVE FLAG BITS TWO POSITIONS
   842 00001285 0825[8A670000]      <1> 	or	[KB_FLAG_1], ah		; SET BITS FOR LEFT CTRL, ALT
   843                              <1> k17f:	; 12/04/2021
   844 0000128B E9D4000000          <1> 	jmp	K26
   845                              <1> 	;
   846                              <1> 	;-----	TOGGLED SHIFT KEY, TEST FOR 1ST MAKE OR NOT
   847                              <1> K18:					; SHIFT-TOGGLE
   848 00001290 F6C304              <1> 	test	bl, CTL_SHIFT 		; CHECK CTL SHIFT STATE
   849 00001293 7402                <1> 	jz	short K18A              ; JUMP IF NOT CTL STATE
   850                              <1>         ;jnz	K25                     ; JUMP IF CTL STATE
   851                              <1> 	; 12/04/2021
   852 00001295 EB1C                <1> 	jmp	short k20a ; K25
   853                              <1> K18A:
   854 00001297 3C52                <1> 	cmp	al, INS_KEY		; CHECK FOR INSERT KEY
   855 00001299 7522                <1> 	jne	short K22		; JUMP IF NOT INSERT KEY
   856 0000129B F6C308              <1> 	test	bl, ALT_SHIFT 		; CHECK FOR ALTERNATE SHIFT
   857 0000129E 7402                <1>       	jz	short K18B		; JUMP IF NOT ALTERNATE SHIFT	
   858                              <1>         ;jnz	K25			; JUMP IF ALTERNATE SHIFT
   859                              <1> 	; 12/04/2021
   860 000012A0 EB11                <1> 	jmp	short k20a ; K25
   861                              <1> K18B:
   862 000012A2 F6C702              <1> 	test	bh, LC_E0 ;20/02/2015	; IS THIS NEW INSERT KEY?
   863 000012A5 7516                <1> 	jnz	short K22		; YES, THIS ONE'S NEVER A '0'
   864                              <1> K19:	
   865 000012A7 F6C320              <1> 	test	bl, NUM_STATE 		; CHECK FOR BASE STATE
   866 000012AA 750C                <1> 	jnz	short K21		; JUMP IF NUM LOCK IS ON
   867 000012AC F6C303              <1> 	test	bl, LEFT_SHIFT+RIGHT_SHIFT ; TEST FOR SHIFT STATE
   868 000012AF 740C                <1> 	jz	short K22		; JUMP IF BASE STATE
   869                              <1> K20:					; NUMERIC ZERO, NOT INSERT KEY
   870 000012B1 88C4                <1> 	mov	ah, al			; PUT SCAN CODE BACK IN AH
   871                              <1> k20a:	; 12/04/2021
   872 000012B3 E994000000          <1>         jmp     K25                     ; NUMERAL '0', STNDRD. PROCESSING
   873                              <1> K21:					; MIGHT BE NUMERIC
   874 000012B8 F6C303              <1> 	test	bl, LEFT_SHIFT+RIGHT_SHIFT
   875 000012BB 74F4                <1> 	jz	short K20		; IS NUMERIC, STD. PROC.
   876                              <1> 	;
   877                              <1> K22:					; SHIFT TOGGLE KEY HIT; PROCESS IT
   878 000012BD 8425[8A670000]      <1> 	test	ah, [KB_FLAG_1] 	; IS KEY ALREADY DEPRESSED
   879                              <1>         ;jnz	short K26		; JUMP IF KEY ALREADY DEPRESSED
   880                              <1> 	; 12/04/2021
   881 000012C3 75C6                <1> 	jnz	short k17f ; K26
   882                              <1> K22A:
   883 000012C5 0825[8A670000]      <1>         or      [KB_FLAG_1], ah 	; INDICATE THAT THE KEY IS DEPRESSED
   884 000012CB 3025[89670000]      <1> 	xor	[KB_FLAG], ah		; TOGGLE THE SHIFT STATE
   885                              <1> 	;
   886                              <1> 	;-----	TOGGLE LED IF CAPS, NUM  OR SCROLL KEY DEPRESSED
   887 000012D1 F6C470              <1> 	test	ah, CAPS_SHIFT+NUM_SHIFT+SCROLL_SHIFT ; SHIFT TOGGLE?
   888 000012D4 7407                <1> 	jz	short K22B		; GO IF NOT
   889                              <1> 	;
   890                              <1> 	; 12/04/2021 (32 bit push/pop)
   891 000012D6 50                  <1> 	push	eax ; push ax		; SAVE SCAN CODE AND SHIFT MASK
   892 000012D7 E8C7030000          <1> 	call	SND_LED			; GO TURN MODE INDICATORS ON
   893 000012DC 58                  <1> 	pop	eax ; pop ax		; RESTORE SCAN CODE
   894                              <1> K22B:
   895 000012DD 3C52                <1> 	cmp	al, INS_KEY		; TEST FOR 1ST MAKE OF INSERT KEY
   896                              <1>         ;jne	short K26		; JUMP IF NOT INSERT KEY
   897                              <1> 	; 12/04/2021
   898 000012DF 75AA                <1> 	jne	short k17f ; K26
   899 000012E1 88C4                <1> 	mov	ah, al		        ; SCAN CODE IN BOTH HALVES OF AX
   900 000012E3 E999000000          <1>         jmp	K28                     ; FLAGS UPDATED, PROC. FOR BUFFER
   901                              <1> 	;
   902                              <1> 	;-----	BREAK SHIFT FOUND
   903                              <1> K23:					; BREAK-SHIFT-FOUND
   904 000012E8 80FC10              <1> 	cmp	ah, SCROLL_SHIFT	; IS THIS A TOGGLE KEY
   905 000012EB F6D4                <1> 	not	ah			; INVERT MASK
   906 000012ED 7355                <1> 	jae	short K24		; YES, HANDLE BREAK TOGGLE
   907 000012EF 2025[89670000]      <1> 	and	[KB_FLAG], ah		; TURN OFF SHIFT BIT
   908 000012F5 80FCFB              <1> 	cmp	ah, ~CTL_SHIFT		; IS THIS ALT OR CTL?
   909 000012F8 7730                <1> 	ja	short K23D		; NO, ALL DONE
   910                              <1> 	;
   911 000012FA F6C702              <1> 	test	bh, LC_E0		; 2ND ALT OR CTL?
   912 000012FD 7408                <1> 	jz	short K23A		; NO, HANSLE NORMALLY
   913 000012FF 2025[8C670000]      <1> 	and 	[KB_FLAG_3], ah		; RESET BIT FOR RIGHT ALT OR CTL
   914 00001305 EB08                <1> 	jmp	short K23B		; CONTINUE
   915                              <1> K23A:
   916 00001307 D2FC                <1> 	sar	ah, cl			; MOVE THE MASK BIT TWO POSITIONS
   917 00001309 2025[8A670000]      <1> 	and	[KB_FLAG_1], ah		; RESET BIT FOR LEFT ALT AND CTL
   918                              <1> K23B:
   919 0000130F 88C4                <1> 	mov	ah, al			; SAVE SCAN CODE
   920 00001311 A0[8C670000]        <1> 	mov	al, [KB_FLAG_3]		; GET RIGHT ALT & CTRL FLAGS
   921 00001316 D2E8                <1> 	shr	al, cl			; MOVE TO BITS 1 & 0
   922 00001318 0A05[8A670000]      <1> 	or	al, [KB_FLAG_1]		; PUT IN LEFT ALT & CTL FLAGS
   923 0000131E D2E0                <1> 	shl	al, cl			; MOVE BACK TO BITS 3 & 2
   924 00001320 240C                <1> 	and	al, ALT_SHIFT+CTL_SHIFT ; FILTER OUT OTHER GARBAGE
   925 00001322 0805[89670000]      <1> 	or	[KB_FLAG], al		; PUT RESULT IN THE REAL FLAGS	
   926 00001328 88E0                <1> 	mov	al, ah
   927                              <1> K23D:
   928 0000132A 3CB8                <1> 	cmp	al, ALT_KEY+80h		; IS THIS ALTERNATE SHIFT RELEASE
   929 0000132C 7536                <1> 	jne	short K26		; INTERRUPT RETURN
   930                              <1> 	;	
   931                              <1> 	;-----	ALTERNATE SHIFT KEY RELEASED, GET THE VALUE INTO BUFFER
   932 0000132E A0[8D670000]        <1> 	mov	al, [ALT_INPUT]
   933 00001333 B400                <1> 	mov	ah, 0			; SCAN CODE OF 0
   934 00001335 8825[8D670000]      <1> 	mov	[ALT_INPUT], ah 	; ZERO OUT THE FIELD
   935 0000133B 3C00                <1> 	cmp	al, 0			; WAS THE INPUT = 0?
   936 0000133D 7425                <1> 	je	short K26		; INTERRUPT_RETURN
   937                              <1>         ; 29/01/2016
   938                              <1> 	;jmp	K61			; IT WASN'T, SO PUT IN BUFFER
   939 0000133F E9AB020000          <1> 	jmp	_K60
   940                              <1> 	;
   941                              <1> K24:					; BREAK-TOGGLE
   942 00001344 2025[8A670000]      <1> 	and	[KB_FLAG_1], ah 	; INDICATE NO LONGER DEPRESSED
   943 0000134A EB18                <1> 	jmp	short K26		; INTERRUPT_RETURN
   944                              <1> 	;
   945                              <1> 	;-----	TEST FOR HOLD STATE
   946                              <1> 					; AL, AH = SCAN CODE
   947                              <1> K25:					; NO-SHIFT-FOUND
   948 0000134C 3C80                <1> 	cmp	al, 80h			; TEST FOR BREAK KEY
   949 0000134E 7314                <1> 	jae	short K26		; NOTHING FOR BREAK CHARS FROM HERE ON
   950 00001350 F605[8A670000]08    <1> 	test	byte [KB_FLAG_1], HOLD_STATE ; ARE WE IN HOLD STATE
   951 00001357 7428                <1> 	jz	short K28		; BRANCH AROUND TEST IF NOT
   952 00001359 3C45                <1> 	cmp	al, NUM_KEY
   953 0000135B 7407                <1> 	je	short K26		; CAN'T END HOLD ON NUM_LOCK
   954 0000135D 8025[8A670000]F7    <1> 	and	byte [KB_FLAG_1], ~HOLD_STATE ; TURN OFF THE HOLD STATE BIT
   955                              <1> K26:
   956 00001364 8025[8C670000]FC    <1> 	and	byte [KB_FLAG_3], ~(LC_E0+LC_E1) ; RESET LAST CHAR H.C. FLAG
   957                              <1> K26A:					; INTERRUPT-RETURN
   958 0000136B FA                  <1> 	cli				; TURN OFF INTERRUPTS
   959 0000136C B020                <1> 	mov	al, EOI			; END OF INTERRUPT COMMAND
   960 0000136E E620                <1> 	out	20h, al	;out INTA00, al	; SEND COMMAND TO INTERRUPT CONTROL PORT
   961                              <1> K27:					; INTERRUPT-RETURN-NO-EOI
   962 00001370 B0AE                <1> 	mov	al, ENA_KBD		; INSURE KEYBOARD IS ENABLED
   963 00001372 E8D1020000          <1> 	call	SHIP_IT			; EXECUTE ENABLE
   964                              <1> K27A:
   965 00001377 FA                  <1> 	cli				; DISABLE INTERRUPTS
   966                              <1> 	;;mov	byte [intflg], 0 ; 07/01/2017 ;; 15/01/2017
   967 00001378 07                  <1> 	pop	es			; RESTORE REGISTERS
   968 00001379 1F                  <1> 	pop	ds
   969 0000137A 5F                  <1> 	pop	edi
   970 0000137B 5E                  <1> 	pop	esi
   971 0000137C 5A                  <1> 	pop	edx
   972 0000137D 59                  <1> 	pop	ecx
   973 0000137E 5B                  <1> 	pop	ebx
   974 0000137F 58                  <1> 	pop	eax
   975                              <1> 	;pop	ebp
   976 00001380 CF                  <1> 	iretd				; RETURN
   977                              <1> 
   978                              <1> 	;-----	NOT IN	HOLD STATE
   979                              <1> K28:					; NO-HOLD-STATE
   980 00001381 3C58                <1> 	cmp	al, 88			; TEST FOR OUT-OF-RANGE SCAN CODES
   981 00001383 77DF                <1> 	ja	short K26		; IGNORE IF OUT-OF-RANGE	
   982                              <1> 	;
   983 00001385 F6C308              <1> 	test	bl, ALT_SHIFT 		; ARE WE IN ALTERNATE SHIFT
   984 00001388 740E                <1>         jz	short K28A		; IF NOT ALTERNATE
   985                              <1>         ; 12/04/2021
   986                              <1> 	;jz	K38
   987                              <1> 	;
   988 0000138A F6C710              <1> 	test	bh, KBX			; IS THIS THE ENCHANCED KEYBOARD?
   989 0000138D 740E                <1> 	jz	short K29		; NO, ALT STATE IS REAL
   990                              <1> 	 ;28/02/2015
   991 0000138F F605[8A670000]04    <1> 	test	byte [KB_FLAG_1], SYS_SHIFT ; YES, IS SYSREQ KEY DOWN?
   992 00001396 7405                <1> 	jz	short K29		;  NO, ALT STATE IS REAL
   993                              <1> 	; 12/04/2021
   994                              <1> 	;jnz	K38			; YES, THIS IS PHONY ALT STATE 
   995                              <1>         ;				; DUE TO PRESSING SYSREQ	
   996 00001398 E9C4000000          <1> K28A:	jmp	K38
   997                              <1> 	;
   998                              <1> 	;-----	TEST FOR RESET KEY SEQUENCE (CTL ALT DEL)
   999                              <1> K29:					; TEST-RESET
  1000 0000139D F6C304              <1> 	test	bl, CTL_SHIFT 		; ARE WE IN CONTROL SHIFT ALSO?
  1001 000013A0 740B                <1> 	jz	short K31		; NO_RESET
  1002 000013A2 3C53                <1> 	cmp	al, DEL_KEY		; CTL-ALT STATE, TEST FOR DELETE KEY
  1003 000013A4 7507                <1> 	jne	short K31		; NO_RESET, IGNORE
  1004                              <1> 	;
  1005                              <1> 	;-----	CTL-ALT-DEL HAS BEEN FOUND
  1006                              <1>  	; 26/08/2014
  1007                              <1> cpu_reset:
  1008                              <1> 	; IBM PC/AT ROM BIOS source code - 10/06/85 (TEST4.ASM - PROC_SHUTDOWN)
  1009                              <1> 	; Send FEh (system reset command) to the keyboard controller.
  1010 000013A6 B0FE                <1> 	mov	al, SHUT_CMD		; SHUTDOWN COMMAND
  1011 000013A8 E664                <1> 	out	STATUS_PORT, al		; SEND TO KEYBOARD CONTROL PORT
  1012                              <1> khere:
  1013 000013AA F4                  <1> 	hlt				; WAIT FOR 80286 RESET
  1014 000013AB EBFD                <1> 	jmp 	short khere		; INSURE HALT
  1015                              <1> 	;
  1016                              <1> 	;-----	IN ALTERNATE SHIFT, RESET NOT FOUND
  1017                              <1> K31:					; NO-RESET
  1018 000013AD 3C39                <1> 	cmp	al, 57			; TEST FOR SPACE KEY
  1019 000013AF 7507                <1> 	jne	short K311		; NOT THERE
  1020 000013B1 B020                <1> 	mov	al, ' '			; SET SPACE CHAR
  1021                              <1> k31a:	; 12/04/2021
  1022 000013B3 E929020000          <1>         jmp     K57                     ; BUFFER_FILL
  1023                              <1> K311:
  1024 000013B8 3C0F                <1> 	cmp	al, 15			; TEST FOR TAB KEY
  1025 000013BA 7506                <1> 	jne	short K312		; NOT THERE
  1026 000013BC 66B800A5            <1> 	mov	ax, 0A500h		; SET SPECIAL CODE FOR ALT-TAB
  1027                              <1>         ;jmp	K57			; BUFFER_FILL
  1028                              <1> 	; 12/04/2021
  1029 000013C0 EBF1                <1> 	jmp	short k31a
  1030                              <1> K312:
  1031 000013C2 3C4A                <1> 	cmp	al, 74			; TEST FOR KEY PAD -
  1032                              <1>         ;je	short K37B		; GO PROCESS
  1033                              <1> 	; 12/04/2021
  1034 000013C4 7404                <1> 	je	short k312a
  1035 000013C6 3C4E                <1> 	cmp	al, 78			; TEST FOR KEY PAD +
  1036                              <1>         ;je	short K37B		; GO PROCESS
  1037                              <1> 	; 12/04/2021
  1038 000013C8 7505                <1> 	jne	short K32
  1039                              <1> k312a:
  1040 000013CA E988000000          <1> 	jmp	K37B	
  1041                              <1> 	;
  1042                              <1> 	;-----	LOOK FOR KEY PAD ENTRY
  1043                              <1> K32:					; ALT-KEY-PAD
  1044 000013CF BF[4C660000]        <1> 	mov	edi, K30		; ALT-INPUT-TABLE offset
  1045 000013D4 B90A000000          <1> 	mov	ecx, 10			; LOOK FOR ENTRY USING KEYPAD
  1046 000013D9 F2AE                <1> 	repne	scasb			; LOOK FOR MATCH
  1047 000013DB 7521                <1> 	jne	short K33		; NO_ALT_KEYPAD
  1048 000013DD F6C702              <1> 	test	bh, LC_E0		; IS THIS ONE OF THE NEW KEYS?
  1049 000013E0 7579                <1>         jnz	short K37C		; YES, JUMP, NOT NUMPAD KEY
  1050 000013E2 81EF[4D660000]      <1> 	sub	edi, K30+1		; DI NOW HAS ENTRY VALUE
  1051 000013E8 A0[8D670000]        <1> 	mov	al, [ALT_INPUT] 	; GET THE CURRENT BYTE
  1052 000013ED B40A                <1> 	mov	ah, 10			; MULTIPLY BY 10
  1053 000013EF F6E4                <1> 	mul	ah
  1054 000013F1 6601F8              <1> 	add	ax, di			; ADD IN THE LATEST ENTRY
  1055 000013F4 A2[8D670000]        <1> 	mov	[ALT_INPUT], al 	; STORE IT AWAY
  1056                              <1> K32A:
  1057 000013F9 E966FFFFFF          <1>         jmp     K26                     ; THROW AWAY THAT KEYSTROKE
  1058                              <1> 	;
  1059                              <1> 	;-----	LOOK FOR SUPERSHIFT ENTRY
  1060                              <1> K33:					; NO-ALT-KEYPAD
  1061 000013FE C605[8D670000]00    <1>         mov     byte [ALT_INPUT], 0     ; ZERO ANY PREVIOUS ENTRY INTO INPUT
  1062 00001405 B91A000000          <1> 	mov	ecx, 26			; (DI),(ES) ALREADY POINTING
  1063 0000140A F2AE                <1> 	repne	scasb			; LOOK FOR MATCH IN ALPHABET
  1064 0000140C 7445                <1> 	je	short K37A		; MATCH FOUND, GO FILLL THE BUFFER
  1065                              <1> 	;
  1066                              <1> 	;-----	LOOK FOR TOP ROW OF ALTERNATE SHIFT
  1067                              <1> K34:					; ALT-TOP-ROW
  1068 0000140E 3C02                <1> 	cmp	al, 2			; KEY WITH '1' ON IT
  1069 00001410 7245                <1> 	jb	short K37B		; MUST BE ESCAPE
  1070 00001412 3C0D                <1> 	cmp	al, 13			; IS IT IN THE REGION
  1071 00001414 7705                <1> 	ja	short K35		; NO, ALT SOMETHING ELSE
  1072 00001416 80C476              <1> 	add	ah, 118			; CONVERT PSEUDO SCAN CODE TO RANGE
  1073 00001419 EB38                <1> 	jmp	short K37A		; GO FILL THE BUFFER
  1074                              <1> 	;
  1075                              <1> 	;-----	TRANSLATE ALTERNATE SHIFT PSEUDO SCAN CODES
  1076                              <1> K35:					; ALT-FUNCTION
  1077 0000141B 3C57                <1> 	cmp	al, F11_M		; IS IT F11?	
  1078 0000141D 7209                <1> 	jb	short K35A ; 20/02/2015	; NO, BRANCH
  1079 0000141F 3C58                <1> 	cmp	al, F12_M		; IS IT F12?
  1080 00001421 7705                <1> 	ja	short K35A ; 20/02/2015	; NO, BRANCH
  1081 00001423 80C434              <1> 	add	ah, 52			; CONVERT TO PSEUDO SCAN CODE
  1082 00001426 EB2B                <1> 	jmp	short K37A		; GO FILL THE BUFFER
  1083                              <1> K35A:
  1084 00001428 F6C702              <1> 	test	bh, LC_E0		; DO WE HAVE ONE OF THE NEW KEYS?
  1085 0000142B 741B                <1> 	jz	short K37		; NO, JUMP
  1086 0000142D 3C1C                <1> 	cmp	al, 28			; TEST FOR KEYPAD ENTER
  1087 0000142F 7506                <1>         jne     short K35B              ; NOT THERE
  1088 00001431 66B800A6            <1> 	mov	ax, 0A600h		; SPECIAL CODE
  1089                              <1> 	;jmp	K57			; BUFFER FILL
  1090                              <1> 	; 12/04/2021
  1091 00001435 EB0C                <1> 	jmp	short k35c
  1092                              <1> K35B:
  1093 00001437 3C53                <1> 	cmp	al, 83			; TEST FOR DELETE KEY
  1094 00001439 7420                <1> 	je	short K37C		; HANDLE WITH OTHER EDIT KEYS
  1095 0000143B 3C35                <1> 	cmp	al, 53			; TEST FOR KEYPAD /
  1096 0000143D 75BA                <1> 	jne	short K32A		; NOT THERE, NO OTHER E0 SPECIALS
  1097                              <1>         ; 12/04/2021
  1098                              <1> 	;jne	K26
  1099 0000143F 66B800A4            <1> 	mov	ax, 0A400h		; SPECIAL CODE1
  1100                              <1> k35c:	; 12/04/2021
  1101 00001443 E999010000          <1> 	jmp	K57			; BUFFER FILL
  1102                              <1> K37:
  1103 00001448 3C3B                <1> 	cmp	al, 59			; TEST FOR FUNCTION KEYS (F1)
  1104 0000144A 720B                <1>         jb      short K37B		; NO FN, HANDLE W/OTHER EXTENDED
  1105 0000144C 3C44                <1> 	cmp	al, 68			; IN KEYPAD REGION?
  1106 0000144E 77A9                <1> 	ja	short K32A		; IF SO, IGNORE
  1107                              <1> 	; 12/04/2021
  1108                              <1> 	;ja	K26
  1109 00001450 80C42D              <1> 	add	ah, 45			; CONVERT TO PSEUDO SCAN CODE
  1110                              <1> K37A:
  1111 00001453 B000                <1> 	mov	al, 0			; ASCII CODE OF ZERO
  1112                              <1> 	;jmp	K57			; PUT IT IN THE BUFFER
  1113                              <1> 	; 12/04/2021
  1114 00001455 EBEC                <1> 	jmp	short k35c
  1115                              <1> K37B:
  1116 00001457 B0F0                <1> 	mov	al, 0F0h		; USE SPECIAL ASCII CODE
  1117                              <1> 	;jmp	K57			; PUT IT IN THE BUFFER
  1118                              <1> 	; 12/04/2021
  1119 00001459 EBE8                <1> 	jmp	short k35c
  1120                              <1> K37C:
  1121 0000145B 0450                <1> 	add	al, 80			; CONVERT SCAN CODE (EDIT KEYS)
  1122 0000145D 88C4                <1> 	mov	ah, al			; (SCAN CODE NOT IN AH FOR INSERT)
  1123 0000145F EBF2                <1> 	jmp     short K37A              ; PUT IT IN THE BUFFER
  1124                              <1> 	;
  1125                              <1> 	;-----	NOT IN ALTERNATE SHIFT
  1126                              <1> K38:					; NOT-ALT-SHIFT
  1127                              <1> 					; BL STILL HAS SHIFT FLAGS
  1128 00001461 F6C304              <1> 	test	bl, CTL_SHIFT 		; ARE WE IN CONTROL SHIFT?
  1129                              <1> 	;;jnz	short K38A		; YES, START PROCESSING	
  1130                              <1>         ;jz	K44			; NOT-CTL-SHIFT
  1131                              <1> 	; 12/04/2021
  1132 00001464 7505                <1> 	jnz	short K38A		; YES, START PROCESSING	
  1133 00001466 E9AB000000          <1> 	jmp	K44			; NOT-CTL-SHIFT
  1134                              <1> 	;
  1135                              <1> 	;-----	CONTROL SHIFT, TEST SPECIAL CHARACTERS
  1136                              <1> 	;-----	TEST FOR BREAK
  1137                              <1> K38A:
  1138 0000146B 3C46                <1> 	cmp	al, SCROLL_KEY		; TEST FOR BREAK
  1139 0000146D 7530                <1> 	jne	short K39		; JUMP, NO-BREAK
  1140 0000146F F6C710              <1> 	test	bh, KBX			; IS THIS THE ENHANCED KEYBOARD?
  1141 00001472 7405                <1> 	jz	short K38B		; NO, BREAK IS VALID	
  1142 00001474 F6C702              <1> 	test	bh, LC_E0		; YES, WAS LAST CODE AN E0?
  1143 00001477 7426                <1> 	jz	short K39		; NO-BREAK, TEST FOR PAUSE	
  1144                              <1> K38B:
  1145 00001479 8B1D[96670000]      <1> 	mov	ebx, [BUFFER_HEAD] 	; RESET BUFFER TO EMPTY
  1146 0000147F 891D[9A670000]      <1> 	mov	[BUFFER_TAIL], ebx
  1147 00001485 C605[88670000]80    <1> 	mov	byte [BIOS_BREAK], 80h  ; TURN ON BIOS_BREAK BIT
  1148                              <1> 	;
  1149                              <1> 	;-----	ENABLE KEYBOARD
  1150 0000148C B0AE                <1> 	mov	al, ENA_KBD		; ENABLE KEYBOARD
  1151 0000148E E8B5010000          <1> 	call	SHIP_IT			; EXECUTE ENABLE
  1152                              <1> 	;
  1153                              <1> 	; CTRL+BREAK code here !!!
  1154                              <1> 	;INT	1BH			; BREAK INTERRUPT VECTOR
  1155                              <1> 	; 17/10/2015	
  1156 00001493 E836590000          <1> 	call	ctrlbrk ; control+break subroutine
  1157                              <1> 	;
  1158                              <1> 	;sub	ax, ax			; PUT OUT DUMMY CHARACTER
  1159                              <1>         ; 12/04/2021
  1160 00001498 29C0                <1> 	sub	eax, eax
  1161 0000149A E942010000          <1>         jmp     K57                     ; BUFFER_FILL
  1162                              <1> 	;
  1163                              <1> 	;-----	TEST FOR PAUSE
  1164                              <1> K39:					; NO_BREAK
  1165 0000149F F6C710              <1> 	test	bh, KBX			; IS THIS THE ENHANCED KEYBOARD?
  1166 000014A2 7537                <1> 	jnz	short K41		; YES, THEN THIS CAN'T BE PAUSE	
  1167 000014A4 3C45                <1> 	cmp	al, NUM_KEY		; LOOK FOR PAUSE KEY
  1168 000014A6 7533                <1> 	jne	short K41		; NO-PAUSE
  1169                              <1> K39P:
  1170 000014A8 800D[8A670000]08    <1> 	or	byte [KB_FLAG_1], HOLD_STATE ; TURN ON THE HOLD FLAG
  1171                              <1> 	;
  1172                              <1> 	;-----	ENABLE KEYBOARD
  1173 000014AF B0AE                <1> 	mov	al, ENA_KBD		; ENABLE KEYBOARD
  1174 000014B1 E892010000          <1> 	call	SHIP_IT			; EXECUTE ENABLE
  1175                              <1> K39A:
  1176 000014B6 B020                <1> 	mov	al, EOI			; END OF INTERRUPT TO CONTROL PORT
  1177 000014B8 E620                <1> 	out	20h, al ;out INTA00, al	; ALLOW FURTHER KEYSTROKE INTERRUPTS
  1178                              <1> 	;
  1179                              <1> 	;-----	DURING PAUSE INTERVAL, TURN COLOR CRT BACK ON
  1180 000014BA 803D[BE670000]07    <1>         cmp     byte [CRT_MODE], 7      ; IS THIS BLACK AND WHITE CARD
  1181 000014C1 740A                <1>         je      short K40              	; YES, NOTHING TO DO
  1182 000014C3 66BAD803            <1> 	mov	dx, 03D8h		; PORT FOR COLOR CARD
  1183 000014C7 A0[BF670000]        <1>         mov     al, [CRT_MODE_SET] 	; GET THE VALUE OF THE CURRENT MODE
  1184 000014CC EE                  <1> 	out	dx, al			; SET THE CRT MODE, SO THAT CRT IS ON
  1185                              <1> 	;
  1186                              <1> K40:					; PAUSE-LOOP
  1187 000014CD F605[8A670000]08    <1>         test    byte [KB_FLAG_1], HOLD_STATE ; CHECK HOLD STATE FLAG
  1188 000014D4 75F7                <1> 	jnz	short K40		; LOOP UNTIL FLAG TURNED OFF
  1189                              <1> 	;
  1190 000014D6 E995FEFFFF          <1>         jmp     K27                     ; INTERRUPT_RETURN_NO_EOI
  1191                              <1>         ;
  1192                              <1> 	;-----	TEST SPECIAL CASE KEY 55
  1193                              <1> K41:					; NO-PAUSE
  1194 000014DB 3C37                <1> 	cmp	al, 55			; TEST FOR */PRTSC KEY
  1195 000014DD 7513                <1> 	jne	short K42		; NOT-KEY-55
  1196 000014DF F6C710              <1> 	test	bh, KBX			; IS THIS THE ENHANCED KEYBOARD?
  1197 000014E2 7405                <1> 	jz	short K41A		; NO, CTL-PRTSC IS VALID	
  1198 000014E4 F6C702              <1> 	test	bh, LC_E0		; YES, WAS LAST CODE AN E0?
  1199 000014E7 7421                <1> 	jz	short K42B		; NO, TRANSLATE TO A FUNCTION
  1200                              <1> K41A:	
  1201 000014E9 66B80072            <1> 	mov	ax, 114*256		; START/STOP PRINTING SWITCH
  1202 000014ED E9EF000000          <1>         jmp     K57                     ; BUFFER_FILL
  1203                              <1> 	;
  1204                              <1> 	;-----	SET UP TO TRANSLATE CONTROL SHIFT
  1205                              <1> K42:					; NOT-KEY-55
  1206 000014F2 3C0F                <1> 	cmp	al, 15			; IS IT THE TAB KEY?
  1207 000014F4 7414                <1> 	je	short K42B		; YES, XLATE TO FUNCTION CODE
  1208 000014F6 3C35                <1> 	cmp	al, 53			; IS IT THE / KEY?
  1209 000014F8 750E                <1> 	jne	short K42A		; NO, NO MORE SPECIAL CASES	
  1210 000014FA F6C702              <1> 	test	bh, LC_E0		; YES, IS IT FROM THE KEY PAD?
  1211 000014FD 7409                <1> 	jz	short K42A		; NO, JUST TRANSLATE
  1212 000014FF 66B80095            <1> 	mov	ax, 9500h		; YES, SPECIAL CODE FOR THIS ONE
  1213 00001503 E9D9000000          <1> 	jmp	K57			; BUFFER FILL	
  1214                              <1> K42A: 
  1215                              <1> 	;;mov	ebx, _K8		; SET UP TO TRANSLATE CTL
  1216 00001508 3C3B                <1> 	cmp	al, 59			; IS IT IN CHARACTER TABLE?
  1217                              <1>         ;jb	short K45F              ; YES, GO TRANSLATE CHAR
  1218                              <1> 	;;jb	K56 ; 20/02/2015
  1219                              <1> 	;;jmp	K64 ; 20/02/2015
  1220                              <1> K42B:
  1221 0000150A BB[80660000]        <1> 	mov	ebx, _K8		; SET UP TO TRANSLATE CTL
  1222                              <1> 	;jb	K56 ;; 20/02/2015
  1223                              <1> 	; 12/04/2021
  1224 0000150F 7267                <1> 	jb	short K45F	
  1225 00001511 E9B9000000          <1> 	jmp	K64	
  1226                              <1>         ;
  1227                              <1> 	;-----	NOT IN CONTROL SHIFT
  1228                              <1> K44:					; NOT-CTL-SHIFT
  1229 00001516 3C37                <1> 	cmp	al, 55			; PRINT SCREEN KEY?
  1230 00001518 7528                <1> 	jne	short K45		; NOT PRINT SCREEN
  1231 0000151A F6C710              <1> 	test	bh, KBX			; IS THIS ENHANCED KEYBOARD?
  1232 0000151D 7407                <1> 	jz	short K44A		; NO, TEST FOR SHIFT STATE	
  1233 0000151F F6C702              <1> 	test	bh, LC_E0		; YES, LAST CODE A MARKER?
  1234 00001522 7507                <1> 	jnz	short K44B		; YES, IS PRINT SCREEN
  1235 00001524 EB41                <1> 	jmp	short K45C		; NO, TRANSLATE TO '*' CHARACTER
  1236                              <1> K44A:
  1237 00001526 F6C303              <1> 	test	bl, LEFT_SHIFT+RIGHT_SHIFT ; NOT 101 KBD, SHIFT KEY DOWN?
  1238 00001529 743C                <1> 	jz	short K45C		; NO, TRANSLATE TO '*' CHARACTER
  1239                              <1> 	;
  1240                              <1> 	;-----	ISSUE INTERRUPT TO INDICATE PRINT SCREEN FUNCTION
  1241                              <1> K44B:
  1242 0000152B B0AE                <1> 	mov	al, ENA_KBD		; INSURE KEYBOARD IS ENABLED
  1243 0000152D E816010000          <1> 	call	SHIP_IT			; EXECUTE ENABLE
  1244 00001532 B020                <1> 	mov	al, EOI			; END OF CURRENT INTERRUPT
  1245 00001534 E620                <1> 	out	20h, al ;out INTA00, al	; SO FURTHER THINGS CAN HAPPEN
  1246                              <1> 	; Print Screen !!!		; ISSUE PRINT SCREEN INTERRUPT (INT 05h)
  1247                              <1> 	;PUSH 	BP			; SAVE POINTER
  1248                              <1> 	;INT 	5H			; ISSUE PRINT SCREEN INTERRUPT
  1249                              <1> 	;POP	BP			; RESTORE POINTER
  1250 00001536 8025[8C670000]FC    <1>         and     byte [KB_FLAG_3], ~(LC_E0+LC_E1) ; ZERO OUT THESE FLAGS
  1251 0000153D E92EFEFFFF          <1>         jmp     K27                     ; GO BACK WITHOUT EOI OCCURRING
  1252                              <1> 	;
  1253                              <1> 	;-----	HANDLE IN-CORE KEYS
  1254                              <1> K45:					; NOT-PRINT-SCREEN
  1255 00001542 3C3A                <1> 	cmp	al, 58			; TEST FOR IN-CORE AREA
  1256 00001544 7734                <1> 	ja	short K46		; JUMP IF NOT
  1257 00001546 3C35                <1> 	cmp	al, 53			; IS THIS THE '/' KEY?
  1258 00001548 7505                <1> 	jne	short K45A		; NO, JUMP
  1259 0000154A F6C702              <1> 	test	bh, LC_E0		; WAS THE LAST CODE THE MARKER?
  1260 0000154D 7518                <1> 	jnz	short K45C		; YES, TRANSLATE TO CHARACTER
  1261                              <1> K45A:
  1262 0000154F B91A000000          <1> 	mov	ecx, 26			; LENGHT OF SEARCH
  1263 00001554 BF[56660000]        <1> 	mov	edi, K30+10		; POINT TO TABLE OF A-Z CHARS
  1264 00001559 F2AE                <1> 	repne	scasb			; IS THIS A LETTER KEY?
  1265                              <1> 		; 20/02/2015
  1266 0000155B 7505                <1> 	jne	short K45B              ; NO, SYMBOL KEY
  1267                              <1> 	;
  1268 0000155D F6C340              <1> 	test	bl, CAPS_STATE		; ARE WE IN CAPS_LOCK?
  1269 00001560 750C                <1> 	jnz	short K45D		; TEST FOR SURE
  1270                              <1> K45B:
  1271 00001562 F6C303              <1> 	test	bl, LEFT_SHIFT+RIGHT_SHIFT ; ARE WE IN SHIFT STATE?
  1272 00001565 750C                <1> 	jnz	short K45E		; YES, UPPERCASE
  1273                              <1> 					; NO, LOWERCASE
  1274                              <1> K45C:
  1275 00001567 BB[D8660000]        <1> 	mov	ebx, K10		; TRANSLATE TO LOWERCASE LETTERS
  1276 0000156C EB51                <1> 	jmp	short K56	
  1277                              <1> K45D:					; ALMOST-CAPS-STATE
  1278 0000156E F6C303              <1> 	test	bl, LEFT_SHIFT+RIGHT_SHIFT ; CL ON. IS SHIFT ON, TOO?
  1279 00001571 75F4                <1> 	jnz	short K45C		; SHIFTED TEMP OUT OF CAPS STATE
  1280                              <1> K45E:
  1281 00001573 BB[30670000]        <1> 	mov	ebx, K11		; TRANSLATE TO UPPER CASE LETTERS
  1282 00001578 EB45                <1> K45F:	jmp	short K56
  1283                              <1> 	;
  1284                              <1> 	;-----	TEST FOR KEYS F1 - F10
  1285                              <1> K46:					; NOT IN-CORE AREA
  1286 0000157A 3C44                <1> 	cmp	al, 68			; TEST FOR F1 - F10
  1287                              <1> 	;ja	short K47		; JUMP IF NOT
  1288                              <1> 	;jmp	short K53		; YES, GO DO FN KEY PROCESS			
  1289 0000157C 7635                <1> 	jna	short K53		
  1290                              <1> 	;
  1291                              <1> 	;-----	HANDLE THE NUMERIC PAD KEYS
  1292                              <1> K47:					; NOT F1 - F10
  1293 0000157E 3C53                <1> 	cmp	al, 83			; TEST NUMPAD KEYS
  1294 00001580 772D                <1> 	ja	short K52		; JUMP IF NOT
  1295                              <1> 	;
  1296                              <1> 	;-----	KEYPAD KEYS, MUST TEST NUM LOCK FOR DETERMINATION
  1297                              <1> K48:
  1298 00001582 3C4A                <1> 	cmp	al, 74			; SPECIAL CASE FOR MINUS
  1299 00001584 74ED                <1> 	je	short K45E		; GO TRANSLATE
  1300 00001586 3C4E                <1> 	cmp	al, 78			; SPECIAL CASE FOR PLUS
  1301 00001588 74E9                <1> 	je	short K45E		; GO TRANSLATE
  1302 0000158A F6C702              <1> 	test	bh, LC_E0		; IS THIS ONE OFTHE NEW KEYS?
  1303 0000158D 750A                <1> 	jnz	short K49		; YES, TRANSLATE TO BASE STATE
  1304                              <1> 	;		
  1305 0000158F F6C320              <1> 	test 	bl, NUM_STATE		; ARE WE IN NUM LOCK
  1306 00001592 7514                <1> 	jnz	short K50		; TEST FOR SURE
  1307 00001594 F6C303              <1> 	test	bl, LEFT_SHIFT+RIGHT_SHIFT ; ARE WE IN SHIFT STATE?
  1308                              <1> 	;jnz	short K51		; IF SHIFTED, REALLY NUM STATE
  1309 00001597 75DA                <1> 	jnz	short K45E
  1310                              <1> 	;
  1311                              <1> 	;-----	BASE CASE FOR KEYPAD
  1312                              <1> K49:					
  1313 00001599 3C4C                <1> 	cmp	al, 76			; SPECIAL CASE FOR BASE STATE 5
  1314 0000159B 7504                <1> 	jne	short K49A		; CONTINUE IF NOT KEYPAD 5
  1315 0000159D B0F0                <1> 	mov	al, 0F0h		; SPECIAL ASCII CODE	
  1316 0000159F EB40                <1> 	jmp	short K57		; BUFFER FILL
  1317                              <1> K49A:
  1318 000015A1 BB[D8660000]        <1> 	mov	ebx, K10		; BASE CASE TABLE	
  1319 000015A6 EB27                <1> 	jmp	short K64		; CONVERT TO PSEUDO SCAN
  1320                              <1> 	;
  1321                              <1> 	;-----	MIGHT BE NUM LOCK, TEST SHIFT STATUS
  1322                              <1> K50:					; ALMOST-NUM-STATE
  1323 000015A8 F6C303              <1>         test    bl, LEFT_SHIFT+RIGHT_SHIFT
  1324 000015AB 75EC                <1> 	jnz 	short K49		; SHIFTED TEMP OUT OF NUM STATE
  1325 000015AD EBC4                <1> K51:	jmp	short K45E		; REALLY NUM STATE
  1326                              <1> 	;
  1327                              <1> 	;-----	TEST FOR THE NEW KEYS ON WT KEYBOARDS 
  1328                              <1> K52:					; NOT A NUMPAD KEY
  1329 000015AF 3C56                <1> 	cmp	al, 86			; IS IT THE NEW WT KEY?
  1330                              <1> 	;jne	short K53		; JUMP IF NOT
  1331                              <1> 	;jmp	short K45B		; HANDLE WITH REST OF LETTER KEYS
  1332 000015B1 74AF                <1> 	je	short K45B		
  1333                              <1> 	;
  1334                              <1> 	;-----	MUST BE F11 OR F12 
  1335                              <1> K53:					; F1 - F10 COME HERE, TOO
  1336 000015B3 F6C303              <1> 	test	bl, LEFT_SHIFT+RIGHT_SHIFT ; TEST SHIFT STATE
  1337 000015B6 74E1                <1> 	jz	short K49		; JUMP, LOWER CASE PSEUDO SC'S
  1338                              <1> 		; 20/02/2015 
  1339 000015B8 BB[30670000]        <1> 	mov	ebx, K11		; UPPER CASE PSEUDO SCAN CODES
  1340 000015BD EB10                <1> 	jmp	short K64		; TRANSLATE SCAN
  1341                              <1> 	;
  1342                              <1> 	;-----	TRANSLATE THE CHARACTER
  1343                              <1> K56:					; TRANSLATE-CHAR
  1344 000015BF FEC8                <1> 	dec	al			; CONVERT ORIGIN
  1345 000015C1 D7                  <1> 	xlat    			; CONVERT THE SCAN CODE TO ASCII
  1346 000015C2 F605[8C670000]02    <1> 	test	byte [KB_FLAG_3], LC_E0	; IS THIS A NEW KEY?
  1347 000015C9 7416                <1> 	jz	short K57		; NO, GO FILL BUFFER
  1348 000015CB B4E0                <1> 	mov	ah, MC_E0		; YES, PUT SPECIAL MARKER IN AH
  1349 000015CD EB12                <1> 	jmp	short K57		; PUT IT INTO THE BUFFER	
  1350                              <1> 	;
  1351                              <1> 	;-----	TRANSLATE SCAN FOR PSEUDO SCAN CODES
  1352                              <1> K64:					; TRANSLATE-SCAN-ORGD
  1353 000015CF FEC8                <1> 	dec	al			; CONVERT ORIGIN
  1354 000015D1 D7                  <1>        	xlat    	                ; CTL TABLE SCAN
  1355 000015D2 88C4                <1> 	mov	ah, al			; PUT VALUE INTO AH
  1356 000015D4 B000                <1> 	mov	al, 0			; ZERO ASCII CODE
  1357 000015D6 F605[8C670000]02    <1> 	test	byte [KB_FLAG_3], LC_E0	; IS THIS A NEW KEY?
  1358 000015DD 7402                <1> 	jz	short K57		; NO, GO FILL BUFFER
  1359 000015DF B0E0                <1> 	mov	al, MC_E0		; YES, PUT SPECIAL MARKER IN AL
  1360                              <1> 	;
  1361                              <1> 	;-----	PUT CHARACTER INTO BUFFER
  1362                              <1> K57:					; BUFFER_FILL
  1363 000015E1 3CFF                <1> 	cmp	al, -1			; IS THIS AN IGNORE CHAR
  1364 000015E3 7405                <1> 	je	short K59		; YES, DO NOTHING WITH IT
  1365                              <1> 	;je	K26			; YES, DO NOTHING WITH IT
  1366 000015E5 80FCFF              <1> 	cmp	ah, -1			; LOOK FOR -1 PSEUDO SCAN
  1367                              <1>         ;;jne	short K61		; NEAR_INTERRUPT_RETURN
  1368                              <1> 	;je	K26			; INTERRUPT_RETURN
  1369                              <1> 	; 12/04/2021
  1370 000015E8 7505                <1>         jne	short _K60		; NEAR_INTERRUPT_RETURN
  1371                              <1> K59:					; NEAR_INTERRUPT_RETURN
  1372 000015EA E975FDFFFF          <1> 	jmp	K26			; INTERRUPT_RETURN
  1373                              <1> 
  1374                              <1> _K60: ; 29/01/2016
  1375 000015EF 80FC68              <1> 	cmp	ah, 68h	; ALT + F1 key
  1376 000015F2 721D                <1> 	jb	short K61
  1377 000015F4 80FC6F              <1> 	cmp	ah, 6Fh ; ALT + F8 key	
  1378 000015F7 7718                <1> 	ja	short K61
  1379                              <1> 	;
  1380 000015F9 8A1D[B6780100]      <1> 	mov	bl, [ACTIVE_PAGE]
  1381 000015FF 80C368              <1> 	add	bl, 68h
  1382 00001602 38E3                <1> 	cmp	bl, ah
  1383 00001604 740B                <1> 	je	short K61
  1384                              <1> 	; 24/07/2022
  1385                              <1> 	;push	ax
  1386 00001606 50                  <1> 	push	eax
  1387 00001607 88E0                <1> 	mov	al, ah
  1388 00001609 2C68                <1> 	sub	al, 68h
  1389 0000160B E850090000          <1> 	call	set_active_page
  1390 00001610 58                  <1> 	pop	eax
  1391                              <1> 	;pop	ax
  1392                              <1> K61:					; NOT-CAPS-STATE
  1393 00001611 8B1D[9A670000]      <1> 	mov	ebx, [BUFFER_TAIL] 	; GET THE END POINTER TO THE BUFFER
  1394 00001617 89DE                <1> 	mov	esi, ebx		; SAVE THE VALUE
  1395 00001619 E8B5FAFFFF          <1> 	call	_K4			; ADVANCE THE TAIL
  1396 0000161E 3B1D[96670000]      <1> 	cmp	ebx, [BUFFER_HEAD] 	; HAS THE BUFFER WRAPPED AROUND
  1397 00001624 740E                <1> 	je	short K62		; BUFFER_FULL_BEEP
  1398 00001626 668906              <1> 	mov	[esi], ax		; STORE THE VALUE
  1399 00001629 891D[9A670000]      <1> 	mov	[BUFFER_TAIL], ebx 	; MOVE THE POINTER UP
  1400 0000162F E930FDFFFF          <1> 	jmp	K26
  1401                              <1> 	;;cli				; TURN OFF INTERRUPTS
  1402                              <1> 	;;mov	al, EOI			; END OF INTERRUPT COMMAND
  1403                              <1> 	;;out	INTA00, al		; SEND COMMAND TO INTERRUPT CONTROL PORT
  1404                              <1> 	;mov	al, ENA_KBD		; INSURE KEYBOARD IS ENABLED
  1405                              <1> 	;call	SHIP_IT			; EXECUTE ENABLE
  1406                              <1> 	;mov	ax, 9102h		; MOVE IN POST CODE & TYPE
  1407                              <1> 	;int	15h			; PERFORM OTHER FUNCTION
  1408                              <1> 	;;and	byte [KB_FLAG_3],~(LC_E0+LC_E1) ; RESET LAST CHAR H.C. FLAG
  1409                              <1> 	;jmp	K27A			; INTERRUPT_RETURN
  1410                              <1> 	;;jmp   K27                    
  1411                              <1> 	;
  1412                              <1> 	;-----	BUFFER IS FULL SOUND THE BEEPER
  1413                              <1> K62:
  1414 00001634 B020                <1> 	mov	al, EOI			; ENABLE INTERRUPT CONTROLLER CHIP
  1415 00001636 E620                <1> 	out	INTA00, al
  1416 00001638 66B9A602            <1> 	mov	cx, 678			; DIVISOR FOR 1760 HZ
  1417 0000163C B304                <1> 	mov	bl, 4			; SHORT BEEP COUNT (1/16 + 1/64 DELAY)
  1418 0000163E E8420D0000          <1> 	call	beep			; GO TO COMMON BEEP HANDLER
  1419 00001643 E928FDFFFF          <1> 	jmp     K27			; EXIT   
  1420                              <1> 
  1421                              <1> SHIP_IT:
  1422                              <1> 	;---------------------------------------------------------------------------------
  1423                              <1> 	; SHIP_IT
  1424                              <1> 	;	THIS ROUTINES HANDLES TRANSMISSION OF COMMAND AND DATA BYTES
  1425                              <1> 	;	TO THE KEYBOARD CONTROLLER.
  1426                              <1> 	;---------------------------------------------------------------------------------
  1427                              <1> 	;
  1428                              <1> 	
  1429                              <1> 	;push	ax			; SAVE DATA TO SEND
  1430                              <1> 	; 12/04/2021
  1431 00001648 50                  <1> 	push	eax
  1432                              <1> 
  1433                              <1> 	;-----	WAIT FOR COMMAND TO ACCEPTED
  1434 00001649 FA                  <1> 	cli				; DISABLE INTERRUPTS TILL DATA SENT
  1435                              <1> 	; xor	ecx, ecx		; CLEAR TIMEOUT COUNTER
  1436 0000164A B900000100          <1> 	mov	ecx, 10000h			
  1437                              <1> S10:
  1438 0000164F E464                <1> 	in	al, STATUS_PORT		; READ KEYBOARD CONTROLLER STATUS
  1439 00001651 A802                <1> 	test	al, INPT_BUF_FULL	; CHECK FOR ITS INPUT BUFFER BUSY
  1440 00001653 E0FA                <1> 	loopnz	S10			; WAIT FOR COMMAND TO BE ACCEPTED
  1441                              <1> 
  1442                              <1> 	;pop	ax			; GET DATA TO SEND
  1443                              <1> 	; 12/04/2021
  1444 00001655 58                  <1> 	pop	eax
  1445                              <1> 
  1446 00001656 E664                <1> 	out	STATUS_PORT, al		; SEND TO KEYBOARD CONTROLLER
  1447 00001658 FB                  <1> 	sti				; ENABLE INTERRUPTS AGAIN
  1448 00001659 C3                  <1> 	retn				; RETURN TO CALLER
  1449                              <1> 
  1450                              <1> 	; 12/04/2021 (32 bit push/pop)
  1451                              <1> SND_DATA:
  1452                              <1> 	; ---------------------------------------------------------------------------------
  1453                              <1> 	; SND_DATA
  1454                              <1> 	;	THIS ROUTINES HANDLES TRANSMISSION OF COMMAND AND DATA BYTES
  1455                              <1> 	;	TO THE KEYBOARD AND RECEIPT OF ACKNOWLEDGEMENTS. IT ALSO
  1456                              <1> 	;	HANDLES ANY RETRIES IF REQUIRED
  1457                              <1> 	; ---------------------------------------------------------------------------------
  1458                              <1> 	;
  1459 0000165A 50                  <1> 	push	eax ; push ax		; SAVE REGISTERS
  1460 0000165B 53                  <1> 	push	ebx ; push bx
  1461 0000165C 51                  <1> 	push	ecx
  1462 0000165D 88C7                <1> 	mov	bh, al			; SAVE TRANSMITTED BYTE FOR RETRIES
  1463 0000165F B303                <1> 	mov	bl, 3			; LOAD RETRY COUNT
  1464                              <1> SD0:
  1465 00001661 FA                  <1> 	cli				; DISABLE INTERRUPTS
  1466 00001662 8025[8B670000]CF    <1> 	and	byte [KB_FLAG_2], ~(KB_FE+KB_FA) ; CLEAR ACK AND RESEND FLAGS
  1467                              <1> 	;
  1468                              <1> 	;-----	WAIT FOR COMMAND TO BE ACCEPTED
  1469 00001669 B900000100          <1> 	mov	ecx, 10000h		; MAXIMUM WAIT COUNT
  1470                              <1> SD5:
  1471 0000166E E464                <1> 	in	al, STATUS_PORT		; READ KEYBOARD PROCESSOR STATUS PORT
  1472 00001670 A802                <1> 	test	al, INPT_BUF_FULL	; CHECK FOR ANY PENDING COMMAND
  1473 00001672 E0FA                <1> 	loopnz	SD5			; WAIT FOR COMMAND TO BE ACCEPTED
  1474                              <1> 	;
  1475 00001674 88F8                <1> 	mov	al, bh			; REESTABLISH BYTE TO TRANSMIT
  1476 00001676 E660                <1> 	out	PORT_A, al		; SEND BYTE
  1477 00001678 FB                  <1> 	sti				; ENABLE INTERRUPTS
  1478                              <1> 	;mov	cx, 01A00h		; LOAD COUNT FOR 10 ms+
  1479 00001679 B9FFFF0000          <1> 	mov	ecx, 0FFFFh
  1480                              <1> SD1:
  1481 0000167E F605[8B670000]30    <1> 	test	byte [KB_FLAG_2], KB_FE+KB_FA ; SEE IF EITHER BIT SET
  1482 00001685 750F                <1> 	jnz	short SD3		; IF SET, SOMETHING RECEIVED GO PROCESS
  1483 00001687 E2F5                <1> 	loop	SD1			; OTHERWISE WAIT
  1484                              <1> SD2:
  1485 00001689 FECB                <1> 	dec	bl			; DECREMENT RETRY COUNT
  1486 0000168B 75D4                <1> 	jnz	short SD0		; RETRY TRANSMISSION
  1487 0000168D 800D[8B670000]80    <1> 	or	byte [KB_FLAG_2], KB_ERR ; TURN ON TRANSMIT ERROR FLAG
  1488 00001694 EB09                <1> 	jmp	short SD4		; RETRIES EXHAUSTED FORGET TRANSMISSION
  1489                              <1> SD3:
  1490 00001696 F605[8B670000]10    <1> 	test	byte [KB_FLAG_2], KB_FA ; SEE IF THIS IS AN ACKNOWLEDGE
  1491 0000169D 74EA                <1> 	jz	short SD2		; IF NOT, GO RESEND
  1492                              <1> SD4:	
  1493 0000169F 59                  <1> 	pop	ecx			; RESTORE REGISTERS
  1494 000016A0 5B                  <1> 	pop	ebx ; pop bx
  1495 000016A1 58                  <1> 	pop	eax ; pop ax
  1496 000016A2 C3                  <1> 	retn				; RETURN, GOOD TRANSMISSION
  1497                              <1> 
  1498                              <1> SND_LED:
  1499                              <1> 	; ---------------------------------------------------------------------------------
  1500                              <1> 	; SND_LED
  1501                              <1> 	;	THIS ROUTINES TURNS ON THE MODE INDICATORS.
  1502                              <1> 	;
  1503                              <1> 	;----------------------------------------------------------------------------------
  1504                              <1> 	;
  1505 000016A3 FA                  <1> 	cli				; TURN OFF INTERRUPTS
  1506 000016A4 F605[8B670000]40    <1> 	test	byte [KB_FLAG_2], KB_PR_LED ; CHECK FOR MODE INDICATOR UPDATE
  1507 000016AB 755F                <1> 	jnz 	short SL1		; DON'T UPDATE AGAIN IF UPDATE UNDERWAY
  1508                              <1> 	;
  1509 000016AD 800D[8B670000]40    <1> 	or	byte [KB_FLAG_2], KB_PR_LED ; TURN ON UPDATE IN PROCESS
  1510 000016B4 B020                <1> 	mov	al, EOI			; END OF INTERRUPT COMMAND
  1511 000016B6 E620                <1> 	out	20h, al ;out INTA00, al	; SEND COMMAND TO INTERRUPT CONTROL PORT
  1512 000016B8 EB11                <1> 	jmp	short SL0		; GO SEND MODE INDICATOR COMMAND
  1513                              <1> SND_LED1:
  1514 000016BA FA                  <1> 	cli				; TURN OFF INTERRUPTS
  1515 000016BB F605[8B670000]40    <1> 	test	byte [KB_FLAG_2], KB_PR_LED ; CHECK FOR MODE INDICATOR UPDATE
  1516 000016C2 7548                <1> 	jnz	short SL1		; DON'T UPDATE AGAIN IF UPDATE UNDERWAY
  1517                              <1> 	;
  1518 000016C4 800D[8B670000]40    <1> 	or	byte [KB_FLAG_2], KB_PR_LED ; TURN ON UPDATE IN PROCESS
  1519                              <1> SL0:
  1520 000016CB B0ED                <1> 	mov	al, LED_CMD		; LED CMD BYTE
  1521 000016CD E888FFFFFF          <1> 	call	SND_DATA		; SEND DATA TO KEYBOARD
  1522 000016D2 FA                  <1> 	cli
  1523 000016D3 E836000000          <1> 	call	MAKE_LED		; GO FORM INDICATOR DATA BYTE
  1524 000016D8 8025[8B670000]F8    <1> 	and	byte [KB_FLAG_2], 0F8h	; ~KB_LEDS ; CLEAR MODE INDICATOR BITS
  1525 000016DF 0805[8B670000]      <1> 	or	[KB_FLAG_2], al 	; SAVE PRESENT INDICATORS FOR NEXT TIME
  1526 000016E5 F605[8B670000]80    <1> 	test	byte [KB_FLAG_2], KB_ERR ; TRANSMIT ERROR DETECTED
  1527 000016EC 750F                <1> 	jnz	short SL2		; IF SO, BYPASS SECOND BYTE TRANSMISSION
  1528                              <1> 	;
  1529 000016EE E867FFFFFF          <1> 	call	SND_DATA		; SEND DATA TO KEYBOARD
  1530 000016F3 FA                  <1> 	cli				; TURN OFF INTERRUPTS
  1531 000016F4 F605[8B670000]80    <1> 	test	byte [KB_FLAG_2], KB_ERR ; TRANSMIT ERROR DETECTED
  1532 000016FB 7408                <1> 	jz	short SL3		; IF NOT, DON'T SEND AN ENABLE COMMAND
  1533                              <1> SL2:
  1534 000016FD B0F4                <1> 	mov	al, KB_ENABLE		; GET KEYBOARD CSA ENABLE COMMAND
  1535 000016FF E856FFFFFF          <1> 	call	SND_DATA		; SEND DATA TO KEYBOARD
  1536 00001704 FA                  <1> 	cli				; TURN OFF INTERRUPTS
  1537                              <1> SL3:
  1538 00001705 8025[8B670000]3F    <1> 	and	byte [KB_FLAG_2], ~(KB_PR_LED+KB_ERR) ; TURN OFF MODE INDICATOR
  1539                              <1> SL1:					; UPDATE AND TRANSMIT ERROR FLAG
  1540 0000170C FB                  <1> 	sti				; ENABLE INTERRUPTS
  1541 0000170D C3                  <1> 	retn				; RETURN TO CALLER
  1542                              <1> 
  1543                              <1> MAKE_LED:
  1544                              <1> 	;---------------------------------------------------------------------------------
  1545                              <1> 	; MAKE_LED
  1546                              <1> 	;	THIS ROUTINES FORMS THE DATA BYTE NECESSARY TO TURN ON/OFF
  1547                              <1> 	;	THE MODE INDICATORS.
  1548                              <1> 	;---------------------------------------------------------------------------------
  1549                              <1> 	;
  1550                              <1> 	;push 	cx			; SAVE CX
  1551 0000170E A0[89670000]        <1> 	mov	al, [KB_FLAG]		; GET CAPS & NUM LOCK INDICATORS
  1552 00001713 2470                <1> 	and	al, CAPS_STATE+NUM_STATE+SCROLL_STATE ; ISOLATE INDICATORS
  1553                              <1> 	;mov	cl, 4			; SHIFT COUNT
  1554                              <1> 	;rol	al, cl			; SHIFT BITS OVER TO TURN ON INDICATORS
  1555 00001715 C0C004              <1> 	rol	al, 4 ; 20/02/2015
  1556 00001718 2407                <1> 	and	al, 07h			; MAKE SURE ONLY MODE BITS ON
  1557                              <1> 	;pop	cx
  1558 0000171A C3                  <1> 	retn				; RETURN TO CALLER
  1559                              <1> 
  1560                              <1> ; % include 'kybdata.s'   ; KEYBOARD DATA
  1561                              <1> 
  1562                              <1> 
  1563                              <1> ; /// End Of KEYBOARD FUNCTIONS ///
  2982                                  
  2983                                  %include 'video.s' ; 07/03/2015
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.7 - video.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 29/11/2023 (Previous: 07/08/2022 - Kernel v2.0.5)
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 16/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.15 (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 0000171B 9C                  <1> 	pushfd
    35 0000171C 0E                  <1> 	push	cs
    36 0000171D E851000000          <1> 	call	VIDEO_IO_1
    37 00001722 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 00001723 [F41A0000]          <1> M1:	dd	SET_MODE	; TABLE OF ROUTINES WITHIN VIDEO I/O
   191 00001727 [AA1E0000]          <1> 	dd	SET_CTYPE
   192 0000172B [D81E0000]          <1> 	dd	SET_CPOS
   193 0000172F [FC1E0000]          <1> 	dd	READ_CURSOR
   194                              <1> 	;dd	VIDEO_RETURN	; READ_LPEN
   195 00001733 [F21A0000]          <1> 	dd	set_mode_ncm	; Set mode without clearing video memory
   196 00001737 [421F0000]          <1> 	dd	ACT_DISP_PAGE
   197 0000173B [CC1F0000]          <1> 	dd	SCROLL_UP
   198 0000173F [E3200000]          <1> 	dd	SCROLL_DOWN
   199 00001743 [62210000]          <1> 	dd	READ_AC_CURRENT
   200 00001747 [BF210000]          <1> 	dd	WRITE_AC_CURRENT
   201 0000174B [E5210000]          <1> 	dd	WRITE_C_CURRENT
   202 0000174F [ED2A0000]          <1> 	dd	SET_COLOR
   203 00001753 [552B0000]          <1> 	dd	WRITE_DOT
   204 00001757 [242B0000]          <1> 	dd	READ_DOT
   205 0000175B [6F220000]          <1> 	dd	WRITE_TTY
   206 0000175F [DA1A0000]          <1> 	dd	VIDEO_STATE
   207 00001763 [22360000]          <1> 	dd	vga_pal_funcs	; 10/08/2016 (TRDOS 386)
   208 00001767 [3A300000]          <1> 	dd	font_setup	; 10/07/2016 (TRDOS 386)
   209 0000176B [291B0000]          <1> 	dd	VIDEO_RETURN	; RESERVED
   210 0000176F [E5230000]          <1> 	dd	WRITE_STRING	; 23/06/2016 (TRDOS 386)
   211                              <1> M1L	EQU	$ - M1
   212                              <1> 
   213                              <1> ; 29/11/2023 - TRDOS 386 v2.0.7
   214                              <1> ;	[VESA VBE3-PMI functions]
   215                              <1> ;	(fixing page table problems for LFB/PMI for >2.5GB main memory)
   216                              <1> ;	((Addresses of kernel page tables and PMI videobios address
   217                              <1> ;	  must be < 4MB or cr3 register must contain kernel's page dir
   218                              <1> ;	  during video interrupt. Save-change-restore cr3 register
   219                              <1> ;	  content here is a bugfix method to prevent page faults 
   220                              <1> ;	  for -real- computers with >2.5GB main memory.))
   221                              <1> ;	 {INT 31h was not changing cr3 while it contains user's
   222                              <1> ;	  page directory addr and accessing beyond of the 1st 4MB was
   223                              <1> ;	  causing to page faults.. because, after the 1st 4MB, user's
   224                              <1> ;	  page tables contain non-linear/virtual memory pages.}
   225                              <1> ;
   226                              <1> ; 02/08/2022 - TRDOS 386 v2.0.5
   227                              <1> ; 06/12/2020
   228                              <1> ; 05/12/2020
   229                              <1> ; 03/12/2020
   230                              <1> ; 27/11/2020 - TRDOS 386 v2.0.3
   231                              <1> ; 14/01/2017
   232                              <1> ; 02/01/2017
   233                              <1> ; 04/07/2016
   234                              <1> ; 12/05/2016
   235                              <1> ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
   236                              <1> int31h:  ; Video BIOS
   237                              <1> 
   238                              <1> ; BH = Video page number
   239                              <1> ; BL = Color/Attribute
   240                              <1> ; AH = Function number
   241                              <1> ; AL = Character
   242                              <1> 
   243                              <1> VIDEO_IO_1:
   244                              <1> 	;sti				; INTERRUPTS BACK ON
   245 00001773 FC                  <1> 	cld				; SET DIRECTION FORWARD
   246                              <1> 	
   247                              <1> 	;cmp	ah, M1L/4		; TEST FOR WITHIN TABLE RANGE
   248                              <1> 	;jnb	short M4		; BRANCH TO EXIT IF NOT A VALID COMMAND
   249                              <1> 
   250                              <1> 	; 26/11/2020
   251 00001774 80FC14              <1> 	cmp	ah, M1L/4
   252 00001777 7205                <1> 	jb	short VGA_func
   253                              <1> 
   254 00001779 80FC4F              <1> 	cmp	ah, 4Fh
   255 0000177C 7532                <1> 	jne	short M4 ; invalid !
   256                              <1> 
   257                              <1> VGA_func: ; 26/11/2020
   258 0000177E 06                  <1> 	push	es ; *
   259 0000177F 1E                  <1> 	push	ds ; **			; SAVE WORK AND PARAMETER REGISTERS
   260                              <1> 
   261                              <1> 	; 26/11/2020
   262 00001780 50                  <1> 	push	eax ; -
   263                              <1> 	
   264 00001781 66B81000            <1> 	mov	ax, KDATA 		; POINT DS: TO DATA SEGMENT
   265 00001785 8ED8                <1> 	mov	ds, ax
   266 00001787 8EC0                <1> 	mov	es, ax
   267                              <1> 
   268                              <1> 	; 26/11/2020
   269 00001789 58                  <1> 	pop	eax ; +
   270                              <1> 	;
   271 0000178A FB                  <1> 	sti
   272 0000178B 80FC4F              <1> 	cmp	ah, 4Fh
   273 0000178E 747A                <1> 	je	short VBE_func
   274                              <1> 
   275                              <1> 	; 04/12/2020
   276 00001790 A3[0C850100]        <1> 	mov	[video_eax], eax
   277                              <1> 
   278                              <1> 	; 21/12/2020
   279 00001795 803D[BE670000]FF    <1> 	cmp	byte [CRT_MODE], 0FFh	; Current mode is a VESA VBE mode ?
   280 0000179C 7213                <1> 	jb	short VGA_func_std
   281                              <1> 
   282 0000179E 08E4                <1> 	or	ah, ah			; set mode ?
   283 000017A0 750F                <1> 	jnz	short VGA_func_std	; no
   284                              <1> 
   285 000017A2 803D[86090000]03    <1> 	cmp	byte [vbe3], 3		; (real) VESA VBE 3 video bios ?
   286 000017A9 7506                <1> 	jne	short VGA_func_std	; no
   287                              <1> 
   288 000017AB E995010000          <1> 	jmp	vesa_vbe3_pmi
   289                              <1> 
   290                              <1> 	; 21/12/2020
   291                              <1> M4:					; COMMAND NOT VALID
   292 000017B0 CF                  <1> 	iretd				; DO NOTHING IF NOT IN VALID RANGE
   293                              <1> 
   294                              <1> VGA_func_std:
   295                              <1> 	; 06/12/2020
   296                              <1> 	; 03/12/2020
   297 000017B1 80FC0F              <1> 	cmp	ah, 0Fh
   298 000017B4 773D                <1> 	ja	short VGA_funcs_0	; only CGA funcs will be handled by	
   299                              <1> 	; 06/12/2020			; vga bios firmware
   300                              <1> 	; 03/12/2020			
   301                              <1> 	;test	ah, 7Fh ; set mode ?
   302                              <1> 	;;or	ah, ah			; only 'set mode' will be handled by
   303                              <1> 	;jnz	short VGA_funcs_0	; vga bios firmware	
   304                              <1> 	;jz	short vbe_pmi32_0
   305                              <1> 
   306                              <1> 	; 28/11/2020
   307 000017B6 803D[D49E0100]00    <1> 	cmp	byte [pmi32], 0		; 32 bit protected mode interface for
   308 000017BD 7634                <1> 	jna	short VGA_funcs_0	; video hardware's vga bios firmware
   309                              <1> 					; ([pmi32] > 0 if it is activated)
   310                              <1> 					; note:
   311                              <1> 					; [vbe3] = 3 is required to activate
   312                              <1> 	; 07/12/2020
   313 000017BF 20E4                <1> 	and	ah, ah ; is this set mode ?
   314 000017C1 7413                <1> 	jz	short vbe_pmi32_2 ; yes
   315                              <1> 
   316 000017C3 80FC04              <1> 	cmp	ah, 04h	 ; set mode ('no clear memory' option)
   317 000017C6 742B                <1> 	je	short VGA_funcs_0
   318                              <1> 
   319                              <1> 	; 07/12/2020
   320 000017C8 803D[BE670000]07    <1> 	cmp	byte [CRT_MODE], 7 ; current mode > 7 ?
   321 000017CF 7622                <1> 	jna	short VGA_funcs_0  ; no	
   322                              <1> 
   323                              <1> 	; when mode 3 is active, 
   324                              <1> 	; video bios functions are not redirected
   325                              <1> 	; to VESA VBE3 PMI except 'set mode' function
   326                              <1> 
   327                              <1> vbe_pmi32_0:
   328                              <1> 	; 06/12/2020
   329                              <1> 	;or	ah, ah
   330                              <1> 	;jnz	short vbe_pmi32_2
   331                              <1> 	; ah = 0 ; 'set mode'
   332                              <1> 	;cmp	al, 3 ; 80x25 text mode, 16 colors, default mode for MainProg
   333                              <1> 	;jne	short vbe_pmi32_1
   334                              <1> 	;cmp	byte [CRT_MODE], 3 ; If current video mode <> 3 and requested
   335                              <1> 	;			; video mode is 3, use internal 'set mode';
   336                              <1> 	;			; otherwise, use vesa vbe 3 bios's 'set mode'.
   337                              <1> 	;jne	short VGA_funcs_0
   338                              <1> vbe_pmi32_1:
   339 000017D1 E96F010000          <1> 	jmp	vesa_vbe3_pmi
   340                              <1> ;vbe_pmi32_2:
   341                              <1> 	;cmp	ah, 04h ; set mode (no clear mem option)
   342                              <1> 	;jne	short vbe_pmi32_1
   343                              <1> 
   344                              <1> vbe_pmi32_2:
   345                              <1> 	; 07/12/2020
   346 000017D6 803D[BE670000]07    <1> 	cmp	byte [CRT_MODE], 7 ; current mode > 7 ?
   347 000017DD 77F2                <1> 	ja	short vbe_pmi32_1  ; yes
   348                              <1> 
   349 000017DF 3C07                <1> 	cmp	al, 7	; requested mode > 7 ?
   350 000017E1 7610                <1> 	jna	short VGA_funcs_0  ; no (CGA)
   351                              <1> 
   352 000017E3 3C13                <1> 	cmp	al, 13h
   353 000017E5 76EA                <1> 	jna	short vbe_pmi32_1
   354                              <1> 
   355 000017E7 A880                <1> 	test	al, 80h
   356 000017E9 7408                <1> 	jz	short VGA_funcs_0  ; unknown or special
   357                              <1> 
   358 000017EB 3C87                <1> 	cmp	al, 87h	; requested mode > 7 ? 
   359                              <1> 			; (with no clear mem ops)
   360 000017ED 7604                <1> 	jna	short VGA_funcs_0  ; no (CGA)
   361                              <1> 
   362 000017EF 3C93                <1> 	cmp	al, 93h
   363 000017F1 76DE                <1> 	jna	short vbe_pmi32_1
   364                              <1> 
   365                              <1> 	; > 13h video modes are unknown or special
   366                              <1>  	; they must be handled by kernel	
   367                              <1> 
   368                              <1> 	; CGA video modes will be handled by kernel
   369                              <1> 
   370                              <1> VGA_funcs_0:
   371 000017F3 52                  <1> 	push	edx ; ***
   372 000017F4 51                  <1> 	push	ecx ; ****
   373 000017F5 53                  <1> 	push	ebx ; *****
   374 000017F6 56                  <1> 	push	esi ; ******
   375 000017F7 57                  <1> 	push	edi ; *******
   376 000017F8 55                  <1> 	push	ebp ; ********
   377                              <1> 
   378                              <1> 	;mov	[video_eax], eax ; 12/05/2016 
   379 000017F9 BF00800B00          <1> 	mov	edi, 0B8000h		; GET offset FOR COLOR CARD
   380                              <1> 
   381                              <1> 	; 23/03/2016
   382 000017FE C0E402              <1> 	shl	ah, 2  ; dword		; TIMES 2 FOR WORD TABLE LOOKUP
   383 00001801 0FB6F4              <1> 	movzx	esi, ah			; MOVE OFFSET INTO LOOK UP REGISTER (SI)
   384                              <1> 	;mov	ah, [CRT_MODE]		; MOVE CURRENT MODE INTO (AH) REGISTER
   385                              <1> 
   386                              <1> 	;;15/01/2017
   387                              <1> 	; 14/01/2017
   388                              <1> 	; 02/01/2017
   389                              <1> 	;;mov	byte [intflg], 31h  ; video interrupt
   390                              <1> 	;sti ; 26/11/2020
   391                              <1> 	;
   392                              <1> 
   393 00001804 FFA6[23170000]      <1> 	jmp	dword [esi+M1]		; GO TO SELECTED FUNCTION
   394                              <1> 
   395                              <1> VBE_func:
   396                              <1> 	; 26/11/2020
   397                              <1> 	;sti
   398 0000180A 55                  <1> 	push	ebp ; *** ; 27/11/2020	
   399 0000180B 56                  <1> 	push	esi ; **** 
   400                              <1> 	
   401                              <1> 	; Note:
   402                              <1> 	; ebx, ecx, edx, edi, ebp registers
   403                              <1> 	; must be saved by VBE functions and
   404                              <1> 	; eax register must be set
   405                              <1> 	; (according to VBE 3 standard)
   406                              <1> 	; before return from this interrupt
   407                              <1> 	; (every function must restore and set
   408                              <1> 	; registers except esp, esi, es, ds)
   409                              <1> 
   410                              <1> 	; 29/11/2023 - TRDOS 386 v2.0.7
   411 0000180C 0F20DE              <1> 	mov	esi, cr3
   412 0000180F 56                  <1> 	push	esi ; *****
   413                              <1> 	;cmp	esi, [k_page_dir]
   414                              <1> 	;je	short VBE_func_x
   415 00001810 8B35[88780100]      <1> 	mov	esi, [k_page_dir]
   416 00001816 0F22DE              <1> 	mov	cr3, esi
   417                              <1> ;VBE_func_x:
   418 00001819 803D[86090000]02    <1> 	cmp	byte [vbe3], 2
   419 00001820 7744                <1> 	ja	short VESA_VBE3_PMI_CALL ; VBE3 video bios ('PMID')
   420                              <1> 	;je	short VBE_func_0  ; Bochs/Qemu/VirtualBox emulator
   421 00001822 726C                <1> 	jb	short VBE_unknown ; invalid ([vbe3] = 0)
   422                              <1> 
   423                              <1> 	;jmp	VESA_VBE3_PMI_CALL
   424                              <1> 
   425                              <1> VBE_func_0:	
   426                              <1> 	; Bochs/Plex86 VGAbios VBE extension
   427                              <1> 	; (TRDOS 386 v2.0.3 can use VBE graphics modes on emulators)
   428                              <1> 	; BOCHS/QEMU/VIRTUALBOX
   429                              <1>  
   430 00001824 8A25[87090000]      <1> 	mov	ah, [vbe2bios]
   431 0000182A 80FCC0              <1> 	cmp	ah, 0C0h		
   432 0000182D 7261                <1> 	jb	short VBE_unknown 	
   433 0000182F 80FCC5              <1> 	cmp	ah, 0C5h
   434 00001832 775C                <1> 	ja	short VBE_unknown
   435                              <1> 
   436                              <1> 	; TRDOS 386 is running on BOCHS or QEMU
   437 00001834 B44F                <1> 	mov	ah, 4Fh
   438                              <1> VBE_func_1:
   439 00001836 0FB6F0              <1> 	movzx	esi, al ; VESA VBE function number
   440                              <1> 	;shl	si, 2 ; dword
   441                              <1> 	; 02/08/2022
   442 00001839 C1E602              <1> 	shl	esi, 2
   443 0000183C 6683FE14            <1> 	cmp	si, N1L
   444 00001840 734E                <1> 	jnb	short VBE_unknown
   445                              <1> 	;sti
   446                              <1> 	
   447 00001842 FF96[52180000]      <1> 	call	dword [esi+N1] ; call VBE function
   448                              <1> 		
   449                              <1> 	;jmp	short VBE_bios_return
   450                              <1> 
   451                              <1> VBE_bios_return:
   452 00001848 FA                  <1> 	cli
   453                              <1> 	; 29/11/2023 - TRDOS 386 v2.0.7
   454 00001849 5E                  <1> 	pop	esi ; *****
   455                              <1> 	;cmp	esi, [k_page_dir]
   456                              <1> 	;je	short VBE_bios_return_x
   457 0000184A 0F22DE              <1> 	mov	cr3, esi
   458                              <1> ;VBE_bios_return_x:	
   459 0000184D 5E                  <1> 	pop	esi ; ****
   460 0000184E 5D                  <1> 	pop	ebp ; *** ; 27/11/2020
   461 0000184F 07                  <1> 	pop	es  ; **
   462 00001850 1F                  <1> 	pop	ds  ; *
   463 00001851 CF                  <1> 	iretd
   464                              <1> 
   465                              <1> 	; 26/11/2020
   466                              <1> N1:
   467 00001852 [B3180000]          <1> 	dd	vbe_biosfn_return_ctrl_info
   468 00001856 [DA380000]          <1> 	dd	vbe_biosfn_return_mode_info
   469 0000185A [94390000]          <1> 	dd	vbe_biosfn_set_mode
   470 0000185E [643A0000]          <1> 	dd	vbe_biosfn_return_current_mode
   471 00001862 [833A0000]          <1> 	dd	vbe_biosfn_save_restore_state
   472                              <1> 	;dd	vbe_biosfn_display_window_ctrl
   473                              <1> 	;dd	vbe_biosfn_set_get_log_scanline
   474                              <1> 	;dd	vbe_biosfn_set_get_disp_start
   475                              <1> 	;dd	vbe_biosfn_set_get_dac_pal_frm
   476                              <1> 	;dd	vbe_biosfn_set_get_palette_data
   477                              <1> 	
   478                              <1> N1L	EQU	$ - N1
   479                              <1> 
   480                              <1> 
   481                              <1> VESA_VBE3_PMI_CALL: ; VESA VBE video bios (firmware) functions
   482                              <1> 		    ; by using VESA VBE3 Protected Mode Interface
   483                              <1> 	
   484                              <1> 	; 02/08/2022 - TRDOS 386 v2.0.5
   485                              <1> 	; 29/11/2020
   486                              <1> 	; 26/11/2020 - TRDOS 386 v2.0.3 video.s
   487                              <1> 
   488                              <1> 	; We are here because..
   489                              <1> 	; 'PMID' has been verified by TRDOS 386 v2.0.3 kernel.
   490                              <1> 	; (Otherwise bochs/plex86 compatible VBE functions and
   491                              <1> 	;  modes would be used on BOCHS/QEMU/VIRTUALBOX emulators
   492                              <1> 	;  or only standard/old VGA graphics modes would be used.)
   493                              <1> 
   494                              <1> 	; (TRDOS 386 v2.0.3 can use VESA VBE graphics modes if
   495                              <1> 	;  the video bios is full compatible with VBE3 standard) 
   496                              <1> 
   497                              <1> 	; 29/11/2020
   498                              <1> 
   499 00001866 0FB6F0              <1> 	movzx	esi, al ; VESA VBE 3 function number
   500                              <1> 	;shl	si, 2 ; dword
   501                              <1> 	; 02/08/2022
   502 00001869 C1E602              <1> 	shl	esi, 2
   503 0000186C 6683FE14            <1> 	cmp	si, P1L
   504 00001870 731E                <1> 	jnb	short VBE_unknown
   505                              <1> 	;sti
   506                              <1> 
   507 00001872 57                  <1> 	push	edi ; *****
   508                              <1> 
   509 00001873 FF96[7C180000]      <1> 	call	dword [esi+P1] ; call VBE 3 function
   510                              <1> 
   511 00001879 5F                  <1> 	pop	edi ; *****
   512                              <1> 		
   513 0000187A EBCC                <1> 	jmp	short VBE_bios_return
   514                              <1> 
   515                              <1> P1:
   516 0000187C [96180000]          <1> 	dd	vbe3_pmfn_return_ctrl_info
   517 00001880 [B9180000]          <1> 	dd	vbe3_pmfn_return_mode_info
   518 00001884 [F5180000]          <1> 	dd	vbe3_pmfn_set_mode
   519 00001888 [F0180000]          <1> 	dd	vbe3_pmfn_return_current_mode
   520 0000188C [FE190000]          <1> 	dd	vbe3_pmfn_save_restore_state
   521                              <1> 	;dd	vbe3_pmfn_display_window_ctrl
   522                              <1> 	;dd	vbe3_pmfn_set_get_log_scanline
   523                              <1> 	;dd	vbe3_pmfn_set_get_disp_start
   524                              <1> 	;dd	vbe3_pmfn_set_get_dac_pal_frm
   525                              <1> 	;dd	vbe3_pmfn_set_get_palette_data
   526                              <1> 	;dd	vbe3_pmfn_return_pmi ; invalid for TRDOS 386 v2
   527                              <1> 	;dd	vbe3_pmfn_set_get_pixel_clock
   528                              <1> 	
   529                              <1> P1L	EQU	$ - P1
   530                              <1> 
   531                              <1> ;	; 29/11/2020
   532                              <1> ;	mov	edi, VBE3MODEINFOBLOCK >> 4 ; / 16
   533                              <1> ;	
   534                              <1> ;	cmp	al, 04h
   535                              <1> ;	jb	short vbe3_pm_f ; function: 4F00h to 4F03h
   536                              <1> ;	ja	short vbe3_pmi_f5B ; function: 4F05h to 4F0Bh
   537                              <1> ;
   538                              <1> ;	; check buffer length (must be <= 2048 bytes)
   539                              <1> ;
   540                              <1> ;	and	dl, dl ; 0
   541                              <1> ;	jz	short vbe3_pm_f 
   542                              <1> ;		       ; Return Save/Restore State buffer size
   543                              <1> ;
   544                              <1> ;	push	ebx  ; buffer address
   545                              <1> ;	push	edx  ; function: save (01h) or restore (02h)
   546                              <1> ;	call	
   547                              <1> ;
   548                              <1> ;vbe3_pm_f03:
   549                              <1> ;	cmp	al, 2
   550                              <1> ;	ja	short vbe3_pm_f ; function 4F03h
   551                              <1> ;	jb	short vbe3_pm_f1
   552                              <1> ;
   553                              <1> ;
   554                              <1> ;vbe3_pm_f1:
   555                              <1> ;	
   556                              <1> ;
   557                              <1> ;vbe3_pmi_f5B:
   558                              <1> ;	cmp	al, 09h
   559                              <1> ;	jna	short vbe3_pm_f ; funcs 05h to 09h are usable 
   560                              <1> ;	
   561                              <1> ;	cmp	al, 0Bh ; Get/Set pixel clock, last function
   562                              <1> ;	jne	short VBE_unknown 
   563                              <1> ;			; (do not use 'uncertain' functions
   564                              <1> ;			; because of system-user buff transfers)
   565                              <1> ;vbe3_pm_f:
   566                              <1> ;	mov	byte [vbe3_pm_fn], al	; set
   567                              <1> ;	; prepare 16 bit pm segments & registers for pmi call 
   568                              <1> ;	call	VESA_VBE3_PM_FUNCTION
   569                              <1> ;
   570                              <1> ;
   571                              <1> 
   572                              <1> 	; 26/11/2020
   573                              <1> VBE_unknown:
   574 00001890 66B80001            <1> 	mov	ax, 0100h  ; ah = 1 : Function call failed	
   575                              <1> 			   ; al = 0 : Function is not supported	
   576                              <1> 	
   577 00001894 EBB2                <1> 	jmp	short VBE_bios_return
   578                              <1> 
   579                              <1> vbe3_pmfn_return_ctrl_info:
   580                              <1> 	; 02/08/2022 (TRDOS 386 Kernel v2.0.5)
   581                              <1> 	; 12/12/2020
   582                              <1> 	;
   583                              <1> 	; VBE function 4F00h - Return VBE Controller Information
   584                              <1> 	;
   585                              <1> 	; Input:
   586                              <1> 	;      EDI = Pointer to buffer in which to place
   587                              <1> 	;	     VbeInfoBlock structure
   588                              <1> 	;
   589                              <1> 	;	AX = 4F00h
   590                              <1> 	; Output:
   591                              <1> 	;	AX = VBE return status
   592                              <1> 	;	     AX = 004Fh -> succeeded
   593                              <1> 	;	     AX <> 004Fh -> failed
   594                              <1> 	; 
   595                              <1> 	; Modified registers: eax (+ edi for kernel's own call)
   596                              <1> 
   597                              <1> 	; NOTE: TRDOS 386 v2 (v2.0.3) kernel calls this function
   598                              <1> 	; during startup while cpu is in real mode
   599                              <1> 	; (by using int 10h, 4F02h) and saves VbeInfoBlock at
   600                              <1> 	; VBE3INFOBLOCK address (97E00h for TRDOS 386 v2.0.3).
   601                              <1> 	;	
   602                              <1> 	; So...
   603                              <1> 	; This VBE function is adjusted to return/move same info
   604                              <1> 	; from VBE3INFOBLOCK to user's buffer in EDI.
   605                              <1> 
   606                              <1> 	; int 31h (int 10h) entrance
   607                              <1> 
   608 00001896 21FF                <1> 	and	edi, edi
   609 00001898 7423                <1> 	jz	short vbe3_func_fail ; invalid buffer address !
   610                              <1> 
   611                              <1> ;_vbe3_pmfn_return_ctrl_info:		
   612                              <1> 	;or	edi, edi
   613                              <1> 	;jnz	short _vbe_biosfn_return_ctrl_info
   614                              <1> 	;
   615                              <1> 	;; this option may not be necessary - 12/12/2020
   616                              <1> 	;
   617                              <1> 	;; edi = 0, kernel forces to get ctrl info again
   618                              <1> 	;;	   by using VESA VBE3 video bios's pmi
   619                              <1> 	;
   620                              <1> 	;;push	edi
   621                              <1> 	;; far call to VESA VBE3 PMI 
   622                              <1> 	;;mov	ax, 4F00h ; Return VBE Controller Info
   623                              <1> 	;mov	edi, VBE3INFOBLOCK-VBE3SAVERESTOREBLOCK
   624                              <1> 	;; ES selector base address = VBE3SAVERESTOREBLOCK 
   625                              <1> 	;call	int10h_32bit_pmi
   626                              <1> 	;;pop	edi
   627                              <1> 	;mov	edi, VBE3INFOBLOCK ; retn to the kernel sub
   628                              <1> 	;cmp	ax, 004Fh
   629                              <1> 	;je	short vbe_ctrl_info_retn
   630                              <1> 	;stc	
   631                              <1> 	;retn
   632                              <1> 
   633                              <1> _vbe_biosfn_return_ctrl_info:
   634 0000189A 57                  <1> 	push	edi
   635 0000189B 51                  <1> 	push	ecx
   636 0000189C BE007E0900          <1> 	mov	esi, VBE3INFOBLOCK
   637                              <1> 	;mov	ecx, 512
   638                              <1> 	; 02/08/2022
   639 000018A1 29C9                <1> 	sub	ecx, ecx
   640 000018A3 B502                <1> 	mov	ch, 2
   641                              <1> 	; ecx = 512
   642 000018A5 E8E7F50000          <1> 	call	transfer_to_user_buffer
   643 000018AA 59                  <1> 	pop	ecx
   644 000018AB 5F                  <1> 	pop	edi
   645 000018AC 720F                <1> 	jc	short vbe3_func_fail
   646                              <1> 
   647 000018AE 31C0                <1> 	xor	eax, eax
   648 000018B0 B04F                <1> 	mov	al, 4Fh ; successful
   649                              <1> ;vbe_ctrl_info_retn:
   650 000018B2 C3                  <1> 	retn
   651                              <1> 
   652                              <1> vbe_biosfn_return_ctrl_info:
   653                              <1> 	; 12/12/2020
   654                              <1> 	;
   655                              <1> 	; VBE function 4F00h - Return VBE Controller Information
   656                              <1> 	;
   657                              <1> 	; Input:
   658                              <1> 	;      EDI = Pointer to buffer in which to place
   659                              <1> 	;	     VbeInfoBlock structure
   660                              <1> 	;
   661                              <1> 	;	AX = 4F00h
   662                              <1> 	; Output:
   663                              <1> 	;	AX = VBE return status
   664                              <1> 	;	     AX = 004Fh -> succeeded
   665                              <1> 	;	     AX <> 004Fh -> failed   
   666                              <1> 	; 
   667                              <1> 	; Modified registers: eax
   668                              <1> 
   669 000018B3 21FF                <1> 	and	edi, edi
   670 000018B5 7406                <1> 	jz	short vbe3_func_fail ; invalid buffer addr !
   671 000018B7 EBE1                <1> 	jmp	short _vbe_biosfn_return_ctrl_info 
   672                              <1> 
   673                              <1> vbe3_pmfn_return_mode_info:
   674                              <1> 	; 02/08/2022 (TRDOS 386 Kernel v2.0.5)	
   675                              <1> 	; 21/12/2020
   676                              <1> 	; 12/12/2020
   677                              <1> 	;
   678                              <1> 	; VBE function 4F01h - Return VBE Mode Information
   679                              <1> 	;
   680                              <1> 	; Input:
   681                              <1> 	;	CX = Mode number (VESA VBE mode number)
   682                              <1> 	;      EDI = Pointer to ModeInfoBlock structure
   683                              <1> 	;	     (256 bytes) -User's buffer address-
   684                              <1> 	;      EDI = 0 -> kernel call
   685                              <1> 	;		  (do not transfer ModeInfoBlock
   686                              <1> 	;		  to user's buffer address)
   687                              <1> 	;	AX = 4F01h	
   688                              <1> 	; Output:
   689                              <1> 	;	AX = VBE return status
   690                              <1> 	;	     AX = 004Fh -> succeeded
   691                              <1> 	;	     AX <> 004Fh -> failed   
   692                              <1> 	; 
   693                              <1> 	; Modified registers: eax, esi, edi
   694                              <1> 
   695                              <1> 	; int 31h (int 10h) entrance
   696                              <1> 	
   697 000018B9 09FF                <1> 	or	edi, edi
   698 000018BB 7506                <1> 	jnz	short _vbe3_pmfn_return_mode_info
   699                              <1> 
   700                              <1> vbe3_func_fail:
   701 000018BD B84F010000          <1> 	mov	eax, 014Fh ; ah = 1 : Function call failed
   702                              <1> 			   ; al = 4Fh : Function is supported
   703 000018C2 C3                  <1> 	retn
   704                              <1> 	
   705                              <1> 	; jump from '_vbe_biosfn_return_mode_info' 
   706                              <1> _vbe3_pmfn_return_mode_info:
   707 000018C3 57                  <1> 	push	edi
   708                              <1> 
   709                              <1> 	;; clear vbe3 'mode info block' buffer
   710                              <1> 	;push	ecx
   711                              <1> 	;xor	eax, eax
   712                              <1> 	;mov	ecx, 256/4
   713                              <1> 	;mov	edi, VBE3MODEINFOBLOCK
   714                              <1> 	;rep	stosd
   715                              <1> 	;pop	ecx
   716                              <1> 
   717                              <1> 	; far call to VESA VBE3 PMI 
   718                              <1> 	;mov	ax, 4F01h ; Return VBE Mode Information
   719 000018C4 BF00060000          <1> 	mov	edi, VBE3MODEINFOBLOCK-VBE3SAVERESTOREBLOCK
   720                              <1> 	; ES selector base address = VBE3SAVERESTOREBLOCK 
   721 000018C9 E812010000          <1> 	call	int10h_32bit_pmi
   722                              <1> 
   723 000018CE 5F                  <1> 	pop	edi
   724                              <1> 
   725                              <1> 	;cmp	ax, 004Fh
   726                              <1> 	;jne	short vbe3_func_retn  ; failed !
   727                              <1> 
   728 000018CF 21FF                <1> 	and	edi, edi
   729                              <1> 	;jz	short vbe3_func_success
   730                              <1> 	; 21/12/2020
   731 000018D1 741C                <1> 	jz	short vbe3_func_retn
   732                              <1> 
   733 000018D3 6683F84F            <1> 	cmp	ax, 004Fh
   734 000018D7 7516                <1> 	jne	short vbe3_func_retn  ; failed !
   735                              <1> 
   736 000018D9 51                  <1> 	push	ecx
   737 000018DA BE007C0900          <1> 	mov	esi, VBE3MODEINFOBLOCK		
   738                              <1> 	;mov	ecx, 256
   739                              <1> 	; 02/08/2022
   740 000018DF 29C9                <1> 	sub	ecx, ecx
   741 000018E1 FEC5                <1> 	inc	ch
   742                              <1> 	; ecx = 256
   743 000018E3 E8A9F50000          <1> 	call	transfer_to_user_buffer
   744 000018E8 59                  <1> 	pop	ecx
   745 000018E9 72D2                <1> 	jc	short vbe3_func_fail
   746                              <1> 
   747 000018EB 31C0                <1> 	xor	eax, eax
   748 000018ED B04F                <1> 	mov	al, 4Fh ; successful
   749                              <1> vbe3_func_success:
   750                              <1> vbe3_func_retn:	
   751 000018EF C3                  <1> 	retn
   752                              <1> 
   753                              <1> vbe3_pmfn_return_current_mode:
   754                              <1> 	; 12/12/2020
   755                              <1> 	;
   756                              <1> 	; VBE function 4F03h - Return Current VBE Mode
   757                              <1> 	;
   758                              <1> 	; Input:
   759                              <1> 	;	none (AX = 4F03h)
   760                              <1> 	; Output:
   761                              <1> 	;	AX = VBE return status
   762                              <1> 	;	     AX = 004Fh -> succeeded
   763                              <1> 	;	     AX <> 004Fh -> failed
   764                              <1> 	;	BX = Current VBE mode
   765                              <1> 	;	  bit 0-13 = Mode number
   766                              <1> 	;	  bit 14 = 0 Windowed frame buffer model
   767                              <1> 	;	         = 1 Linear frame buffer model
   768                              <1> 	;	  bit 15 
   769                              <1> 	;	      = 0 Memory cleared at last mode set
   770                              <1> 	;	      = 1 Memory not cleared at last mode set
   771                              <1> 	; 
   772                              <1> 	; Modified registers: eax, ebx
   773                              <1> 
   774                              <1> 	; int 31h (int 10h) entrance
   775                              <1> 	
   776                              <1> 	; far call to VESA VBE3 PMI 
   777                              <1> 
   778                              <1> 	;mov	eax, 4F03h ; Return Current VBE Mode
   779                              <1> vbe3_pmfn_far_call:
   780                              <1> 	; ES selector base address = VBE3SAVERESTOREBLOCK 
   781                              <1> 	;call	int10h_32bit_pmi
   782                              <1> 	;retn
   783 000018F0 E9EB000000          <1> 	jmp	int10h_32bit_pmi
   784                              <1> 
   785                              <1> vbe3_pmfn_set_mode:
   786                              <1> 	; 02/08/2022 (TRDOS 386 Kernel v2.0.5)
   787                              <1> 	; 22/12/2020
   788                              <1> 	; 21/12/2020
   789                              <1> 	; 12/12/2020
   790                              <1> 	;
   791                              <1> 	; VBE function 4F02h - Set VBE Mode
   792                              <1> 	;
   793                              <1> 	; Input:
   794                              <1> 	;	BX = Desired Mode to set
   795                              <1> 	;	  bit 0-13 = Mode number
   796                              <1> 	;	  bit 14 = 0 Windowed frame buffer model
   797                              <1> 	;	         = 1 Linear frame buffer model
   798                              <1> 	;	  bit 15 
   799                              <1> 	;	      = 0 Memory cleared at last mode set
   800                              <1> 	;	      = 1 Memory not cleared at last mode set
   801                              <1> 	; Output:
   802                              <1> 	;	AX = VBE return status
   803                              <1> 	;	     AX = 004Fh -> succeeded
   804                              <1> 	;	     AX <> 004Fh -> failed
   805                              <1> 	; 
   806                              <1> 	; Modified registers: eax, ebx, esi (21/12/2020)
   807                              <1> 
   808                              <1> 	; int 31h (int 10h) entrance
   809                              <1> 
   810                              <1> 	; 22/12/2020 (VESA VBE3 feature)
   811                              <1> 	; BX bit 11 is flag for
   812                              <1> 	;	user specified CRTC values for refresh rate
   813                              <1> 	; 'test bh, 8'
   814                              <1> 	; if bit 11 is set, EDI points to 'CRTCInfoBlock'
   815                              <1> 
   816                              <1> 	; 22/12/2020
   817                              <1> 	;; test bx for VBE video mode
   818                              <1> 	;test	bh, 1
   819                              <1> 	;jnz	short vbe3_sm_0
   820                              <1> 
   821                              <1> 	;; use internal VBE mode set procedure
   822                              <1> 	;; for non-vbe (std VGA/CGA) modes
   823                              <1> 	;
   824                              <1> 	;; (it is useful -as 4F02h function- 
   825                              <1> 	;;  to jump 'vbe_biosfn_set_mode'
   826                              <1> 	;;  instead of direct jump to '_set_mode')
   827                              <1> 	;; ((eliminates additional push-pops and settings))
   828                              <1>  
   829                              <1> 	;jmp	vbe_biosfn_set_mode	
   830                              <1> 
   831                              <1> vbe3_sm_0: 
   832                              <1> 	;;push	ds  ; *
   833                              <1> 	;;push	es  ; **
   834                              <1> 	;;push	ebp ; ***
   835                              <1> 	;;push	esi ; **** 
   836                              <1> 	
   837                              <1> 	; Fit bx to VESA VBE2 type mode setting
   838                              <1> 	; (bx bit 11 is used for custom CRTC values in VBE3)
   839                              <1> 	; clear bit 9 to 11 (clear bh bit 1 to bit 3)
   840                              <1> 
   841                              <1> 	; 22/12/2020
   842 000018F5 57                  <1> 	push	edi ; *****
   843 000018F6 F6C708              <1> 	test	bh, 8	; Use user specified CRTC values
   844 000018F9 7530                <1> 	jnz	short vbe3_sm_3  ; for refresh rate
   845                              <1> vbe3_sm_4:
   846 000018FB 80E7C1              <1> 	and	bh, 0C1h ; use bit 15, 14, 8 only (for bh)
   847                              <1> 	;mov	[vbe_mode_x], bh
   848                              <1> 
   849 000018FE 803D[BE670000]03    <1> 	cmp	byte [CRT_MODE], 3 ; is current mode 03h ?
   850 00001905 7509                <1> 	jne	short vbe3_sm_1    ; no
   851                              <1> 
   852                              <1> 	; save mode 03h video pages and cursor positions
   853 00001907 57                  <1> 	push	edi ; **!***	
   854 00001908 51                  <1> 	push	ecx ; ******
   855                              <1> 	;push	esi
   856                              <1> 	
   857 00001909 E8CE040000          <1> 	call	save_mode3_multiscreen
   858                              <1> 	
   859                              <1> 	;pop	esi
   860 0000190E 59                  <1> 	pop	ecx ; ******
   861 0000190F 5F                  <1> 	pop	edi ; **!***
   862                              <1> vbe3_sm_1:
   863                              <1> 	; ax = 4F02h
   864                              <1> 	; bx = video mode number (vbe2 type)
   865 00001910 E8CB000000          <1> 	call	int10h_32bit_pmi 
   866                              <1> 			; call to far call to VBE3 PMI
   867                              <1> 
   868 00001915 6683F84F            <1> 	cmp	ax, 004Fh ; succeeded ?
   869 00001919 750E                <1> 	jne	short vbe3_sm_2
   870                              <1> 	; set current mode byte/sign to extended (SVGA) mode
   871 0000191B C605[BE670000]FF    <1> 	mov	byte [CRT_MODE], 0FFh ; VESA VBE mode
   872                              <1> 	; set current VBE mode word to bx input
   873 00001922 66891D[D69E0100]    <1> 	mov	[video_mode], bx
   874                              <1> vbe3_sm_2:
   875                              <1> 	; 22/12/2020
   876 00001929 5F                  <1> 	pop	edi ; ***** 
   877 0000192A C3                  <1> 	retn
   878                              <1> 
   879                              <1> vbe3_sm_3:
   880                              <1> 	; 22/12/2020
   881                              <1> 	; copy user's CRTCInfoBlock to the buffer
   882 0000192B 51                  <1> 	push	ecx
   883 0000192C 89FE                <1> 	mov	esi, edi
   884 0000192E BF807D0900          <1> 	mov	edi, VBE3CRTCINFOBLOCK
   885                              <1> 	;mov	ecx, 64
   886                              <1> 	; 02/08/2022
   887 00001933 29C9                <1> 	sub	ecx, ecx
   888 00001935 B140                <1> 	mov	cl, 64
   889 00001937 E89FF50000          <1> 	call	transfer_from_user_buffer
   890 0000193C 59                  <1> 	pop	ecx
   891                              <1> 	; set offset (es base addr is VBE3SAVERESTOREBLOCK) 
   892 0000193D 81EF00760900        <1> 	sub	edi, VBE3SAVERESTOREBLOCK
   893 00001943 EBB6                <1> 	jmp	short vbe3_sm_4
   894                              <1> 	
   895                              <1> vesa_vbe3_pmi:
   896                              <1> 	; 29/11/2023 - TRDOS 386 v2.0.7
   897                              <1> 	; 12/12/2020
   898                              <1> 	; 08/12/2020
   899                              <1> 	; 07/12/2020
   900                              <1> 	; 05/12/2020, 06/12/2020
   901                              <1> 	; 03/12/2020, 04/12/2020
   902                              <1> 	; 28/11/2020 (TRDOS 386 v2.0.3)
   903                              <1> 	; VGA BIOS functions via
   904                              <1> 	; VESA VBE3 Protected Mode Inface
   905                              <1> 	; [vbe3] = 3 and [pmi32] > 0
   906                              <1> 
   907                              <1> 	; 04/12/2020
   908                              <1> 	; Only 'set mode' will be redirected to vbe3 video bios
   909                              <1> 	; (by setting mode 3 multiscreen parameters before and after) 
   910                              <1> 
   911                              <1> 	; 29/11/2023 - TRDOS 386 v2.0.7
   912 00001945 50                  <1> 	push	eax
   913 00001946 0F20D8              <1> 	mov	eax, cr3
   914 00001949 870424              <1> 	xchg	eax, [esp] ; **!**
   915 0000194C 50                  <1> 	push	eax
   916                              <1> 	;cmp	esi, [k_page_dir]
   917                              <1> 	;je	short vesa_vbe3_pmi_x
   918 0000194D A1[88780100]        <1> 	mov	eax, [k_page_dir]
   919 00001952 0F22D8              <1> 	mov	cr3, eax
   920                              <1> ;vesa_vbe3_pmi_x:
   921 00001955 58                  <1> 	pop	eax
   922                              <1> 
   923                              <1> 	; 06/12/2020
   924 00001956 20E4                <1> 	and	ah, ah	; 0 = set mode function
   925 00001958 7402                <1> 	jz	short vbe3_pmi_0
   926 0000195A EB7D                <1> 	jmp	vbe3_pmi_9 
   927                              <1> 
   928                              <1> vbe3_pmi_0:
   929                              <1> 	; 07/12/2020
   930 0000195C 88C4                <1> 	mov	ah, al
   931 0000195E 80E480              <1> 	and	ah, 80h ; 0 or 80h
   932 00001961 30E0                <1> 	xor	al, ah ; 8?h -> 0?h
   933                              <1> 
   934                              <1> 	;cmp	al, 13h ; mode number above 13h is returned
   935                              <1> 	;jna	short vbe3_pmi_1
   936                              <1> 	;		; back to default code due to uncertainty
   937                              <1> 	; 		; (>13h is not std for all svga bioses)
   938                              <1> 	;jmp	VGA_funcs_0
   939                              <1> vbe3_pmi_1:
   940                              <1> 	; 07/12/2020
   941                              <1> 	; Possible cases for VBE3 (PMI, ah=0) set mode:
   942                              <1> 	; current mode > 07h and requested mode: any 
   943                              <1> 	; current mode <= 07h and requested mode > 07h
   944                              <1> 
   945                              <1> 	; 06/12/2020
   946 00001963 8825[1B850100]      <1> 	mov	byte [noclearmem], ah ; 0 or 80h
   947                              <1> 	; check current video mode if it is 03h
   948 00001969 803D[BE670000]03    <1> 	cmp	byte [CRT_MODE], 3 ; current mode
   949 00001970 750B                <1> 	jne	short vbe3_pmi_3
   950                              <1> 	; 07/12/2020
   951                              <1> 	; check new video mode if it is 03h also
   952                              <1> 	;cmp	al, 3
   953                              <1> 	;jne	short vbe3_pmi_2
   954                              <1> 	;mov	byte [p_crt_mode], 80h 	; clear video memory
   955                              <1> 	;jmp	short vbe3_pmi_5
   956                              <1> vbe3_pmi_2:
   957                              <1> 	; case 1:
   958                              <1> 	; Current mode is 03h and new mode is not 03h
   959                              <1> 
   960                              <1> 	; save video pages and cursor positions
   961 00001972 56                  <1> 	push	esi
   962 00001973 57                  <1> 	push	edi
   963 00001974 51                  <1> 	push	ecx
   964                              <1> 
   965                              <1> 	; 12/12/2020
   966                              <1> 	;mov	esi, 0B8000h ; mode 3 video memory
   967                              <1> 	;mov	edi, 98000h  ; backup location
   968                              <1> 	;mov	ecx, (0B8000h-0B0000h)/4
   969                              <1> 	;rep	movsd
   970                              <1> 	;
   971                              <1> 	;mov	byte [p_crt_mode], 3 ; previous mode, backup sign
   972                              <1> 	;xchg	cl, [ACTIVE_PAGE]
   973                              <1> 	;mov	[p_crt_page], cl  ; save as previous active page
   974                              <1> 	;
   975                              <1> 	;; save cursor positions
   976                              <1> 	;mov	esi, CURSOR_POSN
   977                              <1> 	;mov	edi, cursor_pposn ; cursor positions backup
   978                              <1> 	;mov	cl, 4
   979                              <1> 	;rep	movsd
   980                              <1> 
   981                              <1> 	; 12/12/2020
   982 00001975 E862040000          <1> 	call	save_mode3_multiscreen
   983                              <1> 
   984 0000197A 59                  <1> 	pop	ecx
   985 0000197B 5F                  <1> 	pop	edi
   986 0000197C 5E                  <1> 	pop	esi
   987                              <1> vbe3_pmi_3:
   988                              <1> 	; 08/12/2020
   989                              <1> 	; 07/12/2020
   990                              <1> 	; case 3 or case 4
   991 0000197D A2[BE670000]        <1> 	mov	[CRT_MODE], al
   992 00001982 3C03                <1> 	cmp	al, 3
   993 00001984 7407                <1> 	je	short vbe3_pmi_4
   994                              <1> 	; case 4:
   995                              <1> 	; Current mode is not 03h and also new mode is not 03h
   996 00001986 800D[19850100]80    <1> 	or	byte [p_crt_mode], 80h  ; 83h (case 1 -> case 4)
   997                              <1> 	;jmp	short vbe3_pmi_5
   998                              <1> vbe3_pmi_4:
   999                              <1> 	; case 3:
  1000                              <1> 	;
  1001                              <1> 	; Current mode is not 03h and new mode is 03h
  1002                              <1> 
  1003                              <1> ;vbe3_pmi_5:
  1004                              <1> 	;mov	[CRT_MODE], al
  1005                              <1> 
  1006 0000198D E84E000000          <1> 	call	int10h_32bit_pmi	
  1007                              <1> 
  1008 00001992 803D[BE670000]03    <1> 	cmp	byte [CRT_MODE], 3  ; new video mode
  1009                              <1> 	;jne	vbe3_pmi_8	; video mode <> 03h
  1010 00001999 7532                <1> 	jne	short vbe3_pmi_8	
  1011                              <1> 
  1012                              <1> 	;push	eax ; 04/12/2020
  1013 0000199B 53                  <1> 	push	ebx
  1014 0000199C 51                  <1> 	push	ecx
  1015 0000199D 52                  <1> 	push	edx
  1016 0000199E 57                  <1> 	push	edi ; 03/12/2020
  1017                              <1> 
  1018                              <1> 	; 12/12/2020
  1019 0000199F 56                  <1> 	push	esi
  1020 000019A0 E869040000          <1> 	call	restore_mode3_multiscreen
  1021 000019A5 5E                  <1> 	pop	esi
  1022                              <1> 	; AL = active video page
  1023                              <1> 
  1024                              <1> 	; 12/12/2020
  1025                              <1> 	;mov	al, [p_crt_page] ; previous mode 3 active page
  1026                              <1> 	;
  1027                              <1> 	;;test	byte [p_crt_mode], 7Fh ; 83h or 80h or 03h
  1028                              <1> 	;;jz	short vbe3_pmi_6 ; do not restore video pages
  1029                              <1> 	;			 ; clear current video page
  1030                              <1> 	;; case 3
  1031                              <1> 	;
  1032                              <1> 	;; ([p_crt_mode] = 03h)
  1033                              <1> 	;
  1034                              <1> 	;; New video mode is 3 while current video mode is not 3
  1035                              <1> 	;; (multi screen) video pages will be restored from 098000h
  1036                              <1> 	;
  1037                              <1> 	;; restore video pages and cursor positions
  1038                              <1> 	;
  1039                              <1> 	;mov	[ACTIVE_PAGE], al ; current mode 3 active page
  1040                              <1> 	;
  1041                              <1> 	;push	esi
  1042                              <1> 	;
  1043                              <1> 	;; restore video pages
  1044                              <1> 	;mov	esi, 98000h
  1045                              <1> 	;mov	edi, 0B8000h
  1046                              <1> 	;;mov	ecx, 2000h
  1047                              <1> 	;mov	cx, 2000h ; 8K dwords (32K)
  1048                              <1> 	;rep	movsd
  1049                              <1> 	;
  1050                              <1> 	;mov	[p_crt_mode], cl ; reset ('case 3' end condition)
  1051                              <1> 	;
  1052                              <1> 	;; restore cursor positions
  1053                              <1> 	;mov	esi, cursor_pposn
  1054                              <1> 	;mov	edi, CURSOR_POSN
  1055                              <1> 	;;mov	ecx, 4	; restore all cursor positions (16 bytes)
  1056                              <1> 	;mov	cl, 4
  1057                              <1> 	;rep 	movsd
  1058                              <1> 	;
  1059                              <1> 	;pop	esi
  1060                              <1> 	;
  1061                              <1> 	;; 07/12/2020
  1062                              <1> 	;; restore CRT_START according to ACTIVE_PAGE
  1063                              <1> 	;mov	[CRT_START], cx ; 0
  1064                              <1> 	;
  1065                              <1> 	;; check active page and set it again if it is not 0
  1066                              <1> 	;or	al, al
  1067                              <1> 	;jz	short vbe3_pmi_7
  1068                              <1> 	;
  1069                              <1> 	;mov	cl, al
  1070                              <1> ;vbe3_pmi_5:
  1071                              <1> 	;add	word [CRT_START], 4096
  1072                              <1> 	;dec	cl
  1073                              <1> 	;jnz	short vbe3_pmi_5
  1074                              <1> 
  1075 000019A6 B405                <1> 	mov	ah, 05h ; set current video page
  1076                              <1> 	;al = video page
  1077 000019A8 E833000000          <1> 	call	int10h_32bit_pmi
  1078                              <1> 	
  1079                              <1> 	; check current cursor position & set it again if not 0,0
  1080                              <1> 	;movzx	ebx, byte [ACTIVE_PAGE]
  1081 000019AD 0FB6D8              <1> 	movzx	ebx, al
  1082 000019B0 D0E3                <1> 	shl	bl, 1
  1083 000019B2 81C3[A6780100]      <1> 	add	ebx, CURSOR_POSN
  1084 000019B8 668B13              <1> 	mov	dx, [ebx]
  1085 000019BB 6621D2              <1> 	and	dx, dx		
  1086 000019BE 7409                <1> 	jz	short vbe3_pmi_7
  1087                              <1> 	
  1088                              <1> 	;dx = cursor position (dl = column, dh = row)
  1089                              <1> 	;mov	bh, [ACTIVE_PAGE] ; 06/12/2020
  1090 000019C0 88C7                <1> 	mov	bh, al
  1091 000019C2 B402                <1> 	mov	ah, 02h ; set cursor position
  1092 000019C4 E817000000          <1> 	call	int10h_32bit_pmi
  1093                              <1> 	
  1094                              <1> 	;jmp	short vbe3_pmi_7
  1095                              <1> 
  1096                              <1> ;vbe3_pmi_6:
  1097                              <1> ;	; 07/12/2020
  1098                              <1> ;	; case 1, previous mode is 03h, current mode is 03h
  1099                              <1> ;	; 03/12/2020
  1100                              <1> ;	cmp	byte [noclearmem], 0
  1101                              <1> ;	jna	short vbe3_pmi_7 ; do not clear memory
  1102                              <1> ;	; clear video page
  1103                              <1> ;	mov	ecx, 1024 ; 4096/4
  1104                              <1> ;	mov	eax, 07200720h
  1105                              <1> ;	mov	edi, 0B8000h ; [crt_base]
  1106                              <1> ;	add	di, [CRT_START]
  1107                              <1> ;	rep	stosd	; FILL THE REGEN BUFFER WITH BLANKS
  1108                              <1> 
  1109                              <1> vbe3_pmi_7:
  1110 000019C9 5F                  <1> 	pop	edi
  1111 000019CA 5A                  <1> 	pop	edx
  1112 000019CB 59                  <1> 	pop	ecx
  1113 000019CC 5B                  <1> 	pop	ebx
  1114                              <1> 	;pop	eax ; 04/12/2020
  1115                              <1> vbe3_pmi_8:
  1116                              <1> 	; 04/12/2020
  1117                              <1> 	;(TRDOS 386 v2.0.3, INT 31h, ah=0 return)
  1118 000019CD 31C0                <1> 	xor	eax, eax  ; eax = 0 -> succesful
  1119                              <1> vesa_vbe3_pmi_retn:
  1120                              <1> 	; 29/11/2023 - TRDOS 386 v2.0.7
  1121 000019CF 870424              <1> 	xchg	eax, [esp] ; **!**
  1122                              <1> 	;cmp	eax, [k_page_dir]
  1123                              <1> 	;je	short vesa_vbe3_pmi_retn_x
  1124 000019D2 0F22D8              <1> 	mov	cr3, eax
  1125                              <1> ;vesa_vbe3_pmi_retn_x:
  1126 000019D5 58                  <1> 	pop	eax
  1127                              <1> 	;
  1128 000019D6 07                  <1> 	pop	es  ; **
  1129 000019D7 1F                  <1> 	pop	ds  ; *
  1130 000019D8 CF                  <1> 	iretd
  1131                              <1> 
  1132                              <1> vbe3_pmi_9:
  1133                              <1> 	; 06/12/2020 
  1134                              <1> 	;cmp	ah, 10h ; Set/Get Palette Registers
  1135                              <1> 	;jnb	short vbe3_pmi_10
  1136                              <1> 	; 05/12/2020
  1137 000019D9 E802000000          <1> 	call	int10h_32bit_pmi
  1138 000019DE EBEF                <1> 	jmp	short vesa_vbe3_pmi_retn
  1139                              <1> 
  1140                              <1> ;vbe3_pmi_10:
  1141                              <1> 	; 06/12/2020
  1142                              <1> 	;jmp	VGA_funcs_0
  1143                              <1> 
  1144                              <1> int10h_32bit_pmi:
  1145                              <1> 	; 03/12/2020
  1146                              <1> 	; 28/11/2020
  1147                              <1> 	; calling standard VGA Bios (INT 10h) functions
  1148                              <1> 	; by using 32 bit protected mode interface of
  1149                              <1> 	; VESA VBE3 Video Bios (with 'PMID' signature)
  1150                              <1> 
  1151                              <1> 	; 03/12/2020
  1152                              <1> 	; eax, ebx, ecx, edx, edi will be used by vbios pmi
  1153                              <1> 	; (esi and ebp will not be used) 
  1154                              <1> 
  1155                              <1> 	; 03/12/2020
  1156 000019E0 56                  <1> 	push	esi
  1157 000019E1 C1E010              <1> 	shl	eax, 16  ; move function number (ax) to hw
  1158 000019E4 8B35[DC9E0100]      <1> 	mov	esi, [pmid_addr] ; linear address of
  1159                              <1> 				 ; PMInfo.Entrypoint pointer
  1160                              <1> 	;mov	ax, [esi+PMInfo.EntryPoint]	
  1161 000019EA 668B06              <1> 	mov	ax, [esi]	 
  1162 000019ED C1C010              <1> 	rol	eax, 16 ; move PM entry address to hw
  1163                              <1> 			; and move function number to lw (ax)
  1164 000019F0 5E                  <1> 	pop	esi
  1165                              <1> 
  1166                              <1> 	; top of stack: ; (*)
  1167                              <1> 	; return (the caller) address of "int10h_32bit_pmi"
  1168                              <1> 
  1169 000019F1 E96EEDFFFF          <1> 	jmp	_VBE3PMI_fcall ; will return to the caller (*)
  1170                              <1> 
  1171                              <1> _vbe3_pmfn_srs_8:
  1172                              <1> 	; 17/01/2021
  1173 000019F6 31DB                <1> 	xor 	ebx, ebx ; points to VBE3SAVERESTOREBLOCK
  1174                              <1> _vbe3_pmfn_srs_9: ; 24/01/2021
  1175 000019F8 66B8044F            <1> 	mov	ax, 4F04h
  1176 000019FC EBE2                <1> 	jmp	short int10h_32bit_pmi
  1177                              <1> 
  1178                              <1> vbe3_pmfn_save_restore_state:
  1179                              <1> 	; 02/08/2022 (TRDOS 386 Kernel v2.0.5)
  1180                              <1> 	; 24/01/2021
  1181                              <1> 	; 23/01/2021
  1182                              <1> 	; 16/01/2021 - 17/01/2021
  1183                              <1> 	; 14/01/2021
  1184                              <1> 	;
  1185                              <1> 	; VBE function 4F04h - Save/Restore Video State
  1186                              <1> 	;
  1187                              <1> 	; Input:
  1188                              <1> 	;	DL = sub function
  1189                              <1> 	;	CL = requested state
  1190                              <1> 	;      EBX = pointer to buffer (if DL<>00h)
  1191                              <1> 	;	AX = 4F04h 
  1192                              <1> 	; Output:
  1193                              <1> 	;	AX = 004Fh (successful)
  1194                              <1> 	;	AH > 0 -> error
  1195                              <1> 	;	BX = Number of 64-byte blocks 
  1196                              <1> 	;	     to hold the state buffer (if DL=00h)
  1197                              <1> 
  1198                              <1> 	; Modified registers: eax, ebx, esi, edi
  1199                              <1> 	
  1200 000019FE 21DB                <1> 	and	ebx, ebx ; user's buffer address
  1201 00001A00 750A                <1> 	jnz	short _vbe3_pmfn_save_restore_state
  1202                              <1> 
  1203 00001A02 08D2                <1> 	or	dl, dl
  1204 00001A04 740C                <1> 	jz	short _vbe3_pmfn_srs_0
  1205                              <1> 
  1206                              <1> 	; function failed
  1207                              <1> 	;;mov	eax, 0100h
  1208                              <1> 	;sub	eax, eax
  1209                              <1> 	;inc	ah  ; eax = 0100h
  1210                              <1> 	;retn
  1211                              <1> 	; 16/01/2021
  1212                              <1> _vbe3_pmfn_srs_fail:
  1213 00001A06 B84F010000          <1> 	mov	eax, 014Fh ; ah = 1 : Function call failed
  1214                              <1> 			   ; al = 4Fh : Function is supported
  1215                              <1> _vbe3_srs_retn:
  1216 00001A0B C3                  <1> 	retn
  1217                              <1> 
  1218                              <1> _vbe3_pmfn_save_restore_state:
  1219 00001A0C 20D2                <1> 	and	dl, dl
  1220 00001A0E 7555                <1> 	jnz	short _vbe3_pmfn_srs_2
  1221                              <1> _vbe3_pmfn_srs:
  1222 00001A10 31DB                <1> 	xor	ebx, ebx
  1223                              <1> _vbe3_pmfn_srs_0:
  1224                              <1> 	; 24/01/2021
  1225 00001A12 83F90F              <1> 	cmp	ecx, 0Fh
  1226                              <1> 	;ja	short _vbe3_pmfn_srs_1
  1227 00001A15 77EF                <1> 	ja	short _vbe3_pmfn_srs_fail 
  1228                              <1> 
  1229                              <1> 	; !!! CLEAR CL BIT 2 !!! 
  1230                              <1> 	; (when bit 2 is set, function causes cpu exception)
  1231                              <1> 	; BIOS data will not be saved and restored
  1232                              <1> 	; (to prevent protected mode page fault error)
  1233 00001A17 80E1FD              <1> 	and	cl, ~2 ; and cl, not 2
  1234                              <1> 	
  1235                              <1> 	; 24/01/2021
  1236                              <1> 	;mov	bl, 1
  1237 00001A1A FEC3                <1> 	inc	bl ; = 1
  1238                              <1> 	;shl	bx, cl 
  1239                              <1> 	; 02/08/2022
  1240 00001A1C D3E3                <1> 	shl	ebx, cl
  1241 00001A1E 66231D[E09E0100]    <1> 	and	bx, [vbe3stbsflags]
  1242 00001A25 7415                <1> 	jz	short _vbe3_pmfn_srs_1
  1243                              <1> 	;mov	bx, cx
  1244 00001A27 89CB                <1> 	mov	ebx, ecx ; <= 15
  1245 00001A29 D0E3                <1> 	shl	bl, 1 ; 0, 2, 8 .. 30
  1246 00001A2B 668B9B[343B0000]    <1> 	mov	bx, [vbestatebufsize+ebx]
  1247 00001A32 89DF                <1> 	mov	edi, ebx
  1248                              <1> 	; edi = state buffer size in bytes
  1249                              <1> 	;shr	bx, 6 ; / 64
  1250                              <1> 	; 02/08/2022
  1251 00001A34 C1EB06              <1> 	shr	ebx, 6
  1252                              <1> 	;mov	ax, 4Fh
  1253 00001A37 28E4                <1> 	sub	ah, ah
  1254 00001A39 B04F                <1> 	mov	al, 4Fh
  1255 00001A3B C3                  <1> 	retn
  1256                              <1> _vbe3_pmfn_srs_1:
  1257                              <1> 	; ax = 4F04h
  1258                              <1> 	;call	int10h_32bit_pmi
  1259                              <1> 	; 24/01/2021
  1260                              <1> 	;call	_vbe3_pmfn_srs_8
  1261                              <1> 	; ebx = 0
  1262 00001A3C E8B7FFFFFF          <1> 	call	_vbe3_pmfn_srs_9	
  1263 00001A41 6683F84F            <1> 	cmp	ax, 004Fh
  1264 00001A45 75C4                <1> 	jne	short _vbe3_srs_retn
  1265                              <1> 	; 24/01/2021
  1266                              <1> 	;cmp	ecx, 0Fh
  1267                              <1> 	;ja	short _vbe3_srs_retn
  1268                              <1> 	; 24/01/2021
  1269                              <1> 	;mov	ax, 1
  1270 00001A47 B001                <1> 	mov	al, 1
  1271                              <1> 	;shl	ax, cl		
  1272                              <1> 	; 02/08/2022
  1273 00001A49 D3E0                <1> 	shl	eax, cl
  1274 00001A4B 660905[E09E0100]    <1> 	or	[vbe3stbsflags], ax ; set flag for state option
  1275                              <1> 	; 23/01/2021
  1276 00001A52 89DF                <1> 	mov	edi, ebx
  1277 00001A54 89C8                <1> 	mov	eax, ecx
  1278 00001A56 D0E0                <1> 	shl	al, 1
  1279                              <1> 	;shl	di, 6 ; * 64
  1280                              <1> 	; 02/08/2022
  1281 00001A58 C1E706              <1> 	shl	edi, 6
  1282 00001A5B 6689B8[343B0000]    <1> 	mov	[vbestatebufsize+eax], di
  1283                              <1> 				; save buf size for option 
  1284                              <1> 	;xchg	edi, ebx
  1285                              <1> 	; edi = state buffer size in bytes
  1286 00001A62 B04F                <1> 	mov	al, 4Fh
  1287 00001A64 C3                  <1> 	retn
  1288                              <1> 
  1289                              <1> _vbe3_pmfn_srs_2:
  1290                              <1> 	; 24/01/2021
  1291                              <1> 	; !!! CLEAR CL BIT 2 !!! 
  1292                              <1> 	; (when bit 2 is set, function causes cpu exception)
  1293                              <1> 	; BIOS data will not be saved and restored
  1294                              <1> 	; (to prevent protected mode page fault error)
  1295                              <1> 
  1296 00001A65 F6C1FD              <1> 	test	cl, ~2 ; test cl, not 2
  1297 00001A68 749C                <1> 	jz	short _vbe3_pmfn_srs_fail
  1298                              <1> 
  1299 00001A6A 80FA02              <1> 	cmp	dl, 2
  1300 00001A6D 7748                <1> 	ja	short _vbe3_pmfn_srs_5
  1301                              <1> 
  1302                              <1> 	;and	cl, ~2 ; and cl, not 2
  1303                              <1> 
  1304 00001A6F 53                  <1> 	push	ebx ; * ; buffer address
  1305                              <1> 	; save or restore state
  1306                              <1> 	; (get required buffer size at first)
  1307 00001A70 52                  <1> 	push	edx ; **
  1308 00001A71 28D2                <1> 	sub	dl, dl ; 0
  1309 00001A73 E898FFFFFF          <1> 	call	_vbe3_pmfn_srs
  1310 00001A78 5A                  <1> 	pop	edx ; **
  1311                              <1> 	; 24/01/2021
  1312 00001A79 5B                  <1> 	pop	ebx ; *
  1313 00001A7A 08E4                <1> 	or	ah, ah
  1314 00001A7C 7538                <1> 	jnz	short _vbe3_pmfn_srs_4 ; error
  1315                              <1> 
  1316                              <1> 	; edi = buffer size in bytes
  1317 00001A7E 81FF00080000        <1> 	cmp	edi, 2048
  1318 00001A84 772B                <1> 	ja	short _vbe3_pmfn_srs_3
  1319                              <1> 
  1320 00001A86 80FA01              <1> 	cmp	dl, 1
  1321 00001A89 7531                <1> 	jne	short _vbe3_pmfn_srs_6 ; restore state
  1322                              <1> 	
  1323                              <1> 	; save video state
  1324                              <1> 	;xor 	ebx, ebx ; points to VBE3SAVERESTOREBLOCK
  1325                              <1> 	;mov	ax, 4F04h
  1326                              <1> 	;call	int10h_32bit_pmi
  1327                              <1> 
  1328                              <1> 	; 24/01/2021
  1329 00001A8B E842000000          <1> 	call	_vbe3_pmfn_srs_7
  1330                              <1> 	
  1331 00001A90 6683F84F            <1> 	cmp	ax, 004Fh
  1332 00001A94 7520                <1> 	jne	short _vbe3_pmfn_srs_4
  1333                              <1> 
  1334 00001A96 09DB                <1> 	or	ebx, ebx  ; kernel ('sysvideo') ?
  1335 00001A98 741C                <1> 	jz	short _vbe3_pmfn_srs_4 ; yes
  1336                              <1> 
  1337                              <1> 	; the caller is user
  1338 00001A9A 51                  <1> 	push	ecx ; *
  1339 00001A9B 89F9                <1> 	mov	ecx, edi ; state buffer size
  1340 00001A9D BE00760900          <1> 	mov	esi, VBE3SAVERESTOREBLOCK ; source
  1341                              <1> 					; (vbe3 pmi buff)
  1342 00001AA2 89DF                <1> 	mov	edi, ebx	; destination (user buff)
  1343 00001AA4 E8E8F30000          <1> 	call	transfer_to_user_buffer
  1344 00001AA9 59                  <1> 	pop	ecx ; *
  1345 00001AAA 7205                <1> 	jc	short _vbe3_pmfn_srs_3
  1346                              <1> 
  1347 00001AAC 29C0                <1> 	sub	eax, eax
  1348 00001AAE B04F                <1> 	mov	al, 4Fh
  1349 00001AB0 C3                  <1> 	retn
  1350                              <1> 
  1351                              <1> 	; 24/01/2021
  1352                              <1> _vbe3_pmfn_srs_3:
  1353 00001AB1 B84F010000          <1> 	mov	eax, 014Fh
  1354                              <1> _vbe3_pmfn_srs_4:
  1355 00001AB6 C3                  <1> 	retn
  1356                              <1> _vbe3_pmfn_srs_5:
  1357 00001AB7 31C0                <1> 	xor	eax, eax
  1358 00001AB9 FEC4                <1> 	inc	ah
  1359                              <1> 	; eax = 0100h, function is not supported
  1360 00001ABB C3                  <1> 	retn
  1361                              <1> 
  1362                              <1> _vbe3_pmfn_srs_6:
  1363                              <1> 	; restore video state
  1364                              <1> 	; 24/01/2021
  1365                              <1> 	;pop	ebx ; *
  1366                              <1> 	; 23/01/2021
  1367 00001ABC 09DB                <1> 	or	ebx, ebx ; 0 ?	
  1368 00001ABE 7412                <1> 	jz	short _vbe3_pmfn_srs_7 ; 'sysvideo' call
  1369                              <1> 	; 24/01/2021
  1370                              <1> 	;jz	_vbe3_pmfn_srs_8
  1371 00001AC0 89DE                <1> 	mov	esi, ebx
  1372                              <1> 	; esi = user's video state buffer
  1373 00001AC2 51                  <1> 	push	ecx ; *
  1374 00001AC3 89F9                <1> 	mov	ecx, edi ; state buffer size
  1375 00001AC5 BF00760900          <1> 	mov	edi, VBE3SAVERESTOREBLOCK ; destination
  1376                              <1> 					; (vbe3 pmi buff)
  1377                              <1> 	;mov	esi, ebx	; source (user buff)
  1378 00001ACA E80CF40000          <1> 	call	transfer_from_user_buffer
  1379 00001ACF 59                  <1> 	pop	ecx ; *
  1380 00001AD0 72DF                <1> 	jc	short _vbe3_pmfn_srs_3
  1381                              <1> _vbe3_pmfn_srs_7:
  1382 00001AD2 53                  <1> 	push	ebx ; *
  1383                              <1> 	; restore video state
  1384                              <1> 	;xor 	ebx, ebx ; points to VBE3SAVERESTOREBLOCK
  1385                              <1> 	;mov	ax, 4F04h
  1386                              <1> 	;call	int10h_32bit_pmi
  1387                              <1> 	; 17/01/2021
  1388 00001AD3 E81EFFFFFF          <1> 	call	_vbe3_pmfn_srs_8
  1389 00001AD8 5B                  <1> 	pop	ebx ; *
  1390 00001AD9 C3                  <1> 	retn
  1391                              <1> 
  1392                              <1> VIDEO_STATE:
  1393                              <1> 	; 26/06/2016
  1394                              <1> 	; 12/05/2016
  1395                              <1> 	; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
  1396                              <1> 
  1397                              <1> ;---------------------------------------------------
  1398                              <1> ; VIDEO STATE
  1399                              <1> ;  RETURNS THE CURRENT VIDEO STATE IN AX
  1400                              <1> ;  AH = NUMBER OF COLUMNS ON THE SCREEN
  1401                              <1> ;  AL = CURRENT VIDEO MODE
  1402                              <1> ;  BH = CURRENT ACTIVE PAGE
  1403                              <1> ;---------------------------------------------------
  1404                              <1> 
  1405 00001ADA 8A25[C0670000]      <1> 	mov	ah, [CRT_COLS]	; GET NUMBER OF COLUMNS
  1406 00001AE0 A0[BE670000]        <1> 	mov	al, [CRT_MODE]	; CURRENT MODE
  1407                              <1> 	;movzx	esi, al
  1408                              <1> 	;mov	ah, [esi+M6] 
  1409                              <1> 	; BH = active page
  1410 00001AE5 8A3D[B6780100]      <1> 	mov	bh, [ACTIVE_PAGE] ; GET CURRENT ACTIVE PAGE
  1411 00001AEB FA                  <1> 	cli	; 02/01/2017
  1412 00001AEC 5D                  <1> 	pop	ebp		; RECOVER REGISTERS
  1413 00001AED 5F                  <1> 	pop	edi
  1414 00001AEE 5E                  <1> 	pop	esi
  1415 00001AEF 59                  <1> 	pop	ecx		; DISCARD SAVED BX
  1416 00001AF0 EB41                <1> 	jmp	short M15	; RETURN TO CALLER
  1417                              <1> 
  1418                              <1> set_mode_ncm:
  1419                              <1> 	; 17/11/2020 (TRDOS 386 v2.0.3)
  1420                              <1> 	; 04/07/2016 - TRDOS 386 (TRDOS v2.0)
  1421                              <1> 	; set mode without clearing the video memory
  1422                              <1> 	; (ony for graphics modes)
  1423                              <1> 
  1424                              <1> 	;cmp	al, 7 ; IBM PC CGA modes
  1425                              <1> 	;jna	short SET_MODE ; normal function (clear)
  1426                              <1> 	;; do not clear memory
  1427                              <1> 	;;mov	[noclearmem], al ; > 0
  1428                              <1> 	;mov	byte [noclearmem], 80h ; 17/11/2020
  1429                              <1> 	;call	_set_mode
  1430                              <1> 	;mov	byte [noclearmem], 0
  1431                              <1>         ;jmp     short VIDEO_RETURN
  1432                              <1> 
  1433                              <1> 	; 17/11/2020 (TRDOS v2.0.3)
  1434 00001AF2 0C80                <1> 	or	al, 80h ; not clear memory option
  1435                              <1> 
  1436                              <1> 	; 05/12/2020
  1437                              <1> 	; 27/11/2020
  1438                              <1> 	; 17/11/2020
  1439                              <1> 	; 08/08/2016, 10/08/2016
  1440                              <1> 	; 29/07/2016, 30/07/2016
  1441                              <1> 	; 25/07/2016, 26/07/2016, 27/07/2016
  1442                              <1> 	; 02/07/2016, 18/07/2016, 23/07/2016
  1443                              <1> 	; 24/06/2016, 26/06/2016
  1444                              <1> 	; 29/05/2016 - TRDOS 386 (TRDOS v2.0)
  1445                              <1> SET_MODE:
  1446                              <1> 	; For 32 bit TRDOS and Retro UNIX 386:
  1447                              <1> 	;	valid video mode: 03h only!
  1448                              <1> 	;	(VGA modes will be selected with another routine)
  1449                              <1> 	;
  1450                              <1> 	; set_txt_mode ; 80*25 (16 fore colors, 8 back colors)
  1451                              <1> 
  1452                              <1> 	; 27/11/2020
  1453                              <1> 	
  1454                              <1> 	; Check if current mode is 
  1455                              <1> 	; Bochs/Plex86 VBE graphics mode
  1456 00001AF4 803D[BE670000]FF    <1> 	cmp	byte [CRT_MODE], 0FFh ; VESA VBE graphics mode
  1457 00001AFB 7220                <1> 	jb	short _set_mode_      ; signature  	
  1458                              <1> 				      ; VBE mode number is in	 
  1459                              <1> 				      ; [video_mode] bit 0to8
  1460 00001AFD 88C3                <1> 	mov	bl, al ; save video mode
  1461 00001AFF E87C230000          <1> 	call	dispi_get_enable
  1462 00001B04 50                  <1> 	push	eax ; save current VBE dispi status 
  1463                              <1> 	; Disable Bochs/Plex86 VBE dispi
  1464                              <1> 	;mov	ax, 0 ; VBE_DISPI_DISABLED 
  1465 00001B05 31C0                <1> 	xor	eax, eax ; 0 
  1466 00001B07 E849230000          <1> 	call	dispi_set_enable
  1467 00001B0C 88D8                <1> 	mov	al, bl ; restore video mode
  1468 00001B0E E827000000          <1> 	call	_set_mode
  1469 00001B13 58                  <1> 	pop	eax ; restore current VBE dispi status 
  1470 00001B14 7313                <1> 	jnc	short VIDEO_RETURN
  1471                              <1> 	; ! unimplemented or invalid video mode number !
  1472                              <1> 	; VBE dispi must be enabled again
  1473                              <1> 	; (return to run on current VBE graphics mode)
  1474                              <1> 	;;mov	al, [video_mode+1] ; bit 8 to 15
  1475                              <1> 	;;and	al, 0C0h ; isolate bit 14 and bit 15 
  1476                              <1> 	;;or	al, 1 ; VBE_DISPI_ENABLED
  1477 00001B16 E83A230000          <1> 	call	dispi_set_enable
  1478 00001B1B EB07                <1> 	jmp	short _video_func_err
  1479                              <1> 
  1480                              <1> _set_mode_:
  1481                              <1> 	; VGA bios (non-VBE) 'setmode' procedure
  1482                              <1> 
  1483                              <1> 	; 26/11/2020 (TRDOS v2.0.3)
  1484                              <1> 	
  1485                              <1> ;------------------------------------------------------
  1486                              <1> ; SET MODE					      :
  1487                              <1> ;	THIS ROUTINE INITIALIZES THE ATTACHMENT TO    :
  1488                              <1> ;	THE SELECTED MODE, THE SCREEN IS BLANKED.     :
  1489                              <1> ; INPUT						      :
  1490                              <1> ;	(AL) - MODE SELECTED (RANGE 0-7)	      :
  1491                              <1> ; OUTPUT					      :
  1492                              <1> ;	NONE					      :
  1493                              <1> ;------------------------------------------------------
  1494                              <1> 
  1495 00001B1D E818000000          <1> 	call	_set_mode ; 24/06/2016 (set_txt_mode)
  1496                              <1> 	; 26/11/2020
  1497 00001B22 7305                <1> 	jnc	short VIDEO_RETURN
  1498                              <1> 
  1499                              <1> 	; 26/11/2020
  1500                              <1> _video_func_err:
  1501 00001B24 31C0                <1> 	xor	eax, eax ; function call failed
  1502 00001B26 48                  <1> 	dec	eax  ; 0FFFFFFFFh ; - 1	
  1503 00001B27 EB05                <1> 	jmp	short _video_return	
  1504                              <1> 
  1505                              <1> ; 12/05/2016
  1506                              <1> ; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
  1507                              <1> 
  1508                              <1> ;-----	NORMAL RETURN FROM ALL VIDEO RETURNS
  1509                              <1> 
  1510                              <1> VIDEO_RETURN:
  1511 00001B29 A1[0C850100]        <1> 	mov	eax, [video_eax] ; 12/05/2016
  1512                              <1> _video_return:
  1513 00001B2E FA                  <1> 	cli ; 02/01/2017
  1514 00001B2F 5D                  <1> 	pop	ebp ; ******** ; 26/11/2020
  1515 00001B30 5F                  <1> 	pop	edi ; *******
  1516 00001B31 5E                  <1> 	pop	esi ; ******
  1517 00001B32 5B                  <1> 	pop	ebx ; *****
  1518                              <1> M15:	; VIDEO_RETURN_C
  1519                              <1> 	;;15/01/2017
  1520                              <1> 	; 02/01/2017
  1521                              <1> 	;;mov	byte [intflg], 0
  1522                              <1> 	;
  1523 00001B33 59                  <1> 	pop	ecx ; **** ; 26/11/2020
  1524 00001B34 5A                  <1> 	pop	edx ; ***
  1525 00001B35 1F                  <1> 	pop	ds  ; **
  1526 00001B36 07                  <1> 	pop	es  ; *	; RECOVER SEGMENTS
  1527 00001B37 CF                  <1> 	iretd		; ALL DONE
  1528                              <1> 
  1529                              <1> set_txt_mode:
  1530                              <1> 	
  1531                              <1> 	; 29/07/2016
  1532                              <1> 	; 27/06/2016
  1533 00001B38 B003                <1> 	mov	al, 3 ; 26/11/2020 (bit 7 = 0)
  1534                              <1> 
  1535                              <1> 	; 17/11/2020 (TRDOS v2.0.3)
  1536                              <1> 	;mov	byte [noclearmem], 0
  1537                              <1> 
  1538                              <1> ; 04/08/2022
  1539                              <1> ; 02/08/2022 (TRDOS 386 Kernel v2.0.5)
  1540                              <1> ; 12/04/2021
  1541                              <1> ; 10/08/2016
  1542                              <1> ; 08/08/2016
  1543                              <1> ; 30/07/2016
  1544                              <1> ; 29/07/2016
  1545                              <1> ; 25/07/2016 - 26/07/2016 - 27/07/2016
  1546                              <1> ; 07/07/2016 - 18/07/2016 - 23/07/2016
  1547                              <1> ; 02/07/2016 - 03/07/2016 - 04/07/2016
  1548                              <1> ; 26/06/2016
  1549                              <1> ; 24/06/2016 (set_txt_mode -> _set_mode)
  1550                              <1> ; 17/06/2016
  1551                              <1> ; 29/05/2016
  1552                              <1> ; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
  1553                              <1> 
  1554                              <1> _set_mode:
  1555                              <1> 	; 12/12/2020
  1556                              <1> 	; 26/11/2020
  1557                              <1> 	; call from 'biosfn_set_video_mode'
  1558                              <1> 	;	(bochs/plex86 video bios code)
  1559                              <1> 	; call from 'SET_MODE'
  1560                              <1> 	;	(TRDOS 386 v2 default, IBM PC/AT rom bios code)
  1561                              <1> 	; continue from 'set_txt_mode'	
  1562                              <1> 
  1563                              <1> 	; INPUT:
  1564                              <1> 	;	al = VGA video mode
  1565                              <1> 	; RETURN:
  1566                              <1> 	;	cf = 1 -> video mode not implemented
  1567                              <1> 	;	cf = 0 -> OK
  1568                              <1> 	;
  1569                              <1> 	; Modified registers: eax, bx, ecx, esi, edi, (ebp)
  1570                              <1> 
  1571                              <1> 	; 17/11/2020 (TRDOS v2.0.3)
  1572                              <1> 	; no clear memory option 
  1573                              <1> 	; (from mode number byte bit 7)
  1574 00001B3A 88C4                <1> 	mov	ah, al
  1575 00001B3C 80E480              <1> 	and	ah, 80h
  1576                              <1> 	;mov	[noclearmem], al
  1577 00001B3F 8825[1B850100]      <1> 	mov	[noclearmem], ah
  1578                              <1> 	;and	al, 7Fh ; clear bit 7
  1579                              <1> 	;;xor	[noclearmem], al ; clear bit 0 to 6
  1580                              <1> 	; 26/11/2020
  1581 00001B45 30E0                <1> 	xor	al, ah ; and al, 7Fh
  1582                              <1> 
  1583                              <1> 	; 19/11/2020
  1584                              <1> 
  1585                              <1> 	; Video mode 03h action principle:
  1586                              <1> 	;
  1587                              <1> 	; for case 1:
  1588                              <1> 	; Current mode is 03h and next/requested mode is not 03h
  1589                              <1> 	;	- save mode (set mode 03h flag)
  1590                              <1> 	;	- save 8 video pages (which are will be restored)	
  1591                              <1> 	;	- save active page number (which will be reactivated)
  1592                              <1> 	;	- set active page to 0 always (no multi screen)
  1593                              <1> 	;	- save 8 cursor positions (which will be restored)
  1594                              <1> 	; 	- use 'noclearmem' option
  1595                              <1> 	;	[p_crt_mode] = 0 -> 03h 
  1596                              <1> 	;
  1597                              <1> 	; for case 2:
  1598                              <1> 	; Current mode is 03h and next/requested mode is also 03h
  1599                              <1> 	;	- clear active video page if 'noclearmem' is not set
  1600                              <1> 	;	[p_crt_mode] = 0 -> 80h -> 0
  1601                              <1> 	;
  1602                              <1> 	; for case 3:
  1603                              <1> 	; Current mode is not 03h and next/requested mode is 03h
  1604                              <1> 	;	- restore video pages (8 video pages were saved)	
  1605                              <1> 	;	- restore active page number (which were saved)
  1606                              <1> 	;	- restore 8 cursor positions (which were saved)
  1607                              <1> 	;	- reset/clear mode 03h flag
  1608                              <1> 	;	[p_crt_mode] = 03h -> 0
  1609                              <1> 	;
  1610                              <1> 	; for case 4:
  1611                              <1> 	; Current mode is not 03h and next/requested mode is not 03h
  1612                              <1> 	; 	- use 'noclearmem' option
  1613                              <1> 	;	- set active page to 0 always
  1614                              <1> 	;	[p_crt_mode] = 03h -> 83h -> 03h
  1615                              <1> 	;
  1616                              <1> 	; initial (boot time) values:
  1617                              <1> 	;	[p_crt_mode] = 0 ("there isn't a page backup, yet")
  1618                              <1> 	;	  [CRT_MODE] = 3 (kernel's starting mode)
  1619                              <1> 
  1620                              <1> 	; 26/11/2020
  1621 00001B47 3C03                <1> 	cmp	al, 03h	    ; mode 3, 80x25 text, 16 colors
  1622 00001B49 7515                <1> 	jne	short _sm_0 ; (default mode for TRDOS 386 mainprog)
  1623                              <1> 
  1624                              <1> 	; case 2 or case 3
  1625                              <1> 
  1626                              <1> 	; check current video mode if it is 03h
  1627 00001B4B 08E4                <1> 	or	ah, ah ; 80h or 0 ('noclearmem' option)
  1628 00001B4D 7521                <1> 	jnz	short _sm_1 ; do not clear display page
  1629                              <1>  	
  1630                              <1> 	; 26/11/2020
  1631                              <1> 	; Note:
  1632                              <1> 	; [CRT_MODE] = 0FFh for VESA VBE video modes
  1633                              <1> 	; [video_mode] = standard VGA and VESA VBE video modes
  1634                              <1> 	
  1635 00001B4F 3805[BE670000]      <1> 	cmp	[CRT_MODE], al	; 03h
  1636 00001B55 7520                <1> 	jne	short _sm_2	; case 3 ([p_crt_mode] = 03h)
  1637                              <1> 
  1638                              <1> 	; case 2
  1639                              <1> 
  1640                              <1> 	; [p_crt_mode] = 0
  1641                              <1> 
  1642                              <1> 	; 19/11/2020
  1643                              <1> 	; If '_set_mode' procedure is called for video mode 3
  1644                              <1> 	;     while video mode is 3, video page will be cleared
  1645                              <1> 	;     and cursor position of video page will be reset.	 
  1646                              <1> 
  1647                              <1> 	; clear display page
  1648 00001B57 C605[19850100]80    <1> 	mov	byte [p_crt_mode], 80h ; clear page sign
  1649 00001B5E EB1C                <1> 	jmp	short _sm_3	; bypass save video page routine
  1650                              <1> _sm_0:
  1651                              <1> 	; case 1 or case 4
  1652                              <1> 
  1653                              <1> 	; 05/12/2020
  1654 00001B60 803D[BE670000]03    <1> 	cmp	byte [CRT_MODE], 3 ; is current mode 03h?
  1655 00001B67 7507                <1> 	jne	short _sm_1	; case 4 ; [p_crt_mode] = 03h
  1656                              <1> 	
  1657                              <1> 	; case 1
  1658                              <1> 	; [p_crt_mode] = 0
  1659                              <1> 
  1660                              <1> 	; 19/11/2020
  1661                              <1> 	; If '_set_mode' procedure is called for a video mode
  1662                              <1> 	;     except video mode 3 while current video mode
  1663                              <1> 	;     is 3, all video pages of mode 3 will be copied 
  1664                              <1> 	;     to 98000h address as backup, before mode change.
  1665                              <1> 	
  1666                              <1> _sm_save_pm:
  1667                              <1> 	; 12/12/2020
  1668                              <1> 	;; 03/07/2016
  1669                              <1> 	;; save video pages
  1670                              <1> 	;mov	esi, 0B8000h
  1671                              <1> 	;mov	edi, 98000h ; 30/07/2016
  1672                              <1> 	;mov	ecx, (0B8000h-0B0000h)/4
  1673                              <1> 	;rep	movsd
  1674                              <1> 
  1675                              <1> 	;mov	byte [p_crt_mode], 3 ; previous mode, backup sign
  1676                              <1> 	;; 26/11/2020
  1677                              <1> 	;xchg	cl, [ACTIVE_PAGE]
  1678                              <1> 	;mov	[p_crt_page], cl  ; save as previous active page
  1679                              <1> 	;
  1680                              <1> 	;; save cursor positions
  1681                              <1> 	;mov	esi, CURSOR_POSN
  1682                              <1> 	;mov	edi, cursor_pposn ; cursor positions backup
  1683                              <1> 	;mov	cl, 4
  1684                              <1> 	;rep	movsd
  1685                              <1> 
  1686                              <1> 	; 12/12/2020
  1687 00001B69 E86E020000          <1> 	call	save_mode3_multiscreen
  1688                              <1> 
  1689                              <1> 	; 29/07/2016
  1690                              <1> 	;;mov	[ACTIVE_PAGE], cl ; 0
  1691                              <1> 	;xchg	cl, [ACTIVE_PAGE]
  1692                              <1> 	;mov	[p_crt_page], cl  ; previous page (for mode 3)
  1693                              <1> 	
  1694                              <1> 	; [ACTIVE_PAGE] = 0 
  1695                              <1> 	
  1696 00001B6E EB07                <1> 	jmp	short _sm_2	; case 1 - 19/11/2020
  1697                              <1> _sm_1:
  1698                              <1> 	; 26/11/2020
  1699                              <1> 	; 19/11/2020
  1700                              <1> 	
  1701                              <1> 	; case 4
  1702 00001B70 800D[19850100]80    <1> 	or	byte [p_crt_mode], 80h 
  1703                              <1> 				; here [p_crt_mode] must be 83h
  1704                              <1> 				;	  (for case 4)
  1705                              <1> 				; (because video mode 03h
  1706                              <1> 				; was changed before as in case 1)
  1707                              <1> 
  1708                              <1> _sm_2:	; case 4 (jump to _sm_2) - 19/11/2020 
  1709                              <1> 
  1710                              <1> 	; 19/11/2020
  1711                              <1> 	; case 3
  1712                              <1> 	; If '_set_mode' procedure is called for video mode 3
  1713                              <1> 	;     while video mode is not 3 and if there is video
  1714                              <1> 	;     page backup for video mode 3, all (of 8) mode 3
  1715                              <1> 	;     video pages will be restored from 98000h.
  1716                              <1> 
  1717 00001B77 A2[BE670000]        <1> 	mov	[CRT_MODE], al  ; save mode in global variable
  1718                              <1> _sm_3:
  1719                              <1> 	; 04/08/2022 (TRDOS 386 v2.0.5)
  1720                              <1> 	; 30/07/2016
  1721                              <1> 	; 26/07/2016
  1722                              <1> 	; 25/07/2016
  1723                              <1> 	; set_mode_vga:
  1724                              <1> 	; 18/07/2016
  1725                              <1> 	; 14/07/2016
  1726                              <1> 	; 09/07/2016
  1727                              <1> 	; 04/07/2016
  1728                              <1> 	; 03/07/2016 (TRDOS 386 = TRDOS v2.0)
  1729                              <1> 	; /// video mode 13h ///
  1730                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  1731                              <1> 	; vgabios-0.7a (2011)
  1732                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  1733                              <1> 	; 'vgabios.c', 'vgatables.h'
  1734                              <1> 	;
  1735                              <1> 	; Oracle VirtualBox 5.0.24 VGABios Source Code
  1736                              <1> 	; ('vgabios.c', 'vgatables.h', 'vgafonts.h', 'vgarom.asm')
  1737                              <1> 	;
  1738 00001B7C 88C4                <1> 	mov	ah, al
  1739 00001B7E B910000000          <1> 	mov	ecx, vga_mode_count
  1740 00001B83 BE[DA670000]        <1> 	mov	esi, vga_modes
  1741 00001B88 31DB                <1> 	xor	ebx, ebx
  1742                              <1> _sm_4:
  1743 00001B8A AC                  <1> 	lodsb
  1744 00001B8B 38C4                <1> 	cmp	ah, al
  1745 00001B8D 7406                <1> 	je	short _sm_5
  1746 00001B8F FEC3                <1> 	inc	bl
  1747 00001B91 E2F7                <1> 	loop	_sm_4
  1748                              <1> 
  1749                              <1> 	; UNIMPLEMENTED VIDEO MODE !
  1750                              <1> 	;xor	eax, eax
  1751                              <1>         ;mov	[video_eax], eax ; 0
  1752                              <1> 
  1753                              <1> 	; 26/11/2020
  1754 00001B93 F9                  <1> 	stc	; unimplemented video mode ! (cf=1)
  1755                              <1> 
  1756 00001B94 C3                  <1> 	retn
  1757                              <1> 
  1758                              <1> ;-----	EBX POINTS TO CORRECT ROW OF INITIALIZATION TABLE
  1759                              <1> 
  1760                              <1> _sm_5: 	; 25/07/2016
  1761                              <1> 	;mov	esi, ebx
  1762                              <1> 	;add	esi, vga_memmodel
  1763                              <1> 	;mov	al, [esi]
  1764                              <1> 	; 19/11/2020
  1765 00001B95 8A83[2A680000]      <1> 	mov	al, [ebx+vga_memmodel]
  1766 00001B9B A2[32850100]        <1> 	mov	[VGA_MTYPE], al
  1767                              <1> 
  1768 00001BA0 89DF                <1> 	mov	edi, ebx
  1769 00001BA2 81C7[3A680000]      <1> 	add	edi, vga_dac_s 	
  1770 00001BA8 C0E302              <1> 	shl	bl, 2 ; byte -> dword
  1771 00001BAB 81C3[EA670000]      <1> 	add	ebx, vga_mode_tbl_ptr
  1772                              <1> 
  1773                              <1> 	;mov	dword [VGA_BASE], 0B8000h
  1774                              <1> 	;cmp	ah, 0Dh ; [CRT_MODE]
  1775                              <1> 	;jb	short M9 
  1776                              <1> 	;mov	dword [VGA_BASE], 0A0000h
  1777                              <1> ;M9:
  1778 00001BB1 8B33                <1> 	mov	esi, [ebx]
  1779 00001BB3 89F3                <1> 	mov	ebx, esi
  1780 00001BB5 83C614              <1> 	add	esi, vga_p_cm_pos ; ebx + 20
  1781 00001BB8 668B06              <1> 	mov	ax, [esi]       ; get the cursor mode from the table
  1782 00001BBB 66A3[D7670000]      <1> 	mov	[CURSOR_MODE], ax ; save cursor mode (initial value)
  1783                              <1> 	; al = 6, ah = 7
  1784                              <1> 	; al = 0Dh, ah = 0Eh ; 25/07/2016
  1785 00001BC1 E893020000          <1> 	call	cursor_shape_fix
  1786                              <1> 	; al = 14, ah = 15 (If [CHAR_HEIGHT] = 16)
  1787 00001BC6 668906              <1> 	mov	[esi], ax
  1788                              <1> 
  1789 00001BC9 56                  <1> 	push	esi ; *	
  1790                              <1> 
  1791                              <1> 	; 17/04/2021
  1792 00001BCA B603                <1> 	mov	dh, 03h
  1793                              <1> 	;
  1794 00001BCC 8A25[C5670000]      <1> 	mov	ah, [VGA_MODESET_CTL]
  1795 00001BD2 80E408              <1> 	and	ah, 8 ; default palette loading ?
  1796 00001BD5 7520                <1> 	jnz	short _sm_6
  1797                              <1> 	;mov	dx, 3C6h ; VGAREG_PEL_MASK (DAC mask register)
  1798                              <1> 	; 17/04/2021
  1799 00001BD7 B2C6                <1> 	mov	dl, 0C6h
  1800 00001BD9 B0FF                <1> 	mov	al, 0FFh ; PEL mask
  1801 00001BDB EE                  <1> 	out	dx, al
  1802 00001BDC 8A27                <1> 	mov	ah, [edi] ; DAC model (selection number)
  1803 00001BDE E8F80F0000          <1> 	call	load_dac_palette
  1804                              <1> 	; ecx = 0
  1805 00001BE3 F605[C5670000]02    <1> 	test	byte [VGA_MODESET_CTL], 2 ; gray scale summing
  1806 00001BEA 740B                <1> 	jz	short _sm_6
  1807 00001BEC 53                  <1> 	push	ebx
  1808 00001BED 29DB                <1> 	sub	ebx, ebx ; sub bl, bl
  1809                              <1> 	;mov	cx, 256
  1810                              <1> 	; 02/08/2022
  1811                              <1> 	;sub	ecx, ecx
  1812                              <1> 	; ecx = 0
  1813 00001BEF FEC5                <1> 	inc	ch
  1814                              <1> 	; ecx = 256
  1815 00001BF1 E837100000          <1> 	call	gray_scale_summing
  1816 00001BF6 5B                  <1> 	pop	ebx	
  1817                              <1> _sm_6:
  1818                              <1> 	; Reset Attribute Ctl flip-flop
  1819                              <1> 	;mov	dx, 3DAh ; VGAREG_ACTL_RESET
  1820                              <1>  	; 17/03/2021
  1821 00001BF7 B2DA                <1> 	mov	dl, 0DAh ; dx = 3DAh
  1822 00001BF9 EC                  <1> 	in	al, dx
  1823                              <1> 	; Set Attribute Ctl
  1824 00001BFA 89DE                <1> 	mov	esi, ebx ; addr of params tbl for selected mode
  1825 00001BFC 83C623              <1> 	add	esi, 35  ; actl regs
  1826 00001BFF 30E4                <1> 	xor	ah, ah ; 0
  1827                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  1828                              <1> 	; 17/04/2021
  1829 00001C01 B2C0                <1> 	mov	dl, 0C0h
  1830                              <1> _sm_7:
  1831 00001C03 88E0                <1> 	mov	al, ah
  1832 00001C05 EE                  <1> 	out	dx, al ; index
  1833 00001C06 AC                  <1> 	lodsb
  1834                              <1> 	; DX = 3C0h = VGAREG_ACTL_WRITE_DATA
  1835 00001C07 EE                  <1> 	out	dx, al ; value
  1836 00001C08 FEC4                <1> 	inc	ah
  1837 00001C0A 80FC14              <1> 	cmp	ah, 20 ; number of actl registers
  1838 00001C0D 72F4                <1> 	jb	short _sm_7
  1839                              <1> 	;
  1840 00001C0F 88E0                <1> 	mov	al, ah ; 20
  1841 00001C11 EE                  <1> 	out	dx, al ; index
  1842 00001C12 28C0                <1> 	sub	al, al ; 0
  1843 00001C14 EE                  <1> 	out	dx, al ; value
  1844                              <1> 	;
  1845                              <1> 	; Set Sequencer Ctl
  1846 00001C15 89DE                <1> 	mov	esi, ebx ; addr of params tbl for selected mode
  1847 00001C17 83C605              <1> 	add	esi, 5 ; sequ regs
  1848                              <1> 	;
  1849                              <1> 	;mov	dx, 3C4h  ; VGAREG_SEQU_ADDRESS
  1850                              <1> 	; 17/04/2021
  1851 00001C1A B2C4                <1> 	mov	dl, 0C4h
  1852 00001C1C EE                  <1> 	out	dx, al ; 0
  1853                              <1> 	;inc	dx ; 3C5h ; VGAREG_SEQU_DATA
  1854                              <1> 	; 17/04/2021
  1855 00001C1D FEC2                <1> 	inc	dl ; dx = 3C5h	
  1856 00001C1F B003                <1> 	mov	al, 3
  1857 00001C21 EE                  <1> 	out	dx, al
  1858 00001C22 B401                <1> 	mov	ah, 1	
  1859                              <1> _sm_8:
  1860 00001C24 88E0                <1> 	mov	al, ah
  1861                              <1> 	;mov	dx, 3C4h ; VGAREG_SEQU_ADDRESS
  1862                              <1> 	;dec	dx
  1863                              <1> 	; 17/04/2021
  1864 00001C26 FECA                <1> 	dec	dl ; dx = 3C4h
  1865 00001C28 EE                  <1> 	out	dx, al ; index
  1866 00001C29 AC                  <1> 	lodsb
  1867                              <1> 	;inc	dx ; 3C5h ; VGAREG_SEQU_DATA
  1868                              <1> 	; 17/04/2021
  1869 00001C2A FEC2                <1> 	inc	dl
  1870 00001C2C EE                  <1> 	out	dx, al
  1871 00001C2D 80FC04              <1> 	cmp	ah, 4 ; number of sequ regs
  1872 00001C30 7304                <1> 	jnb	short _sm_9		
  1873 00001C32 FEC4                <1> 	inc	ah 
  1874 00001C34 EBEE                <1> 	jmp	short _sm_8
  1875                              <1> _sm_9:
  1876                              <1> 	; Set Grafx Ctl
  1877 00001C36 89DE                <1> 	mov	esi, ebx ; addr of params tbl for selected mode
  1878 00001C38 83C637              <1> 	add	esi, 55 ; grdc regs
  1879 00001C3B 30E4                <1> 	xor	ah, ah ; 0
  1880                              <1> _sm_10:
  1881 00001C3D 88E0                <1> 	mov	al, ah
  1882                              <1> 	;mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  1883                              <1> 	; 17/04/2021
  1884 00001C3F B2CE                <1> 	mov	dl, 0CEh
  1885 00001C41 EE                  <1> 	out	dx, al	
  1886 00001C42 AC                  <1> 	lodsb
  1887                              <1> 	;inc	dx ; 3CFh ; VGAREG_GRDC_DATA
  1888                              <1> 	; 17/04/2021
  1889 00001C43 FEC2                <1> 	inc	dl ; 3CFh
  1890 00001C45 EE                  <1> 	out	dx, al
  1891 00001C46 FEC4                <1> 	inc	ah
  1892 00001C48 80FC09              <1> 	cmp	ah, 9 ; number of grdc regs
  1893 00001C4B 72F0                <1> 	jb	short _sm_10
  1894                              <1> 	;
  1895                              <1> 	; Disable CRTC write protection
  1896                              <1> 	;mov	dx, 3D4h  ; VGAREG_VGA_CRTC_ADDRESS
  1897                              <1> 	; 17/04/2021
  1898 00001C4D B2D4                <1> 	mov	dl, 0D4h
  1899                              <1> 	;mov	al, 11h
  1900                              <1> 	;out	dx, al
  1901                              <1> 	;inc	dx
  1902                              <1> 	;sub	al, al
  1903                              <1> 	;out	dx, al
  1904 00001C4F 66B81100            <1> 	mov	ax, 11h
  1905 00001C53 66EF                <1> 	out	dx, ax
  1906 00001C55 89DE                <1> 	mov	esi, ebx ; addr of params tbl for selected mode
  1907 00001C57 83C60A              <1> 	add	esi, 10 ; crtc regs
  1908                              <1> 	; ah = 0
  1909                              <1> _sm_11:
  1910 00001C5A 88E0                <1> 	mov	al, ah
  1911                              <1> 	; dx = 3D4h = VGAREG_VGA_CRTC_ADDRESS
  1912 00001C5C EE                  <1> 	out	dx, al ; index
  1913 00001C5D AC                  <1> 	lodsb
  1914                              <1> 	;inc	dx  ; VGAREG_VGA_CRTC_ADDRESS + 1
  1915                              <1> 	; 17/04/2021
  1916 00001C5E FEC2                <1> 	inc	dl
  1917 00001C60 EE                  <1> 	out	dx, al ; value
  1918 00001C61 80FC18              <1> 	cmp	ah, 24 ; number of crtc registers - 1
  1919 00001C64 7306                <1> 	jnb	short _sm_12
  1920 00001C66 FEC4                <1> 	inc	ah
  1921                              <1> 	;dec	dx ; 3D4h
  1922                              <1> 	; 17/04/2021
  1923 00001C68 FECA                <1> 	dec	dl
  1924 00001C6A EBEE                <1> 	jmp	short _sm_11
  1925                              <1> _sm_12:
  1926                              <1> 	; Set the misc register
  1927                              <1> 	;mov	dx, 3CCh ; VGAREG_READ_MISC_OUTPUT
  1928                              <1> 	; 17/04/2021
  1929 00001C6C B2CC                <1> 	mov	dl, 0CCh
  1930 00001C6E 8A4309              <1> 	mov	al, [ebx+9] ; misc reg
  1931 00001C71 EE                  <1> 	out	dx, al
  1932                              <1> 	;
  1933                              <1> 	; Enable video
  1934                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  1935                              <1> 	; 17/04/2021
  1936 00001C72 B2C0                <1> 	mov	dl, 0C0h
  1937 00001C74 B020                <1> 	mov	al, 20h  
  1938 00001C76 EE                  <1>         out     dx, al   ; set bit 5 to 1
  1939                              <1> 	;mov	dx, 3DAh ; VGAREG_ACTL_RESET
  1940                              <1> 	; 17/04/2021
  1941 00001C77 B2DA                <1> 	mov	dl, 0DAh
  1942 00001C79 EC                  <1> 	in	al, dx
  1943                              <1> 	;
  1944                              <1> 	; 17/11/2020
  1945                              <1> 	;cmp	byte [noclearmem], 0
  1946                              <1>         ;ja	short _sm_15
  1947                              <1> 
  1948 00001C7A F605[1B850100]80    <1> 	test	byte [noclearmem], 80h
  1949 00001C81 753B                <1> 	jnz	short _sm_15	
  1950                              <1> 
  1951                              <1> 	; 29/07/2016
  1952 00001C83 31C0                <1> 	xor	eax, eax
  1953                              <1> 	;mov	ecx, 4000h ; 16K words (32K)
  1954                              <1> 	; 02/08/2022
  1955 00001C85 29C9                <1> 	sub	ecx, ecx
  1956 00001C87 B540                <1> 	mov	ch, 40h
  1957                              <1> 	; ecx = 4000h 
  1958 00001C89 803D[32850100]02    <1> 	cmp     byte [VGA_MTYPE], 2  ; CTEXT, MTEXT, CGA
  1959 00001C90 7715                <1> 	ja	short _sm_14    ; no ? (0A0000h)
  1960 00001C92 BF00800B00          <1> 	mov	edi, 0B8000h
  1961 00001C97 7409                <1> 	je	short _sm_13	; CGA graphics mode
  1962                              <1> 	; 08/08/2016
  1963 00001C99 A3[2E850100]        <1> 	mov	[VGA_INT43H], eax ; 0 ; default font 
  1964 00001C9E 66B82007            <1> 	mov	ax, 0720h	; CGA text mode
  1965                              <1> _sm_13:
  1966 00001CA2 F366AB              <1> 	rep	stosw
  1967 00001CA5 EB17                <1> 	jmp	short _sm_15
  1968                              <1> 
  1969                              <1> _sm_14:
  1970 00001CA7 BF00000A00          <1> 	mov	edi, 0A0000h
  1971                              <1> 	; ecx = 16384 dwords (64K)
  1972                              <1> 	;mov	dx, 3C4h ; VGAREG_SEQU_ADDRESS
  1973                              <1> 	; 17/04/2021
  1974 00001CAC B2C4                <1> 	mov	dl, 0C4h
  1975 00001CAE B002                <1> 	mov	al, 2
  1976 00001CB0 EE                  <1> 	out	dx, al
  1977                              <1> 	;mov	dx, 3C5h ; VGAREG_SEQU_DATA
  1978                              <1> 	;inc	dx
  1979                              <1> 	; 17/04/2021
  1980 00001CB1 FEC2                <1> 	inc	dl ; 3C5h
  1981 00001CB3 EC                  <1> 	in	al, dx ; mmask
  1982                              <1> 	;push	ax
  1983                              <1> 	; 12/04/2021
  1984 00001CB4 50                  <1> 	push	eax
  1985 00001CB5 B00F                <1> 	mov	al, 0Fh ; all planes
  1986 00001CB7 EE                  <1> 	out	dx, al
  1987 00001CB8 30C0                <1> 	xor	al, al ; 0
  1988 00001CBA F3AB                <1> 	rep	stosd	; ecx = 163684 (64K)
  1989                              <1> 	;pop	ax
  1990                              <1> 	; 12/04/2021
  1991 00001CBC 58                  <1> 	pop	eax
  1992 00001CBD EE                  <1> 	out	dx, al  ; mmask
  1993                              <1> _sm_15:
  1994                              <1> 	; ebx = addr of params tbl for selected mode
  1995                              <1> 	; 10/08/2016
  1996 00001CBE 668B03              <1> 	mov	ax, [ebx] ; num of columns, 'twidth'
  1997 00001CC1 A2[C0670000]        <1> 	mov	[CRT_COLS], al
  1998                              <1> 	;; 26/07/2016
  1999                              <1> 	;; CRTC_ADDRESS = 3D4h (always)
  2000                              <1> 	;mov	ah, [ebx+1] ; num of rows, 'theightm1'
  2001 00001CC6 FEC4                <1> 	inc	ah ; 09/07/2016
  2002 00001CC8 8825[C6670000]      <1> 	mov	[VGA_ROWS], ah
  2003                              <1> 	; 10/08/2016
  2004 00001CCE 8A4302              <1> 	mov	al, [ebx+2]
  2005 00001CD1 A2[C2670000]        <1> 	mov	[CHAR_HEIGHT], al 
  2006                              <1> 	; 29/07/2016
  2007                              <1> 	; length of regen buffer in bytes
  2008 00001CD6 668B4B03            <1> 	mov	cx, [ebx+3] ; 'slength_l'
  2009 00001CDA 66890D[1C850100]    <1> 	mov	[CRT_LEN], cx
  2010                              <1> 	;
  2011                              <1> 	; 27/07/2016
  2012 00001CE1 30E4                <1> 	xor	ah, ah
  2013 00001CE3 A0[B6780100]        <1> 	mov	al, [ACTIVE_PAGE] ; may be > 0 for mode 3
  2014                              <1> 	;mul	word [CRT_LEN] ; 4096 for mode 3
  2015 00001CE8 66F7E1              <1> 	mul	cx ; 29/07/2016
  2016 00001CEB 66A3[A4780100]      <1> 	mov	[CRT_START], ax
  2017                              <1> 	;
  2018 00001CF1 B060                <1> 	mov	al, 60h
  2019                              <1> 	;cmp	byte [noclearmem], 0
  2020                              <1> 	;jna	short _sm_16
  2021                              <1> 	;add	al, 80h
  2022 00001CF3 0A05[1B850100]      <1> 	or	al, [noclearmem] ; 17/11/2020
  2023                              <1> _sm_16:
  2024 00001CF9 A2[C3670000]        <1> 	mov	[VGA_VIDEO_CTL], al
  2025 00001CFE C605[C4670000]F9    <1> 	mov	byte [VGA_SWITCHES], 0F9h
  2026 00001D05 8025[C5670000]7F    <1> 	and	byte [VGA_MODESET_CTL], 7Fh
  2027                              <1> 
  2028 00001D0C 5E                  <1> 	pop	esi ; *
  2029                              <1> 
  2030                              <1> 	; 26/07/2016
  2031                              <1> 	; 07/07/2016
  2032 00001D0D 668B0D[D7670000]    <1> 	mov	cx, [CURSOR_MODE] ; restore cursor mode (initial value)
  2033 00001D14 66870E              <1> 	xchg	cx, [esi] ; cl = start line, ch = end line
  2034                              <1> 			  ; reset to initial value
  2035 00001D17 86E9                <1> 	xchg 	ch, cl  ; ch = start line, cl = end line  
  2036 00001D19 66890D[D7670000]    <1> 	mov	[CURSOR_MODE], cx ; save (fixed) cursor mode
  2037                              <1> 
  2038                              <1> 	; 27/07/2016
  2039 00001D20 803D[32850100]02    <1> 	cmp	byte [VGA_MTYPE], 2 ; CTEXT, MTEXT
  2040 00001D27 7317                <1> 	jnb	short _sm_17
  2041                              <1> 
  2042                              <1> 	; Set cursor shape
  2043                              <1> 	;mov	cx, 0607h
  2044                              <1> 	;call	_set_ctype
  2045                              <1> 
  2046                              <1> 	; 29/07/2016
  2047 00001D29 B40A                <1> 	mov	ah, 10	; 6845 register for cursor set
  2048 00001D2B E81F060000          <1> 	call	m16	; output cx register
  2049                              <1> 	
  2050                              <1> 	; 25/07/2016
  2051 00001D30 803D[BE670000]03    <1>         cmp     byte [CRT_MODE], 03h
  2052 00001D37 7507                <1> 	jne	short _sm_17
  2053                              <1> 	; 26/07/2016
  2054                              <1> 
  2055 00001D39 A0[B6780100]        <1> 	mov	al, [ACTIVE_PAGE]
  2056 00001D3E EB0B                <1> 	jmp	short _sm_18
  2057                              <1> _sm_17:
  2058                              <1> 	; Set cursor pos for page 0..7
  2059                              <1> 	;sub	ax, ax ; eax = 0
  2060 00001D40 29C0                <1> 	sub	eax, eax ; 17/11/2020
  2061 00001D42 BF[A6780100]        <1> 	mov	edi, CURSOR_POSN
  2062 00001D47 AB                  <1> 	stosd	
  2063 00001D48 AB                  <1> 	stosd
  2064 00001D49 AB                  <1> 	stosd
  2065 00001D4A AB                  <1> 	stosd
  2066                              <1> 	;; Set active page 0
  2067                              <1> 	;mov	[ACTIVE_PAGE], al ; 0
  2068                              <1> _sm_18:
  2069                              <1> 	; 29/07/2016
  2070 00001D4B 803D[32850100]02    <1> 	cmp	byte [VGA_MTYPE], 2 ; CTEXT, MTEXT
  2071                              <1> 	;jnb	_sm_23
  2072                              <1> 	; 04/08/2022
  2073 00001D52 7205                <1> 	jb	short _sm_24
  2074 00001D54 E90C020000          <1> 	jmp	_set_active_page
  2075                              <1> _sm_24:
  2076                              <1> 	;cmp	byte [CHAR_HEIGHT], 16
  2077                              <1> 	;je	short _sm_19
  2078                              <1> 
  2079                              <1>  	;; copy and activate 8x16 font
  2080                              <1> 	
  2081                              <1> 	; 26/07/2016
  2082 00001D59 B004                <1> 	mov	al, 04h
  2083                              <1> 	;sub	bl, bl
  2084                              <1> 	; AX = 1104H ; Load ROM 8x16 Character Set
  2085                              <1> 	; (BL = font block to load (EGA: 0-3; VGA: 0-7))
  2086 00001D5B E844160000          <1> 	call	load_text_8_16_pat
  2087                              <1> 
  2088                              <1> 	; video_func_1103h:
  2089                              <1> 	; biosfn_set_text_block_specifier:
  2090                              <1> 	; BL = font block selector code	
  2091                              <1> 	; NOTE: TRDOS 386 only uses and sets font block 0
  2092                              <1> 	; (It is as BL = 0 for TRDOS 386)
  2093 00001D60 66BAC403            <1> 	mov	dx, 3C4h ; VGAREG_SEQU_ADDRESS
  2094                              <1> 	;;mov	ah, bl
  2095                              <1> 	;sub	ah, ah ; 0
  2096                              <1> 	;mov	al, 03h
  2097                              <1> 	; 19/11/2020
  2098 00001D64 66B80300            <1> 	mov	ax, 03h
  2099 00001D68 66EF                <1> 	out	dx, ax
  2100                              <1> _sm_19:
  2101                              <1> 	; 29/07/2016
  2102                              <1> 	; 26/07/2016
  2103                              <1> 	; 24/06/2016
  2104                              <1> 	;mov	edi, 0B8000h
  2105                              <1> 	;mov	cx, 4000h ; 16K words (32K)
  2106                              <1> 	;
  2107 00001D6A 30C0                <1> 	xor	al, al
  2108 00001D6C 3805[19850100]      <1>         cmp     [p_crt_mode], al ; 0 
  2109 00001D72 7705                <1>         ja      short _sm_20 ; 03h, 80h or 83h
  2110                              <1> 
  2111                              <1> 	; case 1 - 19/11/2020
  2112                              <1> 	;
  2113                              <1> 	; If [pc_crt_mode] = 0, that means, previous mode is 03h
  2114                              <1> 	; and current mode is not 03h (case 1)
  2115                              <1> 
  2116                              <1> 	; 30/07/2016
  2117                              <1> 	; 24/06/2016
  2118                              <1> 	; TRDOS 386 (TRDOS v2) 'set mode' modification
  2119                              <1> 	; (for multiscreen feature):
  2120                              <1> 	; If '_set_mode' procedure is called for video mode 3
  2121                              <1> 	;     while video mode is 3, video page will be cleared
  2122                              <1> 	;     and cursor position of video page will be reset.
  2123                              <1> 	; If '_set_mode' procedure is called for a video mode
  2124                              <1> 	;     except video mode 3, while current video mode
  2125                              <1> 	;     is 3, all video pages of mode 3 will be copied 
  2126                              <1> 	;     to 98000h address as backup, before mode change.
  2127                              <1> 	; If '_set_mode' procedure is called for video mode 3
  2128                              <1> 	;     while video mode is not 3 and if there is video
  2129                              <1> 	;     page backup for video mode 3, all (of 8) mode 3
  2130                              <1> 	;     video pages will be restored from 98000h.
  2131                              <1> 
  2132                              <1> 	; 19/11/2020
  2133                              <1> 	;mov	[ACTIVE_PAGE], al ; 0
  2134                              <1> 
  2135                              <1> 	; Here,
  2136                              <1> 	; video memory already cleared if [noclearmem] <> 80h
  2137                              <1> 	
  2138                              <1> 	;mov	ax, 0720h
  2139                              <1> 	;mov	cx, 4000h ; 16K words (32K)
  2140                              <1> 	;mov	edi, 0B8000h
  2141                              <1> 	;rep	stosw
  2142                              <1> 	;sub	al, al
  2143                              <1> 	
  2144                              <1> 	;jmp	short _sm_23
  2145                              <1> 
  2146                              <1> 	; Set hardware side for the new active video page
  2147                              <1>  
  2148 00001D74 E9EC010000          <1> 	jmp	_set_active_page ; 19/11/2020	
  2149                              <1> 
  2150                              <1> _sm_20:
  2151                              <1> 	; 19/11/2020
  2152                              <1> 	; case 2 or case 3 or case 4 - 19/11/2020
  2153                              <1> 	
  2154                              <1> 	; 19/11/2020
  2155 00001D79 803D[BE670000]03    <1> 	cmp	byte [CRT_MODE], 3  ; new video mode
  2156 00001D80 754E                <1> 	jne	short _sm_22 ; al = 0 (& video mode <> 03h)
  2157                              <1> 			     ; case 4 - 19/11/2020
  2158                              <1> 			     ; ([p_crt_mode] = 83h)
  2159                              <1> 
  2160                              <1> 	; case 2 or case 3 - 19/11/2020	
  2161                              <1> 
  2162                              <1> 	;movzx	ebx, byte [ACTIVE_PAGE]
  2163                              <1> 	; 19/11/2020
  2164 00001D82 A0[1A850100]        <1> 	mov	al, [p_crt_page] ; previous mode 3 active page
  2165                              <1> 	;movzx	ebx, al
  2166                              <1> 	;shl	bl, 1 ; * 2
  2167                              <1> 	;add	ebx, CURSOR_POSN
  2168                              <1> 
  2169                              <1> 	; 29/07/2016
  2170 00001D87 F605[19850100]7F    <1> 	test    byte [p_crt_mode], 7Fh ; 83h or 80h or 03h
  2171 00001D8E 740F                <1> 	jz	short _sm_21	; do not restore video pages
  2172                              <1> 				; case 2 - 19/11/2020 
  2173                              <1> 	; case 3 - 19/11/2020
  2174                              <1> 
  2175                              <1> 	; ([p_crt_mode] = 03h)
  2176                              <1> 
  2177                              <1> 	; New video mode is 3 while current video mode is not 3
  2178                              <1> 	; (multi screen) video pages will be restored from 098000h
  2179                              <1> 
  2180                              <1> 	; 19/11/2020
  2181 00001D90 A2[B6780100]        <1> 	mov	[ACTIVE_PAGE], al ; current mode 3 active page
  2182                              <1> 
  2183                              <1> 	; 12/12/2020
  2184                              <1> 	;; restore video pages
  2185                              <1> 	;mov	esi, 98000h ; 30/07/2016 
  2186                              <1> 	;mov	edi, 0B8000h
  2187                              <1> 	;mov	cx, 2000h ; 8K dwords (32K)
  2188                              <1> 	;rep	movsd
  2189                              <1> 	;
  2190                              <1> 	;; 19/11/2020
  2191                              <1> 	;mov	[p_crt_mode], cl ; reset ('case 3' end condition)
  2192                              <1> 	;
  2193                              <1> 	;; restore cursor positions
  2194                              <1> 	;mov	esi, cursor_pposn
  2195                              <1> 	;mov	edi, CURSOR_POSN
  2196                              <1> 	;;mov	ecx, 4	; restore all cursor positions (16 bytes)
  2197                              <1> 	;mov	cl, 4
  2198                              <1> 	;rep 	movsd
  2199                              <1> 	
  2200                              <1> 	; 12/12/2020
  2201 00001D95 E89A000000          <1> 	call	_restore_mode3_multiscreen
  2202                              <1> 
  2203                              <1> 	;jmp	short _sm_23 ; do not clear current video pages
  2204                              <1> 
  2205                              <1> 	; 19/11/2020
  2206 00001D9A E9C6010000          <1> 	jmp	_set_active_page
  2207                              <1> 
  2208                              <1> _sm_21:
  2209                              <1> 	; 19/11/2020
  2210                              <1> 	; case 2 
  2211                              <1> 	;
  2212                              <1> 	; ([p_crt_mode] = 80h)
  2213                              <1> 	;
  2214                              <1> 	; User has requested to set video mode 3 again while
  2215                              <1> 	; current video mode is 3.. that means, set mode 03h
  2216                              <1> 	; parameters again and clear video page.
  2217                              <1> 	; ('noclearmem' option effects the result) 
  2218                              <1> 	
  2219                              <1> 	; 19/11/2020
  2220 00001D9F F605[1B850100]80    <1> 	test	byte [noclearmem], 80h
  2221 00001DA6 7528                <1> 	jnz	short _sm_22	; 'do not clear video memory'
  2222                              <1> 				; continue with current text
  2223                              <1> 				; (user's option/choice) 
  2224                              <1> 	; clear video page
  2225                              <1> 	;mov	cx, [CRT_LEN] ; 4096
  2226                              <1> 	;shr	cx, 1 ; 2048 ; 16/11/2020
  2227 00001DA8 66B82007            <1> 	mov	ax, 0720h
  2228                              <1> 	; 26/11/2020
  2229                              <1> 	;mov	ecx, 2048 ; 4096/2
  2230                              <1> 	; 02/08/2022
  2231 00001DAC 29C9                <1> 	sub	ecx, ecx
  2232 00001DAE B508                <1> 	mov	ch, 08h
  2233                              <1> 	; ecx = 0800h
  2234 00001DB0 BF00800B00          <1> 	mov	edi, 0B8000h ; [crt_base]
  2235 00001DB5 66033D[A4780100]    <1> 	add	di, [CRT_START]
  2236 00001DBC F366AB              <1> 	rep	stosw	; FILL THE REGEN BUFFER WITH BLANKS
  2237                              <1> 	;
  2238                              <1> 	; 19/11/2020
  2239 00001DBF A0[B6780100]        <1> 	mov	al, [ACTIVE_PAGE] ; 0 to 7 (for video mode 3)
  2240 00001DC4 0FB6D8              <1> 	movzx	ebx, al
  2241 00001DC7 D0E3                <1> 	shl	bl, 1
  2242 00001DC9 66898B[A6780100]    <1> 	mov	[ebx+CURSOR_POSN], cx ; reset cursor position
  2243                              <1> _sm_22:
  2244                              <1> 	;mov	[p_crt_mode], al ; 0 ; reset
  2245                              <1> 	; 19/11/2020
  2246                              <1> 	;and	byte [p_crt_mode], 3 ; 83h -> 3, 80h -> 0  
  2247 00001DD0 8025[19850100]7F    <1> 	and	byte [p_crt_mode], 7Fh ; 83h -> 3, 80h -> 0
  2248                              <1> _sm_23:
  2249                              <1> 	; al = video page number
  2250                              <1> 	; [CRT_LEN] = length of regen buffer in bytes
  2251                              <1> 	;call	_set_active_page
  2252                              <1> 	; 16/11/2020
  2253 00001DD7 E989010000          <1> 	jmp	_set_active_page
  2254                              <1> 
  2255                              <1> ;-----	NORMAL RETURN FROM ALL VIDEO RETURNS
  2256                              <1> 	;retn
  2257                              <1> 
  2258                              <1> save_mode3_multiscreen:
  2259                              <1> 	; 02/08/2022 (TRDOS v2.0.5)
  2260                              <1> 	; 12/12/2020 (TRDOS v2.0.3)
  2261                              <1> 	; save mode 03h video pages and cursor positions
  2262                              <1> 	;
  2263                              <1> 	; Modified registers: ecx (=0), esi, edi
  2264                              <1> 	
  2265                              <1> 	; 12/12/2020
  2266                              <1> 	; moved here from '_set_mode'	
  2267                              <1> 	; 03/07/2016
  2268                              <1> 	; save video pages
  2269 00001DDC BE00800B00          <1> 	mov	esi, 0B8000h
  2270 00001DE1 BF00800900          <1> 	mov	edi, 98000h ; 30/07/2016
  2271                              <1> 	;mov	ecx, (0B8000h-0B0000h)/4
  2272                              <1> 	; 02/08/2022
  2273 00001DE6 29C9                <1> 	sub	ecx, ecx
  2274 00001DE8 B520                <1> 	mov	ch, 20h
  2275                              <1> 	; ecx = 2000h 
  2276 00001DEA F3A5                <1> 	rep	movsd
  2277                              <1> 	
  2278 00001DEC C605[19850100]03    <1> 	mov	byte [p_crt_mode], 3 ; previous mode, backup sign
  2279                              <1> 	; 26/11/2020
  2280 00001DF3 860D[B6780100]      <1> 	xchg	cl, [ACTIVE_PAGE]
  2281 00001DF9 880D[1A850100]      <1> 	mov	[p_crt_page], cl  ; save as previous active page
  2282                              <1> 	
  2283                              <1> 	; save cursor positions
  2284 00001DFF BE[A6780100]        <1> 	mov	esi, CURSOR_POSN
  2285 00001E04 BF[1E850100]        <1> 	mov	edi, cursor_pposn ; cursor positions backup
  2286 00001E09 B104                <1> 	mov	cl, 4
  2287 00001E0B F3A5                <1> 	rep	movsd
  2288 00001E0D C3                  <1> 	retn
  2289                              <1> 
  2290                              <1> restore_mode3_multiscreen:
  2291                              <1> 	; 02/08/2022 (TRDOS v2.0.5)
  2292                              <1> 	; 12/12/2020 (TRDOS v2.0.3)
  2293                              <1> 	; restore mode 03h video pages and cursor positions
  2294                              <1> 	;
  2295                              <1> 	; Input:
  2296                              <1> 	;    settings from the last 'save_mode3_multiscreen'
  2297                              <1> 	;
  2298                              <1> 	; Output: 
  2299                              <1> 	;    AL = active video page = [ACTIVE_PAGE]
  2300                              <1> 	;
  2301                              <1> 	; Modified registers: al, ecx (=0), esi, edi
  2302                              <1> 
  2303 00001E0E A0[1A850100]        <1> 	mov	al, [p_crt_page] ; previous mode 3 active page
  2304 00001E13 A2[B6780100]        <1> 	mov	[ACTIVE_PAGE], al ; current mode 3 active page
  2305                              <1> 
  2306                              <1> 	; 12/12/2020
  2307                              <1> 	; moved here from 'vesa_vbe3_pmi'	
  2308                              <1> 
  2309                              <1> 	; 07/12/2020
  2310                              <1> 	; restore CRT_START according to ACTIVE_PAGE
  2311                              <1> 	;mov	[CRT_START], cx ; 0
  2312                              <1> 	; 12/12/2020
  2313 00001E18 66C705[A4780100]00- <1> 	mov	word [CRT_START], 0
  2313 00001E20 00                  <1>
  2314                              <1> 
  2315                              <1> 	; check active page and set it again if it is not 0
  2316 00001E21 08C0                <1> 	or	al, al
  2317                              <1> 	;;jz	short vbe3_pmi_7
  2318                              <1> 	;jz	short _restore_mode3_multiscreen
  2319 00001E23 740F                <1> 	jz	short r_m3_ms_1
  2320 00001E25 88C1                <1> 	mov	cl, al
  2321                              <1> ;vbe3_pmi_5:
  2322                              <1> r_m3_ms_0:
  2323 00001E27 668105[A4780100]00- <1> 	add	word [CRT_START], 4096
  2323 00001E2F 10                  <1>
  2324 00001E30 FEC9                <1> 	dec	cl
  2325                              <1> 	;jnz	short vbe3_pmi_5
  2326 00001E32 75F3                <1> 	jnz	short r_m3_ms_0
  2327                              <1> r_m3_ms_1:
  2328                              <1> 	; 12/12/2020
  2329                              <1> 	; moved here from '_set_mode'	
  2330                              <1> _restore_mode3_multiscreen:
  2331                              <1> 	; Modified registers: ecx, esi, edi
  2332                              <1> 
  2333                              <1> 	; restore video pages
  2334 00001E34 BE00800900          <1> 	mov	esi, 98000h ; 30/07/2016 
  2335 00001E39 BF00800B00          <1> 	mov	edi, 0B8000h
  2336                              <1> 	;mov	cx, 2000h ; 8K dwords (32K)
  2337                              <1> 	;mov	ecx, 2000h
  2338                              <1> 	; 02/08/2022
  2339 00001E3E 29C9                <1> 	sub	ecx, ecx
  2340 00001E40 B520                <1> 	mov	ch, 20h
  2341                              <1> 	; ecx = 2000h 
  2342 00001E42 F3A5                <1> 	rep	movsd
  2343                              <1> 
  2344                              <1> 	; 19/11/2020
  2345 00001E44 880D[19850100]      <1> 	mov	[p_crt_mode], cl ; reset ('case 3' end condition)
  2346                              <1> 
  2347                              <1> 	; restore cursor positions
  2348 00001E4A BE[1E850100]        <1> 	mov	esi, cursor_pposn
  2349 00001E4F BF[A6780100]        <1> 	mov	edi, CURSOR_POSN
  2350                              <1> 	;mov	ecx, 4	; restore all cursor positions (16 bytes)
  2351 00001E54 B104                <1> 	mov	cl, 4
  2352 00001E56 F3A5                <1> 	rep 	movsd
  2353 00001E58 C3                  <1> 	retn
  2354                              <1> 
  2355                              <1> cursor_shape_fix:
  2356                              <1> 	; 12/04/2021
  2357                              <1> 	; 07/07/2016
  2358                              <1> 	; (Cursor start and cursor end line values -6,7-
  2359                              <1> 	; will be fixed depending on character height)
  2360                              <1> 	;
  2361                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  2362                              <1> 	; vgabios-0.7a (2011)
  2363                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  2364                              <1> 	; 'vgabios.c', ' biosfn_set_cursor_shape (CH,CL)'
  2365                              <1> 	;
  2366                              <1> 	; INPUT ->
  2367                              <1> 	;	AL = cursor start line (=6)
  2368                              <1> 	;	AH = cursor end line (=7)
  2369                              <1> 	; OUTPUT ->
  2370                              <1> 	;	AL = cursor start line (=14)
  2371                              <1> 	;	AH = cursor end line (=15)
  2372                              <1> 	;
  2373                              <1> 	;; if((modeset_ctl&0x01)&&(cheight>8)&&(CL<8)&&(CH<0x20))
  2374                              <1> 
  2375                              <1> 	;test	byte [VGA_MODESET_CTL], 1 ; VGA active
  2376                              <1> 	;jz	short csf_3
  2377 00001E59 803D[C2670000]08    <1> 	cmp	byte [CHAR_HEIGHT], 8
  2378 00001E60 7647                <1> 	jna	short csf_3
  2379 00001E62 80FC08              <1> 	cmp	ah, 8
  2380 00001E65 7342                <1> 	jnb	short csf_3
  2381 00001E67 3C20                <1> 	cmp	al, 20h
  2382 00001E69 733E                <1> 	jnb	short csf_3
  2383                              <1> 	;
  2384                              <1> 	;push	ax
  2385                              <1> 	; 12/04/2021
  2386 00001E6B 50                  <1> 	push	eax
  2387                              <1> 	; {
  2388                              <1>    	; if(CL!=(CH+1))	
  2389 00001E6C FEC0                <1> 	inc	al
  2390 00001E6E 38C4                <1> 	cmp	ah, al   ; ah != al + 1
  2391 00001E70 740F                <1>         je      short csf_1
  2392                              <1> 	; CH = ((CH+1) * cheight / 8) -1;
  2393 00001E72 8A25[C2670000]      <1> 	mov	ah, [CHAR_HEIGHT]
  2394 00001E78 F6E4                <1> 	mul	ah
  2395 00001E7A C0E803              <1> 	shr	al, 3 ; / 8
  2396 00001E7D FEC8                <1> 	dec	al ; - 1
  2397 00001E7F EB0E                <1> 	jmp	short csf_2 
  2398                              <1> csf_1: 	
  2399                              <1>  	; }
  2400                              <1>    	; else		; ah = al + 1
  2401                              <1>     	; {
  2402 00001E81 FEC4                <1> 	inc	ah	; ah = ah + 1   
  2403                              <1> 	; CH = ((CL+1) * cheight / 8) - 2;
  2404 00001E83 A0[C2670000]        <1> 	mov	al, [CHAR_HEIGHT]
  2405 00001E88 F6E4                <1> 	mul	ah
  2406 00001E8A C0E803              <1> 	shr	al, 3 ; / 8
  2407 00001E8D 2C02                <1> 	sub	al, 2 ; - 2
  2408                              <1> 	; al = 14 (if [CHAR_HEIGHT] = 16)
  2409                              <1> csf_2:
  2410 00001E8F 880424              <1> 	mov	[esp], al
  2411 00001E92 8A642401            <1> 	mov	ah, [esp+1]
  2412                              <1> 	; CL = ((CL+1) * cheight / 8) - 1;
  2413 00001E96 FEC4                <1> 	inc	ah 
  2414 00001E98 A0[C2670000]        <1> 	mov	al, [CHAR_HEIGHT]
  2415 00001E9D F6E4                <1> 	mul	ah
  2416 00001E9F C0E803              <1> 	shr	al, 3 ; / 8
  2417 00001EA2 FEC8                <1> 	dec	al ; - 1
  2418 00001EA4 88442401            <1> 	mov	[esp+1], al
  2419                              <1> 	; ah = 15 (if [CHAR_HEIGHT] = 16)
  2420                              <1> 	;
  2421                              <1> 	;pop	ax
  2422                              <1> 	; 12/04/2021
  2423 00001EA8 58                  <1> 	pop	eax
  2424                              <1> csf_3:
  2425 00001EA9 C3                  <1> 	retn
  2426                              <1> 
  2427                              <1> SET_CTYPE:
  2428                              <1> 	; 04/08/2022 (TRDOS 386 v2.0.5)
  2429                              <1> 	; 12/09/2016
  2430                              <1> 	; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
  2431 00001EAA 803D[BE670000]07    <1> 	cmp	byte [CRT_MODE], 7
  2432                              <1> 	;ja	VIDEO_RETURN ; 12/09/2016
  2433                              <1> 	; 04/08/2022
  2434 00001EB1 7738                <1> 	ja	short set_cpos_inv_vp
  2435 00001EB3 E805000000          <1> 	call	_set_ctype
  2436 00001EB8 E96CFCFFFF          <1>         jmp     VIDEO_RETURN
  2437                              <1> 
  2438                              <1> _set_ctype:
  2439                              <1> 	; 02/09/2014 (Retro UNIX 386 v1)
  2440                              <1> 	;
  2441                              <1> 	; VIDEO.ASM - 06/10/85  VIDEO DISPLAY BIOS
  2442                              <1> 
  2443                              <1> 	; (CH) = BITS 4-0 = START LINE FOR CURSOR
  2444                              <1> 	;  ** HARDWARE WILL ALWAYS CAUSE BLINK
  2445                              <1> 	;  ** SETTING BIT 5 OR 6 WILL CAUSE ERRATIC BLINKING
  2446                              <1> 	;     OR NO CURSOR AT ALL
  2447                              <1> 	; (CL) = BITS 4-0 = END LINE FOR CURSOR
  2448                              <1> 
  2449                              <1> ;------------------------------------------------
  2450                              <1> ; SET_CTYPE
  2451                              <1> ;	THIS ROUTINE SETS THE CURSOR VALUE
  2452                              <1> ; INPUT
  2453                              <1> ;	(CX) HAS CURSOR VALUE CH-START LINE, CL-STOP LINE
  2454                              <1> ; OUTPUT	
  2455                              <1> ;	NONE
  2456                              <1> ;------------------------------------------------
  2457                              <1> 	
  2458                              <1> 	; 02/08/2022 (TRDOS 386 Kernel v2.0.5)
  2459                              <1> 	;
  2460                              <1> 	; 07/07/2016
  2461                              <1> 	; Fixing cursor start and stop line depending on
  2462                              <1> 	; current character height (=16)
  2463                              <1> 	; (Note: Default/initial values are 6 and 7.
  2464                              <1> 	; If set values are 6 (start) & 7 (stop) and 
  2465                              <1> 	; [CHAR_HEIGHT] = 16 :
  2466                              <1> 	; After fixing, start line will be 14, stop line
  2467                              <1> 	; will be 15.)
  2468                              <1> 
  2469                              <1> 	;mov	ax, cx
  2470                              <1> 	; 02/08/2022
  2471 00001EBD 89C8                <1> 	mov	eax, ecx
  2472                              <1> 
  2473 00001EBF 86C4                <1> 	xchg	al, ah
  2474                              <1> 	; AL = start line, AH = stop line
  2475 00001EC1 E893FFFFFF          <1> 	call	cursor_shape_fix
  2476                              <1> 	; AL = start line (fixed), AH = stop line (fixed)
  2477                              <1> 	;mov	cx, ax
  2478                              <1> 	; 02/08/2022
  2479 00001EC6 89C1                <1> 	mov	ecx, eax
  2480 00001EC8 86E9                <1> 	xchg	ch, cl
  2481                              <1> 	; CH = start line (fixed), CL = stop line (fixed)
  2482                              <1> 	;
  2483 00001ECA B40A                <1> 	mov	ah, 10	; 6845 register for cursor set
  2484 00001ECC 66890D[D7670000]    <1> 	mov	[CURSOR_MODE], cx ; save in data area
  2485                              <1> 	;call	m16	; output cx register
  2486                              <1> 	;retn
  2487 00001ED3 E977040000          <1>         jmp     m16
  2488                              <1> 
  2489                              <1> SET_CPOS:
  2490                              <1> 	; 02/08/2022 (TRDOS 386 Kernel v2.0.5)
  2491                              <1> 	; 12/09/2016
  2492                              <1> 	; 07/07/2016
  2493                              <1> 	; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
  2494 00001ED8 80FF07              <1> 	cmp	bh, 7 ; video page > 7 ; 07/07/2016
  2495                              <1> 	;ja	VIDEO_RETURN
  2496                              <1> 	; 02/08/2022
  2497 00001EDB 770E                <1> 	ja	short set_cpos_inv_vp
  2498                              <1> 	;
  2499 00001EDD 803D[BE670000]07    <1> 	cmp	byte [CRT_MODE], 7
  2500 00001EE4 770A                <1> 	ja	short vga_set_cpos ; 12/09/2016	
  2501 00001EE6 E839040000          <1> 	call	_set_cpos
  2502                              <1> set_cpos_inv_vp:   ; 02/08/2022
  2503 00001EEB E939FCFFFF          <1>         jmp     VIDEO_RETURN
  2504                              <1> 
  2505                              <1> vga_set_cpos:
  2506                              <1> 	; 12/09/2016
  2507                              <1> 	; 09/07/2016
  2508                              <1> 	; set cursor position
  2509                              <1> 	; NOTE: Hardware cursor position will not be set
  2510                              <1> 	;   in any VGA modes (>7)
  2511                              <1> 	;   But, cursor position will be saved into
  2512                              <1> 	;   [CURSOR_POSN].
  2513                              <1> 	;   TRDOS 386 (TRDOS v2.0) uses only one page
  2514                              <1> 	;   (page 0) for all graphics modes.
  2515                              <1> 
  2516 00001EF0 668915[A6780100]    <1> 	mov	[CURSOR_POSN], dx ; save cursor pos for pg 0
  2517                              <1> 	; 04/08/2016
  2518                              <1> 	;mov	bh, [ACTIVE_PAGE] ; = 0
  2519                              <1> 	;call	_set_cpos
  2520 00001EF7 E92DFCFFFF          <1> 	jmp     VIDEO_RETURN
  2521                              <1> 
  2522                              <1> READ_CURSOR:
  2523                              <1> 	; 12/09/2016
  2524                              <1> 	; 07/07/2016
  2525                              <1> 	; 12/05/2016
  2526                              <1> 	; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
  2527                              <1> 	;
  2528                              <1> 	; VIDEO.ASM - 06/10/85  VIDEO DISPLAY BIOS
  2529                              <1> 
  2530                              <1> ;------------------------------------------------------
  2531                              <1> ; READ_CURSOR
  2532                              <1> ;	THIS ROUTINE READS THE CURRENT CURSOR VALUE FROM THE
  2533                              <1> ;	845, FORMATS IT, AND SENDS IT BACK TO THE CALLER
  2534                              <1> ; INPUT
  2535                              <1> ;	BH - PAGE OF CURSOR
  2536                              <1> ; OUTPUT
  2537                              <1> ;	DX - ROW, COLUMN OF THE CURRENT CURSOR POSITION
  2538                              <1> ;	CX - CURRENT CURSOR MODE
  2539                              <1> ;------------------------------------------------------
  2540                              <1> 
  2541                              <1> 	; BH = Video page number (0 to 7)
  2542                              <1> 
  2543                              <1> 	; 07/07/2016
  2544 00001EFC 80FF07              <1> 	cmp	bh, 7 ; video page > 7 (invalid)
  2545 00001EFF 7606                <1> 	jna	short read_cursor_1
  2546                              <1> 	; invalid video page (input) 
  2547 00001F01 31C9                <1> 	xor	ecx, ecx ; 0
  2548 00001F03 31D2                <1> 	xor	edx, edx ; 0
  2549 00001F05 EB15                <1> 	jmp	short read_cursor_2
  2550                              <1> read_cursor_1:
  2551                              <1> 	; 12/09/2016
  2552 00001F07 803D[BE670000]07    <1> 	cmp	byte [CRT_MODE], 7 ; vga mode
  2553 00001F0E 7727                <1> 	ja	short vga_get_cpos
  2554                              <1> 	;
  2555 00001F10 E815000000          <1> 	call	get_cpos
  2556 00001F15 0FB70D[D7670000]    <1> 	movzx	ecx, word [CURSOR_MODE]
  2557                              <1> read_cursor_2:
  2558 00001F1C 5D                  <1> 	pop	ebp
  2559 00001F1D 5F                  <1> 	pop	edi
  2560 00001F1E 5E                  <1> 	pop	esi
  2561 00001F1F 5B                  <1> 	pop	ebx
  2562 00001F20 58                  <1> 	pop	eax  ; DISCARD SAVED CX AND DX
  2563 00001F21 58                  <1> 	pop	eax
  2564 00001F22 A1[0C850100]        <1> 	mov	eax, [video_eax] ; 12/05/2016
  2565                              <1> 	;;15/01/2017
  2566                              <1> 	;;mov	byte [intflg], 0 ; 07/01/2017
  2567 00001F27 1F                  <1> 	pop	ds
  2568 00001F28 07                  <1> 	pop	es
  2569 00001F29 CF                  <1> 	iretd
  2570                              <1> 
  2571                              <1> get_cpos:
  2572                              <1> 	; 12/05/2016
  2573                              <1> 	; 16/01/2016
  2574                              <1> 	; BH = Video page number (0 to 7)
  2575                              <1> 	;
  2576 00001F2A D0E7                <1> 	shl	bh, 1 ; WORD OFFSET
  2577 00001F2C 0FB6F7              <1> 	movzx	esi, bh 
  2578 00001F2F 0FB796[A6780100]    <1> 	movzx	edx, word [esi+CURSOR_POSN]
  2579 00001F36 C3                  <1> 	retn
  2580                              <1> 
  2581                              <1> vga_get_cpos:
  2582                              <1> 	; 12/09/2016
  2583                              <1> 	; get cursor position (vga)
  2584 00001F37 0FB715[A6780100]    <1> 	movzx	edx, word [CURSOR_POSN] ; cursor pos for pg 0
  2585 00001F3E 31C9                <1> 	xor	ecx, ecx ; Cursor Mode = 0 (invalid)
  2586 00001F40 EBDA                <1> 	jmp     short read_cursor_2
  2587                              <1> 
  2588                              <1> ACT_DISP_PAGE:
  2589                              <1> 	; 07/07/2016
  2590                              <1> 	; 26/06/2016
  2591                              <1> 	; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
  2592                              <1> 	;
  2593                              <1> 	; VIDEO.ASM - 06/10/85  VIDEO DISPLAY BIOS
  2594                              <1> 	;
  2595                              <1> ;-----------------------------------------------------
  2596                              <1> ; ACT_DISP_PAGE
  2597                              <1> ;	THIS ROUTINE SETS THE ACTIVE DISPLAY PAGE, ALLOWING
  2598                              <1> ;	THE FULL USE OF THE MEMORY SET ASIDE FOR THE VIDEO ATTACHMENT
  2599                              <1> ; INPUT
  2600                              <1> ;	AL HAS THE NEW ACTIVE DISPLAY PAGE
  2601                              <1> ; OUTPUT
  2602                              <1> ;	THE 6845 IS RESET TO DISPLAY THAT PAGE
  2603                              <1> ;-----------------------------------------------------
  2604                              <1> 	; 07/07/2016
  2605 00001F42 3C07                <1> 	cmp	al, 7	; > 7 = invalid video page number
  2606                              <1> 	;ja	VIDEO_RETURN
  2607 00001F44 7715                <1>         ja	short adp_2 ; 18/11/2020
  2608                              <1> 	;cmp	byte [CRT_MODE], 3
  2609                              <1> 	;je	short adp_1
  2610                              <1> 	; 18/11/2020
  2611 00001F46 8A25[BE670000]      <1> 	mov	ah, [CRT_MODE]
  2612 00001F4C 80FC03              <1> 	cmp	ah, 3
  2613 00001F4F 7605                <1> 	jna	short adp_1 ; mode 01h, 00h (01h), 02h (03h), 03h
  2614 00001F51 80FC07              <1> 	cmp	ah, 7	    ; mode 07h (03h)
  2615 00001F54 7505                <1> 	jne	short adp_2
  2616                              <1> 	;and 	al, al
  2617                              <1>         ;jnz	VIDEO_RETURN
  2618                              <1> 	;;sub	al, al ; 0 ; force to page 0
  2619                              <1> adp_1:	
  2620 00001F56 E805000000          <1> 	call	set_active_page
  2621                              <1> adp_2:
  2622 00001F5B E9C9FBFFFF          <1>         jmp     VIDEO_RETURN
  2623                              <1> 
  2624                              <1> set_active_page:   ; tty_sw
  2625                              <1> 	; 02/08/2022 (TRDOS 386 Kernel v2.0.5)
  2626                              <1> 	; 09/12/2017
  2627                              <1> 	; 26/07/2016
  2628                              <1> 	; 26/06/2016
  2629                              <1> 	; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
  2630                              <1> 	; 30/06/2015
  2631                              <1> 	; 04/03/2014  (act_disp_page --> tty_sw)
  2632                              <1> 	; 10/12/2013
  2633                              <1> 	; 04/12/2013
  2634                              <1> 	;
  2635 00001F60 A2[B6780100]        <1> 	mov	[ACTIVE_PAGE], al ; save active page value ; [ptty]
  2636                              <1> _set_active_page:
  2637                              <1> 	; 27/06/2015
  2638                              <1> 	;movzx	ebx, al
  2639                              <1> 	; 02/08/2022
  2640 00001F65 0FB6C0              <1> 	movzx	eax, al
  2641 00001F68 89C3                <1> 	mov	ebx, eax
  2642                              <1> 	;
  2643                              <1> 	;cbw	; 07/09/2014 (ah=0)
  2644                              <1> 	; 02/08/2022
  2645                              <1> 	;sub	ah, ah ; 09/12/2017
  2646 00001F6A 66F725[1C850100]    <1> 	mul	word [CRT_LEN]  ; get saved length of regen buffer
  2647                              <1> 				; display page times regen length
  2648                              <1> 	; 10/12/2013
  2649 00001F71 66A3[A4780100]      <1> 	mov	[CRT_START], ax ; save start address for later
  2650                              <1> 	;mov	cx, ax ; start address to cx
  2651                              <1> 	; 02/08/2022
  2652 00001F77 89C1                <1> 	mov	ecx, eax
  2653                              <1> _M16:
  2654                              <1> 	;;sar	cx, 1
  2655                              <1> 	;shr	cx, 1	; divide by 2 for 6845 handling
  2656                              <1> 	; 02/08/2022
  2657 00001F79 D1E9                <1> 	shr	ecx, 1
  2658 00001F7B B40C                <1> 	mov	ah, 12	; 6845 register for start address
  2659 00001F7D E8CD030000          <1> 	call	m16
  2660                              <1> 	;sal	bx, 1
  2661                              <1> 	; 01/09/2014
  2662 00001F82 D0E3                <1> 	shl	bl, 1	; *2 for word offset
  2663 00001F84 81C3[A6780100]      <1> 	add	ebx, CURSOR_POSN
  2664 00001F8A 668B13              <1> 	mov	dx, [ebx] ; get cursor for this page
  2665                              <1> 	; 16/01/2016
  2666                              <1> 	;call	m18
  2667                              <1> 	;retn
  2668 00001F8D E9A9030000          <1> 	jmp	m18
  2669                              <1> 
  2670                              <1> position:
  2671                              <1> 	; 02/08/2022 - TRDOS 386 v2.0.5
  2672                              <1> 	; 17/04/2021 - TRDOS 386 v2.0.4
  2673                              <1> 	; 24/06/2016
  2674                              <1> 	; 12/05/2016 - TRDOS 386 (TRDOS v2.0)
  2675                              <1> 	; 27/06/2015
  2676                              <1> 	; 02/09/2014
  2677                              <1> 	; 30/08/2014 (Retro UNIX 386 v1)
  2678                              <1> 	; 04/12/2013 (Retro UNIX 8086 v1)
  2679                              <1> 	;
  2680                              <1> 	; VIDEO.ASM - 06/10/85  VIDEO DISPLAY BIOS
  2681                              <1> 	;
  2682                              <1> ;-----------------------------------------
  2683                              <1> ; POSITION
  2684                              <1> ;	THIS SERVICE ROUTINE CALCULATES THE REGEN BUFFER ADDRESS
  2685                              <1> ;	OF A CHARACTER IN THE ALPHA MODE
  2686                              <1> ; INPUT
  2687                              <1> ;	AX = ROW, COLUMN POSITION
  2688                              <1> ; OUTPUT
  2689                              <1> ;	AX = OFFSET OF CHAR POSITION IN REGEN BUFFER
  2690                              <1> ;-----------------------------------------
  2691                              <1> 
  2692                              <1> 	; DX = ROW, COLUMN POSITION
  2693                              <1> 	;movzx	eax, byte [CRT_COLS] ; 27/06/2015
  2694 00001F92 31C0                <1> 	xor	eax, eax ; 02/09/2014
  2695 00001F94 B050                <1> 	mov	al, 80   ; determine bytes to row	
  2696 00001F96 F6E6                <1> 	mul	dh	 ; row value
  2697                              <1> 	;xor	dh, dh   ; 0	
  2698                              <1> 	;add	ax, dx	 ; add column value to the result
  2699                              <1> 	; 16/04/2021
  2700 00001F98 00D0                <1> 	add	al, dl
  2701 00001F9A 80D400              <1> 	adc	ah, 0
  2702                              <1> 	; 02/08/2022
  2703 00001F9D D1E0                <1> 	shl	eax, 1
  2704                              <1> 	;shl	ax, 1	; * 2 for attribute bytes
  2705                              <1> 		; EAX = AX = OFFSET OF CHAR POSITION IN REGEN BUFFER 
  2706 00001F9F C3                  <1> 	retn
  2707                              <1> 
  2708                              <1> find_position:
  2709                              <1> 	; 17/04/2021 - TRDOS 386 v2.0.4
  2710                              <1> 	; 24/06/2016
  2711                              <1> 	; 12/05/2016 - TRDOS 386 (TRDOS v2.0)
  2712                              <1> 	; 27/06/2015
  2713                              <1> 	; 07/09/2014
  2714                              <1> 	; 02/09/2014
  2715                              <1> 	; 30/08/2014 (Retro UNIX 386 v1)
  2716                              <1> 	; VIDEO.ASM - 06/10/85  VIDEO DISPLAY BIOS
  2717                              <1> 
  2718 00001FA0 0FB6CF              <1> 	movzx	ecx, bh ; video page number
  2719                              <1> 	; 17/04/2021
  2720                              <1> 	;mov	esi, ecx
  2721                              <1> 	;shl	si, 1
  2722                              <1> 	;mov	dx, [esi+CURSOR_POSN]
  2723                              <1> 	;jz	short p21
  2724                              <1> 	;xor	si, si
  2725                              <1> 	; 17/04/2021
  2726 00001FA3 31F6                <1> 	xor	esi, esi
  2727 00001FA5 D0E1                <1> 	shl	cl, 1
  2728 00001FA7 668B91[A6780100]    <1> 	mov	dx, [ecx+CURSOR_POSN]
  2729 00001FAE 740B                <1> 	jz	short p21
  2730 00001FB0 D0E9                <1> 	shr	cl, 1
  2731                              <1> p20:
  2732 00001FB2 660335[1C850100]    <1> 	add	si, [CRT_LEN] ; 24/06/2016
  2733                              <1> 	;add	si, 80*25*2 ; add length of buffer for one page
  2734 00001FB9 E2F7                <1> 	loop	p20
  2735                              <1> p21:
  2736 00001FBB 6621D2              <1> 	and	dx, dx
  2737 00001FBE 7407                <1> 	jz	short p22
  2738 00001FC0 E8CDFFFFFF          <1> 	call 	position ; determine location in regen in page
  2739 00001FC5 01C6                <1> 	add	esi, eax ; add location to start of regen page
  2740                              <1> p22:	
  2741                              <1> 	;mov	dx, [addr_6845] ; get base address of active display
  2742                              <1> 	;mov	dx, 03D4h ; I/O address of color card
  2743                              <1> 	;add	dx, 6	; point at status port
  2744 00001FC7 66BADA03            <1> 	mov	dx, 03DAh ; status port
  2745                              <1> 	; cx = 0
  2746 00001FCB C3                  <1> 	retn
  2747                              <1> 
  2748                              <1> SCROLL_UP:
  2749                              <1> 	; 04/08/2022 (TRDOS 386 v2.0.5)
  2750                              <1> 	; 07/07/2016
  2751                              <1> 	; 26/06/2016
  2752                              <1> 	; 12/05/2016
  2753                              <1> 	; 30/01/2016
  2754                              <1> 	; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
  2755                              <1> 	; 07/09/2014
  2756                              <1> 	; 02/09/2014
  2757                              <1> 	; 01/09/2014 (Retro UNIX 386 v1 - beginning)
  2758                              <1> 	; 04/04/2014
  2759                              <1> 	; 04/12/2013
  2760                              <1> 	;
  2761                              <1> 	; VIDEO.ASM - 06/10/85  VIDEO DISPLAY BIOS
  2762                              <1> 	;
  2763                              <1> ;----------------------------------------------
  2764                              <1> ; SCROLL UP
  2765                              <1> ;	THIS ROUTINE MOVES A BLOCK OF CHARACTERS UP
  2766                              <1> ;	ON THE SCREEN
  2767                              <1> ; INPUT
  2768                              <1> ;	(AH) = CURRENT CRT MODE
  2769                              <1> ;	(AL) = NUMBER OF ROWS TO SCROLL
  2770                              <1> ;	(CX) = ROW/COLUMN OF UPPER LEFT CORNER
  2771                              <1> ;	(DX) = ROW/COLUMN OF LOWER RIGHT CORNER
  2772                              <1> ;	(BH) = ATTRIBUTE TO BE USED ON BLANKED LINE
  2773                              <1> ;	(DS) = DATA SEGMENT
  2774                              <1> ;	(ES) = REGEN BUFFER SEGMENT
  2775                              <1> ; OUTPUT
  2776                              <1> ;	NONE -- THE REGEN BUFFER IS MODIFIED
  2777                              <1> ;--------------------------------------------
  2778                              <1> 
  2779                              <1> 	; 07/07/2016
  2780 00001FCC 38F5                <1> 	cmp	ch, dh
  2781                              <1> 	;ja	VIDEO_RETURN
  2782                              <1> 	; 04/08/2022
  2783 00001FCE 7709                <1> 	ja	short _s_u_retn
  2784                              <1> 
  2785 00001FD0 38D1                <1> 	cmp	cl, dl
  2786                              <1> 	;ja	VIDEO_RETURN
  2787                              <1> 	; 04/08/2022
  2788 00001FD2 7705                <1> 	ja	short _s_u_retn
  2789                              <1> 	;
  2790 00001FD4 E805000000          <1> 	call	_scroll_up
  2791                              <1> _s_u_retn:
  2792 00001FD9 E94BFBFFFF          <1>         jmp     VIDEO_RETURN
  2793                              <1> 
  2794                              <1> _scroll_up:  ; from 'write_tty'
  2795                              <1> 	;
  2796                              <1> 	; cl = left upper column
  2797                              <1> 	; ch = left upper row
  2798                              <1> 	; dl = right lower column
  2799                              <1> 	; dh = right lower row
  2800                              <1> 	;
  2801                              <1> 	; al = line count 
  2802                              <1> 	; bl = attribute to be used on blanked line
  2803                              <1> 	; bh = video page number (0 to 7)
  2804                              <1> 
  2805 00001FDE E89B000000          <1> 	call	test_line_count ; 16/01/2016
  2806                              <1> 
  2807 00001FE3 8A25[BE670000]      <1> 	mov	ah, [CRT_MODE] ; current video mode
  2808                              <1> 	;;cmp	byte [CRT_MODE], 4
  2809                              <1> 	;cmp	ah, 4 ; 07/07/2016
  2810                              <1> 	;jnb	GRAPHICS_UP ; 26/06/2016
  2811                              <1> 	; 18/11/2020
  2812 00001FE9 80FC04              <1> 	cmp	ah, 4
  2813 00001FEC 720A                <1>  	jb	short n0	
  2814 00001FEE 80FC07              <1> 	cmp	ah, 7 ; TEST FOR BW CARD 
  2815                              <1> 		      ;	(80x25 text, mono)
  2816 00001FF1 7405                <1> 	je	short n0 ; same with mode 3 for TRDOS 386
  2817 00001FF3 E91B050000          <1> 	jmp	GRAPHICS_UP
  2818                              <1> n0:
  2819                              <1> 	; 07/07/2016
  2820 00001FF8 80FF07              <1> 	cmp	bh, 7 ; video page number
  2821 00001FFB 7606                <1> 	jna	short n1
  2822 00001FFD 8A3D[B6780100]      <1> 	mov	bh, [ACTIVE_PAGE]
  2823                              <1> n1:
  2824 00002003 88DC                <1> 	mov	ah, bl ; attribute
  2825                              <1> 	;push	ax ; *
  2826                              <1> 	; 12/04/2021
  2827 00002005 50                  <1> 	push	eax ; *
  2828                              <1> 	;mov 	esi, [CRT_BASE]
  2829 00002006 BE00800B00          <1>         mov     esi, 0B8000h  
  2830 0000200B 3A3D[B6780100]      <1>         cmp     bh, [ACTIVE_PAGE]
  2831 00002011 750B                <1> 	jne	short n2
  2832                              <1> 	;
  2833 00002013 66A1[A4780100]      <1>         mov     ax, [CRT_START]
  2834 00002019 6601C6              <1>         add     si, ax
  2835 0000201C EB11                <1>         jmp     short n4
  2836                              <1> n2:
  2837 0000201E 20FF                <1>         and     bh, bh
  2838 00002020 740D                <1> 	jz	short n4
  2839 00002022 88F8                <1> 	mov	al, bh
  2840                              <1> n3:
  2841 00002024 660335[1C850100]    <1>         add	si, [CRT_LEN]
  2842 0000202B FEC8                <1>         dec	al
  2843 0000202D 75F5                <1> 	jnz	short n3
  2844                              <1> n4:	
  2845 0000202F E85B000000          <1> 	call	scroll_position ; 16/01/2016
  2846 00002034 7420                <1>         jz      short n6 
  2847                              <1> 
  2848 00002036 01CE                <1>         add     esi, ecx ; from address for scroll
  2849 00002038 88F5                <1> 	mov	ch, dh  ; #rows in block
  2850 0000203A 28C5                <1> 	sub	ch, al	; #rows to be moved
  2851                              <1> n5:
  2852 0000203C E88A000000          <1> 	call	n10 ; 16/01/2016
  2853                              <1> 	
  2854 00002041 51                  <1>         push	ecx
  2855 00002042 0FB60D[C0670000]    <1> 	movzx	ecx, byte [CRT_COLS] 
  2856 00002049 00C9                <1> 	add	cl, cl
  2857 0000204B 01CE                <1>         add	esi, ecx  ; next line
  2858 0000204D 01CF                <1>         add	edi, ecx
  2859 0000204F 59                  <1> 	pop	ecx
  2860                              <1> 
  2861 00002050 FECD                <1> 	dec	ch	 ; count of lines to move
  2862 00002052 75E8                <1> 	jnz	short n5 ; row loop
  2863                              <1> 	; ch = 0
  2864 00002054 88C6                <1> 	mov	dh, al	 ; #rows
  2865                              <1> n6:
  2866                              <1> 	; attribute in ah
  2867 00002056 B020                <1> 	mov	al, ' '	 ; fill with blanks
  2868                              <1> n7:
  2869 00002058 E87B000000          <1> 	call	n11 ; 16/01/2016
  2870                              <1> 
  2871 0000205D 8A0D[C0670000]      <1> 	mov	cl, [CRT_COLS]
  2872 00002063 00C9                <1> 	add	cl, cl
  2873 00002065 01CF                <1>         add	edi, ecx
  2874                              <1> 
  2875 00002067 FECE                <1> 	dec	dh
  2876 00002069 75ED                <1> 	jnz	short n7
  2877                              <1> n16:
  2878 0000206B 3A3D[B6780100]      <1> 	cmp	bh, [ACTIVE_PAGE]
  2879 00002071 750A                <1> 	jne	short n8
  2880                              <1> 	
  2881                              <1> 	;cmp	byte [CRT_MODE], 7 ; is this the black and white card
  2882                              <1> 	;je	short n8	   ; if so, skip the mode reset
  2883                              <1> 
  2884 00002073 A0[BF670000]        <1> 	mov	al, [CRT_MODE_SET] ; get the value of mode set
  2885 00002078 66BAD803            <1> 	mov	dx, 03D8h ; always set color card port
  2886 0000207C EE                  <1> 	out	dx, al
  2887                              <1> n8:
  2888 0000207D C3                  <1> 	retn
  2889                              <1> 
  2890                              <1> test_line_count:
  2891                              <1> 	; 12/04/2021
  2892                              <1> 	; 12/05/2016
  2893                              <1> 	; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
  2894                              <1> 	; 07/09/2014 (scroll_up)
  2895 0000207E 08C0                <1> 	or	al, al
  2896 00002080 740C                <1> 	jz	short al_set2
  2897                              <1> 	;push	dx
  2898                              <1> 	; 12/04/2021
  2899 00002082 52                  <1> 	push	edx
  2900 00002083 28EE                <1> 	sub	dh, ch  ; subtract upper row from lower row number
  2901 00002085 FEC6                <1> 	inc	dh	; adjust difference by 1
  2902 00002087 38C6                <1> 	cmp	dh, al 	; line count = amount of rows in window?
  2903 00002089 7502                <1> 	jne	short al_set1 ; if not the we're all set
  2904 0000208B 30C0                <1> 	xor	al, al	; otherwise set al to zero
  2905                              <1> al_set1:
  2906                              <1> 	;pop	dx
  2907                              <1> 	; 12/04/2021
  2908 0000208D 5A                  <1> 	pop	edx
  2909                              <1> al_set2:
  2910 0000208E C3                  <1> 	retn
  2911                              <1> 
  2912                              <1> scroll_position:
  2913                              <1> 	; 12/04/2021
  2914                              <1> 	; 26/06/2016
  2915                              <1> 	; 30/01/2016
  2916                              <1>         ; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
  2917                              <1> 	; 07/09/2014 (scroll_up)
  2918                              <1> 
  2919                              <1> 	; (*) [esp+4] = ax (al = line count, ah = attribute)
  2920                              <1> 
  2921                              <1> 	;push	dx
  2922                              <1> 	; 12/04/2021
  2923 0000208F 52                  <1> 	push	edx
  2924 00002090 6689CA              <1> 	mov	dx, cx	; now, upper left position in DX
  2925 00002093 E8FAFEFFFF          <1> 	call	position
  2926 00002098 01C6                <1> 	add	esi, eax
  2927 0000209A 89F7                <1> 	mov	edi, esi
  2928                              <1> 	;pop	dx	; lower right position in DX
  2929                              <1> 	; 12/04/2021
  2930 0000209C 5A                  <1> 	pop	edx
  2931 0000209D 6629CA              <1> 	sub	dx, cx
  2932 000020A0 FEC6                <1> 	inc	dh	; dh = #rows 
  2933 000020A2 FEC2                <1> 	inc	dl	; dl = #cols in block
  2934 000020A4 59                  <1> 	pop	ecx 	; return address
  2935                              <1> 	;pop	ax	; * ; al = line count, ah = attribute
  2936                              <1> 	; 12/04/2021
  2937 000020A5 58                  <1> 	pop	eax ; (*)
  2938 000020A6 51                  <1> 	push	ecx	; return address
  2939 000020A7 0FB7C8              <1> 	movzx	ecx, ax
  2940 000020AA 8A25[C0670000]      <1> 	mov	ah, [CRT_COLS]
  2941 000020B0 F6E4                <1> 	mul	ah	; determine offset to from address
  2942                              <1> 	;add	ax, ax  ; *2 for attribute byte
  2943                              <1> 	; 02/08/2022
  2944                              <1> 	;shl	eax, 1
  2945 000020B2 01C0                <1> 	add	eax, eax
  2946                              <1> 	;
  2947                              <1> 	;push	ax	; offset 
  2948                              <1> 	;push	dx
  2949                              <1> 	; 12/04/2021
  2950 000020B4 50                  <1> 	push	eax	; offset 
  2951 000020B5 52                  <1> 	push	edx
  2952                              <1> 	;
  2953                              <1> 	; 04/04/2014
  2954 000020B6 66BADA03            <1> 	mov	dx, 3DAh ; guaranteed to be color card here	
  2955                              <1> n9:                      ; wait_display_enable
  2956 000020BA EC                  <1>         in      al, dx   ; get port
  2957 000020BB A808                <1> 	test	al, RVRT ; wait for vertical retrace	
  2958 000020BD 74FB                <1> 	jz	short n9 ; wait_display_enable
  2959 000020BF B025                <1> 	mov	al, 25h
  2960 000020C1 B2D8                <1> 	mov	dl, 0D8h ; address control port
  2961 000020C3 EE                  <1> 	out	dx, al	; turn off video during vertical retrace
  2962                              <1> 	;pop	dx	; #rows, #cols
  2963                              <1>        	;pop	ax	; offset
  2964                              <1> 	; 12/04/2021
  2965 000020C4 5A                  <1> 	pop	edx	; #rows, #cols
  2966 000020C5 58                  <1>        	pop	eax	; offset
  2967 000020C6 6691                <1> 	xchg	ax, cx	; 
  2968                              <1> 	; ecx = offset, al = line count, ah = attribute
  2969                              <1> 	;
  2970 000020C8 08C0                <1> 	or	al, al
  2971 000020CA C3                  <1> 	retn
  2972                              <1> n10:
  2973                              <1> 	; Move rows
  2974 000020CB 88D1                <1> 	mov	cl, dl	; get # of cols to move
  2975 000020CD 56                  <1> 	push	esi
  2976 000020CE 57                  <1> 	push	edi	; save start address
  2977                              <1> n10r:
  2978 000020CF 66A5                <1> 	movsw		; move that line on screen
  2979 000020D1 FEC9                <1> 	dec	cl
  2980 000020D3 75FA                <1>         jnz     short n10r
  2981 000020D5 5F                  <1> 	pop	edi
  2982 000020D6 5E                  <1> 	pop	esi	; recover addresses
  2983 000020D7 C3                  <1> 	retn
  2984                              <1> n11:
  2985                              <1> 	; Clear rows
  2986                              <1>                 	; dh =  #rows
  2987 000020D8 88D1                <1>         mov	cl, dl	; get # of cols to clear
  2988 000020DA 57                  <1>         push    edi     ; save address
  2989                              <1> n11r:
  2990 000020DB 66AB                <1>         stosw           ; store fill character
  2991 000020DD FEC9                <1> 	dec	cl
  2992 000020DF 75FA                <1>         jnz     short n11r
  2993 000020E1 5F                  <1>         pop     edi     ; recover address
  2994 000020E2 C3                  <1> 	retn
  2995                              <1> 
  2996                              <1> SCROLL_DOWN:
  2997                              <1> 	; 12/04/2021
  2998                              <1> 	; 07/07/2016
  2999                              <1> 	; 27/06/2016
  3000                              <1> 	; 26/06/2016
  3001                              <1> 	; 12/05/2016
  3002                              <1> 	; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
  3003                              <1> 	;
  3004                              <1> 	; VIDEO.ASM - 06/10/85  VIDEO DISPLAY BIOS
  3005                              <1> 
  3006                              <1> ;------------------------------------------
  3007                              <1> ; SCROLL DOWN
  3008                              <1> ;	THIS ROUTINE MOVES THE CHARACTERS WITHIN A DEFINED
  3009                              <1> ;	BLOCK DOWN ON THE SCREEN, FILLING THE TOP LINES
  3010                              <1> ;	WITH A DEFINED CHARACTER
  3011                              <1> ; INPUT
  3012                              <1> ;	(AH) = CURRENT CRT MODE
  3013                              <1> ;	(AL) = NUMBER OF LINES TO SCROLL
  3014                              <1> ;	(CX) = UPPER LEFT CORNER OF RECION
  3015                              <1> ;	(DX) = LOWER RIGHT CORNER OF REGION
  3016                              <1> ;	(BH) = FILL CHARACTER
  3017                              <1> ;	(DS) = DATA SEGMENT
  3018                              <1> ;	(ES) = REGEN SEGMENT
  3019                              <1> ; OUTPUT
  3020                              <1> ;	NONE -- SCREEN IS SCROLLED
  3021                              <1> ;------------------------------------------
  3022                              <1> 
  3023                              <1> 	; 07/07/2016
  3024 000020E3 38F5                <1> 	cmp	ch, dh
  3025                              <1> 	;ja	VIDEO_RETURN
  3026 000020E5 7709                <1> 	ja	short _s_d_retn ; 18/11/2020
  3027 000020E7 38D1                <1> 	cmp	cl, dl
  3028                              <1> 	;ja	VIDEO_RETURN
  3029 000020E9 7705                <1> 	ja	short _s_d_retn ; 18/11/2020
  3030                              <1> 	;
  3031 000020EB E805000000          <1> 	call	_scroll_down
  3032                              <1> _s_d_retn:
  3033 000020F0 E934FAFFFF          <1>         jmp     VIDEO_RETURN
  3034                              <1> 
  3035                              <1> _scroll_down: ; 27/06/2016
  3036                              <1> 
  3037                              <1> 	; cl = left upper column
  3038                              <1> 	; ch = left upper row
  3039                              <1> 	; dl = right lower column
  3040                              <1> 	; dh = right lower row
  3041                              <1> 	;
  3042                              <1> 	; al = line count 
  3043                              <1> 	; bl = attribute to be used on blanked line
  3044                              <1> 	; bh = video page number (0 to 7)
  3045                              <1> 
  3046                              <1> 	; !!!!
  3047 000020F5 FD                  <1> 	std		; DIRECTION FOR SCROLL DOWN
  3048                              <1> 	; !!!!
  3049 000020F6 E883FFFFFF          <1> 	call	test_line_count ; 16/01/2016
  3050                              <1> 	
  3051 000020FB 8A25[BE670000]      <1> 	mov	ah, [CRT_MODE] ; current video mode
  3052                              <1> 	;;cmp	byte [CRT_MODE], 4
  3053                              <1> 	;cmp	ah, 4 ; 07/07/2016
  3054                              <1> 	;jnb	GRAPHICS_DOWN ; 26/06/2016
  3055                              <1> 	; 18/11/2020
  3056 00002101 80FC04              <1> 	cmp	ah, 4
  3057 00002104 720A                <1>  	jb	short _n0	
  3058 00002106 80FC07              <1> 	cmp	ah, 7 ; TEST FOR BW CARD 
  3059                              <1> 		      ;	(80x25 text, mono)
  3060 00002109 7405                <1> 	je	short _n0 ; same with mode 3 for TRDOS 386
  3061 0000210B E9D5060000          <1> 	jmp	GRAPHICS_DOWN
  3062                              <1> _n0:
  3063                              <1> 	; 07/07/2016
  3064 00002110 80FF07              <1> 	cmp	bh, 7 ; video page number
  3065 00002113 7606                <1> 	jna	short n12
  3066 00002115 8A3D[B6780100]      <1> 	mov	bh, [ACTIVE_PAGE]
  3067                              <1> 	;
  3068                              <1> n12:			; CONTINUE_DOWN
  3069 0000211B 88DC                <1> 	mov	ah, bl
  3070                              <1> 	;push	ax	; * ; save attribute in ah
  3071                              <1> 	; 12/04/2021
  3072 0000211D 50                  <1> 	push	eax
  3073 0000211E 6689D0              <1> 	mov	ax, dx	; LOWER RIGHT CORNER
  3074 00002121 E869FFFFFF          <1> 	call	scroll_position	; GET REGEN LOCATION
  3075 00002126 741F                <1> 	jz	short n14
  3076 00002128 29CE                <1> 	sub	esi, ecx  ; SI IS FROM ADDRESS
  3077 0000212A 88F5                <1> 	mov	ch, dh  ; #rows in block
  3078 0000212C 28C5                <1> 	sub	ch, al	; #rows to be moved
  3079                              <1> n13:
  3080 0000212E E898FFFFFF          <1> 	call	n10	; MOVE ONE ROW
  3081                              <1> 
  3082 00002133 51                  <1> 	push	ecx
  3083 00002134 8A0D[C0670000]      <1> 	mov	cl, [CRT_COLS] 
  3084 0000213A 00C9                <1> 	add	cl, cl
  3085 0000213C 29CE                <1>         sub	esi, ecx  ; next line
  3086 0000213E 29CF                <1>         sub	edi, ecx
  3087 00002140 59                  <1>         pop	ecx
  3088                              <1> 	
  3089 00002141 FECD                <1> 	dec	ch	 ; count of lines to move
  3090 00002143 75E9                <1> 	jnz	short n13 ; row loop
  3091                              <1> 	; ch = 0
  3092 00002145 88C6                <1> 	mov	dh, al	 ; #rows
  3093                              <1> n14:
  3094                              <1> 	; attribute in ah
  3095 00002147 B020                <1> 	mov	al, ' '	 ; fill with blanks
  3096                              <1> n15:
  3097 00002149 E88AFFFFFF          <1> 	call	n11 ; 16/01/2016
  3098                              <1> 
  3099 0000214E 8A0D[C0670000]      <1> 	mov	cl, [CRT_COLS]
  3100 00002154 00C9                <1> 	add	cl, cl
  3101 00002156 29CF                <1>         sub	edi, ecx
  3102                              <1>         
  3103 00002158 FECE                <1> 	dec	dh
  3104 0000215A 75ED                <1> 	jnz	short n15
  3105                              <1> 	;
  3106                              <1> 	; 18/11/2020
  3107 0000215C FC                  <1> 	cld	; clear direction flag	
  3108                              <1> 	;
  3109 0000215D E909FFFFFF          <1> 	jmp	n16 ; 27/06/2016
  3110                              <1> 
  3111                              <1> ;	cmp	bh, [ACTIVE_PAGE]
  3112                              <1> ;	jne	short n16
  3113                              <1> ;
  3114                              <1> ;	;cmp	byte [CRT_MODE], 7	; is this the black and white card
  3115                              <1> ;	;je	short n16		; if so, skip the mode reset
  3116                              <1> ;
  3117                              <1> ;	mov	al, [CRT_MODE_SET] ; get the value of mode set
  3118                              <1> ;	mov	dx, 03D8h ; always set color card port
  3119                              <1> ;	out	dx, al
  3120                              <1> ;n16:
  3121                              <1> ;	; !!!!
  3122                              <1> ;	cld		; Clear direction flag !
  3123                              <1> ;	; !!!!
  3124                              <1> ;	retn
  3125                              <1> 
  3126                              <1> READ_AC_CURRENT:
  3127                              <1> 	; 08/07/2016
  3128                              <1> 	; 26/06/2016
  3129                              <1> 	; 12/05/2016
  3130                              <1> 	; 18/01/2016
  3131                              <1> 	; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
  3132                              <1> 	;
  3133                              <1> 	; VIDEO.ASM - 06/10/85  VIDEO DISPLAY BIOS
  3134                              <1> 	;
  3135                              <1> 	; 08/07/2016
  3136 00002162 803D[BE670000]07    <1>         cmp     byte [CRT_MODE], 7 ; 6!?
  3137 00002169 7607                <1> 	jna	short read_ac_c
  3138 0000216B 31C0                <1> 	xor	eax, eax
  3139 0000216D E9BCF9FFFF          <1>         jmp     _video_return 
  3140                              <1> read_ac_c:
  3141 00002172 E805000000          <1> 	call	_read_ac_current
  3142                              <1> 	; 12/05/2016
  3143                              <1>         ;jmp     VIDEO_RETURN
  3144 00002177 E9B2F9FFFF          <1> 	jmp	_video_return
  3145                              <1> 
  3146                              <1> ;------------------------------------------------------------------------
  3147                              <1> ; READ_AC_CURRENT							:
  3148                              <1> ;	THIS ROUTINE READS THE ATTRIBUTE AND CHARACTER AT THE CURRENT	:
  3149                              <1> ;	CURSOR POSITION AND RETURNS THEM TO THE CALLER			:
  3150                              <1> ; INPUT									:
  3151                              <1> ;	(AH) = CURRENT CRT MODE						:
  3152                              <1> ;	(BH) = DISPLAY PAGE ( ALPHA MODES ONLY )			:
  3153                              <1> ;	(DS) = DATA SEGMENT						:
  3154                              <1> ;	(ES) = REGEN SEGMENT						:
  3155                              <1> ; OUTPUT								:
  3156                              <1> ;	(AL) = CHARACTER READ						:
  3157                              <1> ;	(AH) = ATTRIBUTE READ						:
  3158                              <1> ;------------------------------------------------------------------------
  3159                              <1> 
  3160                              <1> _read_ac_current:
  3161                              <1> 	; 26/06/2016
  3162                              <1> 	; 12/05/2016 
  3163                              <1> 	; 18/01/2016
  3164                              <1> 
  3165 0000217C 8A25[BE670000]      <1> 	mov	ah, [CRT_MODE] ; current video mode	
  3166 00002182 80FC04              <1> 	cmp	ah, 4
  3167 00002185 720A                <1>  	jb	short p10
  3168                              <1> 	; 18/11/2020
  3169                              <1> 	;cmp	byte [CRT_MODE], 4
  3170                              <1> 	;jnb	GRAPHICS_READ ; 26/06/2016
  3171                              <1> 
  3172 00002187 80FC07              <1> 	cmp	ah, 7 ; TEST FOR BW CARD (80x25 monochrome text)
  3173 0000218A 7405                <1> 	je	short p10	 ; same with mode 3 in TRDOS 386
  3174 0000218C E9A0080000          <1> 	jmp	GRAPHICS_READ
  3175                              <1> p10:
  3176 00002191 E80AFEFFFF          <1> 	call	find_position	; GET REGEN LOCATION AND PORT ADDRESS
  3177                              <1> 	;
  3178                              <1> 	; esi = regen location
  3179                              <1> 	; dx = status port
  3180                              <1> 	;
  3181                              <1> 
  3182                              <1> 	; 18/11/2020
  3183                              <1> 	; convert display mode to a zero value 
  3184                              <1> 	; for 80 column color mode
  3185                              <1> 	;mov	ah, [CRT_MODE]	
  3186                              <1> 	;sub	ah, 2
  3187                              <1> 	;shr	ah, 1
  3188                              <1> 	;jnz	short p13
  3189                              <1> 
  3190                              <1> 	; 05/12/2020
  3191                              <1> 	; 18/11/2020 (TRDOS 386 v2.0.3)
  3192                              <1> 	;xor	bl, bl	; 0
  3193 00002196 803D[BE670000]03    <1> 	cmp	byte [CRT_MODE], 03h ; 80x25 color text
  3194                              <1> 	;je	short p11    ; Note: Only mode 03h and mode 01h are
  3195                              <1> 	;inc	bl	; 1  ;       in use by TRDOS 386 as text modes	
  3196                              <1> 	;jmp	short p14    ;       (07h, 00h and 02h are redirected)		
  3197 0000219D 7516                <1> 	jne	short p13
  3198                              <1> 
  3199                              <1> 	; 05/12/2020
  3200 0000219F 3A3D[B6780100]      <1> 	cmp     bh, [ACTIVE_PAGE]
  3201 000021A5 750E                <1> 	jne	short p13 
  3202                              <1> 
  3203                              <1> 	; WAIT FOR HORIZONTAL RETRACE OR VERTICAL RETRACE IF COLOR 80
  3204                              <1> p11:
  3205 000021A7 FB                  <1> 	sti		; enable interrupts first
  3206                              <1> 	; 05/12/2020
  3207 000021A8 90                  <1> 	nop
  3208                              <1> 	; 18/11/2020
  3209                              <1> 	;or	bl, bl
  3210                              <1> 	;jnz	short p13 ; mode 01h (and mode 00h) - 40x25 color text
  3211 000021A9 FA                  <1> 	cli 		; block interrupts for single loop
  3212 000021AA EC                  <1> 	in	al, dx	; get status from the adapter
  3213 000021AB A801                <1> 	test	al, RHRZ ; is horizontal retrace low
  3214 000021AD 75F8                <1> 	jnz	short p11 ; wait until it is
  3215                              <1> p12:			;  wait for either retrace high
  3216 000021AF EC                  <1> 	in	al, dx ; get status again
  3217 000021B0 A809                <1> 	test	al, RVRT+RHRZ ; is horizontal or vertical retrace high
  3218 000021B2 74FB                <1> 	jz	short p12 ; wait until either retrace active
  3219                              <1> ;p14:
  3220 000021B4 FB                  <1> 	sti
  3221                              <1> p13:
  3222 000021B5 81C600800B00        <1> 	add	esi, 0B8000h 
  3223 000021BB 668B06              <1> 	mov	ax, [esi]
  3224                              <1> 
  3225 000021BE C3                  <1> 	retn	; 18/01/2016
  3226                              <1> 
  3227                              <1> WRITE_AC_CURRENT:
  3228                              <1> 	; 08/07/2016
  3229                              <1> 	; 26/06/2016
  3230                              <1> 	; 24/06/2016
  3231                              <1> 	; 12/05/2016
  3232                              <1> 	; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
  3233                              <1> 	;
  3234                              <1> 	; VIDEO.ASM - 06/10/85  VIDEO DISPLAY BIOS
  3235                              <1> 	;
  3236                              <1> ;----------------------------------------------------------------
  3237                              <1> ; WRITE_AC_CURRENT						:
  3238                              <1> ;	THTS ROUTINE WRITES THE ATTRIBUTE AND CHARACTER		:
  3239                              <1> ;	AT THE CURRENT CURSOR POSITION				:
  3240                              <1> ; INPUT								:
  3241                              <1> ;	(AH) = CURRENT CRT MODE					:
  3242                              <1> ;	(BH) = DISPLAY PAGE					:
  3243                              <1> ;	(CX) = COUNT OF CHARACTERS TO WRITE			:
  3244                              <1> ;	(AL) = CHAR TO WRITE					:
  3245                              <1> ;	(BL) = ATTRIBUTE OF CHAR TO WRITE			:
  3246                              <1> ;	(DS) = DATA SEGMENT					:
  3247                              <1> ;	(ES) = REGEN SEGMENT					:
  3248                              <1> ; OUTPUT							:
  3249                              <1> ;	DISPLAY REGEN BUFFER UPDATED				:
  3250                              <1> ;----------------------------------------------------------------
  3251                              <1> 
  3252                              <1> 	; 08/07/2016
  3253 000021BF 803D[BE670000]07    <1> 	cmp	byte [CRT_MODE], 7 ; 6!?
  3254 000021C6 760A                <1> 	jna	short write_ac_c
  3255                              <1> 
  3256 000021C8 E8B60A0000          <1> 	call	vga_write_char_attr
  3257 000021CD E957F9FFFF          <1> 	jmp     VIDEO_RETURN	
  3258                              <1> 
  3259                              <1> write_ac_c:
  3260 000021D2 E834000000          <1> 	call	_write_c_current
  3261                              <1> 
  3262 000021D7 0FB6F7              <1> 	movzx	esi, bh ; video page number (0 to 7)	
  3263 000021DA 889E[C7670000]      <1> 	mov	[esi+chr_attrib], bl ; color/attribute
  3264                              <1> 
  3265 000021E0 E944F9FFFF          <1>         jmp     VIDEO_RETURN
  3266                              <1> 
  3267                              <1> WRITE_C_CURRENT:
  3268                              <1> 	; 08/07/2016
  3269                              <1> 	; 26/06/2016
  3270                              <1> 	; 12/05/2016
  3271                              <1> 	; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
  3272                              <1> 	;
  3273                              <1> 	; VIDEO.ASM - 06/10/85  VIDEO DISPLAY BIOS
  3274                              <1> 	;
  3275                              <1> ;----------------------------------------------------------------
  3276                              <1> ; WRITE_C_CURRENT						:
  3277                              <1> ;	THIS ROUTINE WRITES THE CHARACTER AT			:
  3278                              <1> ;	THE CURRENT CURSOR POSITION, ATTRIBUTE UNCHANGED	:
  3279                              <1> ; INPUT								:
  3280                              <1> ;	(AH) = CURRENT CRT MODE					:
  3281                              <1> ;	(BH) = DISPLAY PAGE					:
  3282                              <1> ;	(CX) = COUNT OF CHARACTERS TO WRITE			:
  3283                              <1> ;	(AL) = CHAR TO WRITE					:
  3284                              <1> ;	(DS) = DATA SEGMENT					:
  3285                              <1> ;	(ES) = REGEN SEGMENT					:
  3286                              <1> ; OUTPUT							:
  3287                              <1> ;	DISPLAY REGEN BUFFER UPDATED				:
  3288                              <1> ;----------------------------------------------------------------
  3289                              <1> 
  3290                              <1> 	; 08/07/2016
  3291 000021E5 803D[BE670000]07    <1> 	cmp	byte [CRT_MODE], 7 ; 6!?
  3292 000021EC 760A                <1> 	jna	short write_c_c
  3293                              <1> 
  3294 000021EE E8900A0000          <1> 	call	vga_write_char_only
  3295 000021F3 E931F9FFFF          <1> 	jmp     VIDEO_RETURN	
  3296                              <1> 
  3297                              <1> write_c_c:
  3298                              <1> 	;and	bh, 7 ; video page number (<= 7)
  3299 000021F8 0FB6F7              <1> 	movzx	esi, bh	
  3300 000021FB 8A9E[C7670000]      <1> 	mov	bl, [esi+chr_attrib]
  3301                              <1> 
  3302 00002201 E805000000          <1> 	call	_write_c_current
  3303 00002206 E91EF9FFFF          <1>         jmp     VIDEO_RETURN
  3304                              <1> 
  3305                              <1> _write_c_current:  ; from 'write_tty'
  3306                              <1> 	; 12/04/2021
  3307                              <1> 	; 18/11/2020
  3308                              <1> 	; 26/06/2016
  3309                              <1> 	; 24/06/2016
  3310                              <1> 	; 12/05/2016
  3311                              <1> 	; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
  3312                              <1> 	; 30/08/2014 (Retro UNIX 386 v1)
  3313                              <1> 	; 18/01/2014
  3314                              <1> 	; 04/12/2013
  3315                              <1> 	;
  3316                              <1> 	; VIDEO.ASM - 06/10/85 VIDEO DISPLAY BIOS
  3317                              <1> 
  3318                              <1> 	; 18/11/2020
  3319 0000220B 8A25[BE670000]      <1> 	mov	ah, [CRT_MODE] ; current video mode	
  3320 00002211 80FC04              <1> 	cmp	ah, 4
  3321 00002214 720A                <1>  	jb	short p40
  3322                              <1> 	
  3323                              <1> 	;cmp	byte [CRT_MODE], 4
  3324                              <1>         ;jnb	GRAPHICS_WRITE ; 26/06/2016
  3325                              <1> 
  3326 00002216 80FC07              <1> 	cmp	ah, 7 ; TEST FOR BW CARD
  3327 00002219 7405                <1> 	je	short p40
  3328 0000221B E963070000          <1> 	jmp	GRAPHICS_WRITE
  3329                              <1> p40:
  3330                              <1> 	; al = character
  3331                              <1> 	; bl = color/attribute
  3332                              <1> 	; bh = video page
  3333                              <1> 	; cx = count of characters to write
  3334                              <1> 	;push	dx
  3335                              <1> 	; 12/04/2021
  3336 00002220 52                  <1> 	push	edx ; *
  3337 00002221 88DC                <1> 	mov	ah, bl  ; color/attribute (12/05/2016)
  3338                              <1> 	;push	ax	; save character & attribute/color
  3339                              <1> 	;push	cx
  3340                              <1> 	; 12/04/2021
  3341 00002223 50                  <1> 	push	eax ; ** ; save character & attribute/color
  3342 00002224 51                  <1> 	push	ecx ; ***
  3343 00002225 E876FDFFFF          <1> 	call 	find_position  ; get regen location and port address
  3344                              <1> 	;pop	cx
  3345                              <1> 	; 12/04/2021
  3346 0000222A 59                  <1> 	pop	ecx ; ***
  3347                              <1> 	; esi = regen location
  3348                              <1> 	; dx = status port
  3349                              <1> 	;
  3350 0000222B 81C600800B00        <1> 	add	esi, 0B8000h ; 30/08/2014 (crt_base) 
  3351                              <1> 	;
  3352                              <1> 	; 18/11/2020
  3353                              <1> 	; convert display mode to a zero value 
  3354                              <1> 	; for 80 column color mode
  3355                              <1> 	;mov	ah, [CRT_MODE]	
  3356                              <1> 	;sub	ah, 2
  3357                              <1> 	;shr	ah, 1
  3358                              <1> 	;jnz	short p44    ; 26/06/2016
  3359                              <1> 
  3360                              <1> 	; 05/12/2020
  3361                              <1> 	; 18/11/2020 (TRDOS 386 v2.0.3)
  3362                              <1> 	;xor	bl, bl	; 0
  3363 00002231 803D[BE670000]03    <1> 	cmp	byte [CRT_MODE], 03h ; 80x25 color text
  3364                              <1> 	;je	short p41    ; Note: Only mode 03h and mode 01h are
  3365                              <1> 	;inc	bl	; 1  ;       in use by TRDOS 386 as text modes	
  3366                              <1> 	;jmp	short p43    ;       (07h, 00h and 02h are redirected)			
  3367                              <1> 	; 05/12/2020
  3368 00002238 751A                <1> 	jne	short p44
  3369                              <1> p46:
  3370                              <1> 	; 05/12/2020
  3371 0000223A 3A3D[B6780100]      <1> 	cmp     bh, [ACTIVE_PAGE]
  3372 00002240 7512                <1> 	jne	short p44
  3373                              <1> 
  3374                              <1> 	; WAIT FOR HORIZONTAL RETRACE OR VERTICAL RETRACE IF COLOR 80
  3375                              <1> p41:
  3376                              <1> 	; 05/12/2020
  3377 00002242 FB                  <1> 	sti		; enable interrupts first
  3378 00002243 90                  <1> 	nop
  3379                              <1> 	; 18/11/2020
  3380                              <1> 	;or	bl, bl
  3381                              <1> 	;jnz	short p44 ; mode 01h (and mode 00h) - 40x25 color text
  3382 00002244 FA                  <1> 	cli 		; block interrupts for single loop
  3383 00002245 EC                  <1> 	in	al, dx	; get status from the adapter
  3384 00002246 A808                <1> 	test	al, RVRT ; check for vertical retrace first
  3385 00002248 7509                <1> 	jnz	short p43 ; Do fast write now if vertical retrace
  3386 0000224A A801                <1> 	test	al, RHRZ ; is horizontal retrace low
  3387 0000224C 75F4                <1> 	jnz	short p41 ; wait until it is
  3388                              <1> p42:			;  wait for either retrace high
  3389 0000224E EC                  <1> 	in	al, dx ; get status again
  3390 0000224F A809                <1> 	test	al, RVRT+RHRZ ; is horizontal or vertical retrace high
  3391 00002251 74FB                <1> 	jz	short p42 ; wait until either retrace active
  3392                              <1> p43:	
  3393 00002253 FB                  <1> 	sti
  3394                              <1> p44:
  3395 00002254 668B0424            <1> 	mov	ax, [esp] ; restore the character (al) & attribute (ah)
  3396 00002258 668906              <1> 	mov	[esi], ax
  3397                              <1> 
  3398 0000225B 6649                <1> 	dec	cx
  3399 0000225D 740D                <1> 	jz	short p45
  3400                              <1> 
  3401 0000225F 46                  <1> 	inc	esi
  3402 00002260 46                  <1> 	inc	esi
  3403                              <1> 
  3404                              <1> 	; 05/12/2020
  3405 00002261 803D[BE670000]03    <1> 	cmp	byte [CRT_MODE], 03h
  3406 00002268 75EA                <1> 	jne	short p44
  3407                              <1> 	;jmp	short p41
  3408 0000226A EBCE                <1> 	jmp	short p46
  3409                              <1> p45:	
  3410                              <1> 	;pop	ax
  3411                              <1> 	;pop	dx
  3412                              <1> 	; 12/04/2021
  3413 0000226C 58                  <1> 	pop	eax ; **
  3414 0000226D 5A                  <1> 	pop	edx ; *
  3415 0000226E C3                  <1> 	retn
  3416                              <1> 
  3417                              <1> ; 09/07/2016
  3418                              <1> ; 26/06/2016
  3419                              <1> ; 24/06/2016
  3420                              <1> ; 12/05/2016
  3421                              <1> ; 18/01/2016
  3422                              <1> ; 16/01/2016 - TRDOS 386 (TRDOS v2.0)
  3423                              <1> ; 30/06/2015
  3424                              <1> ; 27/06/2015
  3425                              <1> ; 11/03/2015
  3426                              <1> ; 02/09/2014
  3427                              <1> ; 30/08/2014
  3428                              <1> ; VIDEO FUNCTIONS
  3429                              <1> ; (write_tty - Retro UNIX 8086 v1 - U9.ASM, 01/02/2014)
  3430                              <1> 
  3431                              <1> WRITE_TTY:
  3432                              <1> 	; 09/12/2017
  3433                              <1> 	; 09/07/2016
  3434                              <1> 	; 01/07/2016
  3435                              <1> 	; 26/06/2016
  3436                              <1> 	; 24/06/2016
  3437                              <1> 	; 13/05/2016
  3438                              <1> 	; 12/05/2016
  3439                              <1> 	; 30/01/2016
  3440                              <1> 	; 18/01/2016
  3441                              <1> 	; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
  3442                              <1> 	; 13/08/2015
  3443                              <1> 	; 02/09/2014
  3444                              <1> 	; 30/08/2014 (Retro UNIX 386 v1 - beginning)
  3445                              <1> 	; 01/02/2014 (Retro UNIX 8086 v1 - last update)
  3446                              <1> 	; 03/12/2013 (Retro UNIX 8086 v1 - beginning)	
  3447                              <1> 	; (Modified registers: EAX, EBX, ECX, EDX, ESI, EDI)
  3448                              <1> 	;
  3449                              <1> 	; INPUT -> AL = Character to be written
  3450                              <1> 	;	   BL = Color (Forecolor, Backcolor)
  3451                              <1> 	;	   BH = Video Page (0 to 7)
  3452                              <1> 
  3453                              <1> 	; 09/07/2016
  3454 0000226F 803D[BE670000]07    <1>         cmp     byte [CRT_MODE], 7
  3455 00002276 760A                <1> 	jna 	short write_tty_cga
  3456                              <1> 
  3457 00002278 E8EB0C0000          <1> 	call	vga_write_teletype
  3458 0000227D E9A7F8FFFF          <1> 	jmp	VIDEO_RETURN
  3459                              <1> 
  3460                              <1> write_tty_cga:
  3461                              <1> 	; 13/05/2016
  3462                              <1> 	;call	_write_tty
  3463                              <1> 	; 01/07/2016
  3464 00002282 E818000000          <1> 	call	_write_tty_m3
  3465 00002287 E99DF8FFFF          <1> 	jmp	VIDEO_RETURN
  3466                              <1> 
  3467                              <1> RVRT	equ	00001000b	; VIDEO VERTICAL RETRACE BIT
  3468                              <1> RHRZ	equ	00000001b	; VIDEO HORIZONTAL RETRACE BIT
  3469                              <1> 
  3470                              <1> ; Derived from "WRITE_TTY" procedure of IBM "pc-at" rombios source code
  3471                              <1> ; (06/10/1985), 'video.asm', INT 10H, VIDEO_IO
  3472                              <1> ;
  3473                              <1> ; 06/10/85  VIDEO DISPLAY BIOS
  3474                              <1> ;
  3475                              <1> ;--- WRITE_TTY ------------------------------------------------------------------
  3476                              <1> ;										:
  3477                              <1> ;   THIS INTERFACE PROVIDES A TELETYPE LIKE INTERFACE TO THE			:
  3478                              <1> ;   VIDEO CARDS. THE INPUT CHARACTER IS WRITTEN TO THE CURRENT			:
  3479                              <1> ;   CURSOR POSITION, AND THE CURSOR IS MOVED TO THE NEXT POSITION.		:
  3480                              <1> ;   IF THE CURSOR LEAVES THE LAST COLUMN OF THE FIELD, THE COLUMN		:
  3481                              <1> ;   IS SET TO ZERO, AND THE ROW VALUE IS INCREMENTED. IF THE ROW		:
  3482                              <1> ;   ROW VALUE LEAVES THE FIELD, THE CURSOR IS PLACED ON THE LAST ROW,		:
  3483                              <1> ;   FIRST COLUMN, AND THE ENTIRE SCREEN IS SCROLLED UP ONE LINE.		:
  3484                              <1> ;   WHEN THE SCREEN IS SCROLLED UP, THE ATTRIBUTE FOR FILLING THE		:
  3485                              <1> ;   NEWLY BLANKED LINE IS READ FROM THE CURSOR POSITION ON THE PREVIOUS		:
  3486                              <1> ;   LINE BEFORE THE SCROLL, IN CHARACTER MODE. IN GRAPHICS MODE,		:
  3487                              <1> ;   THE 0 COLOR IS USED.							:
  3488                              <1> ;   ENTRY --									:
  3489                              <1> ;     (AH) = CURRENT CRT MODE							:
  3490                              <1> ;     (AL) = CHARACTER TO BE WRITTEN						:
  3491                              <1> ;	    NOTE THAT BACK SPACE, CARRIAGE RETURN, BELL AND LINE FEED ARE	:
  3492                              <1> ;	    HANDLED AS COMMANDS RATHER THAN AS DISPLAY GRAPHICS CHARACTERS	:
  3493                              <1> ;     (BL) = FOREGROUND COLOR FOR CHAR WRITE IF CURRENTLY IN A GRAPHICS MODE	:
  3494                              <1> ;   EXIT -- 									:
  3495                              <1> ;     ALL REGISTERS SAVED							:
  3496                              <1> ;--------------------------------------------------------------------------------
  3497                              <1> 
  3498                              <1> ; 02/08/2022 (TRDOS 386 v2.0.5)
  3499                              <1> ; 18/11/2020 (TRDOS 386 v2.0.3)
  3500                              <1> ; 09/12/2017
  3501                              <1> ; 08/07/2016
  3502                              <1> ; 26/06/2016
  3503                              <1> ; 24/06/2016
  3504                              <1> _write_tty:
  3505                              <1> 	; 13/05/2016
  3506                              <1> 	; --- 18/11/2020 ---
  3507                              <1> 	; NOTE:
  3508                              <1> 	; Only kernel calls "_write_tty" procedure...
  3509                              <1> 	; TRDOS 386 v2 kernel uses video mode 3 for displaying
  3510                              <1> 	; (some error) messages and also mainprog command interpreter
  3511                              <1> 	; (in kernel) uses "_write_tty".
  3512                              <1> 	; So, here video mode must be set to 3 if it is not 3.
  3513                              <1>  
  3514 0000228C FA                  <1> 	cli	; disable interrupts
  3515                              <1> 	;
  3516                              <1> 	; 01/09/2014
  3517 0000228D 803D[BE670000]03    <1> 	cmp	byte [CRT_MODE], 3
  3518 00002294 7409                <1> 	je	short _write_tty_m3
  3519                              <1> 	;
  3520                              <1> set_mode_3:
  3521 00002296 53                  <1> 	push	ebx
  3522 00002297 50                  <1> 	push	eax
  3523                              <1> 	;call	_set_mode
  3524                              <1> 	; 18/11/2020 
  3525 00002298 E89BF8FFFF          <1> 	call	set_txt_mode  ; set video mode to 03h 
  3526 0000229D 58                  <1> 	pop	eax
  3527 0000229E 5B                  <1> 	pop	ebx
  3528                              <1> 	;
  3529                              <1> _write_tty_m3: ; 24/06/2016 (m3 -> _write_tty_m3)
  3530 0000229F 0FB6F7              <1> 	movzx 	esi, bh ; 12/05/2016
  3531                              <1> 	;shl	si, 1
  3532                              <1> 	; 02/08/2022
  3533 000022A2 D1E6                <1> 	shl	esi, 1
  3534 000022A4 81C6[A6780100]      <1> 	add	esi, CURSOR_POSN
  3535 000022AA 668B16              <1> 	mov	dx, [esi]
  3536                              <1> 	;
  3537                              <1> 	; dx now has the current cursor position
  3538                              <1> 	;
  3539 000022AD 3C0D                <1> 	cmp	al, 0Dh	; CR	; is it carriage return or control character
  3540                              <1> 	;jbe	short u8
  3541                              <1> 	; 17/04/2021
  3542 000022AF 7241                <1> 	jb	short u8
  3543 000022B1 746F                <1> 	je	short u9
  3544                              <1> 	;
  3545                              <1> 	; write the char to the screen
  3546                              <1> u0:	
  3547                              <1> 	; al = character
  3548                              <1> 	; bl = attribute/color
  3549                              <1> 	; bh = video page number (0 to 7)
  3550                              <1> 	;
  3551                              <1> 	;mov	cx, 1  ; 24/06/2016
  3552                              <1> 	; 02/08/2022
  3553 000022B3 29C9                <1> 	sub	ecx, ecx
  3554 000022B5 FEC1                <1> 	inc	cl ; ecx = 1
  3555                              <1> 	; cx = count of characters to write
  3556                              <1> 	;
  3557 000022B7 E84FFFFFFF          <1> 	call	_write_c_current ; 16/01/2015
  3558                              <1> 	;
  3559                              <1> 	; position the cursor for next char
  3560 000022BC FEC2                <1> 	inc	dl		; next column
  3561 000022BE 3A15[C0670000]      <1> 	cmp	dl, [CRT_COLS]  ; test for column overflow 
  3562                              <1> 	;jne	_set_cpos
  3563                              <1> 	; 02/08/2022
  3564 000022C4 7402                <1> 	je	short u13
  3565 000022C6 EB5C                <1> 	jmp	_set_cpos
  3566                              <1> u13:
  3567 000022C8 B200                <1> 	mov	dl, 0		; column = 0
  3568                              <1> u10:				; (line feed found)
  3569 000022CA 80FE18              <1> 	cmp	dh, 25-1 	; check for last row
  3570 000022CD 721F                <1> 	jb 	short u6
  3571                              <1> 	;
  3572                              <1> 	; scroll required
  3573                              <1> u1:	
  3574                              <1> 	; SET CURSOR POSITION (04/12/2013)
  3575 000022CF E850000000          <1> 	call	_set_cpos
  3576                              <1> 	;
  3577                              <1> 	; determine value to fill with during scroll
  3578                              <1> u2:
  3579                              <1> 	; bh = video page number
  3580                              <1> 	;
  3581 000022D4 E8A3FEFFFF          <1> 	call	_read_ac_current ; 18/01/2016
  3582                              <1> 	;
  3583                              <1> 	; al = character, ah = attribute
  3584                              <1> 	; bh = video page number
  3585                              <1> 	; 18/11/2020
  3586 000022D9 88E3                <1> 	mov	bl, ah ; color/attribute 	
  3587                              <1> u3:
  3588                              <1> 	;;mov	ax, 0601h 	; scroll one line
  3589                              <1> 	;;sub	cx, cx		; upper left corner
  3590                              <1> 	;;mov	dh, 25-1 	; lower right row
  3591                              <1> 	;;;mov	dl, [CRT_COLS]
  3592                              <1> 	;mov	dl, 80		; lower right column	
  3593                              <1> 	;;dec	dl
  3594                              <1> 	;;mov	dl, 79
  3595                              <1> 
  3596                              <1> 	;;call	scroll_up	; 04/12/2013
  3597                              <1> 	;;; 11/03/2015
  3598                              <1> 	; 02/09/2014
  3599                              <1> 	;;;mov	cx, [crt_ulc] ; Upper left corner  (0000h)
  3600                              <1> 	;;;mov	dx, [crt_lrc] ; Lower right corner (184Fh)
  3601                              <1> 	; 11/03/2015
  3602                              <1> 	;sub	cx, cx
  3603                              <1> 	; 17/04/2021
  3604 000022DB 29C9                <1> 	sub	ecx, ecx
  3605                              <1> 	;mov	dx, 184Fh ; dl = 79 (column), dh = 24 (row)
  3606                              <1> 	; 18/11/2020
  3607 000022DD B618                <1> 	mov	dh, 25-1
  3608 000022DF 8A15[C0670000]      <1> 	mov	dl, [CRT_COLS]
  3609 000022E5 FECA                <1> 	dec	dl
  3610                              <1> 	;
  3611 000022E7 B001                <1> 	mov	al, 1		; scroll 1 line up
  3612                              <1> 		; ah = attribute
  3613                              <1> 	;mov	bl, al ; 12/05/2016
  3614 000022E9 E9F0FCFFFF          <1> 	jmp	_scroll_up	; 16/01/2016
  3615                              <1> ;u4:
  3616                              <1> 	;;int	10h		; video-call return
  3617                              <1> 				; scroll up the screen
  3618                              <1> 				; tty return
  3619                              <1> ;u5:
  3620                              <1> 	;retn			; return to the caller
  3621                              <1> 
  3622                              <1> u6:				; set-cursor-inc
  3623 000022EE FEC6                <1> 	inc	dh		; next row
  3624                              <1> 				; set cursor
  3625                              <1> ;u7:					
  3626                              <1> 	;;mov	ah, 02h
  3627                              <1> 	;;jmp	short u4 	; establish the new cursor
  3628                              <1> 	;call	_set_cpos
  3629                              <1> 	;jmp 	short u5
  3630 000022F0 EB32                <1> 	jmp     _set_cpos
  3631                              <1> 
  3632                              <1> 	; check for control characters
  3633                              <1> u8:
  3634                              <1> 	;je	short u9 ; 17/04/2021
  3635 000022F2 3C0A                <1> 	cmp	al, 0Ah		; is it a line feed (0Ah)
  3636 000022F4 74D4                <1> 	je	short u10
  3637 000022F6 3C07                <1> 	cmp	al, 07h 	; is it a bell
  3638 000022F8 747C                <1> 	je	short u11
  3639 000022FA 3C08                <1> 	cmp	al, 08h		; is it a backspace
  3640                              <1> 	;jne	short u0
  3641 000022FC 741C                <1> 	je	short bs	; 12/12/2013
  3642                              <1> 	; 12/12/2013 (tab stop)
  3643 000022FE 3C09                <1> 	cmp	al, 09h		; is it a tab stop
  3644 00002300 75B1                <1> 	jne	short u0
  3645 00002302 88D0                <1> 	mov	al, dl
  3646                              <1> 	;cbw
  3647 00002304 30E4                <1> 	xor	ah, ah ; 09/12/2017
  3648 00002306 B108                <1> 	mov	cl, 8
  3649 00002308 F6F1                <1> 	div	cl
  3650 0000230A 28E1                <1> 	sub	cl, ah
  3651                              <1> ts:
  3652                              <1> 	; 02/09/2014
  3653                              <1> 	; 01/09/2014
  3654                              <1> 	;mov	al, 20h
  3655                              <1> tsloop:
  3656                              <1> 	;push	cx
  3657                              <1> 	; 12/04/2021
  3658 0000230C 51                  <1> 	push	ecx ; *
  3659                              <1> 	; 18/11/2020
  3660                              <1> 	;push	ax
  3661                              <1> 	;;mov	bh, [ACTIVE_PAGE]
  3662                              <1> 	; 05/12/2020
  3663                              <1> 	;push	bx
  3664 0000230D B020                <1> 	mov	al, 20h ; al = space (blank) 
  3665                              <1> 			; bl = color/attribute
  3666 0000230F E88BFFFFFF          <1> 	call	_write_tty_m3 ; 24/06/2016 (m3 -> _write_tty_m3)
  3667                              <1> 	; 05/12/2020
  3668                              <1> 	; bx is preserved in '_write_tty_m3'
  3669                              <1> 	; 18/11/2020
  3670                              <1> 	;pop	bx  ; BL = color/attribute, Bh = video page 
  3671                              <1> 	;pop	ax  ; AL = character
  3672                              <1> 	; 12/04/2021
  3673                              <1> 	;pop	cx
  3674 00002314 59                  <1> 	pop	ecx ; *
  3675 00002315 FEC9                <1> 	dec	cl
  3676 00002317 75F3                <1> 	jnz	short tsloop
  3677 00002319 C3                  <1> 	retn
  3678                              <1> bs:	
  3679                              <1> 	; back space found
  3680                              <1> 
  3681 0000231A 08D2                <1> 	or	dl, dl 		; is it already at start of line
  3682                              <1> 	;je	short u7 	; set_cursor
  3683 0000231C 7406                <1> 	jz	short _set_cpos
  3684                              <1> 	;dec	dx     		; no -- just move it back
  3685                              <1> 	; 17/04/2021
  3686 0000231E FECA                <1> 	dec	dl		; move to 1 column back
  3687                              <1> 	;jmp	short u7
  3688 00002320 EB02                <1> 	jmp	short _set_cpos
  3689                              <1> 
  3690                              <1> 	; carriage return found
  3691                              <1> u9:
  3692 00002322 B200                <1> 	mov	dl, 0 		; move to first column
  3693                              <1> 	;jmp	short u7
  3694                              <1> 	;jmp	short _set_cpos ; 30/01/2016
  3695                              <1> 
  3696                              <1> 	; line feed found
  3697                              <1> ;u10:
  3698                              <1> ;	cmp	dh, 25-1 	; bottom of screen
  3699                              <1> ;	jne	short u6 	; no, just set the cursor
  3700                              <1> ;       jmp     u1              ; yes, scroll the screen
  3701                              <1> 
  3702                              <1> _set_cpos:
  3703                              <1> 	; 02/08/2022 - TRDOS 386 v2.0.5
  3704                              <1> 	; 17/04/2021 - TRDOS 386 v2.0.4
  3705                              <1> 	; 12/05/2016 - TRDOS 386 (TRDOS v2.0)
  3706                              <1> 	; 27/06/2015
  3707                              <1> 	; 01/09/2014
  3708                              <1> 	; 30/08/2014 (Retro UNIX 386 v1)
  3709                              <1> 	;
  3710                              <1> 	; 04/12/2013 - 12/12/2013 (Retro UNIX 8086 v1) 
  3711                              <1> 	;
  3712                              <1> 	; VIDEO.ASM - 06/10/85  VIDEO DISPLAY BIOS
  3713                              <1> 	;
  3714                              <1> ;----------------------------------------------
  3715                              <1> ; SET_CPOS
  3716                              <1> ;	THIS ROUTINE SETS THE CURRENT CURSOR POSITION TO THE
  3717                              <1> ;	NEW X-Y VALUES PASSED
  3718                              <1> ; INPUT
  3719                              <1> ;	DX - ROW,COLUMN OF NEW CURSOR
  3720                              <1> ;	BH - DISPLAY PAGE OF CURSOR
  3721                              <1> ; OUTPUT
  3722                              <1> ;	CURSOR ID SET AT 6845 IF DISPLAY PAGE IS CURRENT DISPLAY
  3723                              <1> ;----------------------------------------------
  3724                              <1> 	;
  3725 00002324 BE[A6780100]        <1> 	mov	esi, CURSOR_POSN
  3726 00002329 0FB6C7              <1>         movzx   eax, bh	; BH = video page number
  3727                              <1> ;	or	al, al
  3728                              <1> ;	jz	short _set_cpos_0
  3729 0000232C D0E0                <1>         shl     al, 1   ; word offset
  3730 0000232E 01C6                <1>         add     esi, eax
  3731                              <1> ;_set_cpos_0:
  3732 00002330 668916              <1> 	mov	[esi], dx ; save the pointer
  3733 00002333 383D[B6780100]      <1> 	cmp	[ACTIVE_PAGE], bh
  3734 00002339 7532                <1> 	jne	short m17
  3735                              <1> 	;call	m18	; CURSOR SET
  3736                              <1> ;m17:			; SET_CPOS_RETURN
  3737                              <1> 	; 01/09/2014
  3738                              <1> ;	retn
  3739                              <1> 		; DX = row/column
  3740                              <1> m18:
  3741 0000233B E852FCFFFF          <1> 	call	position ; determine location in regen buffer	
  3742 00002340 668B0D[A4780100]    <1> 	mov	cx, [CRT_START]
  3743 00002347 6601C1              <1> 	add	cx, ax  ; add char position in regen buffer
  3744                              <1> 			; to the start address (offset) for this page
  3745 0000234A 66D1E9              <1> 	shr	cx, 1	; divide by 2 for char only count
  3746 0000234D B40E                <1> 	mov	ah, 14	; register number for cursor
  3747                              <1> 	;call	m16	; output value to the 6845	
  3748                              <1> 	;retn
  3749                              <1> 
  3750                              <1> 	;-----	THIS ROUTINE OUTPUTS THE CX REGISTER
  3751                              <1> 	;	TO THE 6845 REGISTERS NAMED IN (AH)
  3752                              <1> m16:
  3753 0000234F FA                  <1> 	cli
  3754                              <1> 	;mov	dx, [addr_6845] ; address register
  3755 00002350 66BAD403            <1> 	mov 	dx, 03D4h ; I/O address of color card
  3756 00002354 88E0                <1> 	mov	al, ah	; get value
  3757 00002356 EE                  <1> 	out	dx, al	; register set
  3758                              <1> 	;inc	dx	; data register
  3759                              <1> 	; 17/04/2021
  3760 00002357 FEC2                <1> 	inc	dl
  3761 00002359 EB00                <1> 	jmp	$+2	; i/o delay
  3762 0000235B 88E8                <1> 	mov	al, ch	; data
  3763 0000235D EE                  <1> 	out	dx, al	
  3764                              <1> 	;dec	dx	
  3765                              <1> 	; 17/04/2021
  3766 0000235E FECA                <1> 	dec	dl
  3767 00002360 88E0                <1> 	mov	al, ah
  3768 00002362 FEC0                <1> 	inc	al	; point to other data register
  3769 00002364 EE                  <1> 	out	dx, al	; set for second register
  3770                              <1> 	;inc	dx
  3771                              <1> 	; 17/04/2021
  3772 00002365 FEC2                <1> 	inc	dl
  3773 00002367 EB00                <1> 	jmp	$+2	; i/o delay
  3774 00002369 88C8                <1> 	mov	al, cl	; second data value
  3775 0000236B EE                  <1> 	out	dx, al
  3776 0000236C FB                  <1> 	sti
  3777                              <1> m17:
  3778 0000236D C3                  <1> 	retn
  3779                              <1> 
  3780                              <1> _beep:
  3781                              <1> 	; 12/02/2021 (TRDOS v2.0.3)
  3782 0000236E FA                  <1> 	cli
  3783 0000236F E811000000          <1> 	call	beep
  3784 00002374 FB                  <1> 	sti
  3785 00002375 C3                  <1> 	retn
  3786                              <1> 
  3787                              <1> beeper: 
  3788                              <1> 	; 04/08/2016
  3789                              <1> 	; 12/05/2016 - TRDOS 386 (TRDOS v2.0)
  3790                              <1> 	; 30/08/2014 (Retro UNIX 386 v1)
  3791                              <1> 	; 18/01/2014
  3792                              <1> 	; 03/12/2013
  3793                              <1> 	; bell found
  3794                              <1> u11:
  3795 00002376 FB                  <1> 	sti
  3796 00002377 3A3D[B6780100]      <1> 	cmp	bh, [ACTIVE_PAGE]
  3797 0000237D 7552                <1> 	jne	short u12	; Do not sound the beep 
  3798                              <1> 				; if it is not written on the active page
  3799                              <1> beeper_gfx: ; 04/08/2016
  3800 0000237F 66B93305            <1> 	mov	cx, 1331 	; divisor for 896 hz tone
  3801 00002383 B31F                <1> 	mov	bl, 31		; set count for 31/64 second for beep
  3802                              <1> 	;call	beep		; sound the pod bell
  3803                              <1> 	;jmp	short u5 	; tty_return
  3804                              <1> 	;retn
  3805                              <1> 	
  3806                              <1> TIMER	equ 	040h   		; 8254 TIMER - BASE ADDRESS
  3807                              <1> PORT_B	equ	061h		; PORT B READ/WRITE DIAGNOSTIC REGISTER
  3808                              <1> GATE2	equ	00000001b	; TIMER 2 INPUT CATE CLOCK BIT
  3809                              <1> SPK2	equ	00000010b	; SPEAKER OUTPUT DATA ENABLE BIT
  3810                              <1> 
  3811                              <1> beep:
  3812                              <1> 	; 12/02/2021
  3813                              <1> 	; 07/02/2015
  3814                              <1> 	; 30/08/2014 (Retro UNIX 386 v1)
  3815                              <1> 	; 18/01/2014
  3816                              <1> 	; 03/12/2013
  3817                              <1> 	;
  3818                              <1> 	; TEST4.ASM - 06/10/85  POST AND BIOS UTILITY ROUTINES
  3819                              <1> 	;
  3820                              <1> 	; ROUTINE TO SOUND THE BEEPER USING TIMER 2 FOR TONE
  3821                              <1> 	;
  3822                              <1> 	; ENTRY:
  3823                              <1> 	;    (BL) = DURATION COUNTER ( 1 FOR 1/64 SECOND )
  3824                              <1> 	;    (CX) = FREQUENCY DIVISOR (1193180/FREQUENCY) (1331 FOR 886 HZ)
  3825                              <1> 	; EXIT:				:
  3826                              <1> 	;    (AX),(BL),(CX) MODIFIED.
  3827                              <1> 
  3828 00002385 9C                  <1> 	pushfd  ; 18/01/2014	; save interrupt status
  3829 00002386 FA                  <1> 	cli			; block interrupts during update
  3830 00002387 B0B6                <1> 	mov	al, 10110110b	; select timer 2, lsb, msb binary
  3831 00002389 E643                <1> 	out	TIMER+3, al 	; write timer mode register
  3832 0000238B EB00                <1> 	jmp	$+2		; I/O delay
  3833 0000238D 88C8                <1> 	mov	al, cl		; divisor for hz (low)
  3834 0000238F E642                <1> 	out	TIMER+2,AL	; write timer 2 count - lsb
  3835 00002391 EB00                <1> 	jmp	$+2		; I/O delay
  3836 00002393 88E8                <1> 	mov	al, ch		; divisor for hz (high)
  3837 00002395 E642                <1> 	out	TIMER+2, al	; write timer 2 count - msb
  3838 00002397 E461                <1> 	in	al, PORT_B	; get current setting of port
  3839 00002399 88C4                <1> 	mov	ah, al		; save that setting
  3840 0000239B 0C03                <1> 	or	al, GATE2+SPK2	; gate timer 2 and turn speaker on
  3841 0000239D E661                <1> 	out	PORT_B, al	; and restore interrupt status
  3842                              <1> 	; 12/02/2021
  3843 0000239F 9D                  <1> 	popfd	; 18/01/2014
  3844                              <1> 	;sti
  3845                              <1> g7:				; 1/64 second per count (bl)
  3846 000023A0 B90B040000          <1> 	mov	ecx, 1035	; delay count for 1/64 of a second
  3847 000023A5 E828000000          <1> 	call	waitf		; go to beep delay 1/64 count
  3848 000023AA FECB                <1> 	dec	bl		; (bl) length count expired?
  3849 000023AC 75F2                <1> 	jnz	short g7	; no - continue beeping speaker
  3850                              <1> 	;
  3851 000023AE 9C                  <1> 	pushfd	; 12/02/2021	; save interrupt status
  3852 000023AF FA                  <1> 	cli  	; 18/01/2014	; block interrupts during update
  3853 000023B0 E461                <1> 	in	al, PORT_B	; get current port value
  3854                              <1>         ;or	al, not (GATE2+SPK2) ; isolate current speaker bits in case
  3855 000023B2 0CFC                <1>         or      al, ~(GATE2+SPK2)
  3856 000023B4 20C4                <1>         and	ah, al		; someone turned them off during beep
  3857 000023B6 88E0                <1> 	mov	al, ah		; recover value of port
  3858                              <1>         ;or	al, not (GATE2+SPK2) ; force speaker data off
  3859 000023B8 0CFC                <1> 	or 	al, ~(GATE2+SPK2) ; isolate current speaker bits in case
  3860 000023BA E661                <1> 	out	PORT_B, al	; and stop speaker timer
  3861 000023BC 9D                  <1> 	popfd	; 12/02/2021		; restore interrupt flag state
  3862                              <1> 	;sti
  3863                              <1> 	;mov	ecx, 1035	; force 1/64 second delay (short)
  3864                              <1> 	; 17/04/2021
  3865 000023BD 66B90B04            <1> 	mov	cx, 1035
  3866 000023C1 E80C000000          <1> 	call	waitf		; minimum delay between all beeps
  3867 000023C6 9C                  <1> 	pushfd			; save interrupt status
  3868 000023C7 FA                  <1> 	cli			; block interrupts during update
  3869 000023C8 E461                <1> 	in	al, PORT_B	; get current port value in case
  3870 000023CA 2403                <1> 	and	al, GATE2+SPK2	; someone turned them on
  3871 000023CC 08E0                <1> 	or	al, ah		; recover value of port_b
  3872 000023CE E661                <1> 	out	PORT_B, al	; restore speaker status
  3873 000023D0 9D                  <1> 	popfd			; restore interrupt flag state
  3874                              <1> u12:	
  3875 000023D1 C3                  <1> 	retn
  3876                              <1> 
  3877                              <1> REFRESH_BIT equ	00010000b 	; REFRESH TEST BIT
  3878                              <1> 
  3879                              <1> WAITF:
  3880                              <1> waitf:
  3881                              <1> 	; 30/08/2014 (Retro UNIX 386 v1)
  3882                              <1> 	; 03/12/2013
  3883                              <1> 	;
  3884                              <1> ;	push	ax		; save work register (ah)
  3885                              <1> ;waitf1:
  3886                              <1> 				; use timer 1 output bits
  3887                              <1> ;	in	al, PORT_B	; read current counter output status
  3888                              <1> ;	and	al, REFRESH_BIT	; mask for refresh determine bit
  3889                              <1> ;	cmp	al, ah		; did it just change
  3890                              <1> ;	je	short waitf1	; wait for a change in output line
  3891                              <1> ;	;
  3892                              <1> ;	mov	ah, al		; save new lflag state
  3893                              <1> ;	loop	waitf1		; decrement half cycles till count end
  3894                              <1> ;	;
  3895                              <1> ;	pop	ax		; restore (ah)
  3896                              <1> ;	retn			; return (cx)=0
  3897                              <1> 
  3898                              <1> ; 06/02/2015 (unix386.s <-- dsectrm2.s)
  3899                              <1> ; 17/12/2014 (dsectrm2.s)
  3900                              <1> ; WAITF
  3901                              <1> ; /// IBM PC-XT Model 286 System BIOS Source Code - Test 4 - 06/10/85 ///
  3902                              <1> ;
  3903                              <1> ;---WAITF-----------------------------------------------------------------------
  3904                              <1> ;	FIXED TIME WAIT ROUTINE (HARDWARE CONTROLLED - NOT PROCESSOR)
  3905                              <1> ; ENTRY:
  3906                              <1> ;	(CX) =	COUNT OF 15.085737 MICROSECOND INTERVALS TO WAIT
  3907                              <1> ;	      	MEMORY REFRESH TIMER 1 OUTPUT USED AS REFERENCE
  3908                              <1> ; EXIT:
  3909                              <1> ;	       	AFTER (CX) TIME COUNT (PLUS OR MINUS 16 MICROSECONDS)
  3910                              <1> ;	(CX) = 0	
  3911                              <1> ;-------------------------------------------------------------------------------
  3912                              <1> 
  3913                              <1> ; Refresh period: 30 micro seconds (15-80 us)
  3914                              <1> ; (16/12/2014 - AWARDBIOS 1999 - ATORGS.ASM, WAIT_REFRESH)
  3915                              <1> 
  3916                              <1> ;WAITF:					; DELAY FOR (CX)*15.085737 US
  3917                              <1> 	;push	AX			; SAVE WORK REGISTER (AH)
  3918                              <1> 	; 11/04/2021
  3919 000023D2 50                  <1> 	push	eax
  3920                              <1> 	; 16/12/2014
  3921                              <1> 	;shr	cx, 1			; convert to count of 30 micro seconds
  3922 000023D3 D1E9                <1> 	shr	ecx, 1	; 21/02/2015
  3923                              <1> ;17/12/2014	
  3924                              <1> ;WAITF1:
  3925                              <1> ;	in	al, PORT_B   ;061h	; READ CURRENT COUNTER OUTPUT STATUS
  3926                              <1> ;	and	al, REFRESH_BIT	;00010000b ; MASK FOR REFRESH DETERMINE BIT
  3927                              <1> ;	cmp	al, ah			; DID IT JUST CHANGE
  3928                              <1> ;	je	short WAITF1		; WAIT FOR A CHANGE IN OUTPUT LINE
  3929                              <1> ;	mov	ah, al			; SAVE NEW FLAG STATE
  3930                              <1> ;	loop	WAITF1			; DECREMENT HALF CYCLES TILL COUNT END		
  3931                              <1> 	;
  3932                              <1> 	; 17/12/2014
  3933                              <1> 	;
  3934                              <1> 	; Modification from 'WAIT_REFRESH' procedure of AWARD BIOS - 1999
  3935                              <1> 	;
  3936                              <1> ;WAIT_REFRESH:  Uses port 61, bit 4 to have CPU speed independent waiting.
  3937                              <1> ;   	INPUT:  CX = number of refresh periods to wait
  3938                              <1> ;     	       (refresh periods = 1 per 30 microseconds on most machines)
  3939                              <1> WR_STATE_0:
  3940 000023D5 E461                <1> 	in	al, PORT_B		; IN AL,SYS1
  3941 000023D7 A810                <1> 	test	al, 010h
  3942 000023D9 74FA                <1> 	JZ	short WR_STATE_0
  3943                              <1> WR_STATE_1:
  3944 000023DB E461                <1> 	in	al, PORT_B		; IN AL,SYS1
  3945 000023DD A810                <1> 	test	al, 010h
  3946 000023DF 75FA                <1> 	jnz	short WR_STATE_1
  3947 000023E1 E2F2                <1>         loop    WR_STATE_0
  3948                              <1> 	;
  3949                              <1> 	;pop	ax			; RESTORE (AH)
  3950                              <1> 	; 11/04/2021
  3951 000023E3 58                  <1> 	pop	eax
  3952 000023E4 C3                  <1> 	retn				; (CX) = 0
  3953                              <1> 
  3954                              <1> ; 03/08/2022
  3955                              <1> ; 02/08/2022 - TRDOS 386 Kernel v2.0.5
  3956                              <1> ; 09/07/2016
  3957                              <1> ; 01/07/2016
  3958                              <1> ; 24/06/2016
  3959                              <1> ; 23/06/2016 - TRDOS 386 (TRDOS v2.0)
  3960                              <1> ; VIDEO1.ASM - 24/03/1985 (IBM PC-AT BIOS source code)
  3961                              <1> ;-------------------------------------------------------------------------------
  3962                              <1> ; WRITE_STRING								       :
  3963                              <1> ;	THIS ROUTINE WRITES A STRING OF CHARACTERS TO THE CRT.		       :
  3964                              <1> ; INPUT 								       :
  3965                              <1> ;	(AL) = WRITE STRING COMMAND  0 - 3				       :
  3966                              <1> ;	(BH) = DISPLAY PAGE (ACTIVE PAGE)				       :
  3967                              <1> ;	(CX) = COUNT OF CHARACTERS TO WRITE, IF (CX) = 0 THEN RETURN	       :
  3968                              <1> ;	(DX) = CURSOR POSITION FOR START OF STRING WRITE		       :
  3969                              <1> ;	(BL) = ATTRIBUTE OF CHARACTER TO WRITE IF (AL) = 0  OR	(AL) = 1       :
  3970                              <1> ;	(EBP) = SOURCE STRING OFFSET					       :
  3971                              <1> ; OUTPUT								       :
  3972                              <1> ;	NONE								       :
  3973                              <1> ;-------------------------------------------------------------------------------
  3974                              <1> 
  3975                              <1> ; AL = 00h: Assign all characters the attribute in BL; do not update cursor
  3976                              <1> ; AL = 01h: Assign all characters the attribute in BL; update cursor
  3977                              <1> ; AL = 02h: Use attributes in string; do not update cursor
  3978                              <1> ; AL = 03h: Use attributes in string; update cursor
  3979                              <1> 
  3980                              <1> WRITE_STRING:
  3981                              <1> 	; 03/08/2022
  3982                              <1> 	; 02/08/2022
  3983                              <1> 	; 12/09/2016
  3984                              <1> 	; 09/07/2016
  3985                              <1> 	;cmp	byte [CRT_MODE], 7 ; 6?!
  3986                              <1> 	;ja	VIDEO_RETURN		; not a valid function for VGA modes
  3987                              <1> 	;
  3988 000023E5 A2[18850100]        <1> 	mov	[w_str_cmd], al		; save (AL) command
  3989 000023EA 3C04                <1> 	cmp	al, 4			; TEST FOR INVALID WRITE STRING OPTION
  3990                              <1> 	;jnb	VIDEO_RETURN		; IF OPTION INVALID THEN RETURN
  3991                              <1> 	; 02/08/2022
  3992 000023EC 7361                <1> 	jnb	short P55
  3993                              <1> 
  3994                              <1>         ;jcxz	VIDEO_RETURN		; IF ZERO LENGTH STRING THEN RETURN
  3995                              <1> 
  3996 000023EE 67E35E              <1>         jcxz    P55			; 01/07/2016
  3997                              <1> 
  3998                              <1> 	; 01/07/2016
  3999                              <1> 	;and	ecx, 0FFFFh
  4000                              <1> 	; ecx = byte count
  4001                              <1> 	;push	ecx
  4002 000023F1 89EE                <1> 	mov	esi, ebp ; user buffer
  4003 000023F3 BF00000700          <1> 	mov	edi, Cluster_Buffer  ; system buffer
  4004 000023F8 E8DEEA0000          <1> 	call	transfer_from_user_buffer
  4005                              <1> 	;pop	ecx
  4006                              <1> 	;jc	VIDEO_RETURN
  4007                              <1> 	; 02/08/2022
  4008 000023FD 7250                <1> 	jc	short P55
  4009                              <1> 	; ecx = transfer (byte) count = character count
  4010 000023FF BD00000700          <1> 	mov	ebp, Cluster_Buffer
  4011                              <1> 	; 12/09/2016
  4012 00002404 803D[BE670000]07    <1> 	cmp	byte [CRT_MODE], 7 ; 6?!
  4013                              <1> 	;ja	vga_write_string
  4014                              <1> 	; 02/08/2022
  4015 0000240B 7605                <1> 	jna	short P57
  4016 0000240D E99C000000          <1> 	jmp	vga_write_string
  4017                              <1> P57:
  4018 00002412 0FB6F7              <1> 	movzx	esi, bh			; GET CURRENT CURSOR PAGE
  4019                              <1> 	;sal	si, 1			; CONVERT TO PAGE OFFSET (SI = PAGE)
  4020                              <1> 	; 02/08/2022
  4021 00002415 D1E6                <1> 	sal	esi, 1
  4022                              <1> 	; *****
  4023 00002417 66FFB6[A6780100]    <1> 	push	word [esi+CURSOR_POSN]	; SAVE CURRENT CURSOR POSITION IN STACK
  4024                              <1> 
  4025                              <1> 	;mov	ax, 0200h		; SET NEW CURSOR POSITION
  4026                              <1> 	;int	10h
  4027                              <1> P50next:	
  4028 0000241E 51                  <1> 	push	ecx ; ****
  4029 0000241F 53                  <1> 	push	ebx ; *** ; 18/11/2020
  4030 00002420 56                  <1> 	push	esi ; **
  4031 00002421 52                  <1> 	push	edx ; *
  4032 00002422 E8FDFEFFFF          <1> 	call	_set_cpos
  4033                              <1> P50:
  4034 00002427 8A4500              <1> 	mov	al, [ebp]		; GET CHARACTER FROM INPUT STRING
  4035 0000242A 45                  <1> 	inc	ebp			; BUMP POINTER TO CHARACTER
  4036                              <1> 
  4037                              <1> ;-----	TEST FOR SPECIAL CHARACTER'S
  4038                              <1> 
  4039 0000242B 3C08                <1> 	cmp	al, 08h			; IS IT A BACKSPACE
  4040 0000242D 7410                <1> 	je	short P51		; BACK_SPACE
  4041 0000242F 3C0D                <1> 	cmp	al, 0Dh ; CR		; IS IT CARRIAGE RETURN
  4042 00002431 740C                <1> 	je	short P51		; CAR_RET
  4043 00002433 3C0A                <1> 	cmp	al, 0Ah ; LF		; IS IT A LINE FEED
  4044 00002435 7408                <1> 	je	short P51		; LINE_FEED
  4045                              <1> 	; 18/11/2020
  4046 00002437 3C09                <1> 	cmp	al, 09h			; is it a tab stop
  4047 00002439 7404                <1> 	je	short P51
  4048                              <1> 	;
  4049 0000243B 3C07                <1> 	cmp	al, 07h			; IS IT A BELL
  4050 0000243D 7515                <1> 	jne	short P52		; IF NOT THEN DO WRITE CHARACTER
  4051                              <1> P51:
  4052                              <1> 	;mov	ah, 0Eh			; TTY_CHARACTER_WRITE
  4053                              <1> 	;int	10h			; WRITE TTY CHARACTER TO THE CRT
  4054                              <1> 	
  4055 0000243F E85BFEFFFF          <1> 	call	_write_tty_m3
  4056                              <1> 
  4057 00002444 5A                  <1> 	pop	edx ; *
  4058 00002445 5E                  <1> 	pop	esi ; **
  4059                              <1> 
  4060 00002446 668B96[A6780100]    <1> 	mov	dx, [esi+CURSOR_POSN]	; GET CURRENT CURSOR POSITION
  4061 0000244D EB44                <1> 	jmp	short P54		; SET CURSOR POSITION AND CONTINUE
  4062                              <1> P55:
  4063 0000244F E9D5F6FFFF          <1> 	jmp	VIDEO_RETURN
  4064                              <1> P52:
  4065                              <1> 	;mov	cx, 1			; SET CHARACTER WRITE AMOUNT TO ONE
  4066                              <1> 	; 02/08/2022
  4067 00002454 29C9                <1> 	sub	ecx, ecx
  4068 00002456 FEC1                <1> 	inc	cl
  4069                              <1> 	; ecx = 1
  4070 00002458 803D[18850100]02    <1> 	cmp	byte [w_str_cmd], 2	; IS THE ATTRIBUTE IN THE STRING
  4071 0000245F 7204                <1> 	jb	short P53		; IF NOT THEN SKIP
  4072 00002461 8A5D00              <1> 	mov	bl, [ebp]		; ELSE GET NEW ATTRIBUTE
  4073 00002464 45                  <1> 	inc	ebp			; BUMP STRING POINTER
  4074                              <1> P53:
  4075                              <1> 	;mov	ah, 09h			; GOT_CHARACTER
  4076                              <1> 	;int	10h			; WRITE CHARACTER TO THE CRT
  4077                              <1> 
  4078 00002465 E8A1FDFFFF          <1> 	call	_write_c_current
  4079                              <1> 	
  4080 0000246A 5A                  <1> 	pop	edx ; *	
  4081                              <1> 
  4082                              <1> 	; 05/12/2020
  4083                              <1> 	; bx is preserved in '_write_c_current'
  4084                              <1> 	; 18/11/2020
  4085                              <1> 	;mov	ebx, [esp+4]	; ***
  4086                              <1> 
  4087 0000246B 0FB6F7              <1> 	movzx	esi, bh ; video page number (0 to 7)	
  4088 0000246E 889E[C7670000]      <1> 	mov	[esi+chr_attrib], bl ; color/attribute
  4089                              <1> 
  4090 00002474 FEC2                <1> 	inc	dl			; INCREMENT COLUMN COUNTER
  4091 00002476 3A15[C0670000]      <1> 	cmp	dl, [CRT_COLS]		; IF COLS ARE WITHIN RANGE FOR THIS MODE
  4092                              <1> 	;jb	short P54		;    THEN GO TO COLUMNS SET
  4093 0000247C 7214                <1> 	jb	short P56 ; 05/12/2020
  4094 0000247E FEC6                <1> 	inc	dh			; BUMP ROW COUNTER BY ONE
  4095 00002480 28D2                <1> 	sub	dl, dl			; SET COLUMN COUNTER TO ZERO
  4096 00002482 80FE19              <1> 	cmp	dh, 25			; IF ROWS ARE LESS THAN 25 THEN
  4097                              <1> 	;jb	short P54		; GO TO ROWS_COLUMNS_SET
  4098 00002485 720B                <1> 	jb	short P56 ; 05/12/2020
  4099                              <1> 
  4100                              <1> 	; 18/11/2020
  4101                              <1> 	;mov	ax, 0E0Ah		; ELSE SCROLL SCREEN
  4102                              <1> 	;int	10h			; RESET ROW COUNTER TO 24
  4103                              <1> 
  4104                              <1> 	; 18/11/2020
  4105 00002487 B00A                <1> 	mov	al, 0Ah	; line feed
  4106                              <1> 
  4107 00002489 E811FEFFFF          <1> 	call	_write_tty_m3
  4108                              <1> 	
  4109 0000248E 66BA0018            <1> 	mov	dx, 1800h		; Column = 0, Row = 24
  4110                              <1> P56:	
  4111                              <1> 	; 05/12/2020
  4112                              <1> 	; 18/11/2020
  4113 00002492 5E                  <1> 	pop	esi ; **
  4114                              <1> P54:					; ROW_COLUMNS_SET
  4115                              <1> 	;mov	ax, 0200h		; SET NEW CURSOR POSITION COMMAND
  4116                              <1> 	;int	10h			; ESTABLISH NEW CURSOR POSITION
  4117                              <1> 
  4118                              <1> 	; 18/11/2020
  4119 00002493 5B                  <1> 	pop	ebx ; ***
  4120 00002494 59                  <1> 	pop	ecx ; ****
  4121                              <1> 
  4122                              <1> 	;loop	P50			; DO IT ONCE MORE UNTIL (CX) = ZERO
  4123 00002495 6649                <1> 	dec	cx
  4124 00002497 7585                <1> 	jnz	short P50next
  4125                              <1> 
  4126 00002499 665A                <1> 	pop	dx  ; *****		; RESTORE OLD CURSOR COORDINATES
  4127                              <1> 	
  4128 0000249B F605[18850100]01    <1> 	test	byte [w_str_cmd], 1	; IF CURSOR WAS NOT TO BE MOVED
  4129                              <1> 	;jnz	VIDEO_RETURN		; THEN EXIT WITHOUT RESETTING OLD VALUE
  4130                              <1> 	; 03/08/2022
  4131 000024A2 7505                <1> 	jnz	short P58
  4132                              <1> 	
  4133                              <1> 	;mov	ax, 0200h		; ELSE RESTORE OLD CURSOR POSITION
  4134                              <1> 	;int	10h
  4135                              <1> 					; DONE - EXIT WRITE STRING
  4136 000024A4 E87BFEFFFF          <1> 	call	_set_cpos
  4137                              <1> P58:
  4138 000024A9 E97BF6FFFF          <1> 	jmp	VIDEO_RETURN		; RETURN TO CALLER
  4139                              <1> 
  4140                              <1> vga_write_string:
  4141                              <1> 	; 04/08/2022 - TRDOS 386 Kernel v2.0.5
  4142                              <1> 	; 12/09/2016 - TRDOS 386 (TRDOS v2.0)
  4143                              <1> 	;
  4144                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  4145                              <1> 	; vgabios-0.7a (2011)
  4146                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  4147                              <1> 	; 'vgabios.c', ' biosfn_write_string'
  4148                              <1> 
  4149                              <1> 	; INPUT 								  :
  4150                              <1> 	;	(AL) = WRITE STRING COMMAND  0 - 3				  :
  4151                              <1> 	;	(BH) = DISPLAY PAGE (ACTIVE PAGE)				  :
  4152                              <1> 	;	(CX) = COUNT OF CHARACTERS TO WRITE, IF (CX) = 0 THEN RETURN	  :
  4153                              <1> 	;	(DX) = CURSOR POSITION FOR START OF STRING WRITE		  :
  4154                              <1> 	;	(BL) = ATTRIBUTE OF CHARACTER TO WRITE IF (AL) = 0  OR	(AL) = 1  :
  4155                              <1> 	;	(EBP) = SOURCE STRING OFFSET					  :
  4156                              <1> 	; OUTPUT								  :
  4157                              <1> 	;	NONE								  :
  4158                              <1> 	;-------------------------------------------------------------------------;
  4159                              <1> 
  4160                              <1> 	; AL = 00h: Assign all characters the attribute in BL; do not update cursor
  4161                              <1> 	; AL = 01h: Assign all characters the attribute in BL; update cursor
  4162                              <1> 	; AL = 02h: Use attributes in string; do not update cursor
  4163                              <1> 	; AL = 03h: Use attributes in string; update cursor
  4164                              <1> 	
  4165                              <1> 	; biosfn_write_string(GET_AL(),GET_BH(),GET_BL(),CX,GET_DH(),GET_DL(),ES,BP);
  4166                              <1> 	; static void biosfn_write_string (flag,page,attr,count,row,col,seg,offset) 
  4167                              <1> 
  4168                              <1> 	; // Read curs info for the page
  4169                              <1>  	; biosfn_get_cursor_pos(page,&dummy,&oldcurs);
  4170                              <1> 	; bh = video page = 0
  4171                              <1> 	;movzx	esi, word [CURSOR_POSN] ; current cursor position for video page 0
  4172                              <1> 	
  4173                              <1> 	; // if row=0xff special case : use current cursor position
  4174                              <1> 	; if(row==0xff)
  4175                              <1> 	;  {col=oldcurs&0x00ff;
  4176                              <1> 	;   row=(oldcurs&0xff00)>>8;
  4177                              <1> 	;  }
  4178                              <1> 
  4179                              <1> 	;mov	al, [w_str_cmd]
  4180                              <1> 
  4181 000024AE 80FEFF              <1> 	cmp	dh, 0FFh
  4182 000024B1 7407                <1> 	je	short vga_wstr_1 ; user current cursor position
  4183                              <1> vga_wstr_0:
  4184                              <1> 	; set cursor position
  4185 000024B3 668915[A6780100]    <1> 	mov	[CURSOR_POSN], dx ; save cursor pos for pg 0
  4186                              <1> vga_wstr_1:
  4187 000024BA 66FF35[A6780100]    <1> 	push	word [CURSOR_POSN] ; *
  4188                              <1> 
  4189                              <1> 	; ebp = string offset in system buffer (user buffer was copied to)
  4190                              <1> 	
  4191                              <1> 	; while(count--!=0)
  4192                              <1> 	;  {
  4193                              <1> 	;   car=read_byte(seg,offset++);
  4194                              <1> 	;   if((flag&0x02)!=0)
  4195                              <1> 	;    attr=read_byte(seg,offset++);
  4196                              <1> 	;    biosfn_write_teletype(car,page,attr,WITH_ATTR);
  4197                              <1> 	;  }
  4198                              <1> 
  4199                              <1> 	;push	eax ; **
  4200                              <1> 	;test	al, 2
  4201 000024C1 F605[18850100]02    <1> 	test	byte [w_str_cmd], 2
  4202 000024C8 751D                <1> 	jnz	short vga_wstr_3
  4203 000024CA 881D[B7780100]      <1> 	mov	[ccolor], bl
  4204                              <1> vga_wstr_2:
  4205 000024D0 51                  <1> 	push	ecx
  4206 000024D1 8A4500              <1> 	mov	al, [ebp]
  4207 000024D4 E88F0A0000          <1> 	call	vga_write_teletype
  4208 000024D9 59                  <1> 	pop	ecx
  4209 000024DA 6649                <1> 	dec	cx
  4210 000024DC 741E                <1> 	jz	short vga_wstr_4
  4211 000024DE 45                  <1> 	inc	ebp
  4212 000024DF 8A1D[B7780100]      <1> 	mov	bl, [ccolor]
  4213 000024E5 EBE9                <1> 	jmp	short vga_wstr_2
  4214                              <1> vga_wstr_3:
  4215 000024E7 51                  <1> 	push	ecx
  4216 000024E8 8A4500              <1> 	mov	al, [ebp]
  4217 000024EB 45                  <1> 	inc	ebp
  4218 000024EC 8A5D00              <1> 	mov	bl, [ebp]
  4219 000024EF E8740A0000          <1> 	call	vga_write_teletype
  4220 000024F4 59                  <1> 	pop	ecx
  4221 000024F5 6649                <1> 	dec	cx
  4222 000024F7 7403                <1> 	jz	short vga_wstr_4
  4223 000024F9 45                  <1> 	inc	ebp
  4224 000024FA EBEB                <1> 	jmp	short vga_wstr_3
  4225                              <1> vga_wstr_4:
  4226                              <1> 	; // Set back curs pos 
  4227                              <1> 	; if((flag&0x01)==0)
  4228                              <1> 	;  biosfn_set_cursor_pos(page,oldcurs);
  4229                              <1> 	; }
  4230                              <1> 	;pop	eax ; **
  4231 000024FC 665A                <1> 	pop	dx ; word [CURSOR_POSN] ; *
  4232                              <1> 	;test	al, 1
  4233 000024FE F605[18850100]01    <1> 	test	byte [w_str_cmd], 1
  4234                              <1> 	;jnz	VIDEO_RETURN
  4235                              <1> 	; 04/08/2022
  4236 00002505 7507                <1> 	jnz	short vga_wstr_5
  4237 00002507 668915[A6780100]    <1> 	mov 	[CURSOR_POSN], dx
  4238                              <1> vga_wstr_5:
  4239 0000250E E916F6FFFF          <1> 	jmp	VIDEO_RETURN
  4240                              <1> 
  4241                              <1> ; 03/08/2022 - TRDOS 386 Kernel v2.0.5
  4242                              <1> ; 07/07/2016
  4243                              <1> ; 27/06/2016 - TRDOS 386 (TRDOS v2.0)
  4244                              <1> ; VIDEO1.ASM - 24/03/1985 (IBM PC-AT BIOS source code)
  4245                              <1> ;------------------------------------------------------
  4246                              <1> ;  SCROLL UP
  4247                              <1> ;   THIS ROUTINE SCROLLS UP THE INFORMATION ON THE CRT
  4248                              <1> ; ENTRY ---
  4249                              <1> ;  CH,CL = UPPER LEFT CORNER OF REGION TO SCROLL
  4250                              <1> ;  DH,DL = LOWER RIGHT CORNER OF REGION TO SCROLL
  4251                              <1> ;   BOTH OF THE ABOVE ARE IN CHARACTER POSITIONS
  4252                              <1> ;  BH = FILL VALUE FOR BLANKED LINES
  4253                              <1> ;  AL = # LINES TO SCROLL (AL=0 MEANS BLANK THE ENTIRE FIELD)
  4254                              <1> ;  DS = DATA SEGMENT
  4255                              <1> ;  ES = REGEN SEGMENT
  4256                              <1> ; EXIT --
  4257                              <1> ;  NOTHING, THE SCREEN IS SCROLLED
  4258                              <1> ;--------------------------------------------------------
  4259                              <1> 
  4260                              <1> 	; cl = upper left column
  4261                              <1> 	; ch = upper left row
  4262                              <1> 	; dl = lower rigth column
  4263                              <1> 	; dh = lower right row
  4264                              <1> 	;
  4265                              <1> 	; al = line count (AL=0 means blank entire fields)
  4266                              <1> 	; bl = fill value for blanked lines	
  4267                              <1> 	; bh = unused
  4268                              <1> 
  4269                              <1> GRAPHICS_UP:
  4270                              <1> 	; 07/07/2016
  4271                              <1> 	; AH = Current video mode, [CRT_MODE]
  4272 00002513 80FC07              <1> 	cmp	ah, 7
  4273 00002516 7762                <1> 	ja	short vga_graphics_up
  4274                              <1> 	;je	n0
  4275                              <1> 
  4276 00002518 88C7                <1> 	mov	bh, al			; save line count in BH
  4277                              <1> 	;mov	ax, cx			; GET UPPER LEFT POSITION INTO AX REG
  4278                              <1> 	; 03/08/2022
  4279 0000251A 89C8                <1> 	mov	eax, ecx
  4280                              <1> 
  4281                              <1> ;-----	USE CHARACTER SUBROUTINE FOR POSITIONING
  4282                              <1> ;-----	ADDRESS RETURNED IS MULTIPLIED BY 2 FROM CORRECT VALUE
  4283                              <1> 
  4284 0000251C E8BA050000          <1> 	call	GRAPH_POSN
  4285                              <1> 	;movzx	edi, ax			; SAVE RESULT AS DESTINATION ADDRESS
  4286                              <1> 	; 03/08/2022
  4287 00002521 89C7                <1> 	mov	edi, eax
  4288                              <1> 
  4289                              <1> ;-----	DETERMINE SIZE OF WINDOW
  4290                              <1> 
  4291 00002523 6629CA              <1> 	sub	dx, cx
  4292 00002526 6681C20101          <1>         add     dx, 101h                ; ADJUST VALUES
  4293 0000252B C0E602              <1> 	sal	dh, 2			; MULTIPLY ROWS BY 4 AT 8 VERT DOTS/CHAR
  4294                              <1> 					; AND EVEN/ODD ROWS
  4295                              <1> ;-----	DETERMINE CRT MODE
  4296                              <1> 
  4297 0000252E 803D[BE670000]06    <1> 	cmp	byte [CRT_MODE], 6	; TEST FOR MEDIUM RES
  4298 00002535 7304                <1>         jnc	short _R7_              ; FIND_SOURCE
  4299                              <1> 
  4300                              <1> ;-----	MEDIUM RES UP
  4301 00002537 D0E2                <1> 	sal	dl, 1			; # COLUMNS * 2, SINCE 2 BYTES/CHAR
  4302                              <1> 	;sal	di, 1			; OFFSET *2 SINCE 2 BYTES/CHAR
  4303                              <1> 	; 03/08/2022
  4304 00002539 D1E7                <1> 	sal	edi, 1
  4305                              <1> 
  4306                              <1> ;-----	DETERMINE THE SOURCE ADDRESS IN THE BUFFER
  4307                              <1> _R7_:                                   ; FIND_SOURCE
  4308 0000253B 81C700800B00        <1> 	add	edi, 0B8000h
  4309 00002541 C0E702              <1> 	sal	bh, 2			; multiply number of lines by 4
  4310 00002544 7430                <1>         jz	short _R11              ; IF ZERO, THEN BLANK ENTIRE FIELD
  4311 00002546 B050                <1> 	mov	al, 80			; 80 BYTES/ROW
  4312 00002548 F6E7                <1> 	mul	bh			; determine offset to source
  4313                              <1> 	;movzx	esi, ax			; offset to source
  4314                              <1> 	; 03/08/2022
  4315 0000254A 89C6                <1> 	mov	esi, eax
  4316 0000254C 01FE                <1> 	add	esi, edi		; SET UP SOURCE
  4317 0000254E 88F4                <1> 	mov	ah, dh			; NUMBER OF ROWS IN FIELD
  4318 00002550 28FC                <1> 	sub	ah, bh			; determine number to move
  4319                              <1> 
  4320                              <1> ;-----	LOOP THROUGH, MOVING ONE ROW AT A TIME, BOTH EVEN AND ODD FIELDS
  4321                              <1> _R8:                                    ; ROW_LOOP
  4322 00002552 E8FD030000          <1>         call    _R17                    ; MOVE ONE ROW
  4323 00002557 6681EEB01F          <1> 	sub	si, 2000h-80		; MOVE TO NEXT ROW
  4324 0000255C 6681EFB01F          <1> 	sub	di, 2000h-80
  4325 00002561 FECC                <1> 	dec	ah			; NUMBER OF ROWS TO MOVE
  4326 00002563 75ED                <1>         jnz     short _R8               ; CONTINUE TILL ALL MOVED
  4327                              <1> 
  4328                              <1> ;-----	FILL IN THE VACATED LINE(S)
  4329                              <1> _R9:                                    ; CLEAR ENTRY
  4330 00002565 88D8                <1> 	mov	al, bl			; attribute to fill with
  4331                              <1> _R10_:
  4332 00002567 E804040000          <1>         call    _R18                    ; CLEAR THAT ROW
  4333 0000256C 6681EFB01F          <1> 	sub	di, 2000h-80		; POINT TO NEXT LINE
  4334 00002571 FECF                <1> 	dec	bh			; number of lines to fill
  4335 00002573 75F2                <1> 	jnz	short _R10_             ; CLEAR LOOP
  4336 00002575 C3                  <1> 	retn				; EVERYYHING DONE
  4337                              <1> 
  4338                              <1> _R11:                                   ; BLANK_FIELD
  4339 00002576 88F7                <1> 	mov	bh, dh			; set blank count to everything in field
  4340 00002578 EBEB                <1>         jmp     short _R9               ; CLEAR THE FIELD
  4341                              <1> 
  4342                              <1> vga_graphics_up:
  4343                              <1> 	; 03/08/2022 - TRDOS 386 Kertnel v2.0.5
  4344                              <1> 	; 12/04/2021
  4345                              <1> 	; 08/08/2016
  4346                              <1> 	; 07/08/2016
  4347                              <1> 	; 04/08/2016
  4348                              <1> 	; 01/08/2016
  4349                              <1> 	; 31/07/2016
  4350                              <1> 	; 07/07/2016 - TRDOS 386 (TRDOS v2.0)
  4351                              <1> 	;
  4352                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  4353                              <1> 	; vgabios-0.7a (2011)
  4354                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  4355                              <1> 	; 'vgabios.c', 'biosfn_scroll'
  4356                              <1> 	;
  4357                              <1> 
  4358                              <1> 	; cl = upper left column
  4359                              <1> 	; ch = upper left row
  4360                              <1> 	; dl = lower rigth column
  4361                              <1> 	; dh = lower right row
  4362                              <1> 	;
  4363                              <1> 	; al = line count (AL=0 means blank entire fields)
  4364                              <1> 	; bl = fill value for blanked lines	
  4365                              <1> 	; bh = unused
  4366                              <1> 	;
  4367                              <1> 	; ah = [CRT_MODE], current video mode	
  4368                              <1> 
  4369 0000257A 88C7                <1> 	mov	bh, al ; 31/07/2016
  4370 0000257C BE[E2670000]        <1> 	mov	esi, vga_g_modes
  4371 00002581 89F7                <1> 	mov	edi, esi
  4372 00002583 83C708              <1> 	add	edi, vga_g_mode_count
  4373                              <1> vga_g_up_0:
  4374 00002586 AC                  <1> 	lodsb
  4375 00002587 38E0                <1> 	cmp	al, ah ; [CRT_MODE]
  4376 00002589 7405                <1> 	je	short vga_g_up_1
  4377 0000258B 39FE                <1> 	cmp	esi, edi
  4378 0000258D 72F7                <1> 	jb	short vga_g_up_0
  4379                              <1> 	;xor	bh, bh ; 31/07/2016)
  4380 0000258F C3                  <1> 	retn	; nothing to do
  4381                              <1> vga_g_up_1:
  4382 00002590 88F8                <1> 	mov	al, bh ; 31/07/2016
  4383 00002592 83C64F              <1> 	add	esi, vga_g_memmodel - (vga_g_modes + 1)  
  4384                              <1> 	; [ESI] = VGA memory model number (LINEAR8, PLANAR4, PLANAR1)
  4385                              <1> 	
  4386                              <1> 	; if(rlr>=nbrows)rlr=nbrows-1;
  4387                              <1>  	; if(clr>=nbcols)clr=nbcols-1;
  4388                              <1>  	; if(nblines>nbrows)nblines=0;
  4389                              <1>  	; cols=clr-cul+1;
  4390                              <1> 
  4391 00002595 3A35[C6670000]      <1> 	cmp	dh, [VGA_ROWS]
  4392 0000259B 7208                <1> 	jb	short vga_g_up_2
  4393 0000259D 8A35[C6670000]      <1> 	mov	dh, [VGA_ROWS]
  4394 000025A3 FECE                <1> 	dec	dh
  4395                              <1> vga_g_up_2:
  4396 000025A5 3A15[C0670000]      <1> 	cmp	dl, [CRT_COLS]  ; = [VGA_COLS]
  4397 000025AB 7208                <1> 	jb	short vga_g_up_3
  4398 000025AD 8A15[C0670000]      <1> 	mov	dl, [CRT_COLS]
  4399 000025B3 FECA                <1> 	dec	dl
  4400                              <1> vga_g_up_3:	
  4401 000025B5 3A05[C6670000]      <1> 	cmp	al, [VGA_ROWS]
  4402 000025BB 7602                <1> 	jna	short vga_g_up_4
  4403 000025BD 28C0                <1> 	sub	al, al ; 0
  4404                              <1> vga_g_up_4:
  4405 000025BF 88D7                <1> 	mov	bh, dl ; clr
  4406 000025C1 28CF                <1> 	sub	bh, cl ; cul
  4407 000025C3 FEC7                <1> 	inc	bh ; cols = clr-cul+1
  4408                              <1> 
  4409 000025C5 20C0                <1> 	and	al, al ; nblines = 0
  4410 000025C7 7559                <1> 	jnz	short vga_g_up_6
  4411 000025C9 20ED                <1> 	and	ch, ch ; rul = 0
  4412 000025CB 7555                <1> 	jnz	short vga_g_up_6
  4413 000025CD 20C9                <1> 	and	cl, cl ; cul = 0
  4414 000025CF 7551                <1> 	jnz	short vga_g_up_6
  4415                              <1> 
  4416                              <1> 	;push	ax
  4417                              <1> 	; 12/04/2021
  4418 000025D1 50                  <1> 	push	eax
  4419 000025D2 A0[C6670000]        <1> 	mov	al, [VGA_ROWS]
  4420 000025D7 FEC8                <1> 	dec	al  
  4421 000025D9 38C6                <1> 	cmp	dh, al ; rlr = nbrows-1
  4422 000025DB 7545                <1> 	jne	short vga_g_up_5
  4423 000025DD A0[C0670000]        <1>         mov     al, [CRT_COLS]  ; = VGA_COLS
  4424 000025E2 FEC8                <1> 	dec	al 
  4425 000025E4 38C2                <1>  	cmp	dl, al ; clr = nbcols-1
  4426                              <1> 	;jne	short vga_g_up_5
  4427                              <1> 	;;pop	ax
  4428                              <1> 	; 12/04/2021
  4429 000025E6 58                  <1> 	pop	eax
  4430 000025E7 7539                <1> 	jne	short vga_g_up_5
  4431                              <1> 
  4432 000025E9 66B80502            <1> 	mov	ax, 0205h
  4433 000025ED 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  4434 000025F1 66EF                <1> 	out	dx, ax
  4435 000025F3 A0[C6670000]        <1> 	mov	al, [VGA_ROWS]
  4436 000025F8 8A25[C0670000]      <1> 	mov	ah, [CRT_COLS] ; = [VGA_COLS]
  4437 000025FE F6E4                <1> 	mul	ah
  4438 00002600 0FB7D0              <1> 	movzx	edx, ax
  4439                              <1> 	; 08/08/2016
  4440 00002603 0FB605[C2670000]    <1> 	movzx	eax, byte [CHAR_HEIGHT]
  4441 0000260A F7E2                <1> 	mul	edx
  4442                              <1> 	; eax = byte count	
  4443 0000260C 89C1                <1> 	mov	ecx, eax
  4444                              <1> 	;; 07/08/2016
  4445                              <1> 	;shl	dx, 3 ; * 8 ; * [CHAR_HEIGHT]
  4446                              <1> 	;mov	ecx, edx
  4447 0000260E 88D8                <1> 	mov	al, bl ; fill value for blanked lines
  4448 00002610 BF00000A00          <1> 	mov	edi, 0A0000h
  4449 00002615 F3AA                <1> 	rep	stosb		
  4450                              <1> 	
  4451                              <1> 	;mov	ax, 5
  4452                              <1> 	; 03/08/2022
  4453 00002617 30E4                <1> 	xor	ah, ah
  4454 00002619 B005                <1> 	mov	al, 5
  4455                              <1> 
  4456 0000261B 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  4457 0000261F 66EF                <1> 	out	dx, ax ; 0005h	
  4458                              <1> 
  4459 00002621 C3                  <1> 	retn
  4460                              <1> 
  4461                              <1> vga_g_up_5:
  4462                              <1> 	;;pop	ax
  4463                              <1> 	; 12/04/2021
  4464                              <1> 	;pop	eax
  4465                              <1> 
  4466                              <1> vga_g_up_6:
  4467                              <1> 	; [ESI] = VGA memory model number for current video mode
  4468                              <1>         ;
  4469                              <1>         ; LINEAR8 equ 5
  4470                              <1>         ; PLANAR4 equ 4
  4471                              <1>         ; PLANAR1 equ 3
  4472                              <1> 
  4473 00002622 803E04              <1> 	cmp	byte [esi], PLANAR4
  4474 00002625 7424                <1> 	je	short vga_g_up_planar
  4475 00002627 803E03              <1> 	cmp	byte [esi], PLANAR1
  4476 0000262A 741F                <1> 	je	short vga_g_up_planar
  4477                              <1> vga_g_up_linear8:
  4478                              <1> 	; 07/07/2016 (TEMPORARY)
  4479                              <1> 	;
  4480                              <1> 	; cl = upper left column ; cul
  4481                              <1> 	; ch = upper left row ; rul
  4482                              <1> 	; dl = lower rigth column ; clr
  4483                              <1> 	; dh = lower right row ; rlr
  4484                              <1> 
  4485                              <1> vga_g_up_l0:
  4486                              <1>  	;{for(i=rul;i<=rlr;i++)
  4487                              <1>   	; if((i+nblines>rlr)||(nblines==0))
  4488 0000262C 08C0                <1> 	or	al, al
  4489 0000262E 7414                <1> 	jz	short vga_g_up_l2
  4490 00002630 88C4                <1> 	mov	ah, al
  4491 00002632 00EC                <1> 	add	ah, ch ; i+nblines
  4492                              <1> 	;jc	short vga_g_up_l2	
  4493 00002634 38F4                <1> 	cmp	ah, dh
  4494 00002636 770C                <1> 	ja	short vga_g_up_l2
  4495                              <1> 	; else
  4496                              <1> 	;  vgamem_copy_pl4(cul,i+nblines,i,cols,nbcols,cheight);
  4497 00002638 E8F2000000          <1> 	call	vgamem_copy_l8
  4498                              <1> vga_g_up_l1:
  4499 0000263D FEC5                <1> 	inc	ch
  4500 0000263F 38F5                <1> 	cmp	ch, dh
  4501 00002641 76E9                <1> 	jna	short vga_g_up_l0
  4502 00002643 C3                  <1> 	retn
  4503                              <1> vga_g_up_l2:
  4504                              <1> 	; vgamem_fill_pl4(cul,i,cols,nbcols,cheight,attr);
  4505 00002644 E84C010000          <1> 	call	vgamem_fill_l8
  4506 00002649 EBF2                <1> 	jmp	short vga_g_up_l1
  4507                              <1> 
  4508                              <1> vga_g_up_planar:
  4509                              <1> 	; cl = upper left column ; cul
  4510                              <1> 	; ch = upper left row ; rul
  4511                              <1> 	; dl = lower rigth column ; clr
  4512                              <1> 	; dh = lower right row ; rlr
  4513                              <1> vga_g_up_pl0:
  4514                              <1>  	;{for(i=rul;i<=rlr;i++)
  4515                              <1>   	; if((i+nblines>rlr)||(nblines==0))
  4516 0000264B 20C0                <1> 	and	al, al
  4517 0000264D 7414                <1> 	jz	short vga_g_up_pl2	
  4518 0000264F 88C4                <1> 	mov	ah, al
  4519 00002651 00EC                <1> 	add	ah, ch ; i+nblines
  4520                              <1> 	;jc	short vga_g_up_pl2
  4521 00002653 38F4                <1> 	cmp	ah, dh
  4522 00002655 770C                <1> 	ja	short vga_g_up_pl2
  4523                              <1> 	; else
  4524                              <1> 	;  vgamem_copy_pl4(cul,i+nblines,i,cols,nbcols,cheight);
  4525 00002657 E80E000000          <1> 	call	vgamem_copy_pl4
  4526                              <1> vga_g_up_pl1:
  4527 0000265C FEC5                <1> 	inc	ch 
  4528 0000265E 38F5                <1> 	cmp	ch, dh
  4529 00002660 76E9                <1> 	jna	short vga_g_up_pl0
  4530 00002662 C3                  <1> 	retn
  4531                              <1> vga_g_up_pl2:
  4532                              <1> 	; vgamem_fill_pl4(cul,i,cols,nbcols,cheight,attr);
  4533 00002663 E870000000          <1> 	call	vgamem_fill_pl4
  4534 00002668 EBF2                <1> 	jmp	short vga_g_up_pl1
  4535                              <1> 
  4536                              <1> vgamem_copy_pl4:
  4537                              <1> 	; 08/08/2016
  4538                              <1> 	; 07/08/2016
  4539                              <1> 	; 07/07/2016 - TRDOS 386 (TRDOS v2.0)
  4540                              <1> 	;
  4541                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  4542                              <1> 	; vgabios-0.7a (2011)
  4543                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  4544                              <1> 	; 'vgabios.c', 'vgamem_copy_pl4'
  4545                              <1> 	;
  4546                              <1> 	; vgamem_copy_pl4(xstart,ysrc,ydest,cols,nbcols,cheight)
  4547                              <1> 	; cl = xstart, ah = ysrc (i+nblines), ch = ydest (i),
  4548                              <1> 	; bh = cols, [CRT_COLS] = nbcols, [CHAR_HEIGHT] = cheight
  4549                              <1> 
  4550                              <1> 	; src=ysrc*cheight*nbcols+xstart;
  4551                              <1> 	; dest=ydest*cheight*nbcols+xstart;
  4552                              <1> 
  4553 0000266A 52                  <1> 	push	edx
  4554 0000266B 50                  <1> 	push	eax
  4555                              <1> 
  4556                              <1> 	; outw(VGAREG_GRDC_ADDRESS, 0x0105)
  4557 0000266C 66B80501            <1> 	mov	ax, 0105h
  4558 00002670 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  4559 00002674 66EF                <1> 	out	dx, ax
  4560                              <1> 
  4561                              <1> 	; 07/08/2016
  4562                              <1>  	;mov     ah, [esp+1]
  4563                              <1> 	;movzx	edx, ah ; ysrc
  4564 00002676 0FB6542401          <1> 	movzx	edx, byte [esp+1]
  4565                              <1> 	; 08/08/2016
  4566 0000267B 0FB605[C2670000]    <1> 	movzx	eax, byte [CHAR_HEIGHT]
  4567 00002682 8A25[C0670000]      <1> 	mov	ah, [CRT_COLS] ; nbcols
  4568 00002688 F6E4                <1> 	mul	ah 
  4569                              <1> 	;; 07/08/2016
  4570                              <1> 	;movzx	eax, byte [CRT_COLS]
  4571                              <1> 	;shl	ax, 3 ; * 8 ; * [CHAR_HEIGHT]
  4572 0000268A 50                  <1> 	push	eax ; cheight * nbcols
  4573 0000268B F7E2                <1> 	mul	edx ; * ysrc
  4574                              <1> 	; eax = ysrc * cheight * nbcols
  4575                              <1> 	; edx = 0
  4576 0000268D 88CA                <1> 	mov	dl, cl ; edx = xstart	
  4577 0000268F 01D0                <1>  	add	eax, edx
  4578 00002691 89C6                <1> 	mov	esi, eax ; src
  4579 00002693 88EA                <1> 	mov	dl, ch ; ydest
  4580 00002695 58                  <1> 	pop	eax ; cheight * nbcols
  4581 00002696 F7E2                <1> 	mul	edx
  4582                              <1> 	; eax = ydest * cheight * nbcols
  4583 00002698 88CA                <1> 	mov	dl, cl ; edx = xstart	
  4584 0000269A 01D0                <1>  	add	eax, edx
  4585 0000269C 89C7                <1> 	mov	edi, eax ; dest
  4586                              <1> 	; esi = src
  4587                              <1> 	; edi = dest
  4588                              <1> 	; for(i=0;i<cheight;i++)
  4589                              <1>   	; {
  4590                              <1>    	;  memcpyb(0xa000,dest+i*nbcols,0xa000,src+i*nbcols,cols);
  4591                              <1>   	; }
  4592 0000269E 51                  <1> 	push	ecx
  4593 0000269F B900000A00          <1> 	mov	ecx, 0A0000h
  4594 000026A4 01CE                <1> 	add	esi, ecx
  4595 000026A6 01CF                <1> 	add	edi, ecx
  4596                              <1> 	; 08/08/2016
  4597 000026A8 8A35[C2670000]      <1> 	mov	dh, [CHAR_HEIGHT]
  4598                              <1> 	;; 07/08/2016
  4599                              <1> 	;mov	dh, 8 ; 07/08/2016
  4600 000026AE 28D2                <1> 	sub	dl, dl ; i
  4601                              <1> vgamem_copy_pl4_0:
  4602 000026B0 56                  <1> 	push	esi
  4603 000026B1 57                  <1> 	push	edi
  4604 000026B2 0FB605[C0670000]    <1> 	movzx	eax, byte [CRT_COLS]
  4605 000026B9 F6E2                <1> 	mul	dl
  4606                              <1> 	; eax = i * nbcols
  4607 000026BB 01C7                <1> 	add	edi, eax ; dest+i*nbcols
  4608 000026BD 01C6                <1> 	add	esi, eax
  4609 000026BF 0FB6CF              <1> 	movzx	ecx, bh ; cols
  4610 000026C2 F3A4                <1> 	rep	movsb
  4611 000026C4 5F                  <1> 	pop	edi
  4612 000026C5 5E                  <1> 	pop	esi
  4613 000026C6 FECE                <1> 	dec	dh
  4614 000026C8 75E6                <1> 	jnz	short vgamem_copy_pl4_0
  4615                              <1> vgamem_copy_pl4_1:
  4616 000026CA 59                  <1> 	pop	ecx
  4617                              <1> 
  4618                              <1> 	; outw(VGAREG_GRDC_ADDRESS, 0x0005);
  4619 000026CB 66B80500            <1> 	mov	ax, 0005h
  4620 000026CF 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  4621 000026D3 66EF                <1> 	out	dx, ax
  4622                              <1> 
  4623 000026D5 58                  <1> 	pop	eax
  4624 000026D6 5A                  <1> 	pop	edx
  4625                              <1> 
  4626 000026D7 C3                  <1> 	retn	
  4627                              <1> 
  4628                              <1> vgamem_fill_pl4:
  4629                              <1> 	; 08/08/2016
  4630                              <1> 	; 07/08/2016
  4631                              <1> 	; 04/08/2016
  4632                              <1> 	; 07/07/2016 - TRDOS 386 (TRDOS v2.0)
  4633                              <1> 	;
  4634                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  4635                              <1> 	; vgabios-0.7a (2011)
  4636                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  4637                              <1> 	; 'vgabios.c', 'vgamem_fill_pl4'
  4638                              <1> 	;
  4639                              <1> 	; vgamem_fill_pl4(xstart,ystart,cols,nbcols,cheight,attr)
  4640                              <1> 	; cl = xstart, edi = ch = ystart, bh = cols,
  4641                              <1> 	; [CRT_COLS] = nbcols, [CHAR_HEIGHT] = cheight, attr = 0
  4642                              <1> 
  4643                              <1> 	; dest=ystart*cheight*nbcols+xstart;
  4644 000026D8 52                  <1> 	push	edx
  4645 000026D9 50                  <1> 	push	eax
  4646                              <1> 
  4647                              <1> 	; outw(VGAREG_GRDC_ADDRESS, 0x0205)
  4648 000026DA 66B80502            <1> 	mov	ax, 0205h
  4649 000026DE 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  4650 000026E2 66EF                <1> 	out	dx, ax
  4651                              <1> 
  4652                              <1>       	; 08/08/2016
  4653 000026E4 0FB605[C2670000]    <1> 	movzx   eax, byte [CHAR_HEIGHT]
  4654 000026EB F6E5                <1> 	mul	ch
  4655                              <1> 	;; 07/08/2016
  4656                              <1> 	;movzx	eax, ch
  4657                              <1> 	;shl	ax, 3 ; * 8 ; * [CHAR_HEIGHT]
  4658 000026ED 0FB615[C0670000]    <1> 	movzx	edx, byte [CRT_COLS] ; = [VGA_COLS]
  4659 000026F4 F7E2                <1> 	mul	edx
  4660                              <1> 	; edx  = 0
  4661 000026F6 88CA                <1> 	mov	dl, cl 
  4662 000026F8 01D0                <1> 	add	eax, edx
  4663 000026FA 89C7                <1> 	mov	edi, eax
  4664                              <1> 	; edi = dest
  4665                              <1> 	; for(i=0;i<cheight;i++)
  4666                              <1>   	; {
  4667                              <1>    	;  memsetb(0xa000,dest+i*nbcols,attr,cols);
  4668                              <1>   	; }
  4669 000026FC 81C700000A00        <1> 	add	edi, 0A0000h
  4670 00002702 51                  <1> 	push	ecx
  4671                              <1> 	; 08/08/2016
  4672 00002703 8A35[C2670000]      <1> 	mov	dh, [CHAR_HEIGHT]
  4673                              <1> 	;; 07/08/2016
  4674                              <1> 	;mov	dh, 8 ; 07/08/2016
  4675 00002709 28D2                <1> 	sub	dl, dl ; i
  4676                              <1> vgamem_fill_pl4_0:
  4677 0000270B 57                  <1> 	push	edi
  4678 0000270C 0FB605[C0670000]    <1> 	movzx	eax, byte [CRT_COLS]
  4679 00002713 F6E2                <1> 	mul	dl
  4680                              <1> 	; eax = i * nbcols
  4681 00002715 01C7                <1> 	add	edi, eax ; dest+i*nbcols
  4682 00002717 88D8                <1> 	mov	al, bl ; attr ; 04/08/2016
  4683 00002719 0FB6CF              <1> 	movzx	ecx, bh ; cols
  4684 0000271C F3AA                <1>  	rep	stosb
  4685 0000271E 5F                  <1> 	pop	edi
  4686 0000271F 75EA                <1> 	jnz	short vgamem_fill_pl4_0
  4687                              <1> vgamem_fill_pl4_1:
  4688 00002721 59                  <1> 	pop	ecx
  4689                              <1> 
  4690                              <1> 	; outw(VGAREG_GRDC_ADDRESS, 0x0005);
  4691 00002722 66B80500            <1> 	mov	ax, 0005h
  4692 00002726 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  4693 0000272A 66EF                <1> 	out	dx, ax
  4694                              <1> 
  4695 0000272C 58                  <1> 	pop	eax
  4696 0000272D 5A                  <1> 	pop	edx 
  4697                              <1> 	
  4698 0000272E C3                  <1> 	retn
  4699                              <1> 
  4700                              <1> vgamem_copy_l8:
  4701                              <1> 	; 02/08/2022 - TRDOS 386 Kernel v2.0.5
  4702                              <1> 	; 08/08/2016
  4703                              <1> 	; 07/08/2016
  4704                              <1> 	; 06/08/2016
  4705                              <1> 	; 07/07/2016 - TRDOS 386 (TRDOS v2.0)
  4706                              <1> 	;
  4707                              <1> 	; TEMPORARY
  4708                              <1> 	;
  4709                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  4710                              <1> 	; vgabios-0.7a (2011)
  4711                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  4712                              <1> 	; 'vgabios.c', 'vgamem_copy_pl4'
  4713                              <1> 	;
  4714                              <1> 	; vgamem_copy_pl4(xstart,ysrc,ydest,cols,nbcols,cheight)
  4715                              <1> 	; cl = xstart, ah = ysrc (i+nblines), ch = ydest (i),
  4716                              <1> 	; bh = cols, [CRT_COLS] = nbcols, [CHAR_HEIGHT] = cheight
  4717                              <1> 
  4718                              <1> 	; src=ysrc*cheight*nbcols+xstart;
  4719                              <1> 	; dest=ydest*cheight*nbcols+xstart;
  4720                              <1> 
  4721 0000272F 52                  <1> 	push	edx
  4722 00002730 50                  <1> 	push	eax
  4723                              <1> 
  4724                              <1> 	; outw(VGAREG_GRDC_ADDRESS, 0x0105)
  4725                              <1> 	;mov	ax, 0105h
  4726                              <1> 	;mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  4727                              <1> 	;out	dx, ax
  4728                              <1> 
  4729                              <1> 	;mov	ah, [esp+1]
  4730                              <1> 
  4731 00002731 0FB6D4              <1> 	movzx	edx, ah ; ysrc
  4732                              <1> 	; 08/08/2016
  4733 00002734 0FB605[C2670000]    <1> 	movzx	eax, byte [CHAR_HEIGHT]
  4734 0000273B 8A25[C0670000]      <1> 	mov	ah, [CRT_COLS] ; nbcols
  4735 00002741 F6E4                <1> 	mul	ah 
  4736                              <1> 	;; 07/08/2016
  4737                              <1> 	;movzx	eax, byte [CRT_COLS]
  4738                              <1> 	;shl	ax, 3 ; * 8 ; * [CHAR_HEIGHT]
  4739 00002743 50                  <1> 	push	eax ; cheight * nbcols
  4740 00002744 F7E2                <1> 	mul	edx ; * ysrc
  4741                              <1> 	; eax = ysrc * cheight * nbcols
  4742                              <1> 	; edx = 0
  4743 00002746 88CA                <1> 	mov	dl, cl ; edx = xstart
  4744 00002748 01D0                <1>  	add	eax, edx
  4745 0000274A 89C6                <1> 	mov	esi, eax ; src
  4746                              <1> 	;shl	si, 3 ; * 8 ; 06/08/2016
  4747                              <1> 	; 02/08/2022
  4748 0000274C C1E603              <1> 	shl	esi, 3
  4749 0000274F 88EA                <1> 	mov	dl, ch ; ydest
  4750 00002751 58                  <1> 	pop	eax ; cheight * nbcols
  4751 00002752 F7E2                <1> 	mul	edx
  4752                              <1> 	; eax = ydest * cheight * nbcols
  4753 00002754 88CA                <1> 	mov	dl, cl ; edx = xstart	
  4754 00002756 01D0                <1>  	add	eax, edx
  4755 00002758 89C7                <1> 	mov	edi, eax ; dest
  4756                              <1> 	;shl	di, 3 ; * 8 ; 06/08/2016
  4757                              <1> 	; 02/08/2022
  4758 0000275A C1E703              <1> 	shl	edi, 3
  4759                              <1> 	; esi = src
  4760                              <1> 	; edi = dest
  4761                              <1> 	; for(i=0;i<cheight;i++)
  4762                              <1>   	; {
  4763                              <1>    	;  memcpyb(0xa000,dest+i*nbcols,0xa000,src+i*nbcols,cols);
  4764                              <1>   	; }
  4765 0000275D 51                  <1> 	push	ecx
  4766 0000275E B900000A00          <1> 	mov	ecx, 0A0000h
  4767 00002763 01CE                <1> 	add	esi, ecx
  4768 00002765 01CF                <1> 	add	edi, ecx
  4769                              <1> 	; 08/08/2016
  4770 00002767 8A35[C2670000]      <1> 	mov	dh, [CHAR_HEIGHT]
  4771                              <1> 	;; 07/08/2016
  4772                              <1> 	;mov	dh, 8 ; 07/08/2016
  4773 0000276D 28D2                <1> 	sub	dl, dl ; i
  4774                              <1> vgamem_copy_l8_0:
  4775 0000276F 56                  <1> 	push	esi
  4776 00002770 57                  <1> 	push	edi
  4777 00002771 0FB605[C0670000]    <1> 	movzx	eax, byte [CRT_COLS]
  4778 00002778 F6E2                <1> 	mul	dl
  4779                              <1> 	; eax = i * nbcols
  4780                              <1> 	;shl	ax, 3 ; * 8 ; 06/08/2016
  4781                              <1> 	; 02/08/2022
  4782 0000277A C1E003              <1> 	shl	eax, 3
  4783 0000277D 01C7                <1> 	add	edi, eax ; dest+i*nbcols
  4784 0000277F 01C6                <1> 	add	esi, eax
  4785 00002781 0FB6CF              <1> 	movzx	ecx, bh ; cols
  4786                              <1> 	;shl	cx, 3 ; * 8 ; 06/08/2016
  4787                              <1> 	; 02/08/2022
  4788 00002784 C1E103              <1> 	shl	ecx, 3
  4789 00002787 F3A4                <1> 	rep	movsb
  4790 00002789 5F                  <1> 	pop	edi
  4791 0000278A 5E                  <1> 	pop	esi
  4792 0000278B FEC2                <1> 	inc	dl ; 06/08/2016
  4793 0000278D FECE                <1> 	dec	dh
  4794 0000278F 75DE                <1> 	jnz	short vgamem_copy_l8_0
  4795                              <1> vgamem_copy_l8_1:
  4796 00002791 59                  <1> 	pop	ecx
  4797                              <1> 
  4798                              <1> 	;; outw(VGAREG_GRDC_ADDRESS, 0x0005);
  4799                              <1> 	;mov	ax, 0005h
  4800                              <1> 	;mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  4801                              <1> 	;out	dx, ax
  4802                              <1> 
  4803 00002792 58                  <1> 	pop	eax
  4804 00002793 5A                  <1> 	pop	edx
  4805                              <1> 
  4806 00002794 C3                  <1> 	retn
  4807                              <1> 
  4808                              <1> vgamem_fill_l8:
  4809                              <1> 	; 02/08/2022 - TRDOS 386 Kernel v2.0.5
  4810                              <1> 	; 08/08/2016
  4811                              <1> 	; 07/08/2016
  4812                              <1> 	; 06/08/2016
  4813                              <1> 	; 04/08/2016
  4814                              <1> 	; 07/07/2016 - TRDOS 386 (TRDOS v2.0)
  4815                              <1> 	;
  4816                              <1> 	; TEMPORARY
  4817                              <1> 	;
  4818                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  4819                              <1> 	; vgabios-0.7a (2011)
  4820                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  4821                              <1> 	; 'vgabios.c', 'vgamem_fill_pl4'
  4822                              <1> 	;
  4823                              <1> 	; vgamem_fill_pl4(xstart,ystart,cols,nbcols,cheight,attr)
  4824                              <1> 	; cl = xstart, edi = ch = ystart, bh = cols,
  4825                              <1> 	; [CRT_COLS] = nbcols, [CHAR_HEIGHT] = cheight, attr = 0
  4826                              <1> 
  4827                              <1> 	; dest=ystart*cheight*nbcols+xstart;
  4828 00002795 52                  <1> 	push	edx
  4829 00002796 50                  <1> 	push	eax
  4830                              <1> 
  4831                              <1> 	;; outw(VGAREG_GRDC_ADDRESS, 0x0205)
  4832                              <1> 	;mov	ax, 0205h
  4833                              <1> 	;mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  4834                              <1> 	;out	dx, ax
  4835                              <1> 
  4836                              <1>         ; 08/08/2016
  4837 00002797 0FB605[C2670000]    <1> 	movzx   eax, byte [CHAR_HEIGHT]
  4838 0000279E F6E5                <1> 	mul	ch
  4839                              <1> 	;; 07/08/2016
  4840                              <1> 	;movzx	eax, ch
  4841                              <1> 	;shl	ax, 3 ; * 8 ; * [CHAR_HEIGHT]
  4842 000027A0 0FB615[C0670000]    <1> 	movzx	edx, byte [CRT_COLS] ; = [VGA_COLS]
  4843 000027A7 F7E2                <1> 	mul	edx
  4844                              <1> 	; edx  = 0
  4845 000027A9 88CA                <1> 	mov	dl, cl 
  4846 000027AB 01D0                <1> 	add	eax, edx
  4847 000027AD 89C7                <1> 	mov	edi, eax
  4848                              <1> 	;shl	di, 3 ; * 8 ; 06/08/2016
  4849                              <1> 	; 02/08/2022
  4850 000027AF C1E703              <1> 	shl	edi, 3
  4851                              <1> 	; edi = dest
  4852                              <1> 	; for(i=0;i<cheight;i++)
  4853                              <1>   	; {
  4854                              <1>    	;  memsetb(0xa000,dest+i*nbcols,attr,cols);
  4855                              <1>   	; }
  4856 000027B2 81C700000A00        <1> 	add	edi, 0A0000h
  4857 000027B8 51                  <1> 	push	ecx
  4858                              <1> 	; 08/08/2016
  4859 000027B9 8A35[C2670000]      <1> 	mov	dh, [CHAR_HEIGHT]
  4860                              <1> 	;; 07/08/2016
  4861                              <1> 	;mov	dh, 8 ; 07/08/2016
  4862 000027BF 28D2                <1> 	sub	dl, dl ; i
  4863                              <1> vgamem_fill_l8_0:
  4864 000027C1 57                  <1> 	push	edi
  4865 000027C2 0FB605[C0670000]    <1> 	movzx	eax, byte [CRT_COLS]
  4866 000027C9 F6E2                <1> 	mul	dl
  4867                              <1> 	; eax = i * nbcols
  4868                              <1> 	;shl	ax, 3 ; * 8 ; 06/08/2016
  4869                              <1> 	; 02/08/2022
  4870 000027CB C1E003              <1> 	shl	eax, 3
  4871 000027CE 01C7                <1> 	add	edi, eax ; dest+i*nbcols
  4872 000027D0 88D8                <1> 	mov	al, bl ; attr ; 04/08/2016
  4873 000027D2 0FB6CF              <1> 	movzx	ecx, bh ; cols
  4874                              <1> 	;shl	cx, 3 ; * 8 ; 06/08/2016
  4875                              <1>  	; 02/08/2022
  4876 000027D5 C1E103              <1> 	shl	ecx, 3
  4877 000027D8 F3AA                <1> 	rep	stosb
  4878 000027DA 5F                  <1> 	pop	edi
  4879 000027DB FEC2                <1> 	inc	dl ; 06/08/2016
  4880 000027DD FECE                <1> 	dec	dh
  4881 000027DF 75E0                <1> 	jnz	short vgamem_fill_l8_0
  4882                              <1> vgamem_fill_l8_1:
  4883 000027E1 59                  <1> 	pop	ecx
  4884                              <1> 
  4885                              <1> 	;; outw(VGAREG_GRDC_ADDRESS, 0x0005);
  4886                              <1> 	;mov	ax, 0005h
  4887                              <1> 	;mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  4888                              <1> 	;out	dx, ax
  4889                              <1> 
  4890 000027E2 58                  <1> 	pop	eax
  4891 000027E3 5A                  <1> 	pop	edx 
  4892                              <1> 
  4893 000027E4 C3                  <1> 	retn
  4894                              <1> 
  4895                              <1> ; 03/08/2022 - TRDOS 386 Kernel V2.0.5
  4896                              <1> ; 07/07/2016
  4897                              <1> ; 27/06/2016 - TRDOS 386 (TRDOS v2.0)
  4898                              <1> ; VIDEO1.ASM - 24/03/1985 (IBM PC-AT BIOS source code)
  4899                              <1> ;------------------------------------------------------
  4900                              <1> ; SCROLL DOWN
  4901                              <1> ;  THIS ROUTINE SCROLLS DOWN THE INFORMATION ON THE CRT
  4902                              <1> ; ENTRY --
  4903                              <1> ;  CH,CL = UPPER LEFT CORNER OF REGION TO SCROLL
  4904                              <1> ;  DH,DL = LOWER RIGHT CORNER OF REGION TO SCROLL
  4905                              <1> ;   BOTH OF THE ABOVE ARE IN CHARACTER POSITIONS
  4906                              <1> ;  BH = FILL VALUE FOR BLANKED LINES
  4907                              <1> ;  AL = # LINES TO SCROLL (AL=0 MEANS BLANK THE ENTIRE FIELD)
  4908                              <1> ;  DS = DATA SEGMENT
  4909                              <1> ;  ES = REGEN SEGMENT
  4910                              <1> ; EXIT --
  4911                              <1> ;  NOTHING, THE SCREEN IS SCROLLED
  4912                              <1> ;--------------------------------------------------------
  4913                              <1> 
  4914                              <1> 	; cl = upper left column
  4915                              <1> 	; ch = upper left row
  4916                              <1> 	; dl = lower rigth column
  4917                              <1> 	; dh = lower right row
  4918                              <1> 	;
  4919                              <1> 	; al = line count (AL=0 means blank entire fields)
  4920                              <1> 	; bl = fill value for blanked lines	
  4921                              <1> 	; bh = unused
  4922                              <1> 
  4923                              <1> GRAPHICS_DOWN:
  4924                              <1> 	; 07/07/2016
  4925                              <1> 	; ah = Current video mode, [CRT_MODE]
  4926                              <1> 	; std				; SET DIRECTION
  4927 000027E5 80FC07              <1> 	cmp	ah, 7
  4928 000027E8 7769                <1>         ja	short vga_graphics_down ; 03/08/2022
  4929                              <1> 	;je	_n0
  4930                              <1> 
  4931 000027EA 88C7                <1> 	mov	bh, al			; save line count in BH
  4932                              <1> 	;mov	ax, dx			; GET LOWER RIGHT POSITION INTO AX REG
  4933                              <1> 	; 03/08/2022
  4934 000027EC 89D0                <1> 	mov	eax, edx
  4935                              <1> 
  4936                              <1> ;-----	USE CHARACTER SUBROUTINE FOR POSITIONING
  4937                              <1> ;-----	ADDRESS RETURNED IS MULTIPLIED BY 2 FROM CORRECT VALUE
  4938                              <1> 
  4939 000027EE E8E8020000          <1> 	call	GRAPH_POSN
  4940                              <1> 	;movzx	edi, ax			; SAVE RESULT AS DESTINATION ADDRESS
  4941                              <1> 	; 03/08/2022
  4942 000027F3 89C7                <1> 	mov	edi, eax
  4943                              <1> 
  4944                              <1> ;-----	DETERMINE SIZE OF WINDOW
  4945                              <1> 
  4946 000027F5 6629CA              <1> 	sub	dx, cx
  4947 000027F8 6681C20101          <1>         add     dx, 101h                ; ADJUST VALUES
  4948 000027FD C0E602              <1> 	sal	dh, 2			; MULTIPLY ROWS BY 4 AT 8 VERT DOTS/CHAR
  4949                              <1> 					; AND EVEN/ODD ROWS
  4950                              <1> ;-----	DETERMINE CRT MODE
  4951                              <1> 
  4952 00002800 803D[BE670000]06    <1> 	cmp	byte [CRT_MODE], 6	; TEST FOR MEDIUM RES
  4953 00002807 7305                <1> 	jnc	short _R12              ; FIND_SOURCE_DOWN
  4954                              <1> 
  4955                              <1> ;-----	MEDIUM RES DOWN
  4956 00002809 D0E2                <1> 	sal	dl, 1			; # COLUMNS * 2, SINCE 2 BYTES/CHAR
  4957                              <1> 	;sal	di, 1			; OFFSET *2 SINCE 2 BYTES/CHAR
  4958                              <1> 	; 03/08/2022
  4959 0000280B D1E7                <1> 	sal	edi, 1
  4960                              <1> 	;inc	di			; POINT TO LAST BYTE
  4961                              <1> 	; 03/08/2022
  4962 0000280D 47                  <1> 	inc	edi
  4963                              <1> 
  4964                              <1> ;-----	DETERMINE THE SOURCE ADDRESS IN THE BUFFER
  4965                              <1> 
  4966                              <1> _R12:                                   ; FIND_SOURCE_DOWN
  4967 0000280E 81C700800B00        <1> 	add	edi, 0B8000h		
  4968 00002814 6681C7F000          <1> 	add	di, 240			; POINT TO LAST ROW OF PIXELS
  4969 00002819 C0E702              <1> 	sal	bh, 2			; multiply number of lines by 4
  4970 0000281C 74(06)              <1> 	jz	short 6			; IF ZERO, THEN BLANK ENTIRE FIELD
  4971 0000281E B050                <1> 	mov	al, 80			; 80 BYTES/ROW
  4972 00002820 F6E7                <1> 	mul	bh			; determine offset to source
  4973 00002822 89FE                <1> 	mov	esi, edi		; SET UP SOURCE
  4974                              <1> 	;sub	si, ax			; SUBTRACT THE OFFSET
  4975                              <1> 	; 03/08/2022
  4976 00002824 29C6                <1> 	sub	esi, eax
  4977 00002826 88F4                <1> 	mov	ah, dh			; NUMBER OF ROWS IN FIELD
  4978 00002828 28FC                <1> 	sub	ah, bh			; determine number to move
  4979                              <1> 
  4980                              <1> ;-----	LOOP THROUGH, MOVING ONE ROW AT A TIME, BOTH EVEN AND ODD FIELDS
  4981                              <1> 
  4982                              <1> _R13:                                   ; ROW_LOOP_DOWN
  4983 0000282A E825010000          <1>         call    _R17                    ; MOVE ONE ROW
  4984 0000282F 6681EE5020          <1> 	sub	si, 2000h+80		; MOVE TO NEXT ROW
  4985 00002834 6681EF5020          <1> 	sub	di, 2000h+80
  4986 00002839 FECC                <1> 	dec	ah			; NUMBER OF ROWS TO MOVE
  4987 0000283B 75ED                <1> 	jnz	short _R13              ; CONTINUE TILL ALL MOVED
  4988                              <1> 
  4989                              <1> ;-----	FILL IN THE VACATED LINE(S)
  4990                              <1> _R14:                                   ; CLEAR_ENTRY_DOWN
  4991 0000283D 88D8                <1> 	mov	al, bl			; attribute to fill with
  4992                              <1> _R15_:                                  ; CLEAR_LOOP_DOWN
  4993 0000283F E82C010000          <1> 	call	_R18			; CLEAR A ROW
  4994 00002844 6681EF5020          <1> 	sub	di, 2000h+80		; POINT TO NEXT LINE
  4995 00002849 FECF                <1> 	dec	bh			; number of lines to fill
  4996 0000284B 75F2                <1>         jnz	short _R15_             ; CLEAR_LOOP_DOWN
  4997                              <1> 	; 18/11/2020
  4998 0000284D FC                  <1> 	cld				; RESET THE DIRECTION FLAG
  4999                              <1> 	
  5000 0000284E C3                  <1> 	retn				; EVERYTHING DONE
  5001                              <1> 
  5002                              <1> _R16:                                   ; BLANK_FIELD_DOWN
  5003 0000284F 88F7                <1> 	mov	bh, dh			; set blank count to everything in field
  5004 00002851 EBEA                <1>         jmp     short _R14              ; CLEAR THE FIELD
  5005                              <1> 
  5006                              <1> vga_graphics_down:
  5007                              <1> 	; 03/08/2022 - TRDOS 386 Kertnel v2.0.5
  5008                              <1> 	; 12/04/2021
  5009                              <1> 	; 08/08/2016
  5010                              <1> 	; 07/08/2016
  5011                              <1> 	; 31/07/2016
  5012                              <1> 	; 07/07/2016 - TRDOS 386 (TRDOS v2.0)
  5013                              <1> 	;
  5014                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  5015                              <1> 	; vgabios-0.7a (2011)
  5016                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  5017                              <1> 	; 'vgabios.c', 'biosfn_scroll'
  5018                              <1> 	;
  5019                              <1> 
  5020                              <1> 	; cl = upper left column
  5021                              <1> 	; ch = upper left row
  5022                              <1> 	; dl = lower rigth column
  5023                              <1> 	; dh = lower right row
  5024                              <1> 	;
  5025                              <1> 	; al = line count (AL=0 means blank entire fields)
  5026                              <1> 	; bl = fill value for blanked lines	
  5027                              <1> 	; bh = unused
  5028                              <1> 	;
  5029                              <1> 	; ah = [CRT_MODE], current video mode	
  5030                              <1> 
  5031 00002853 FC                  <1>         cld     ; !!! Clear direction flag !!! 
  5032                              <1> 
  5033 00002854 88C7                <1> 	mov	bh, al ; 31/07/2016
  5034                              <1> 
  5035 00002856 BE[DA670000]        <1> 	mov	esi, vga_modes
  5036 0000285B 89F7                <1> 	mov	edi, esi
  5037 0000285D 83C710              <1> 	add	edi, vga_mode_count
  5038                              <1> vga_g_down_0:
  5039 00002860 AC                  <1> 	lodsb
  5040 00002861 38E0                <1> 	cmp	al, ah ; [CRT_MODE]
  5041 00002863 7405                <1> 	je	short vga_g_down_1
  5042 00002865 39FE                <1> 	cmp	esi, edi
  5043 00002867 72F7                <1> 	jb	short vga_g_down_0
  5044                              <1> 	; xor 	bh, bh	; 31/07/2016
  5045 00002869 C3                  <1> 	retn	; nothing to do
  5046                              <1> vga_g_down_1:
  5047 0000286A 88F8                <1> 	mov	al, bh ; 31/07/2016
  5048 0000286C 83C64F              <1> 	add	esi, vga_memmodel - (vga_modes + 1)  
  5049                              <1> 	; [ESI] = VGA memory model number (LINEAR8, PLANAR4, PLANAR1)
  5050                              <1> 	
  5051                              <1> 	; if(rlr>=nbrows)rlr=nbrows-1;
  5052                              <1>  	; if(clr>=nbcols)clr=nbcols-1;
  5053                              <1>  	; if(nblines>nbrows)nblines=0;
  5054                              <1>  	; cols=clr-cul+1;
  5055                              <1> 
  5056 0000286F 3A35[C6670000]      <1> 	cmp	dh, [VGA_ROWS]
  5057 00002875 7208                <1> 	jb	short vga_g_down_2
  5058 00002877 8A35[C6670000]      <1> 	mov	dh, [VGA_ROWS]
  5059 0000287D FECE                <1> 	dec	dh
  5060                              <1> vga_g_down_2:
  5061 0000287F 3A15[C0670000]      <1> 	cmp	dl, [CRT_COLS]  ; = [VGA_COLS]
  5062 00002885 7208                <1> 	jb	short vga_g_down_3
  5063 00002887 8A15[C0670000]      <1> 	mov	dl, [CRT_COLS]
  5064 0000288D FECA                <1> 	dec	dl
  5065                              <1> vga_g_down_3:	
  5066 0000288F 3A05[C6670000]      <1> 	cmp	al, [VGA_ROWS]
  5067 00002895 7602                <1> 	jna	short vga_g_down_4
  5068 00002897 28C0                <1> 	sub	al, al ; 0
  5069                              <1> vga_g_down_4:
  5070 00002899 88F7                <1> 	mov	bh, dh ; clr
  5071 0000289B 28CF                <1> 	sub	bh, cl ; cul
  5072 0000289D FEC7                <1> 	inc	bh ; cols = clr-cul+1
  5073                              <1> 
  5074 0000289F 20C0                <1> 	and	al, al ; nblines = 0
  5075 000028A1 7559                <1> 	jnz	short vga_g_down_6
  5076 000028A3 20ED                <1> 	and	ch, ch ; rul = 0
  5077 000028A5 7555                <1> 	jnz	short vga_g_down_6
  5078 000028A7 20C9                <1> 	and	cl, cl ; cul = 0
  5079 000028A9 7551                <1> 	jnz	short vga_g_down_6
  5080                              <1> 
  5081 000028AB 50                  <1> 	push	eax ; push ax ; 12/04/2021
  5082 000028AC A0[C6670000]        <1> 	mov	al, [VGA_ROWS]
  5083 000028B1 FEC8                <1> 	dec	al  
  5084 000028B3 38C6                <1> 	cmp	dh, al ; rlr = nbrows-1
  5085 000028B5 7545                <1> 	jne	short vga_g_down_5
  5086 000028B7 A0[C0670000]        <1>         mov     al, [CRT_COLS]  ; = VGA_COLS
  5087 000028BC FEC8                <1> 	dec	al 
  5088 000028BE 38C2                <1>  	cmp	dl, al ; clr = nbcols-1
  5089                              <1> 	;jne	short vga_g_down_5
  5090                              <1>  	; 12/04/2021
  5091 000028C0 58                  <1> 	pop	eax ; pop ax
  5092 000028C1 7539                <1> 	jne	short vga_g_down_5
  5093                              <1> 
  5094 000028C3 66B80502            <1> 	mov	ax, 0205h
  5095 000028C7 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  5096 000028CB 66EF                <1> 	out	dx, ax
  5097 000028CD A0[C6670000]        <1> 	mov	al, [VGA_ROWS]
  5098 000028D2 8A25[C0670000]      <1> 	mov	ah, [CRT_COLS] ; = [VGA_COLS]
  5099 000028D8 F6E4                <1> 	mul	ah
  5100 000028DA 0FB7D0              <1> 	movzx	edx, ax
  5101                              <1> 	; 08/08/2016
  5102 000028DD 0FB605[C2670000]    <1> 	movzx	eax, byte [CHAR_HEIGHT]
  5103 000028E4 F7E2                <1> 	mul	edx
  5104                              <1> 	; eax = byte count	
  5105 000028E6 89C1                <1> 	mov	ecx, eax
  5106                              <1> 	;; 07/08/2016
  5107                              <1> 	;shl	dx, 3 ; * 8 ; * [CHAR_HEIGHT]
  5108                              <1> 	;mov	ecx, edx
  5109 000028E8 88D8                <1> 	mov	al, bl ; fill value for blanked lines
  5110 000028EA BF00000A00          <1> 	mov	edi, 0A0000h
  5111 000028EF F3AA                <1> 	rep	stosb			
  5112                              <1> 	
  5113                              <1> 	; 03/08/2022
  5114 000028F1 30E4                <1> 	xor	ah, ah ; 0 
  5115                              <1> 	
  5116 000028F3 B005                <1> 	mov	al, 5
  5117 000028F5 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  5118 000028F9 66EF                <1> 	out	dx, ax ; 0005h	
  5119                              <1> 
  5120 000028FB C3                  <1> 	retn
  5121                              <1> 
  5122                              <1> vga_g_down_5:
  5123                              <1> 	; 12/04/2021
  5124                              <1> 	;pop	eax  ; pop ax
  5125                              <1> 
  5126                              <1> vga_g_down_6:
  5127                              <1> 	; [ESI] = VGA memory model number for current video mode
  5128                              <1>         ;
  5129                              <1>         ; LINEAR8 equ 5
  5130                              <1>         ; PLANAR4 equ 4
  5131                              <1>         ; PLANAR1 equ 3
  5132                              <1> 
  5133 000028FC 803E04              <1> 	cmp	byte [esi], PLANAR4
  5134 000028FF 742C                <1> 	je	short vga_g_down_planar
  5135 00002901 803E03              <1> 	cmp	byte [esi], PLANAR1
  5136 00002904 7427                <1> 	je	short vga_g_down_planar
  5137                              <1> vga_g_down_linear8:
  5138                              <1> 	; 07/07/2016 (TEMPORARY)
  5139                              <1> 	;
  5140                              <1> 	; cl = upper left column ; cul
  5141                              <1> 	; ch = upper left row ; rul
  5142                              <1> 	; dl = lower rigth column ; clr
  5143                              <1> 	; dh = lower right row ; rlr
  5144                              <1> 
  5145                              <1> vga_g_down_l0:
  5146                              <1> 	;{for(i=rlr;i>=rul;i--)
  5147                              <1>         ; if((i<rul+nblines)||(nblines==0))
  5148 00002906 08C0                <1> 	or	al, al
  5149 00002908 741C                <1> 	jz	short vga_g_down_l2
  5150 0000290A 88C4                <1> 	mov	ah, al
  5151 0000290C 00EC                <1> 	add	ah, ch
  5152                              <1> 	;jc	short vga_g_down_l2	
  5153 0000290E 86EE                <1> 	xchg	ch, dh
  5154 00002910 38E5                <1> 	cmp	ch, ah
  5155 00002912 7212                <1> 	jb	short vga_g_down_l2
  5156 00002914 88EC                <1> 	mov	ah, ch
  5157 00002916 28C4                <1> 	sub	ah, al ; ah = i - nblines
  5158                              <1> 	; else
  5159                              <1> 	; vgamem_copy_pl4(cul,i,i-nblines,cols,nbcols,cheight);
  5160 00002918 E812FEFFFF          <1> 	call	vgamem_copy_l8
  5161                              <1> vga_g_down_l1:
  5162 0000291D 86F5                <1> 	xchg	dh, ch
  5163 0000291F FECE                <1> 	dec	dh 
  5164 00002921 38EE                <1> 	cmp	dh, ch
  5165 00002923 73E1                <1> 	jnb	short vga_g_down_l0
  5166 00002925 C3                  <1> 	retn
  5167                              <1> 
  5168                              <1> vga_g_down_l2:
  5169                              <1> 	; vgamem_fill_pl4(cul,i,cols,nbcols,cheight,attr);
  5170 00002926 E86AFEFFFF          <1> 	call	vgamem_fill_l8
  5171 0000292B EBF0                <1> 	jmp	short vga_g_down_l1
  5172                              <1> 		 
  5173                              <1> vga_g_down_planar:
  5174                              <1> 	; cl = upper left column ; cul
  5175                              <1> 	; ch = upper left row ; rul
  5176                              <1> 	; dl = lower rigth column ; clr
  5177                              <1> 	; dh = lower right row ; rlr
  5178                              <1> vga_g_down_pl0:
  5179                              <1>  	;{for(i=rlr;i>=rul;i--)
  5180                              <1>         ; if((i<rul+nblines)||(nblines==0))
  5181 0000292D 08C0                <1> 	or	al, al
  5182 0000292F 741C                <1> 	jz	short vga_g_down_pl2
  5183 00002931 88C4                <1> 	mov	ah, al
  5184 00002933 00EC                <1> 	add	ah, ch
  5185                              <1> 	;jc	short vga_g_down_pl2	
  5186 00002935 86EE                <1> 	xchg	ch, dh
  5187 00002937 38E5                <1> 	cmp	ch, ah
  5188 00002939 7212                <1> 	jb	short vga_g_down_pl2
  5189 0000293B 88EC                <1> 	mov	ah, ch
  5190 0000293D 28C4                <1> 	sub	ah, al ; ah = i - nblines
  5191                              <1> 	; else
  5192                              <1> 	; vgamem_copy_pl4(cul,i,i-nblines,cols,nbcols,cheight);
  5193 0000293F E826FDFFFF          <1> 	call	vgamem_copy_pl4
  5194                              <1> vga_g_down_pl1:
  5195 00002944 86F5                <1> 	xchg	dh, ch
  5196 00002946 FECE                <1> 	dec	dh 
  5197 00002948 38EE                <1> 	cmp	dh, ch
  5198 0000294A 73E1                <1> 	jnb	short vga_g_down_pl0
  5199 0000294C C3                  <1> 	retn
  5200                              <1> 
  5201                              <1> vga_g_down_pl2:
  5202                              <1> 	; vgamem_fill_pl4(cul,i,cols,nbcols,cheight,attr);
  5203 0000294D E886FDFFFF          <1> 	call	vgamem_fill_pl4
  5204 00002952 EBF0                <1> 	jmp	short vga_g_down_pl1
  5205                              <1> 
  5206                              <1> 
  5207                              <1> 
  5208                              <1> ; 27/06/2016 - TRDOS 386 (TRDOS v2.0)
  5209                              <1> ; VIDEO1.ASM - 24/03/1985 (IBM PC-AT BIOS source code)
  5210                              <1> 
  5211                              <1> ;-----	ROUTINE TO MOVE ONE ROW OF INFORMATION
  5212                              <1> 
  5213                              <1> _R17:
  5214 00002954 0FB6CA              <1> 	movzx	ecx, dl			; NUMBER OF BYTES IN THE ROW
  5215 00002957 56                  <1> 	push	esi
  5216 00002958 57                  <1> 	push	edi			; SAVE POINTERS
  5217 00002959 F3A4                <1> 	rep	movsb			; MOVE THE EVEN FIELD
  5218 0000295B 5F                  <1> 	pop	edi
  5219 0000295C 5E                  <1> 	pop	esi
  5220 0000295D 6681C60020          <1> 	add	si, 2000h
  5221 00002962 6681C70020          <1> 	add	di, 2000h		; POINT TO THE ODD FIELD
  5222 00002967 56                  <1> 	push	esi
  5223 00002968 57                  <1> 	push	edi			; SAVE THE POINTERS
  5224 00002969 88D1                <1> 	mov	cl, dl			; COUNT BACK
  5225 0000296B F3A4                <1> 	rep	movsb			; MOVE THE ODD FIELD
  5226 0000296D 5F                  <1> 	pop	edi
  5227 0000296E 5E                  <1> 	pop	esi			; POINTERS BACK
  5228 0000296F C3                  <1> 	retn				; RETURN TO CALLER
  5229                              <1> 
  5230                              <1> ;-----	CLEAR A SINGLE ROW
  5231                              <1> 
  5232                              <1> _R18:
  5233 00002970 0FB6CA              <1> 	movzx	ecx, dl			; NUMBER OF BYTES IN FIELD
  5234 00002973 57                  <1> 	push	edi			; SAVE POINTER
  5235 00002974 F3AA                <1> 	rep	stosb			; STORE THE NEW VALUE
  5236 00002976 5F                  <1> 	pop	edi			; POINTER BACK
  5237 00002977 6681C70020          <1> 	add	di, 2000h		; POINT TO ODD FIELD
  5238 0000297C 57                  <1> 	push	edi
  5239 0000297D 88D1                <1> 	mov	cl, dl
  5240 0000297F F3AA                <1> 	rep	stosb			; FILL THE ODD FIELD
  5241 00002981 5F                  <1> 	pop	edi
  5242 00002982 C3                  <1> 	retn				; RETURN TO CALLER
  5243                              <1> 
  5244                              <1> ; 03/08/2022 - TRDOS 386 Kernel v2.0.5
  5245                              <1> ; 04/07/2016
  5246                              <1> ; 01/07/2016
  5247                              <1> ; 30/06/2016 - TRDOS 386 (TRDOS v2.0)
  5248                              <1> ; VIDEO1.ASM - 24/03/1985 (IBM PC-AT BIOS source code)
  5249                              <1> ;--------------------------------------------------
  5250                              <1> ; GRAPHICS WRITE
  5251                              <1> ;  THIS ROUTINE WRITES THE ASCII CHARACTER TO THE CURRENT
  5252                              <1> ;  POSITION ON THE SCREEN.
  5253                              <1> ; ENTRY --
  5254                              <1> ;  AL = CHARACTER TO WRITE
  5255                              <1> ;  BL = COLOR ATTRIBUTE TO BE USED FOR FOREGROUND COLOR
  5256                              <1> ;	IF BIT 7 IS SET, THE CHAR IS XOR'D INTO THE REGEN BUFFER
  5257                              <1> ;	(0 IS USED FOR THE BACKGROUND COLOR)
  5258                              <1> ;  CX = NUMBER OF CHARS TO WRITE
  5259                              <1> ;  DS = DATA SEGMENT
  5260                              <1> ;  ES = REGEN SEGMENT
  5261                              <1> ; EXIT --
  5262                              <1> ;  NOTHING IS RETURNED
  5263                              <1> ;
  5264                              <1> ; GRAPHICS READ
  5265                              <1> ;  THIS ROUTINE READS THE ASCII CHARACTER AT THE CURRENT CURSOR
  5266                              <1> ;  POSITION ON THE SCREEN BY MATCHING THE DOTS ON THE SCREEN TO THE
  5267                              <1> ;  CHARACTER GENERATOR CODE POINTS
  5268                              <1> ; ENTRY --
  5269                              <1> ;  NONE (0 IS ASSUMED AS THE BACKGROUND COLOR)
  5270                              <1> ; EXIT --
  5271                              <1> ;  AL = CHARACTER READ AT THAT POSITION (0 RETURNED IF NONE FOUND)
  5272                              <1> ;
  5273                              <1> ; FOR BOTH ROUTINES, THE IMAGES USED TO FORM CHARS ARE CONTAINED IN ROM
  5274                              <1> ;  FOR THE 1ST 128 CHARS.  TO ACCESS CHARS IN THE SECOND HALF, THE USER
  5275                              <1> ;  MUST INITIALIZE THE VECTOR AT INTERRUPT 1FH (LOCATION 0007CH) TO
  5276                              <1> ;  POINT TO THE USER SUPPLIED TABLE OF GRAPHIC IMAGES (8X8 BOXES).
  5277                              <1> ;  FAILURE TO DO SO WILL CAUSE IN STRANGE RESULTS
  5278                              <1> ;-----------------------------------------------------
  5279                              <1> 
  5280                              <1> GRAPHICS_WRITE:
  5281 00002983 25FF000000          <1> 	and 	eax, 0FFh		; ZERO TO HIGH OF CODE POINT
  5282 00002988 50                  <1> 	push	eax			; SAVE CODE POINT VALUE
  5283                              <1> 
  5284                              <1> ;-----	DETERMINE POSITION IN REGEN BUFFER TO PUT CODE POINTS
  5285                              <1> 
  5286 00002989 E846010000          <1> 	call	S26			; FIND LOCATION IN REGEN BUFFER
  5287 0000298E 89C7                <1> 	mov	edi, eax		; REGEN POINTER IN DI
  5288                              <1> 
  5289                              <1> ;-----	DETERMINE REGION TO GET CODE POINTS FROM
  5290                              <1> 
  5291 00002990 58                  <1> 	pop	eax			; RECOVER CODE POINT
  5292                              <1> 
  5293 00002991 BE[1C4F0100]        <1> 	mov	esi, CRT_CHAR_GEN	; OFFSET OF IMAGES
  5294                              <1> 
  5295                              <1> ;-----	DETERMINE GRAPHICS MODE IN OPERATION
  5296                              <1> 					; DETERMINE_MODE
  5297                              <1> 	;sal	ax, 3			; MULTIPLY CODE POINT VALUE BY 8
  5298                              <1> 	; 03/08/2022
  5299 00002996 C1E003              <1> 	sal	eax, 3
  5300 00002999 01C6                <1> 	add	esi, eax		; SI HAS OFFSET OF DESIRED CODES
  5301                              <1> 	
  5302 0000299B 803D[BE670000]06    <1> 	cmp	byte [CRT_MODE], 6
  5303 000029A2 7231                <1> 	jc	short S6		; TEST FOR MEDIUM RESOLUTION MODE
  5304                              <1> 
  5305                              <1> ;-----	HIGH RESOLUTION MODE
  5306                              <1> 
  5307 000029A4 81C700800B00        <1> 	add	edi, 0B8000h
  5308                              <1> S1:					; HIGH_CHAR
  5309 000029AA 57                  <1> 	push	edi			; SAVE REGEN POINTER
  5310 000029AB 56                  <1> 	push	esi			; SAVE CODE POINTER
  5311 000029AC B604                <1> 	mov	dh, 4			; NUMBER OF TIMES THROUGH LOOP
  5312                              <1> S2:
  5313 000029AE AC                  <1> 	lodsb				; GET BYTE FROM CODE POINTS
  5314 000029AF F6C380              <1> 	test	bl, 80h			; SHOULD WE USE THE FUNCTION
  5315 000029B2 7515                <1> 	jnz	short S5		; TO PUT CHAR IN
  5316 000029B4 AA                  <1> 	stosb				; STORE IN REGEN BUFFER
  5317 000029B5 AC                  <1> 	lodsb
  5318                              <1> S4:
  5319 000029B6 8887FF1F0000        <1> 	mov	[edi+2000h-1], al	; STORE IN SECOND HALF
  5320 000029BC 83C74F              <1> 	add	edi, 79			; MOVE TO NEXT ROW IN REGEN
  5321 000029BF FECE                <1> 	dec	dh			; DONE WITH LOOP
  5322 000029C1 75EB                <1> 	jnz	short S2
  5323 000029C3 5E                  <1> 	pop	esi
  5324 000029C4 5F                  <1> 	pop	edi			; RECOVER REGEN POINTER
  5325 000029C5 47                  <1> 	inc	edi			; POINT TO NEXT CHAR POSITION
  5326 000029C6 E2E2                <1> 	loop	S1			; MORE CHARS TO WRITE
  5327 000029C8 C3                  <1> 	retn
  5328                              <1> 
  5329                              <1> S5:
  5330 000029C9 3207                <1> 	xor	al, [edi]		; EXCLUSIVE OR WITH CURRENT
  5331 000029CB AA                  <1> 	stosb				; STORE THE CODE POINT
  5332 000029CC AC                  <1> 	lodsb				; AGAIN FOR ODD FIELD
  5333 000029CD 3287FF1F0000        <1> 	xor	al, [edi+2000h-1]
  5334 000029D3 EBE1                <1> 	jmp	short S4		; BACK TO MAINSTREAM
  5335                              <1> 
  5336                              <1> ;-----	MEDIUM RESOLUTION WRITE
  5337                              <1> S6:					; MED_RES_WRITE
  5338 000029D5 88DA                <1> 	mov	dl, bl			; SAVE HIGH COLOR BIT
  5339                              <1> 	; 03/08/2022
  5340 000029D7 D1E7                <1> 	sal	edi, 1
  5341                              <1> 	;sal	di, 1			; OFFSET*2 SINCE 2 BYTES/CHAR
  5342                              <1> 					; EXPAND BL TO FULL WORD OF COLOR
  5343 000029D9 80E303              <1> 	and	bl, 3			; ISOLATE THE COLOR BITS ( LOW 2 BITS )
  5344 000029DC B055                <1> 	mov	al, 055h		; GET BIT CONVERSION MULTIPLIER
  5345 000029DE F6E3                <1> 	mul	bl			; EXPAND 2 COLOR BITS TO 4 REPLICATIONS
  5346 000029E0 88C3                <1> 	mov	bl, al			; PLACE BACK IN WORK REGISTER
  5347 000029E2 88C7                <1> 	mov	bh, al			; EXPAND TO 8 REPLICATIONS OF COLOR BITS
  5348 000029E4 81C700800B00        <1> 	add	edi, 0B8000h
  5349                              <1> S7:                                     ; MED_CHAR
  5350 000029EA 57                  <1> 	push	edi			; SAVE REGEN POINTER
  5351 000029EB 56                  <1> 	push	esi			; SAVE THE CODE POINTER
  5352 000029EC B604                <1> 	mov	dh, 4			; NUMBER OF LOOPS
  5353                              <1> S8:
  5354 000029EE AC                  <1> 	lodsb				; GET CODE POINT
  5355 000029EF E8B1000000          <1> 	call	S21			; DOUBLE UP ALL THE BITS
  5356 000029F4 6621D8              <1> 	and	ax, bx			; CONVERT TO FOREGROUND COLOR ( 0 BACK )
  5357 000029F7 86E0                <1> 	xchg	ah, al			; SWAP HIGH/LOW BYTES FOR WORD MOVE
  5358 000029F9 F6C280              <1> 	test	dl, 80h			; IS THIS XOR FUNCTION
  5359 000029FC 7403                <1> 	jz	short S9		; NO, STORE IT IN AS IS
  5360 000029FE 663307              <1> 	xor	ax, [edi]		; DO FUNCTION WITH LOW/HIGH
  5361                              <1> S9:
  5362 00002A01 668907              <1> 	mov	[edi], ax		; STORE FIRST BYTE HIGH, SECOND LOW
  5363 00002A04 AC                  <1> 	lodsb				; GET CODE POINT
  5364 00002A05 E89B000000          <1> 	call	S21
  5365 00002A0A 6621D8              <1> 	and	ax, bx			; CONVERT TO COLOR
  5366 00002A0D 86E0                <1> 	xchg	ah, al			; SWAP HIGH/LOW BYTES FOR WORD MOVE
  5367 00002A0F F6C280              <1> 	test	dl, 80h			; AGAIN, IS THIS XOR FUNCTION
  5368 00002A12 7407                <1> 	jz	short _S10		; NO, JUST STORE THE VALUES
  5369 00002A14 66338700200000      <1> 	xor	ax, [edi+2000h]		; FUNCTION WITH FIRST HALF LOW
  5370                              <1> _S10:
  5371 00002A1B 66898700200000      <1> 	mov	[edi+2000h], ax		; STORE SECOND PORTION HIGH
  5372 00002A22 6683C750            <1> 	add	di, 80			; POINT TO NEXT LOCATION
  5373 00002A26 FECE                <1> 	dec	dh
  5374 00002A28 75C4                <1> 	jnz	short S8		; KEEP GOING
  5375 00002A2A 5E                  <1> 	pop	esi			; RECOVER CODE POINTER
  5376 00002A2B 5F                  <1> 	pop	edi			; RECOVER REGEN POINTER
  5377 00002A2C 47                  <1> 	inc	edi			; POINT TO NEXT CHAR POSITION
  5378 00002A2D 47                  <1> 	inc	edi
  5379 00002A2E E2BA                <1> 	loop	S7			; MORE TO WRITE
  5380 00002A30 C3                  <1> 	retn
  5381                              <1> 
  5382                              <1> ; 03/08/2022 - TRDOS 386 Kernel v2.0.5
  5383                              <1> ; 04/07/2016
  5384                              <1> ; 01/07/2016
  5385                              <1> ; 30/06/2016 - TRDOS 386 (TRDOS v2.0)
  5386                              <1> ; VIDEO1.ASM - 24/03/1985 (IBM PC-AT BIOS source code)
  5387                              <1> ;----------------------------------------
  5388                              <1> ; GRAPHICS READ
  5389                              <1> ;----------------------------------------
  5390                              <1> GRAPHICS_READ:
  5391 00002A31 E89E000000          <1> 	call	S26			; CONVERTED TO OFFSET IN REGEN
  5392 00002A36 89C6                <1> 	mov	esi, eax		; SAVE IN SI
  5393 00002A38 81C600800B00        <1> 	add	esi, 0B8000h		; 01/07/2016
  5394 00002A3E 83EC08              <1> 	sub	esp, 8			; ALLOCATE SPACE FOR THE READ CODE POINT
  5395 00002A41 89E5                <1> 	mov	ebp, esp		; POINTER TO SAVE AREA
  5396                              <1> 
  5397                              <1> ;-----	DETERMINE GRAPHICS MODES
  5398 00002A43 B604                <1> 	mov	dh, 4			; number of passes ; 01/07/2016
  5399 00002A45 803D[BE670000]06    <1> 	cmp	byte [CRT_MODE], 6
  5400 00002A4C 7219                <1> 	jc	short S12		; MEDIUM RESOLUTION
  5401                              <1> 
  5402                              <1> ;-----	HIGH RESOLUTION READ
  5403                              <1> ;-----	GET VALUES FROM REGEN BUFFER AND CONVERT TO CODE POINT
  5404                              <1> 	;mov	dh,4			; NUMBER OF PASSES
  5405                              <1> S11:
  5406 00002A4E 8A06                <1> 	mov	al, [esi] 		; GET FIRST BYTE
  5407 00002A50 884500              <1> 	mov	[ebp], al 		; SAVE IN STORAGE AREA
  5408 00002A53 45                  <1> 	inc	ebp			; NEXT LOCATION
  5409 00002A54 8A8600200000        <1> 	mov	al, [esi+2000h]		; GET LOWER REGION BYTE
  5410 00002A5A 884500              <1> 	mov	[ebp], al 		; ADJUST AND STORE
  5411 00002A5D 45                  <1> 	inc	ebp
  5412 00002A5E 83C650              <1> 	add	esi, 80			; POINTER INTO REGEN
  5413 00002A61 FECE                <1> 	dec	dh			; LOOP CONTROL
  5414 00002A63 75E9                <1> 	jnz	short S11		; DO IT SOME MORE
  5415 00002A65 EB1C                <1> 	jmp	short S14		; GO MATCH THE SAVED CODE POINTS
  5416                              <1> 
  5417                              <1> ;-----	MEDIUM RESOLUTION READ
  5418                              <1> S12:	
  5419                              <1> 	;sal	si, 1			; OFFSET*2 SINCE 2 BYTES/CHAR
  5420                              <1> 	; 03/08/2022
  5421 00002A67 D1E6                <1> 	sal	esi, 1
  5422                              <1> 	;mov	dh, 4			; NUMBER OF PASSES
  5423                              <1> S13:
  5424 00002A69 E84B000000          <1> 	call	S23			; GET BYTES FROM REGEN INTO SINGLE SAVE
  5425 00002A6E 81C6FE1F0000        <1> 	add	esi, 2000h-2		; GO TO LOWER REGION
  5426 00002A74 E840000000          <1> 	call	S23			; GET THIS PAIR INTO SAVE
  5427 00002A79 81EEB21F0000        <1> 	sub	esi, 2000h-80+2		; ADJUST POINTER BACK INTO UPPER
  5428 00002A7F FECE                <1> 	dec	dh
  5429 00002A81 75E6                <1> 	jnz	short S13		; KEEP GOING UNTIL ALL 8 DONE
  5430                              <1> 
  5431                              <1> ;-----	SAVE AREA HAS CHARACTER IN IT, MATCH IT
  5432                              <1> S14:					; FIND_CHAR
  5433 00002A83 BF[1C4F0100]        <1> 	mov	edi, CRT_CHAR_GEN	; ESTABLISH ADDRESSING
  5434 00002A88 83ED08              <1> 	sub	ebp, 8			; ADJUST POINTER TO START OF SAVE AREA
  5435 00002A8B 89EE                <1> 	mov	esi, ebp
  5436                              <1> S15:
  5437                              <1> 	;mov	ax, 256			; NUMBER TO TEST AGAINST
  5438                              <1> 	; 03/08/2022
  5439 00002A8D 29C0                <1> 	sub	eax, eax
  5440 00002A8F FEC4                <1> 	inc	ah
  5441                              <1> 	; eax = 256
  5442                              <1> S16:
  5443 00002A91 56                  <1> 	push	esi			; SAVE SAVE AREA POINTER
  5444 00002A92 57                  <1> 	push	edi			; SAVE CODE POINTER
  5445                              <1> 	;mov	ecx, 4			; NUMBER OF WORDS TO MATCH
  5446                              <1> 	;repe	cmpsw			; COMPARE THE 8 BYTES AS WORDS
  5447 00002A93 A7                  <1> 	cmpsd				; compare first 4 bytes 
  5448 00002A94 7501                <1> 	jne	short S17		; 
  5449 00002A96 A7                  <1> 	cmpsd				; compare last 4 bytes
  5450                              <1> S17:
  5451 00002A97 5F                  <1> 	pop	edi			; RECOVER THE POINTERS
  5452 00002A98 5E                  <1> 	pop	esi
  5453                              <1> 	;jz	short S18		; IF ZERO FLAG SET, THEN MATCH OCCURRED
  5454 00002A99 7406                <1> 	je	short S18
  5455                              <1> 	;				; NO MATCH, MOVE ON TO NEXT
  5456 00002A9B 83C708              <1> 	add	edi, 8			; NEXT CODE POINT
  5457                              <1> 	;dec	ax			; LOOP CONTROL
  5458                              <1> 	; 03/08/2022
  5459 00002A9E 48                  <1> 	dec	eax
  5460 00002A9F 75F0                <1> 	jnz	short S16		; DO ALL OF THEM
  5461                              <1> 
  5462                              <1> ;-----	CHARACTER IS FOUND ( AL=0 IF NOT FOUND )
  5463                              <1> S18:	
  5464 00002AA1 83C408              <1> 	add	esp, 8			; READJUST THE STACK, THROW AWAY SAVE
  5465 00002AA4 C3                  <1> 	retn				; ALL DONE
  5466                              <1> 
  5467                              <1> ; 12/04/2021
  5468                              <1> ; 30/06/2016 - TRDOS 386 (TRDOS v2.0)
  5469                              <1> ; VIDEO1.ASM - 24/03/1985 (IBM PC-AT BIOS source code)
  5470                              <1> ;--------------------------------------------
  5471                              <1> ; EXPAND BYTE
  5472                              <1> ;  THIS ROUTINE TAKES THE BYTE IN AL AND DOUBLES ALL
  5473                              <1> ;  OF THE BITS, TURNING THE 8 BITS INTO 16 BITS.
  5474                              <1> ;  THE RESULT IS LEFT IN AX
  5475                              <1> ;--------------------------------------------
  5476                              <1> S21:
  5477                              <1> 	; 03/08/2022
  5478                              <1> 	;push	cx			; SAVE REGISTER
  5479                              <1> 	; 12/04/2021
  5480 00002AA5 51                  <1> 	push	ecx
  5481                              <1> 	;;mov	cx, 8			; SHIFT COUNT REGISTER FOR ONE BYTE
  5482                              <1> 	;mov	cl, 8
  5483 00002AA6 B408                <1> 	mov	ah, 8
  5484                              <1> S22:
  5485 00002AA8 D0C8                <1> 	ror	al, 1			; SHIFT BITS, LOW BIT INTO CARRY FLAG
  5486                              <1> 	;rcr	bp, 1			; MOVE CARRY FLAG (LOW BIT INTO RESULTS
  5487                              <1> 	;sar	bp, 1			; SIGN EXTEND HIGH BIT (DOUBLE IT)
  5488                              <1> 	; 03/08/2022
  5489 00002AAA 66D1D9              <1> 	rcr	cx, 1
  5490 00002AAD 66D1F9              <1> 	sar	cx, 1
  5491                              <1> 
  5492                              <1> 	;;loop	S22			; REPEAT FOR ALL 8 BITS
  5493                              <1> 	;dec	cl
  5494                              <1> 	;jnz	short S22
  5495                              <1> 	;xchg	ax, bp			; MOVE RESULTS TO PARAMETER REGISTER
  5496                              <1> 	; 03/08/5022
  5497 00002AB0 FECC                <1> 	dec	ah
  5498 00002AB2 75F4                <1> 	jnz	short S22
  5499 00002AB4 6689C8              <1> 	mov	ax, cx
  5500                              <1> 	;pop	cx			; RECOVER REGISTER
  5501                              <1> 	; 12/04/2021
  5502 00002AB7 59                  <1> 	pop	ecx
  5503 00002AB8 C3                  <1> 	retn				; ALL DONE
  5504                              <1> 
  5505                              <1> ; 01/07/2016 - TRDOS 386 (TRDOS v2.0)
  5506                              <1> ; VIDEO1.ASM - 24/03/1985 (IBM PC-AT BIOS source code)
  5507                              <1> ;--------------------------------------------------
  5508                              <1> ; MED_READ_BYTE
  5509                              <1> ; THIS ROUTINE WILL TAKE 2 BYTES FROM THE REGEN BUFFER,
  5510                              <1> ;  COMPARE AGAINST THE CURRENT FOREGROUND COLOR, AND PLACE
  5511                              <1> ;  THE CORRESPONDING ON/OFF BIT PATTERN INTO THE CURRENT
  5512                              <1> ;  POSITION IN THE SAVE AREA
  5513                              <1> ; ENTRY --
  5514                              <1> ;  SI,DS = POINTER TO REGEN AREA OF INTEREST
  5515                              <1> ;  BX = EXPANDED FOREGROUND COLOR
  5516                              <1> ;  BP = POINTER TO SAVE AREA
  5517                              <1> ; EXIT --
  5518                              <1> ;  SI AND BP ARE INCREMENTED
  5519                              <1> ;----------------------------------------------------
  5520                              <1> S23:
  5521 00002AB9 66AD                <1> 	lodsw				; GET FIRST BYTE AND SECOND BYTES
  5522 00002ABB 86C4                <1> 	xchg	al, ah			; SWAP FOR COMPARE
  5523                              <1> 	;mov	cx, 0C000h		; 2 BIT MASK TO TEST THE ENTRIES
  5524                              <1> 	; 02/08/2022
  5525 00002ABD 29C9                <1> 	sub	ecx, ecx
  5526 00002ABF B5C0                <1> 	mov	ch, 0C0h
  5527                              <1> 	; ecx = 0C000h
  5528                              <1> 	;mov	dl, 0			; RESULT REGISTER
  5529                              <1> 	; 03/08/2022
  5530 00002AC1 28D2                <1> 	sub	dl, dl
  5531                              <1> S24:
  5532                              <1> 	;test	ax, cx			; IS THIS SECTION BACKCROUND?
  5533                              <1>         ; 03/08/2022
  5534 00002AC3 85C8                <1> 	test	eax, ecx
  5535 00002AC5 7401                <1> 	jz	short S25               ; IF ZERO, IT IS BACKGROUND (CARRY=0)
  5536 00002AC7 F9                  <1> 	stc				; WASN'T, SO SET CARRY
  5537                              <1> S25:
  5538 00002AC8 D0D2                <1> 	rcl	dl, 1			; MOVE THAT BIT INTO THE RESULT
  5539                              <1> 	;shr	cx, 2			; MOVE THE MASK TO THE RIGHT BY 2 BITS
  5540                              <1> 	; 02/08/2022
  5541 00002ACA C1E902              <1> 	shr	ecx, 2
  5542 00002ACD 73F4                <1> 	jnc	short S24		; DO IT AGAIN IF MASK DIDN'T FALL OUT
  5543 00002ACF 885500              <1> 	mov	[ebp], dl 		; STORE RESULT IN SAVE AREA
  5544 00002AD2 45                  <1> 	inc	ebp			; ADJUST POINTER
  5545 00002AD3 C3                  <1> 	retn				; ALL DONE
  5546                              <1> 
  5547                              <1> ; 02/08/2022 - TRDOS 386 Kernel v2.0.5
  5548                              <1> ; 30/06/2016 - TRDOS 386 (TRDOS v2.0)
  5549                              <1> ; VIDEO1.ASM - 24/03/1985 (IBM PC-AT BIOS source code)
  5550                              <1> ;-----------------------------------------
  5551                              <1> ; V4_POSITION
  5552                              <1> ;  THIS ROUTINE TAKES THE CURSOR POSITION CONTAINED IN
  5553                              <1> ;  THE MEMORY LOCATION, AND CONVERTS IT INTO AN OFFSET
  5554                              <1> ;  INTO THE REGEN BUFFER, ASSUMING ONE BYTE/CHAR.
  5555                              <1> ;  FOR MEDIUM RESOLUTION GRAPHICS, THE NUMBER MUST
  5556                              <1> ;  BE DOUBLED.
  5557                              <1> ; ENTRY -- NO REGISTERS,MEMORY LOCATION @CURSOR_POSN IS USED
  5558                              <1> ; EXIT--
  5559                              <1> ;  AX CONTAINS OFFSET INTO REGEN BUFFER
  5560                              <1> ;-----------------------------------------
  5561                              <1> S26:
  5562 00002AD4 0FB705[A6780100]    <1> 	movzx	eax, word [CURSOR_POSN]	; GET CURRENT CURSOR
  5563                              <1> GRAPH_POSN:
  5564 00002ADB 53                  <1> 	push	ebx			; SAVE REGISTER
  5565 00002ADC 0FB6D8              <1> 	movzx	ebx, al			; SAVE A COPY OF CURRENT CURSOR
  5566 00002ADF A0[C0670000]        <1> 	mov	al, [CRT_COLS]		; GET BYTES PER COLUMN
  5567 00002AE4 F6E4                <1> 	mul	ah			; MULTIPLY BY ROWS
  5568                              <1> 	;shl	ax, 2			; MULTIPLY * 4 SINCE 4 ROWS/BYTE
  5569                              <1> 	; 02/08/2022
  5570 00002AE6 C1E002              <1> 	shl	eax, 2
  5571 00002AE9 01D8                <1> 	add	eax, ebx		; DETERMINE OFFSET
  5572 00002AEB 5B                  <1> 	pop	ebx			; RECOVER POINTER
  5573 00002AEC C3                  <1> 	retn				; ALL DONE
  5574                              <1> 
  5575                              <1> ; 03/08/2022 - TRDOS 386 Kernel v2.0.5
  5576                              <1> ; 09/07/2016
  5577                              <1> ; 01/07/2016 - TRDOS 386 (TRDOS v2.0)
  5578                              <1> ; VIDEO1.ASM - 24/03/1985 (IBM PC-AT BIOS source code)
  5579                              <1> ;---------------------------------------------
  5580                              <1> ; SET_COLOR
  5581                              <1> ;	THIS ROUTINE WILL ESTABLISH THE BACKGROUND COLOR, THE OVERSCAN COLOR,
  5582                              <1> ;	AND THE FOREGROUND COLOR SET FOR MEDIUM RESOLUTION GRAPHICS
  5583                              <1> ; INPUT
  5584                              <1> ;	(BH) HAS COLOR ID
  5585                              <1> ;		IF BH=0, THE BACKGROUND COLOR VALUE IS SET
  5586                              <1> ;			FROM THE LOW BITS OF BL (0-31)
  5587                              <1> ;		IF BH=1, THE PALETTE SELECTION IS MADE
  5588                              <1> ;			BASED ON THE LOW BIT OF BL:
  5589                              <1> ;				0 = GREEN, RED, YELLOW FOR COLORS 1,2,3
  5590                              <1> ;				1 = BLUE, CYAN, MAGENTA FOR COLORS 1,2,3
  5591                              <1> ;	(BL) HAS THE COLOR VALUE TO BE USED
  5592                              <1> ; OUTPUT
  5593                              <1> ;	THE COLOR SELECTION IS UPDATED
  5594                              <1> ;----------------------------------------------
  5595                              <1> SET_COLOR:
  5596 00002AED 803D[BE670000]07    <1>         cmp     byte [CRT_MODE], 7      ; 09/07/2016
  5597                              <1> 	;ja	VIDEO_RETURN		; nothing to do for VGA modes
  5598                              <1> 	; 03/08/2022
  5599 00002AF4 7605                <1> 	jna	short M21
  5600 00002AF6 E92EF0FFFF          <1> 	jmp	VIDEO_RETURN
  5601                              <1> M21:
  5602                              <1> 	;mov	dx, [ADDR_6845]		; I/O PORT FOR PALETTE
  5603                              <1> 	;mov	dx, 3D4h
  5604                              <1> 	;add	dx, 5			; OVERSCAN PORT
  5605 00002AFB 66BAD903            <1> 	mov	dx, 3D9h
  5606 00002AFF A0[C1670000]        <1> 	mov	al, [CRT_PALETTE] 	; GET THE CURRENT PALETTE VALUE
  5607 00002B04 08FF                <1> 	or	bh, bh			; IS THIS COLOR 0?
  5608 00002B06 7512                <1> 	jnz	short M20		; OUTPUT COLOR 1
  5609                              <1> 
  5610                              <1> ;-----	HANDLE COLOR 0 BY SETTING THE BACKGROUND COLOR
  5611                              <1> 
  5612 00002B08 24E0                <1> 	and	al, 0E0h 		; TURN OFF LOW 5 BITS OF CURRENT
  5613 00002B0A 80E31F              <1> 	and	bl, 01Fh 		; TURN OFF HIGH 3 BITS OF INPUT VALUE
  5614 00002B0D 08D8                <1> 	or	al, bl			; PUT VALUE INTO REGISTER
  5615                              <1> M19:					; OUTPUT THE PALETTE
  5616 00002B0F EE                  <1> 	out	dx, al			; OUTPUT COLOR SELECTION TO 3D9 PORT
  5617 00002B10 A2[C1670000]        <1> 	mov	[CRT_PALETTE], al 	; SAVE THE COLOR VALUE
  5618 00002B15 E90FF0FFFF          <1> 	jmp	VIDEO_RETURN
  5619                              <1> 
  5620                              <1> ;-----	HANDLE COLOR 1 BY SELECTING THE PALETTE TO BE USED
  5621                              <1> 
  5622                              <1> M20:
  5623 00002B1A 24DF                <1> 	and	al, 0DFH 		; TURN OFF PALETTE SELECT BIT
  5624 00002B1C D0EB                <1> 	shr	bl, 1			; TEST THE LOW ORDER BIT OF BL
  5625 00002B1E 73EF                <1> 	jnc	short M19		; ALREADY DONE
  5626 00002B20 0C20                <1> 	or	al, 20H			; TURN ON PALETTE SELECT BIT
  5627 00002B22 EBEB                <1> 	jmp	short M19		; GO DO IT
  5628                              <1> 
  5629                              <1> ; 03/08/2022 - TRDOS 386 Kernel v2.0.5
  5630                              <1> ; 09/07/2016
  5631                              <1> ; 01/07/2016 - TRDOS 386 (TRDOS v2.0)
  5632                              <1> ; VIDEO1.ASM - 24/03/1985 (IBM PC-AT BIOS source code)
  5633                              <1> ;--------------------------------------------
  5634                              <1> ; READ DOT -- WRITE DOT
  5635                              <1> ; THESE ROUTINES WILL WRITE A DOT, OR READ THE
  5636                              <1> ;  DOT AT THE INDICATED LOCATION
  5637                              <1> ; ENTRY --
  5638                              <1> ;   DX = ROW (0-199)	(THE ACTUAL VALUE DEPENDS ON THE MODE)
  5639                              <1> ;   CX = COLUMN ( 0-639) ( THE VALUES ARE NOT RANGE CHECKED )
  5640                              <1> ;   AL = DOT VALUE TO WRITE (1,2 OR 4 BITS DEPENDING ON MODE,
  5641                              <1> ;	REQUIRED FOR WRITE DOT ONLY, RIGHT JUSTIFIED)
  5642                              <1> ;	BIT 7 OF AL = 1 INDICATES XOR THE VALUE INTO THE LOCATION
  5643                              <1> ;   DS = DATA SEGMENT
  5644                              <1> ;   ES = REGEN SEGMENT
  5645                              <1> ;
  5646                              <1> ; EXIT
  5647                              <1> ;	AL = DOT VALUE READ, RIGHT JUSTIFIED, READ ONLY
  5648                              <1> ;----------------------------------------------
  5649                              <1> 
  5650                              <1> READ_DOT:
  5651                              <1> 	; 09/07/2016
  5652 00002B24 8A25[BE670000]      <1> 	mov	ah,  [CRT_MODE]
  5653 00002B2A 80FC07              <1> 	cmp	ah, 7 ; 6!?
  5654 00002B2D 760A                <1> 	jna	short read_dot_cga
  5655                              <1> 
  5656 00002B2F E8B3030000          <1> 	call	vga_read_pixel
  5657                              <1> 	; al = pixel value
  5658                              <1> read_dot_retn:	; 03/08/2022
  5659 00002B34 E9F5EFFFFF          <1> 	jmp	_video_return
  5660                              <1> 
  5661                              <1> read_dot_cga:
  5662                              <1> 	;je	VIDEO_RETURN ; 7	
  5663 00002B39 80FC04              <1> 	cmp	ah, 4 ; graphics ? 
  5664                              <1> 	;jb	VIDEO_RETURN ; no, text mode, nothing to do
  5665                              <1> 	; 03/08/2022
  5666 00002B3C 72F6                <1> 	jb	short read_dot_retn
  5667                              <1> 
  5668 00002B3E E84F000000          <1> 	call	R3			; DETERMINE BYTE POSITION OF DOT
  5669 00002B43 8A06                <1> 	mov	al, [esi]		; GET THE BYTE
  5670 00002B45 20E0                <1> 	and	al, ah			; MASK OFF THE OTHER BITS IN THE BYTE
  5671 00002B47 D2E0                <1> 	shl	al, cl			; LEFT JUSTIFY THE VALUE
  5672 00002B49 88F1                <1> 	mov	cl, dh			; GET NUMBER OF BITS IN RESULT
  5673 00002B4B D2C0                <1> 	rol	al, cl			; RIGHT JUSTIFY THE RESULT
  5674                              <1> 	;jmp	VIDEO_RETURN		; RETURN FROM VIDEO I/O
  5675 00002B4D 0FB6C0              <1> 	movzx	eax, al
  5676 00002B50 E9D9EFFFFF          <1> 	jmp	_video_return
  5677                              <1> 
  5678                              <1> ; 03/08/2022
  5679                              <1> ; 02/08/2022 - TRDOS 386 Kernel v2.0.5
  5680                              <1> ; 12/04/2021
  5681                              <1> ; 09/07/2016
  5682                              <1> ; 01/07/2016 - TRDOS 386 (TRDOS v2.0)
  5683                              <1> ; VIDEO1.ASM - 24/03/1985 (IBM PC-AT BIOS source code)
  5684                              <1> 
  5685                              <1> WRITE_DOT:
  5686                              <1> 	; 09/07/2016
  5687 00002B55 8A25[BE670000]      <1> 	mov	ah, [CRT_MODE]
  5688 00002B5B 80FC07              <1> 	cmp	ah, 7 ; 6!?
  5689 00002B5E 760A                <1> 	jna	short write_dot_cga
  5690                              <1> 	
  5691 00002B60 E8F2020000          <1> 	call	vga_write_pixel
  5692                              <1> write_dot_retn:	; 03/08/2022
  5693 00002B65 E9BFEFFFFF          <1> 	jmp	VIDEO_RETURN
  5694                              <1> 
  5695                              <1> write_dot_cga:
  5696                              <1> 	;je	VIDEO_RETURN ; 7	
  5697 00002B6A 80FC04              <1> 	cmp	ah, 4 ; graphics ? 
  5698                              <1> 	;jb	VIDEO_RETURN ; no, text mode, nothing to do
  5699                              <1> 	; 03/08/2022
  5700 00002B6D 72F6                <1> 	jb	short write_dot_retn
  5701                              <1> 
  5702                              <1> 	;;push	ax			; SAVE DOT VALUE
  5703                              <1> 	;push	ax			; TWICE
  5704                              <1> 	; 12/04/2021
  5705 00002B6F 50                  <1> 	push	eax
  5706 00002B70 E81D000000          <1> 	call	R3			; DETERMINE BYTE POSITION OF THE DOT
  5707 00002B75 D2E8                <1> 	shr	al, cl			; SHIFT TO SET UP THE BITS FOR OUTPUT
  5708 00002B77 20E0                <1> 	and	al, ah			; STRIP OFF THE OTHER BITS
  5709 00002B79 8A0E                <1> 	mov	cl, [esi]		; GET THE CURRENT BYTE
  5710                              <1> 	;pop	bx			; RECOVER XOR FLAG
  5711                              <1> 	; 12/04/2021
  5712 00002B7B 5B                  <1> 	pop	ebx
  5713 00002B7C F6C380              <1> 	test	bl, 80h			; IS IT ON
  5714 00002B7F 750D                <1> 	jnz	short R2		; YES, XOR THE DOT
  5715 00002B81 F6D4                <1> 	not	ah			; SET MASK TO REMOVE THE INDICATED BITS
  5716 00002B83 20E1                <1> 	and	cl, ah
  5717 00002B85 08C8                <1> 	or	al, cl			; OR IN THE NEW VALUE OF THOSE BITS
  5718                              <1> R1:					; FINISH_DOT
  5719 00002B87 8806                <1> 	mov	[esi], al		; RESTORE THE BYTE IN MEMORY
  5720                              <1> 	;;pop	AX
  5721 00002B89 E99BEFFFFF          <1> 	jmp	VIDEO_RETURN		; RETURN FROM VIDEO I/O
  5722                              <1> R2:					; XOR_DOT
  5723 00002B8E 30C8                <1> 	xor	al, cl			; EXCLUSIVE OR THE DOTS
  5724 00002B90 EBF5                <1> 	jmp	short R1		; FINISH UP THE WRITING
  5725                              <1> 
  5726                              <1> ; 02/08/2022 - TRDOS 386 Kernel v2.0.5
  5727                              <1> ; 01/07/2016 - TRDOS 386 (TRDOS v2.0)
  5728                              <1> ; VIDEO1.ASM - 24/03/1985 (IBM PC-AT BIOS source code)
  5729                              <1> 
  5730                              <1> ;----------------------------------------------
  5731                              <1> ; THIS SUBROUTINE DETERMINES THE REGEN BYTE LOCATION OF THE
  5732                              <1> ; INDICATED ROW COLUMN VALUE IN GRAPHICS MODE.
  5733                              <1> ; ENTRY --
  5734                              <1> ;  DX = ROW VALUE (0-199)
  5735                              <1> ;  CX = COLUMN VALUE (0-639)
  5736                              <1> ; EXIT --
  5737                              <1> ;  SI = OFFSET INTO REGEN BUFFER FOR BYTE OF INTEREST
  5738                              <1> ;  AH = MASK TO STRIP OFF THE BITS OF INTEREST
  5739                              <1> ;  CL = BITS TO SHIFT TO RIGHT JUSTIFY THE MASK IN AH
  5740                              <1> ;  DH = # BITS IN RESULT
  5741                              <1> ;  BX = MODIFIED
  5742                              <1> ;-----------------------------------------------
  5743                              <1> R3:
  5744                              <1> 
  5745                              <1> ;-----	DETERMINE 1ST BYTE IN INDICATED ROW BY MULTIPLYING ROW VALUE BY 40
  5746                              <1> ;-----	 ( LOW BIT OF ROW DETERMINES EVEN/ODD, 80 BYTES/ROW )
  5747                              <1> 
  5748 00002B92 0FB7F0              <1> 	movzx	esi, ax			; WILL SAVE AL AND AH DURING OPERATION
  5749 00002B95 B028                <1> 	mov	al, 40
  5750 00002B97 F6E2                <1> 	mul	dl			; AX= ADDRESS OF START OF INDICATED ROW
  5751 00002B99 A808                <1> 	test	al, 08H 		; TEST FOR EVEN/ODD ROW CALCULATED
  5752 00002B9B 7404                <1> 	JZ	short R4		; JUMP IF EVEN ROW
  5753 00002B9D 6605D81F            <1> 	add	ax, 2000h-40		; OFFSET TO LOCATION OF ODD ROWS ADJUST
  5754                              <1> R4:					; EVEN_ROW
  5755                              <1> 	;xchg	si, ax			; MOVE POINTER TO (SI) AND RECOVER (AX)
  5756                              <1> 	; 02/08/2022
  5757 00002BA1 96                  <1> 	xchg	esi, eax
  5758 00002BA2 81C600800B00        <1> 	add	esi, 0B8000h
  5759                              <1> 	;mov	dx, cx			; COLUMN VALUE TO DX
  5760 00002BA8 0FB7D1              <1> 	movzx	edx, cx
  5761                              <1> 
  5762                              <1> ;-----	DETERMINE GRAPHICS MODE CURRENTLY IN EFFECT
  5763                              <1> 
  5764                              <1> ; SET UP THE REGISTERS ACCORDING TO THE MODE
  5765                              <1> ; CH = MASK FOR LOW OF COLUMN ADDRESS ( 7/3 FOR HIGH/MED RES )
  5766                              <1> ; CL = # OF ADDRESS BITS IN COLUMN VALUE ( 3/2 FOR H/M )
  5767                              <1> ; BL = MASK TO SELECT BITS FROM POINTED BYTE ( 80H/C0H FOR H/M )
  5768                              <1> ; BH = NUMBER OF VALID BITS IN POINTED BYTE ( 1/2 FOR H/M )
  5769                              <1> 
  5770 00002BAB 66BBC002            <1> 	mov	bx, 2C0h
  5771 00002BAF 66B90203            <1> 	mov	cx, 302h 		; SET PARMS FOR MED RES
  5772 00002BB3 803D[BE670000]06    <1> 	cmp	byte [CRT_MODE], 6
  5773 00002BBA 7208                <1> 	jc	short R5		; HANDLE IF MED RES
  5774 00002BBC 66BB8001            <1> 	mov	bx, 180h
  5775 00002BC0 66B90307            <1> 	mov	cx, 703h 		; SET PARMS FOR HIGH RES
  5776                              <1> 
  5777                              <1> ;-----	DETERMINE BIT OFFSET IN BYTE FROM COLUMN MASK
  5778                              <1> R5:
  5779 00002BC4 20D5                <1> 	and	ch, dl			; ADDRESS OF PEL WITHIN BYTE TO CH
  5780                              <1> 
  5781                              <1> ;-----	DETERMINE BYTE OFFSET FOR THIS LOCATION IN COLUMN
  5782                              <1> 
  5783                              <1> 	;shr	dx, cl			; SHIFT BY CORRECT AMOUNT
  5784                              <1> 	;add	si, dx			; INCREMENT THE POINTER
  5785                              <1> 	; 02/08/2022
  5786 00002BC6 D3EA                <1> 	shr	edx, cl
  5787 00002BC8 01D6                <1> 	add	esi, edx
  5788 00002BCA 88FE                <1> 	mov	dh, bh			; GET THE # OF BITS IN RESULT TO DH
  5789                              <1> 
  5790                              <1> ;-----	MULTIPLY BH (VALID BITS IN BYTE) BY CH (BIT OFFSET)
  5791                              <1> 
  5792 00002BCC 28C9                <1> 	sub	cl, cl			; ZERO INTO STORAGE LOCATION
  5793                              <1> R6:
  5794 00002BCE D0C8                <1> 	ror	al, 1			; LEFT JUSTIFY VALUE IN AL (FOR WRITE)
  5795 00002BD0 00E9                <1> 	add	cl, ch			; ADD IN THE BIT OFFSET VALUE
  5796 00002BD2 FECF                <1> 	dec	bh			; LOOP CONTROL
  5797 00002BD4 75F8                <1> 	jnz	short R6		; ON EXIT, CL HAS COUNT TO RESTORE BITS
  5798 00002BD6 88DC                <1> 	mov	ah, bl			;  GET MASK TO AH
  5799 00002BD8 D2EC                <1> 	shr	ah, cl			;  MOVE THE MASK TO CORRECT LOCATION
  5800 00002BDA C3                  <1> 	retn				;  RETURN WITH EVERYTHING SET UP
  5801                              <1> 
  5802                              <1> load_dac_palette:
  5803                              <1> 	; 02/08/2022 (TRDOS 386 Kernel v2.0.5)
  5804                              <1> 	; 29/07/2016
  5805                              <1> 	; 23/07/2016
  5806                              <1> 	; 03/07/2016 (TRDOS 386 = TRDOS v2.0)
  5807                              <1> 	; (set_mode_vga)
  5808                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  5809                              <1> 	; vgabios-0.7a (2011)
  5810                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  5811                              <1> 	; 'vgabios.c', 'load_dac_palette'
  5812                              <1> 	;
  5813                              <1> 	; Oracle VirtualBox 5.0.24 VGABios Source Code
  5814                              <1> 	; ('vgabios.c', 'vgatables.h', 'vgafonts.h', 'vgarom.asm')
  5815                              <1> 	;
  5816                              <1> 	; INPUT -> AH = DAC selection number (3, 2 or 1)
  5817                              <1> 	; OUTPUT -> ECX = 0, AX = 0
  5818                              <1> 	; (Modifed registers: EAX, ECX, EDX, ESI)
  5819                              <1> 	;
  5820 00002BDB 66BAC803            <1> 	mov	dx, 3C8h  ; VGAREG_DAC_WRITE_ADDRESS
  5821 00002BDF 28C0                <1> 	sub	al, al ; 0
  5822 00002BE1 EE                  <1> 	out	dx, al ; 0 ; color index, always 0 at the beginning
  5823                              <1> 	;inc	dx   ; 3C9h ; VGAREG_DAC_DATA
  5824                              <1> 	; 02/08/2022
  5825 00002BE2 FEC2                <1> 	inc	dl ; dx = 3C9h
  5826                              <1> 	;mov	ecx, 256   ; always 256*3 values
  5827                              <1> 	; 02/08/2022
  5828 00002BE4 31C9                <1> 	xor	ecx, ecx
  5829 00002BE6 FEC5                <1> 	inc	ch	
  5830                              <1> 	; ecx = 256
  5831                              <1> 
  5832                              <1> 	;push	esi
  5833 00002BE8 88E0                <1> 	mov	al, ah
  5834 00002BEA B43F                <1> 	mov	ah, 3Fh	; 3Fh except DAC selection number 3
  5835 00002BEC 3C02                <1> 	cmp 	al, 2
  5836 00002BEE 7414                <1> 	je	short l_dac_p_2
  5837 00002BF0 7719                <1> 	ja	short l_dac_p_3
  5838 00002BF2 20C0                <1> 	and	al, al
  5839 00002BF4 7507                <1> 	jnz	short l_dac_p_1
  5840                              <1> l_dac_p_0:
  5841 00002BF6 BE[DC490100]        <1> 	mov	esi, palette0
  5842 00002BFB EB15                <1> 	jmp	short l_dac_p_4	
  5843                              <1> l_dac_p_1:
  5844 00002BFD BE[9C4A0100]        <1> 	mov	esi, palette1
  5845 00002C02 EB0E                <1> 	jmp	short l_dac_p_4
  5846                              <1> l_dac_p_2:
  5847 00002C04 BE[5C4B0100]        <1> 	mov	esi, palette2
  5848 00002C09 EB07                <1> 	jmp	short l_dac_p_4
  5849                              <1> l_dac_p_3:
  5850 00002C0B B4FF                <1> 	mov	ah, 0FFh ; dac registers
  5851 00002C0D BE[1C4C0100]        <1> 	mov	esi, palette3
  5852                              <1> l_dac_p_4:
  5853 00002C12 AC                  <1> 	lodsb
  5854 00002C13 EE                  <1> 	out	dx, al  ; Red
  5855 00002C14 AC                  <1> 	lodsb
  5856 00002C15 EE                  <1> 	out	dx, al	; Green
  5857 00002C16 AC                  <1> 	lodsb
  5858 00002C17 EE                  <1> 	out	dx, al	; Blue
  5859 00002C18 20E4                <1> 	and	ah, ah
  5860 00002C1A 7405                <1> 	jz	short l_dac_p_5	
  5861 00002C1C FECC                <1> 	dec	ah
  5862 00002C1E E2F2                <1> 	loop	l_dac_p_4
  5863                              <1> 	;pop	esi
  5864 00002C20 C3                  <1> 	retn
  5865                              <1> l_dac_p_5:
  5866                              <1> 	; 29/07/2016
  5867 00002C21 FEC9                <1> 	dec	cl
  5868 00002C23 7407                <1> 	jz	short l_dac_p_7
  5869                              <1> 	;
  5870 00002C25 28C0                <1> 	sub	al, al ; 0
  5871                              <1> l_dac_p_6:
  5872 00002C27 EE                  <1> 	out	dx, al ; outb(VGAREG_DAC_DATA,0);
  5873 00002C28 EE                  <1> 	out	dx, al
  5874 00002C29 EE                  <1> 	out	dx, al
  5875 00002C2A E2FB                <1> 	loop	l_dac_p_6
  5876                              <1> l_dac_p_7:
  5877                              <1> 	;pop	esi
  5878 00002C2C C3                  <1> 	retn
  5879                              <1> 
  5880                              <1> gray_scale_summing:
  5881                              <1> 	; 03/08/2022 (TRDOS 386 v2.0.5)
  5882                              <1> 	; 12/04/2021
  5883                              <1> 	; 03/07/2016 (TRDOS 386 = TRDOS v2.0)
  5884                              <1> 	; (set_mode_vga)
  5885                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  5886                              <1> 	; vgabios-0.7a (2011)
  5887                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  5888                              <1> 	; 'vgabios.c', 'biosfn_perform_gray_scale_summing'
  5889                              <1> 	;
  5890                              <1> 	; Oracle VirtualBox 5.0.24 VGABios Source Code
  5891                              <1> 	; ('vgabios.c', 'vgatables.h', 'vgafonts.h', 'vgarom.asm')
  5892                              <1> 	;
  5893                              <1> 
  5894                              <1> 	; INPUT -> EBX = Start address (color index <= 255)
  5895                              <1> 	;	   ECX = Count (<= 256)
  5896                              <1> 	; OUTPUT -> (E)CX = 0
  5897                              <1> 	; (Modifed registers: EAX, ECX, EDX, EBX)
  5898                              <1> 
  5899 00002C2D 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  5900 00002C31 EC                  <1> 	in	al, dx
  5901 00002C32 30C0                <1> 	xor	al, al ; 0
  5902                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  5903                              <1> 	; 03/08/2022
  5904 00002C34 B2C0                <1> 	mov	dl, 0C0h
  5905 00002C36 EE                  <1> 	out	dx, al	; clear bit 5
  5906                              <1> 			; (while loading palette registers)
  5907                              <1> 	; set read address and switch to read mode
  5908                              <1> g_s_s_1:
  5909                              <1> 	;mov	dx, 3C7h ; VGAREG_DAC_READ_ADDRESS
  5910                              <1> 	; 03/08/2022
  5911 00002C37 B2C7                <1> 	mov	dl, 0C7h
  5912 00002C39 88D8                <1> 	mov	al, bl
  5913 00002C3B EE                  <1> 	out	dx, al
  5914                              <1> 	; get 6-bit wide RGB data values
  5915                              <1>  	; intensity = (0.3*Red)+(0.59*Green)+(0.11*Blue)
  5916                              <1> 	; i = ( ( 77*r + 151*g + 28*b ) + 0x80 ) >> 8;
  5917                              <1> 	;mov	dx, 3C9h ; VGAREG_DAC_DATA
  5918                              <1> 	; 03/08/2022
  5919 00002C3C B2C9                <1> 	mov	dl, 0C9h
  5920 00002C3E EC                  <1> 	in	al, dx ; red
  5921 00002C3F B44D                <1> 	mov	ah, 77 ; 0.3* Red
  5922 00002C41 F6E4                <1> 	mul	ah
  5923                              <1> 	;push	ax
  5924                              <1> 	; 12/04/2021
  5925 00002C43 50                  <1> 	push	eax
  5926 00002C44 EC                  <1> 	in	al, dx ; green
  5927 00002C45 B497                <1> 	mov	ah, 151  ; 0.59 * Green
  5928 00002C47 F6E4                <1> 	mul	ah
  5929                              <1> 	;push	ax
  5930                              <1> 	; 12/04/2021
  5931 00002C49 50                  <1> 	push	eax
  5932 00002C4A EC                  <1> 	in	al, dx ; blue
  5933 00002C4B B41C                <1> 	mov	ah, 28 ; 0.11 * Blue
  5934 00002C4D F6E4                <1> 	mul	ah
  5935                              <1> 	;pop	dx
  5936                              <1> 	; 12/04/2021
  5937 00002C4F 5A                  <1> 	pop	edx
  5938 00002C50 6601D0              <1> 	add	ax, dx
  5939                              <1> 	;pop	dx
  5940                              <1> 	; 12/04/2021
  5941 00002C53 5A                  <1> 	pop	edx
  5942 00002C54 6601D0              <1> 	add	ax, dx
  5943 00002C57 66058000            <1> 	add	ax, 80h  
  5944 00002C5B B03F                <1> 	mov	al, 3Fh
  5945 00002C5D 38C4                <1> 	cmp	ah, al	; if(i>0x3f)i=0x3f
  5946 00002C5F 7602                <1> 	jna	short g_s_s_2
  5947 00002C61 88C4                <1> 	mov	ah, al
  5948                              <1> g_s_s_2:
  5949                              <1> 	;mov	dx, 3C8h  ; VGAREG_DAC_WRITE_ADDRESS
  5950                              <1> 	; 03/08/2022
  5951 00002C63 B2C8                <1> 	mov	dl, 0C8h
  5952 00002C65 88D8                <1> 	mov	al, bl ; color index
  5953 00002C67 EE                  <1> 	out	dx, al
  5954 00002C68 88E0                <1> 	mov	al, ah ; intensity
  5955                              <1> 	;inc	dx ; 3C9h ; VGAREG_DAC_DATA
  5956                              <1> 	; 03/08/2022
  5957 00002C6A FEC2                <1> 	inc	dl
  5958 00002C6C EE                  <1> 	out	dx, al ; R (R=G=B)
  5959 00002C6D 88E0                <1> 	mov	al, ah ; intensity
  5960 00002C6F EE                  <1> 	out	dx, al ; G (R=G=B)
  5961 00002C70 88E0                <1>  	mov	al, ah ; intensity
  5962 00002C72 EE                  <1> 	out	dx, al ; B (R=G=B)
  5963                              <1> 	;dec	cx
  5964                              <1> 	; 03/08/2022
  5965 00002C73 49                  <1> 	dec	ecx
  5966 00002C74 7404                <1> 	jz	short g_s_s_3
  5967 00002C76 FEC3                <1> 	inc	bl    ; next color index value
  5968 00002C78 EBBD                <1> 	jmp	short g_s_s_1
  5969                              <1> g_s_s_3:
  5970                              <1> 	;mov	dx, 3DAh ; VGAREG_ACTL_RESET
  5971                              <1> 	; 03/08/2022
  5972 00002C7A B2DA                <1> 	mov	dl, 0DAh
  5973 00002C7C EC                  <1> 	in	al, dx
  5974 00002C7D B020                <1> 	mov	al, 20h
  5975                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  5976                              <1> 	; 03/08/2022
  5977 00002C7F B2C0                <1> 	mov	dl, 0C0h 
  5978 00002C81 EE                  <1> 	out	dx, al ; 20h -> set bit 5
  5979                              <1> 		        ; (after loading palette regs)
  5980 00002C82 C3                  <1> 	retn
  5981                              <1> 
  5982                              <1> vga_write_char_attr:
  5983                              <1> vga_write_char_only: 
  5984                              <1> 	; 08/07/2016 (TRDOS 386 = TRDOS v2.0)
  5985                              <1> 	;
  5986                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  5987                              <1> 	; vgabios-0.7a (2011)
  5988                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  5989                              <1> 	; 'vgabios.c', 'biosfn_write_char_attr'
  5990                              <1> 	; 'biosfn_write_char_only'
  5991                              <1> 
  5992                              <1> 	; INPUT ->
  5993                              <1> 	; [CRT_MODE] = current video mode (>7)
  5994                              <1> 	; CX = Count of characters to write
  5995                              <1> 	; AL = Character to write
  5996                              <1> 	; BL = Color of character
  5997                              <1> 	; OUTPUT ->
  5998                              <1> 	; Regen buffer updated
  5999                              <1>  
  6000 00002C83 8A25[BE670000]      <1> 	mov 	ah, [CRT_MODE]
  6001 00002C89 668B15[A6780100]    <1> 	mov	dx, [CURSOR_POSN] ; cursor pos for page 0
  6002                              <1> 
  6003 00002C90 BE[DA670000]        <1> 	mov	esi, vga_modes
  6004 00002C95 89F7                <1> 	mov	edi, esi
  6005 00002C97 83C710              <1> 	add	edi, vga_mode_count
  6006                              <1> vga_wca_0:
  6007 00002C9A AC                  <1> 	lodsb
  6008 00002C9B 38E0                <1> 	cmp	al, ah ; [CRT_MODE]
  6009 00002C9D 7405                <1> 	je	short vga_wca_2
  6010 00002C9F 39FE                <1> 	cmp	esi, edi
  6011 00002CA1 72F7                <1> 	jb	short vga_wca_0
  6012                              <1> vga_wca_1:
  6013 00002CA3 C3                  <1> 	retn	; nothing to do
  6014                              <1> vga_wca_2:
  6015 00002CA4 83C64F              <1> 	add	esi, vga_memmodel - (vga_modes + 1)  
  6016                              <1> 	; [ESI] = VGA memory model number (LINEAR8, PLANAR4, PLANAR1)
  6017                              <1> 
  6018                              <1> 	; biosfn_write_char_attr (car,page,attr,count) 
  6019                              <1> 	; AL = car, page = 0, BL = attr, CX = count
  6020 00002CA7 803E04              <1> 	cmp	byte [esi], PLANAR4
  6021 00002CAA 741D                <1> 	je	short vga_wca_planar
  6022 00002CAC 803E03              <1> 	cmp	byte [esi], PLANAR1
  6023 00002CAF 7418                <1> 	je	short vga_wca_planar
  6024                              <1> vga_wca_linear8:
  6025                              <1> 	; while((count-->0) && (xcurs<nbcols))
  6026                              <1> 	; CX = count
  6027 00002CB1 6621C9              <1> 	and	cx, cx
  6028 00002CB4 74ED                <1> 	jz	short vga_wca_1
  6029 00002CB6 3A15[C0670000]      <1> 	cmp	dl, [CRT_COLS]
  6030 00002CBC 73E5                <1> 	jnb	short vga_wca_1
  6031                              <1> 	; write_gfx_char_lin(car,attr,xcurs,ycurs,nbcols);
  6032                              <1> 	; AL = car, BL = attr, DL = xcurs, DH = ycurs, 
  6033                              <1> 	; [CRT_COLS] = nbcols
  6034 00002CBE E81E000000          <1> 	call	write_gfx_char_lin	 
  6035 00002CC3 6649                <1> 	dec	cx ; count
  6036 00002CC5 FEC2                <1> 	inc	dl ; xcurs
  6037 00002CC7 EBE8                <1> 	jmp	short vga_wca_linear8
  6038                              <1> vga_wca_planar:
  6039                              <1> 	; while((count-->0) && (xcurs<nbcols))
  6040                              <1> 	; CX = count
  6041 00002CC9 6621C9              <1> 	and	cx, cx
  6042 00002CCC 74D5                <1> 	jz	short vga_wca_1
  6043 00002CCE 3A15[C0670000]      <1> 	cmp	dl, [CRT_COLS]
  6044 00002CD4 73CD                <1> 	jnb	short vga_wca_1
  6045                              <1> 	; write_gfx_char_pl4(car,attr,xcurs,ycurs,nbcols,cheight);
  6046                              <1> 	; AL = car, BL = attr, DL = xcurs, DH = ycurs, 
  6047                              <1> 	; [CRT_COLS] = nbcols, [CHAR_HEIGHT] = cheight
  6048 00002CD6 E8A7000000          <1> 	call	write_gfx_char_pl4
  6049 00002CDB 6649                <1> 	dec	cx ; count
  6050 00002CDD FEC2                <1> 	inc	dl ; xcurs
  6051 00002CDF EBE8                <1> 	jmp	short vga_wca_planar
  6052                              <1> 
  6053                              <1> write_gfx_char_lin:
  6054                              <1> 	; 02/08/2022 (TRDOS 386 v2.0.5)
  6055                              <1> 	; 08/01/2021
  6056                              <1> 	; 05/01/2021 (TRDOS 386 v2.0.3)
  6057                              <1> 	; 08/08/2016
  6058                              <1> 	; 31/07/2016
  6059                              <1> 	; 08/07/2016 (TRDOS 386 = TRDOS v2.0)
  6060                              <1> 	;
  6061                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  6062                              <1> 	; vgabios-0.7a (2011)
  6063                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  6064                              <1> 	; 'vgabios.c', 'write_gfx_char_lin'
  6065                              <1> 
  6066                              <1> 	; write_gfx_char_lin(car,attr,xcurs,ycurs,nbcols)
  6067                              <1> 	; INPUT ->
  6068                              <1> 	; AL = car, BL = attr, DL = xcurs, DH = ycurs, 
  6069                              <1> 	; [CRT_COLS] = nbcols
  6070                              <1> 	; OUTPUT ->
  6071                              <1> 	; Regen buffer updated
  6072                              <1> 
  6073 00002CE1 51                  <1> 	push	ecx
  6074 00002CE2 53                  <1> 	push	ebx
  6075 00002CE3 52                  <1> 	push	edx
  6076 00002CE4 50                  <1> 	push	eax
  6077                              <1> 	; addr=xcurs*8+ycurs*nbcols*64;
  6078                              <1> 	; 08/08/2016
  6079 00002CE5 0FB6F0              <1> 	movzx	esi, al ; car
  6080                              <1> 	; 08/01/2021
  6081                              <1> 	;movzx	eax, dh ; ycurs
  6082                              <1> 	;mov	ah, [CRT_COLS] ; nbcols
  6083                              <1> 	;mul	ah
  6084 00002CE8 A0[C0670000]        <1> 	mov	al, [CRT_COLS]
  6085 00002CED F6E6                <1> 	mul	dh
  6086                              <1> 	;shl	ax, 6 ; * 64
  6087                              <1> 	;shl	ax, 3 ; 8 * ycurs * [CRT_COLS]
  6088                              <1> 	; 02/08/2022
  6089 00002CEF C1E003              <1> 	shl	eax, 3
  6090                              <1> 	;sub	dh, dh
  6091                              <1> 	;shl	dx, 3 ; xcurs * 8
  6092                              <1> 	;movzx	edi, dx
  6093 00002CF2 BF00000A00          <1> 	mov	edi, 0A0000h
  6094 00002CF7 30F6                <1> 	xor	dh, dh
  6095 00002CF9 6689D7              <1> 	mov	di, dx
  6096                              <1> 	;movzx	edi, dl
  6097 00002CFC 66C1E703            <1> 	shl	di, 3 ; xcurs * 8
  6098                              <1> 	;xor	dh, dh
  6099 00002D00 8A15[C2670000]      <1> 	mov	dl, [CHAR_HEIGHT]
  6100 00002D06 66F7E2              <1> 	mul	dx
  6101                              <1> 	; eax = ycurs*nbcols*8*[CHAR_HEIGHT]
  6102                              <1> 	;add	edi, eax ; addr
  6103                              <1> 	;add	edi, 0A0000h
  6104 00002D09 6601C7              <1> 	add	di, ax
  6105                              <1> 	;shl	si, 3 ; car * 8
  6106 00002D0C 30E4                <1> 	xor	ah, ah
  6107 00002D0E A0[C2670000]        <1> 	mov	al, [CHAR_HEIGHT]
  6108 00002D13 66F7E6              <1> 	mul	si
  6109 00002D16 6689C6              <1> 	mov	si, ax
  6110                              <1> 	;; esi = src = car * 8
  6111                              <1> 	; esi = src = car * [CHAR_HEIGHT]
  6112                              <1> 	; i = 0
  6113                              <1> 	;add	esi, vgafont8 ; fdata [src+i]
  6114                              <1> 	; 08/08/2016
  6115 00002D19 A1[2E850100]        <1> 	mov	eax, [VGA_INT43H]
  6116 00002D1E 09C0                <1> 	or	eax, eax ; 0 ?
  6117 00002D20 743E                <1> 	jz	short wfxl_7 ; yes, default font
  6118                              <1> 	;cmp	eax, vgafont16
  6119                              <1>         ;je	short wgfxl_0
  6120                              <1> 	;cmp	eax, vgafont14
  6121                              <1> 	;je	short wgfxl_0
  6122                              <1> 	;cmp	eax, vgafont8
  6123                              <1> 	;je	short wgfxl_0
  6124                              <1> 	;; 05/01/2021 (TRDOS 386 v2.0.3)
  6125                              <1> 	;; user font  
  6126                              <1> 	;mov	eax, VGAFONTUSR ; 8x16 or 8x8 or 8x14 font
  6127                              <1> 	;			; (256 characters)
  6128                              <1> wgfxl_0:
  6129 00002D22 01C6                <1> 	add	esi, eax
  6130                              <1> wgfxl_1:
  6131 00002D24 28FF                <1> 	sub	bh, bh ; i = 0
  6132                              <1> wgfxl_2:
  6133                              <1> 	; for(i=0;i<8;i++)
  6134 00002D26 57                  <1> 	push	edi ; addr
  6135 00002D27 0FB605[C0670000]    <1> 	movzx	eax, byte [CRT_COLS] ; nbcols
  6136 00002D2E F6E7                <1> 	mul	bh ; nbcols*i
  6137                              <1> 	;shl	ax, 3 ; i*nbcols*8
  6138                              <1>  	; 02/08/2022
  6139 00002D30 C1E003              <1> 	shl	eax, 3
  6140                              <1> 	; dest=addr+i*nbcols*8;
  6141 00002D33 01C7                <1> 	add	edi, eax ; dest + j ; j = 0
  6142 00002D35 B180                <1> 	mov	cl, 80h ; mask = 0x80;
  6143                              <1> 	; esi = fdata + src + i
  6144                              <1> 	; for(j=0;j<8;j++)
  6145 00002D37 29D2                <1> 	sub	edx, edx ; j = 0
  6146                              <1> wgfxl_3:
  6147 00002D39 8A06                <1> 	mov	al, [esi] ; al = fdata[src+i]
  6148 00002D3B 20C8                <1> 	and	al, cl ; if (fdata[src+i] & mask)
  6149 00002D3D 7402                <1> 	jz	short wgfxl_4  ; data = 0, zf = 1
  6150 00002D3F 88D8                <1> 	mov	al, bl ; data = attr;
  6151                              <1> wgfxl_4:
  6152                              <1> 	; write_byte(0xa000,dest+j,data);		
  6153 00002D41 AA                  <1> 	stosb  ; dest + j (+ 0A0000h)
  6154                              <1> 	;inc	dl ; j++
  6155                              <1> 	;cmp	dl, 8
  6156 00002D42 80FA07              <1> 	cmp	dl, 7
  6157 00002D45 720E                <1> 	jb	short wgfxl_5
  6158 00002D47 5F                  <1> 	pop	edi
  6159                              <1> 	; 08/08/2016
  6160                              <1> 	;cmp	bh, 7
  6161                              <1> 	;jnb	short wgfxl_6
  6162 00002D48 FEC7                <1> 	inc	bh ; i++
  6163 00002D4A 3A3D[C2670000]      <1> 	cmp	bh, [CHAR_HEIGHT]
  6164 00002D50 7309                <1> 	jnb	short wgfxl_6
  6165 00002D52 46                  <1> 	inc	esi
  6166 00002D53 EBD1                <1> 	jmp	short wgfxl_2
  6167                              <1> wgfxl_5:
  6168 00002D55 D0E9                <1> 	shr	cl, 1 ; mask >>= 1;
  6169 00002D57 FEC2                <1> 	inc	dl ; j++
  6170 00002D59 EBDE                <1>         jmp     short wgfxl_3
  6171                              <1> wgfxl_6:
  6172 00002D5B 58                  <1> 	pop	eax
  6173 00002D5C 5A                  <1> 	pop	edx
  6174 00002D5D 5B                  <1> 	pop	ebx
  6175 00002D5E 59                  <1> 	pop	ecx
  6176 00002D5F C3                  <1> 	retn
  6177                              <1> wfxl_7:
  6178                              <1> 	; 08/01/2021
  6179                              <1> 	; 05/01/2021
  6180                              <1> 	; Default font (8x8 or 8x14 or 8x16)
  6181 00002D60 A0[C2670000]        <1> 	mov	al, [CHAR_HEIGHT]
  6182 00002D65 3C08                <1> 	cmp	al, 8
  6183 00002D67 7507                <1> 	jne	short wfxl_8
  6184 00002D69 B8[1C4F0100]        <1> 	mov	eax, vgafont8
  6185 00002D6E EBB2                <1> 	jmp	short wgfxl_0
  6186                              <1> wfxl_8:
  6187 00002D70 3C0E                <1> 	cmp	al, 14
  6188 00002D72 7507                <1> 	jne	short wfxl_9
  6189 00002D74 B8[1C570100]        <1> 	mov	eax, vgafont14
  6190 00002D79 EBA7                <1> 	jmp	short wgfxl_0
  6191                              <1> wfxl_9:
  6192 00002D7B B8[1C650100]        <1> 	mov	eax, vgafont16
  6193 00002D80 EBA0                <1> 	jmp	short wgfxl_0
  6194                              <1> 
  6195                              <1> write_gfx_char_pl4:
  6196                              <1> 	; 02/08/2022 (TRDOS 386 Kernel v2.0.5)
  6197                              <1> 	; 08/08/2016
  6198                              <1> 	; 08/07/2016 (TRDOS 386 = TRDOS v2.0)
  6199                              <1> 	;
  6200                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  6201                              <1> 	; vgabios-0.7a (2011)
  6202                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  6203                              <1> 	; 'vgabios.c', 'write_gfx_char_pl4'
  6204                              <1> 
  6205                              <1> 	; write_gfx_char_pl4(car,attr,xcurs,ycurs,nbcols,cheight)
  6206                              <1> 	; INPUT ->
  6207                              <1> 	; AL = car, BL = attr, DL = xcurs, DH = ycurs, 
  6208                              <1> 	; [CRT_COLS] = nbcols, [CHAR_HEIGHT] = cheight
  6209                              <1> 	; OUTPUT ->
  6210                              <1> 	; Regen buffer updated
  6211                              <1> 
  6212 00002D82 51                  <1> 	push	ecx
  6213 00002D83 53                  <1> 	push	ebx
  6214 00002D84 52                  <1> 	push	edx
  6215 00002D85 50                  <1> 	push	eax
  6216                              <1> wgfxpl_f0:
  6217                              <1> 	; switch(cheight)
  6218 00002D86 8A25[C2670000]      <1> 	mov	ah, [CHAR_HEIGHT]
  6219 00002D8C 80FC10              <1> 	cmp	ah, 16 ; case 16:
  6220 00002D8F 7507                <1> 	jne	short wgfxpl_f1
  6221                              <1> 	; fdata = &vgafont16;
  6222 00002D91 BE[1C650100]        <1> 	mov	esi, vgafont16
  6223 00002D96 EB13                <1> 	jmp	short wgfxpl_f3
  6224                              <1> wgfxpl_f1:
  6225 00002D98 80FC0E              <1> 	cmp	ah, 14 ; case 14:
  6226 00002D9B 7507                <1> 	jne	short wgfxpl_f2
  6227 00002D9D BE[1C570100]        <1> 	mov	esi, vgafont14
  6228 00002DA2 EB07                <1> 	jmp	short wgfxpl_f3
  6229                              <1> wgfxpl_f2:
  6230                              <1> 	; default:
  6231                              <1> 	;  fdata = &vgafont8;
  6232 00002DA4 BE[1C4F0100]        <1> 	mov	esi, vgafont8
  6233 00002DA9 B408                <1> 	mov	ah, 8	
  6234                              <1> wgfxpl_f3:
  6235                              <1> 	; al = car
  6236 00002DAB F6E4                <1> 	mul	ah ; ah = cheight
  6237 00002DAD 25FFFF0000          <1> 	and	eax, 0FFFFh ; car * cheight
  6238                              <1> 	; src = car * cheight;
  6239 00002DB2 01C6                <1> 	add	esi, eax ; esi = fdata[src+i]
  6240                              <1> 	; addr=xcurs*8+ycurs*nbcols*64;
  6241 00002DB4 88F0                <1> 	mov	al, dh ; ycurs
  6242 00002DB6 8A25[C0670000]      <1> 	mov	ah, [CRT_COLS] ; nbcols
  6243 00002DBC F6E4                <1> 	mul	ah
  6244                              <1> 	; 08/08/2016
  6245                              <1> 	;shl	ax, 6 ; * 64
  6246                              <1> 	;shl	ax, 3 ; * 8
  6247                              <1> 	; 02/08/2022
  6248 00002DBE C1E003              <1> 	shl	eax, 3
  6249                              <1> 	;sub	dh, dh ; 0
  6250                              <1> 	;shl	dx, 3 ; xcurs * 8
  6251                              <1> 	;movzx	edi, dx
  6252 00002DC1 0FB6FA              <1> 	movzx	edi, dl
  6253                              <1> 	;shl	di, 3 ; xcurs * 8
  6254                              <1> 	; 02/08/2022
  6255 00002DC4 C1E703              <1> 	shl	edi, 3
  6256 00002DC7 30F6                <1> 	xor	dh, dh
  6257 00002DC9 8A15[C2670000]      <1> 	mov	dl, [CHAR_HEIGHT]
  6258 00002DCF 66F7E2              <1> 	mul	dx
  6259                              <1> 	; eax = ycurs*nbcols*8*[CHAR_HEIGHT]
  6260 00002DD2 01C7                <1> 	add	edi, eax ; addr
  6261 00002DD4 81C700000A00        <1> 	add	edi, 0A0000h
  6262                              <1> 	;
  6263                              <1> 	; outw(VGAREG_SEQU_ADDRESS, 0x0f02);
  6264                              <1> 	; outw(VGAREG_GRDC_ADDRESS, 0x0205);
  6265 00002DDA 66BAC403            <1> 	mov	dx, 3C4h ; VGAREG_SEQU_ADDRESS
  6266 00002DDE 66B8020F            <1> 	mov	ax, 0F02h
  6267 00002DE2 66EF                <1> 	out	dx, ax
  6268 00002DE4 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  6269 00002DE8 66B80502            <1> 	mov	ax, 0205h
  6270 00002DEC 66EF                <1> 	out	dx, ax
  6271                              <1> 	;
  6272 00002DEE 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  6273 00002DF2 F6C380              <1> 	test	bl, 80h ; if(attr&0x80)
  6274 00002DF5 7406                <1> 	jz	short wgfxpl_f4 ; else
  6275                              <1> 	; outw(VGAREG_GRDC_ADDRESS, 0x1803);
  6276 00002DF7 66B80318            <1> 	mov	ax, 1803h
  6277 00002DFB EB04                <1> 	jmp	short wgfxpl_f5
  6278                              <1> wgfxpl_f4:
  6279                              <1> 	; outw(VGAREG_GRDC_ADDRESS, 0x0003);
  6280 00002DFD 66B80300            <1> 	mov	ax, 0003h	
  6281                              <1> wgfxpl_f5:
  6282 00002E01 66EF                <1> 	out	dx, ax
  6283                              <1> 	;	
  6284 00002E03 28FF                <1> 	sub	bh, bh ; i = 0
  6285                              <1> wgfxpl_0:
  6286                              <1> 	; for(i=0;i<cheight;i++)
  6287 00002E05 57                  <1> 	push	edi ; addr
  6288 00002E06 0FB605[C0670000]    <1> 	movzx	eax, byte [CRT_COLS] ; nbcols
  6289 00002E0D F6E7                <1> 	mul	bh ; nbcols*i
  6290                              <1> 	; dest=addr+i*nbcols
  6291 00002E0F 01C7                <1> 	add	edi, eax ; dest
  6292 00002E11 B580                <1> 	mov	ch, 80h ; mask = 0x80;
  6293                              <1> 	; for(j=0;j<8;j++)
  6294 00002E13 28C9                <1> 	sub	cl, cl ; j = 0
  6295                              <1> wgfxpl_1:
  6296 00002E15 D2ED                <1> 	shr	ch, cl ; mask=0x80>>j;
  6297                              <1> 	;
  6298                              <1> 	; outw(VGAREG_GRDC_ADDRESS, (mask << 8) | 0x08);
  6299                              <1>      	; read_byte(0xa000,dest);
  6300                              <1> 	;mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  6301 00002E17 88EC                <1> 	mov	ah, ch
  6302 00002E19 B008                <1> 	mov	al, 8
  6303 00002E1B 66EF                <1> 	out	dx, ax
  6304 00002E1D 8A07                <1> 	mov	al, [edi] ; ? (io delay?)
  6305                              <1> 	;
  6306 00002E1F 28C0                <1> 	sub	al, al ; attr = 0
  6307                              <1> 	; if (fdata[src+i] & mask)
  6308 00002E21 842E                <1> 	test	byte [esi], ch
  6309 00002E23 7404                <1> 	jz	short wgfxpl_2  ; zf = 1
  6310                              <1> 	; write_byte(0xa000,dest,attr&0x0f);
  6311 00002E25 88D8                <1> 	mov	al, bl ; attr;
  6312 00002E27 240F                <1> 	and	al, 0Fh	; attr&0x0f
  6313                              <1> wgfxpl_2:
  6314                              <1> 	; write_byte(0xa000,dest,0x00);		
  6315 00002E29 8807                <1> 	mov	[edi], al ; dest (+ 0A0000h)
  6316 00002E2B FEC1                <1> 	inc	cl ; j++
  6317 00002E2D 80F908              <1> 	cmp	cl, 8
  6318 00002E30 72E3                <1> 	jb	short wgfxpl_1
  6319 00002E32 5F                  <1> 	pop	edi
  6320                              <1> 	; 08/08/2016
  6321                              <1> 	;cmp	bh, 7
  6322                              <1> 	;jnb	short wgfxpl_3
  6323 00002E33 FEC7                <1> 	inc	bh ; i++
  6324 00002E35 3A3D[C2670000]      <1> 	cmp	bh, [CHAR_HEIGHT]
  6325 00002E3B 7303                <1> 	jnb	short wgfxpl_3
  6326 00002E3D 46                  <1> 	inc	esi
  6327 00002E3E EBC5                <1> 	jmp	short wgfxpl_0
  6328                              <1> wgfxpl_3:
  6329                              <1> 	;mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  6330 00002E40 66B808FF            <1>   	mov	ax, 0FF08h
  6331 00002E44 66EF                <1> 	out	dx, ax
  6332 00002E46 66B80500            <1> 	mov	ax, 0005h
  6333 00002E4A 66EF                <1> 	out	dx, ax
  6334 00002E4C 66B80300            <1> 	mov	ax, 0003h
  6335 00002E50 66EF                <1> 	out	dx, ax
  6336                              <1> 	;
  6337 00002E52 58                  <1> 	pop	eax
  6338 00002E53 5A                  <1> 	pop	edx
  6339 00002E54 5B                  <1> 	pop	ebx
  6340 00002E55 59                  <1> 	pop	ecx
  6341 00002E56 C3                  <1> 	retn
  6342                              <1> 
  6343                              <1> vga_write_pixel:
  6344                              <1> 	; 02/08/2022 (TRDOS 386 Kerbel v2.0.5)
  6345                              <1> 	; 09/07/2016 (TRDOS 386 = TRDOS v2.0)
  6346                              <1> 	;
  6347                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  6348                              <1> 	; vgabios-0.7a (2011)
  6349                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  6350                              <1> 	; 'vgabios.c', 'biosfn_write_pixel'
  6351                              <1> 
  6352                              <1> 	; INPUT ->
  6353                              <1> 	; 	DX = row (0-239)
  6354                              <1> 	; 	CX = column (0-799)
  6355                              <1> 	; 	AL = pixel value
  6356                              <1> 	;	(AH = [CRT_MODE])
  6357                              <1> 	; OUTPUT ->
  6358                              <1> 	; 	none
  6359                              <1>  
  6360 00002E57 88C3                <1> 	mov	bl, al ; pixel value
  6361                              <1> 	;mov 	ah, [CRT_MODE]
  6362 00002E59 BE[DA670000]        <1> 	mov	esi, vga_modes
  6363 00002E5E 89F7                <1> 	mov	edi, esi
  6364 00002E60 83C710              <1> 	add	edi, vga_mode_count
  6365                              <1> vga_wp_0:
  6366 00002E63 AC                  <1> 	lodsb
  6367 00002E64 38E0                <1> 	cmp	al, ah ; [CRT_MODE]
  6368 00002E66 7405                <1> 	je	short vga_wp_1
  6369 00002E68 39FE                <1> 	cmp	esi, edi
  6370 00002E6A 72F7                <1> 	jb	short vga_wp_0
  6371 00002E6C C3                  <1> 	retn	; nothing to do
  6372                              <1> vga_wp_1:
  6373 00002E6D 83C64F              <1> 	add	esi, vga_memmodel - (vga_modes + 1)  
  6374                              <1> 	; [ESI] = VGA memory model number (LINEAR8, PLANAR4, PLANAR1)
  6375 00002E70 BF00000A00          <1> 	mov	edi, 0A0000h
  6376                              <1> 	;
  6377 00002E75 803E04              <1> 	cmp	byte [esi], PLANAR4
  6378 00002E78 741C                <1> 	je	short vga_wp_planar
  6379 00002E7A 803E03              <1> 	cmp	byte [esi], PLANAR1
  6380 00002E7D 7417                <1> 	je	short vga_wp_planar
  6381                              <1> vga_wp_linear8:
  6382                              <1> 	; addr=CX+DX*(read_word(BIOSMEM_SEG,BIOSMEM_NB_COLS)*8);
  6383 00002E7F 0FB605[C0670000]    <1> 	movzx	eax, byte [CRT_COLS] ; = [VGA_COLS] ; nbcols
  6384                              <1>      	;shl	ax, 3 ; * 8
  6385                              <1> 	; 02/08/2022
  6386 00002E86 C1E003              <1> 	shl	eax, 3
  6387 00002E89 66F7E2              <1> 	mul	dx
  6388 00002E8C 50                  <1> 	push	eax
  6389                              <1> 	;mov	edi, 0A0000h
  6390 00002E8D 6601CF              <1> 	add	di, cx
  6391 00002E90 58                  <1> 	pop	eax
  6392 00002E91 01C7                <1> 	add	edi, eax ; addr
  6393                              <1> 	; write_byte(0xa000,addr,AL);
  6394 00002E93 881F                <1> 	mov	[edi], bl
  6395 00002E95 C3                  <1> 	retn    
  6396                              <1> vga_wp_planar:
  6397                              <1> 	; addr = CX/8+DX*read_word(BIOSMEM_SEG,BIOSMEM_NB_COLS);
  6398 00002E96 0FB7C1              <1> 	movzx	eax, cx
  6399 00002E99 66C1E803            <1> 	shr	ax, 3 ; CX/8
  6400 00002E9D 50                  <1> 	push	eax
  6401 00002E9E 28E4                <1> 	sub	ah, ah ; 0
  6402 00002EA0 A0[C0670000]        <1> 	mov	al, [CRT_COLS] ; = [VGA_COLS] ; nbcols
  6403 00002EA5 66F7E2              <1> 	mul	dx
  6404                              <1> 	;mov	edi, 0A0000h
  6405 00002EA8 6601C7              <1>         add     di, ax
  6406 00002EAB 58                  <1> 	pop	eax
  6407 00002EAC 01C7                <1> 	add	edi, eax ; addr
  6408 00002EAE 80E107              <1> 	and	cl, 7
  6409 00002EB1 B580                <1> 	mov	ch, 80h ; mask
  6410 00002EB3 D2ED                <1> 	shr	ch, cl 	; mask = 0x80 >> (CX & 0x07);
  6411                              <1> 	
  6412                              <1> 	; outw(VGAREG_GRDC_ADDRESS, (mask << 8) | 0x08);
  6413 00002EB5 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  6414 00002EB9 88EC                <1> 	mov	ah, ch
  6415 00002EBB B008                <1> 	mov	al, 8
  6416 00002EBD 66EF                <1> 	out	dx, ax
  6417                              <1> 	; outw(VGAREG_GRDC_ADDRESS, 0x0205);
  6418 00002EBF 66B80502            <1> 	mov	ax, 0205h
  6419 00002EC3 66EF                <1> 	out	dx, ax
  6420                              <1> 	; data = read_byte(0xa000,addr);
  6421 00002EC5 8A07                <1> 	mov	al, [edi] ; (delay?)	
  6422                              <1> 	; if (AL & 0x80)
  6423                              <1> 	; {
  6424                              <1> 	;  outw(VGAREG_GRDC_ADDRESS, 0x1803);
  6425                              <1> 	; }
  6426 00002EC7 F6C380              <1> 	test	bl, 80h
  6427 00002ECA 7406                <1> 	jz	short vga_wp_2
  6428 00002ECC 66B80318            <1> 	mov	ax, 1803h
  6429 00002ED0 66EF                <1> 	out	dx, ax
  6430                              <1> vga_wp_2:	
  6431                              <1> 	; write_byte(0xa000,addr,AL);
  6432 00002ED2 881F                <1> 	mov	[edi], bl
  6433                              <1> 	;
  6434                              <1> 	;mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  6435 00002ED4 66B808FF            <1>   	mov	ax, 0FF08h
  6436 00002ED8 66EF                <1> 	out	dx, ax
  6437 00002EDA 66B80500            <1> 	mov	ax, 0005h
  6438 00002EDE 66EF                <1> 	out	dx, ax
  6439 00002EE0 66B80300            <1> 	mov	ax, 0003h
  6440 00002EE4 66EF                <1> 	out	dx, ax
  6441                              <1> 	;
  6442 00002EE6 C3                  <1> 	retn
  6443                              <1> 
  6444                              <1> vga_read_pixel: 
  6445                              <1> 	; 02/08/2022 (TRDOS 386 Kernel v2.0.5)
  6446                              <1> 	; 09/07/2016 (TRDOS 386 = TRDOS v2.0)
  6447                              <1> 	;
  6448                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  6449                              <1> 	; vgabios-0.7a (2011)
  6450                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  6451                              <1> 	; 'vgabios.c', 'biosfn_read_pixel'
  6452                              <1> 
  6453                              <1> 	; INPUT ->
  6454                              <1> 	; 	DX = row (0-239)
  6455                              <1> 	; 	CX = column (0-799)
  6456                              <1> 	;	(AH = [CRT_MODE])
  6457                              <1> 	; OUTPUT ->
  6458                              <1> 	; 	AL = pixel value
  6459                              <1> 	 
  6460                              <1> 	;mov 	ah, [CRT_MODE]
  6461 00002EE7 BE[DA670000]        <1> 	mov	esi, vga_modes
  6462 00002EEC 89F7                <1> 	mov	edi, esi
  6463 00002EEE 83C710              <1> 	add	edi, vga_mode_count
  6464                              <1> vga_rp_0:
  6465 00002EF1 AC                  <1> 	lodsb
  6466 00002EF2 38E0                <1> 	cmp	al, ah ; [CRT_MODE]
  6467 00002EF4 7405                <1> 	je	short vga_rp_1
  6468 00002EF6 39FE                <1> 	cmp	esi, edi
  6469 00002EF8 72F7                <1> 	jb	short vga_rp_0
  6470 00002EFA C3                  <1> 	retn	; nothing to do
  6471                              <1> vga_rp_1:
  6472 00002EFB 83C64F              <1> 	add	esi, vga_memmodel - (vga_modes + 1)  
  6473                              <1> 	; [ESI] = VGA memory model number (LINEAR8, PLANAR4, PLANAR1)
  6474 00002EFE BF00000A00          <1> 	mov	edi, 0A0000h
  6475                              <1> 	;
  6476 00002F03 803E04              <1> 	cmp	byte [esi], PLANAR4
  6477 00002F06 741C                <1> 	je	short vga_rp_planar
  6478 00002F08 803E03              <1> 	cmp	byte [esi], PLANAR1
  6479 00002F0B 7417                <1> 	je	short vga_rp_planar
  6480                              <1> vga_rp_linear8:
  6481                              <1> 	; addr=CX+DX*(read_word(BIOSMEM_SEG,BIOSMEM_NB_COLS)*8);
  6482 00002F0D 0FB605[C0670000]    <1> 	movzx	eax, byte [CRT_COLS] ; = [VGA_COLS] ; nbcols
  6483                              <1>      	;shl	ax, 3 ; * 8
  6484                              <1> 	; 02/08/2022
  6485 00002F14 C1E003              <1> 	shl	eax, 3
  6486 00002F17 66F7E2              <1> 	mul	dx
  6487 00002F1A 50                  <1> 	push	eax
  6488                              <1> 	;mov	edi, 0A0000h
  6489 00002F1B 6601CF              <1> 	add	di, cx
  6490 00002F1E 58                  <1> 	pop	eax
  6491 00002F1F 01C7                <1> 	add	edi, eax ; addr
  6492                              <1> 	; attr=read_byte(0xa000,addr);
  6493 00002F21 8A07                <1> 	mov	al, [edi] ; pixel value
  6494 00002F23 C3                  <1> 	retn    
  6495                              <1> vga_rp_planar:
  6496                              <1> 	; addr = CX/8+DX*read_word(BIOSMEM_SEG,BIOSMEM_NB_COLS);
  6497 00002F24 0FB7C1              <1> 	movzx	eax, cx
  6498 00002F27 66C1E803            <1> 	shr	ax, 3 ; CX/8
  6499 00002F2B 50                  <1> 	push	eax
  6500 00002F2C 28E4                <1> 	sub	ah, ah ; 0
  6501 00002F2E A0[C0670000]        <1> 	mov	al, [CRT_COLS] ; = [VGA_COLS] ; nbcols
  6502 00002F33 66F7E2              <1> 	mul	dx
  6503                              <1> 	;mov	edi, 0A0000h
  6504 00002F36 6601C7              <1>         add     di, ax
  6505 00002F39 58                  <1> 	pop	eax
  6506 00002F3A 01C7                <1> 	add	edi, eax ; addr
  6507 00002F3C 80E107              <1> 	and	cl, 7
  6508 00002F3F B580                <1> 	mov	ch, 80h ; mask
  6509 00002F41 D2ED                <1> 	shr	ch, cl 	; mask = 0x80 >> (CX & 0x07);
  6510                              <1> 	; attr = 0x00;
  6511 00002F43 30DB                <1> 	xor	bl, bl ; attr = bl = 0, 
  6512 00002F45 30C9                <1> 	xor	cl, cl ; i = cl = 0
  6513                              <1> 	; for(i=0;i<4;i++)
  6514                              <1>       	; {
  6515                              <1>        	;  outw(VGAREG_GRDC_ADDRESS, (i << 8) | 0x04);
  6516                              <1>        	;  data = read_byte(0xa000,addr) & mask;
  6517                              <1>        	;  if (data > 0) attr |= (0x01 << i);
  6518                              <1>       	; }
  6519                              <1> vga_rp_2:
  6520 00002F47 88CC                <1> 	mov	ah, cl ; i << 8
  6521 00002F49 B004                <1> 	mov	al, 4  ; | 0x04
  6522 00002F4B 66BACE03            <1> 	mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  6523 00002F4F 66EF                <1> 	out	dx, ax
  6524                              <1> 	; data = read_byte(0xa000,addr) & mask;
  6525 00002F51 8A07                <1> 	mov	al, [edi]
  6526 00002F53 20E8                <1> 	and	al, ch ; & mask
  6527                              <1> 	; if (data > 0) attr |= (0x01 << i);
  6528 00002F55 08C0                <1> 	or	al, al
  6529 00002F57 7408                <1> 	jz	short vga_rp_3 ; al = 0 
  6530 00002F59 B701                <1> 	mov	bh, 1
  6531 00002F5B D2E7                <1> 	shl	bh, cl ; (0x01 << i)
  6532 00002F5D 08FB                <1> 	or	bl, bh ; attr |= (0x01 << i)
  6533 00002F5F 88D8                <1> 	mov	al, bl ; pixel value	
  6534                              <1> vga_rp_3:	
  6535 00002F61 C3                  <1> 	retn
  6536                              <1> 
  6537                              <1> vga_beeper:
  6538                              <1> 	; 04/08/2016  (TRDOS 386 = TRDOS v2.0)
  6539 00002F62 FB                  <1> 	sti
  6540                              <1> 	;mov	bh, [ACTIVE_PAGE]
  6541 00002F63 E917F4FFFF          <1>         jmp     beeper_gfx
  6542                              <1> 
  6543                              <1> vga_write_teletype:
  6544                              <1> 	; 03/08/2022 (TRDOS 386 Kernel v2.0.5)
  6545                              <1> 	; 12/04/2021 (TRDOS 386 v2.0.3, 32 bit push/pop)
  6546                              <1> 	; 09/12/2017
  6547                              <1> 	; 06/08/2016
  6548                              <1> 	; 04/08/2016
  6549                              <1> 	; 01/08/2016
  6550                              <1> 	; 31/07/2016
  6551                              <1> 	; 09/07/2016 (TRDOS 386 = TRDOS v2.0)
  6552                              <1> 	;
  6553                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  6554                              <1> 	; vgabios-0.7a (2011)
  6555                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  6556                              <1> 	; 'vgabios.c', 'biosfn_write_teletype'
  6557                              <1> 	; 'biosfn_write_char_only'
  6558                              <1> 
  6559                              <1> 	; INPUT ->
  6560                              <1> 	; [CRT_MODE] = current video mode (>7)
  6561                              <1> 	; AL = Character to write
  6562                              <1> 	; BL = Color of character
  6563                              <1> 	; OUTPUT ->
  6564                              <1> 	; Regen buffer updated
  6565                              <1> 
  6566                              <1> 	; biosfn_write_teletype (car, page, attr, flag) 
  6567                              <1> 	; car = character (AL)
  6568                              <1> 	; page = 0
  6569                              <1> 	; attr = color (BL)
  6570                              <1> 	; 'flag' not used
  6571                              <1> 
  6572 00002F68 8A25[BE670000]      <1> 	mov 	ah, [CRT_MODE]
  6573 00002F6E 88C7                <1> 	mov	bh, al ; character
  6574 00002F70 668B15[A6780100]    <1> 	mov	dx, [CURSOR_POSN] ; cursor pos for page 0
  6575                              <1> 
  6576 00002F77 BE[E2670000]        <1> 	mov	esi, vga_g_modes
  6577 00002F7C 89F7                <1> 	mov	edi, esi
  6578 00002F7E 83C708              <1> 	add	edi, vga_g_mode_count
  6579                              <1> vga_wtty_0:
  6580 00002F81 AC                  <1> 	lodsb
  6581 00002F82 38E0                <1> 	cmp	al, ah ; [CRT_MODE]
  6582 00002F84 7405                <1> 	je	short vga_wtty_2
  6583 00002F86 39FE                <1> 	cmp	esi, edi
  6584 00002F88 72F7                <1> 	jb	short vga_wtty_0
  6585                              <1> vga_wtty_1:
  6586 00002F8A C3                  <1> 	retn	; nothing to do
  6587                              <1> vga_wtty_2:
  6588 00002F8B 80FF07              <1> 	cmp	bh, 07h ; bell (beep)
  6589 00002F8E 74D2                <1> 	je	short vga_beeper  ; u11
  6590 00002F90 80FF08              <1> 	cmp	bh, 08h ; backspace
  6591 00002F93 7508                <1> 	jne	short vga_wtty_3
  6592                              <1> 	; if(xcurs>0)xcurs--;
  6593 00002F95 08D2                <1> 	or	dl, dl ; xcurs (column)
  6594 00002F97 74F1                <1> 	jz	short vga_wtty_1
  6595 00002F99 FECA                <1> 	dec	dl ; xcurs--;
  6596 00002F9B EB55                <1>         jmp     short vga_wtty_12 
  6597                              <1> vga_wtty_3:			
  6598 00002F9D 80FF0D              <1> 	cmp	bh, 0Dh ; carriage return (\r)
  6599 00002FA0 7504                <1> 	jne	short vga_wtty_4
  6600                              <1> 	; xcurs=0;
  6601 00002FA2 28D2                <1> 	sub	dl, dl ; 0
  6602 00002FA4 EB4C                <1>         jmp     short vga_wtty_12 
  6603                              <1> vga_wtty_4:	
  6604 00002FA6 80FF0A              <1> 	cmp	bh, 0Ah ; new line (\n)
  6605 00002FA9 7504                <1> 	jne	short vga_wtty_5
  6606                              <1> 	; ycurs++;
  6607 00002FAB FEC6                <1> 	inc	dh ; next row
  6608 00002FAD EB5E                <1>         jmp     short vga_wtty_11
  6609                              <1> vga_wtty_5:
  6610 00002FAF 80FF09              <1> 	cmp 	bh, 09h ; tab stop
  6611 00002FB2 7523                <1> 	jne	short vga_wtty_8
  6612 00002FB4 88D0                <1> 	mov	al, dl
  6613                              <1> 	;cbw
  6614 00002FB6 30E4                <1> 	xor	ah, ah ; 09/12/2017
  6615 00002FB8 B108                <1> 	mov	cl, 8
  6616 00002FBA F6F1                <1> 	div	cl
  6617 00002FBC 28E1                <1> 	sub	cl, ah
  6618                              <1> 	;
  6619 00002FBE B720                <1> 	mov	bh, 20h ; space
  6620                              <1> vga_wtty_6: ; tab stop loop
  6621                              <1> 	;push	cx
  6622                              <1> 	;push	bx
  6623                              <1> 	; 12/04/2021
  6624 00002FC0 51                  <1> 	push	ecx
  6625 00002FC1 53                  <1> 	push	ebx
  6626 00002FC2 E810000000          <1> 	call	vga_wtty_8
  6627                              <1> 	;pop	bx  ; bh = character, bl = color
  6628                              <1> 	;pop	cx
  6629                              <1> 	; 12/04/2021
  6630 00002FC7 5B                  <1> 	pop	ebx  ; bh = character, bl = color
  6631 00002FC8 59                  <1> 	pop	ecx
  6632 00002FC9 FEC9                <1> 	dec	cl
  6633 00002FCB 7409                <1> 	jz	short vga_wtty_7
  6634 00002FCD 668B15[A6780100]    <1> 	mov	dx, [CURSOR_POSN] ; new cursor position (pg 0)
  6635 00002FD4 EBEA                <1> 	jmp	short vga_wtty_6
  6636                              <1> vga_wtty_7:
  6637 00002FD6 C3                  <1> 	retn
  6638                              <1> 	;
  6639                              <1> vga_wtty_8:
  6640 00002FD7 83C64F              <1> 	add	esi, vga_g_memmodel - (vga_g_modes + 1)  
  6641                              <1> 	; [ESI] = VGA memory model number (LINEAR8, PLANAR4, PLANAR1)
  6642 00002FDA BF00000A00          <1> 	mov	edi, 0A0000h
  6643                              <1> 	;
  6644 00002FDF 88F8                <1> 	mov	al, bh ; character
  6645                              <1> 	;
  6646 00002FE1 803E04              <1> 	cmp	byte [esi], PLANAR4
  6647 00002FE4 7414                <1> 	je	short vga_wtty_planar
  6648 00002FE6 803E03              <1> 	cmp	byte [esi], PLANAR1
  6649 00002FE9 740F                <1> 	je	short vga_wtty_planar
  6650                              <1> vga_wtty_linear8:
  6651                              <1> 	; write_gfx_char_lin(car,attr,xcurs,ycurs,nbcols);
  6652                              <1> 	; AL = car, BL = attr (color), DL = xcurs, DH = ycurs, 
  6653                              <1> 	; [CRT_COLS] = nbcols
  6654 00002FEB E8F1FCFFFF          <1> 	call	write_gfx_char_lin
  6655 00002FF0 EB0D                <1> 	jmp	short vga_wtty_9
  6656                              <1> 
  6657                              <1> vga_wtty_12:
  6658                              <1> 	; 09/07/2016
  6659                              <1> 	; set cursor position
  6660                              <1> 	; NOTE: Hardware cursor position will not be set
  6661                              <1> 	;   in any VGA modes (>7)
  6662                              <1> 	;   But, cursor position will be saved into
  6663                              <1> 	;   [CURSOR_POSN].
  6664                              <1> 	;   TRDOS 386 (TRDOS v2.0) uses only one page
  6665                              <1> 	;   (page 0) for all graphics modes.
  6666                              <1> 
  6667 00002FF2 668915[A6780100]    <1> 	mov	[CURSOR_POSN], dx ; save cursor pos for pg 0
  6668                              <1> 	; 04/08/2016
  6669                              <1> 	;mov	bh, [ACTIVE_PAGE] ; = 0
  6670                              <1> 	;call	_set_cpos
  6671 00002FF9 C3                  <1> 	retn
  6672                              <1> 
  6673                              <1> vga_wtty_planar:
  6674                              <1> 	; write_gfx_char_pl4(car,attr,xcurs,ycurs,nbcols,cheight);
  6675                              <1> 	; AL = car, BL = attr (color), DL = xcurs, DH = ycurs, 
  6676                              <1> 	; [CRT_COLS]= nbcols, [CHAR_HEIGHT] = cheight
  6677 00002FFA E883FDFFFF          <1> 	call	write_gfx_char_pl4
  6678                              <1> vga_wtty_9:
  6679 00002FFF FEC2                <1> 	inc	dl ; xcurs++;
  6680                              <1> vga_wtty_10:
  6681                              <1> 	; Do we need to wrap ?
  6682                              <1> 	; if(xcurs==nbcols)
  6683 00003001 3A15[C0670000]      <1> 	cmp	dl, [CRT_COLS] ; [VGA_COLS]
  6684 00003007 7204                <1> 	jb	short vga_wtty_11 ; no
  6685 00003009 28D2                <1> 	sub	dl, dl ; xcurs=0;
  6686 0000300B FEC6                <1> 	inc	dh ;  ycurs++;
  6687                              <1> vga_wtty_11:
  6688                              <1> 	; Do we need to scroll ?
  6689                              <1> 	; if(ycurs==nbrows)
  6690 0000300D 3A35[C6670000]      <1> 	cmp	dh, [VGA_ROWS]
  6691 00003013 72DD                <1> 	jb	short vga_wtty_12 ; no
  6692                              <1> 	;
  6693                              <1> 	; biosfn_scroll (nblines,attr,rul,cul,rlr,clr,page,dir)
  6694                              <1> 	; al = nblines = 1, bl = attr (color) = 0
  6695                              <1> 	; ch = rul, cl = cul, dh = rlr, dl = clr, page = 0
  6696                              <1> 	; dir = SCROLL_UP
  6697                              <1> 	
  6698 00003015 B001                <1> 	mov	al, 1
  6699 00003017 28DB                <1> 	sub	bl, bl ; 0 ; blank/black line (attr=0) will be used
  6700                              <1> 	;sub	cx, cx ; 0,0
  6701                              <1> 	; 03/08/2022
  6702 00003019 29C9                <1> 	sub	ecx, ecx
  6703                              <1> 
  6704                              <1> 	; 06/08/2016
  6705 0000301B 8A35[C6670000]      <1> 	mov	dh, [VGA_ROWS]
  6706 00003021 FECE                <1> 	dec	dh ; nbrows -1
  6707                              <1> 
  6708                              <1> 	;push	dx ; 04/08/2016
  6709                              <1> 	; 12/04/2021
  6710 00003023 52                  <1> 	push	edx
  6711 00003024 8A15[C0670000]      <1> 	mov	dl, [CRT_COLS]
  6712 0000302A FECA                <1> 	dec	dl ; nbcols -1
  6713                              <1> 	
  6714 0000302C 8A25[BE670000]      <1> 	mov	ah, [CRT_MODE]
  6715                              <1> 	
  6716                              <1> 	; biosfn_scroll(0x01,0x00,0,0,nbrows-1,nbcols-1,page,SCROLL_UP);
  6717 00003032 E843F5FFFF          <1> 	call	vga_graphics_up
  6718                              <1> 	; 04/08/2016
  6719                              <1> 	;pop	dx
  6720                              <1> 	; 12/04/2021
  6721 00003037 5A                  <1> 	pop	edx
  6722                              <1> 
  6723                              <1> 	;dec	dh ; ycurs-=1
  6724 00003038 EBB8                <1> 	jmp	short vga_wtty_12 
  6725                              <1> 
  6726                              <1> font_setup:
  6727                              <1> 	; 03/08/2022 (TRDOS 386 v2.0.5)
  6728                              <1> 	; 09/01/2021 (TRDOS 386 v2.0.3)
  6729                              <1> 	; 09/07/2016
  6730                              <1> 	; character generator (font loading) functions
  6731                              <1> 	;
  6732                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  6733                              <1> 	; vgabios-0.7a (2011)
  6734                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  6735                              <1> 	; 'vgabios.c', 'int10_func'
  6736                              <1> 
  6737                              <1> 	; AX = 1100H ; Load User-Defined Font (EGA/VGA)
  6738                              <1> 	;
  6739                              <1>         ; BH =  height of each character (bytes per character definition)
  6740                              <1>         ; (BL = font block to load (EGA: 0-3; VGA: 0-7))
  6741                              <1> 	; CX =  number of characters to redefine (<=256)
  6742                              <1>         ; DX =  ASCII code of the first character defined at ES:BP
  6743                              <1>         ; EBP =	address of font-definition information
  6744                              <1> 	;	(in user's memory space)
  6745                              <1> 
  6746                              <1> 	; case 0x11:
  6747                              <1>      	; switch(GET_AL())
  6748                              <1>       	; {
  6749                              <1> 	; case 0x00:
  6750                              <1>         ; case 0x10:
  6751                              <1>         ; biosfn_load_text_user_pat(GET_AL(),ES,BP,CX,DX,GET_BL(),GET_BH());
  6752                              <1>         ; break;
  6753                              <1> 
  6754                              <1> 	; AX = 1110H ; Load and Activate User-Defined Font (EGA/VGA)
  6755 0000303A 08C0                <1> 	or	al, al ; 0
  6756 0000303C 7404                <1> 	jz	short font_setup_0
  6757 0000303E 3C10                <1> 	cmp	al, 10h
  6758 00003040 7511                <1> 	jne	short font_setup_1	
  6759                              <1> font_setup_0:
  6760 00003042 E8CE000000          <1> 	call	transfer_user_fonts
  6761 00003047 721C                <1> 	jc	short font_setup_error
  6762 00003049 E8AD010000          <1> 	call	load_text_user_pat
  6763 0000304E E9D6EAFFFF          <1>         jmp     VIDEO_RETURN 
  6764                              <1> font_setup_1:
  6765                              <1> 	; AX = 1101H ; Load ROM 8x14 Character Set (EGA/VGA)
  6766                              <1> 	; case 0x01:
  6767                              <1>         ; case 0x11:
  6768                              <1>         ; biosfn_load_text_8_14_pat(GET_AL(),GET_BL());
  6769                              <1>         ; break;
  6770 00003053 3C01                <1> 	cmp	al, 1
  6771 00003055 7404                <1> 	je	short font_setup_2
  6772 00003057 3C11                <1> 	cmp	al, 11h
  6773 00003059 7511                <1> 	jne	short font_setup_3	
  6774                              <1> font_setup_2:
  6775                              <1> 	; AX = 1111H ; Load and Activate ROM 8x14 Character Set (EGA/VGA)
  6776                              <1> 	; (BL = font block to load (EGA: 0-3; VGA: 0-7))
  6777 0000305B E8C9020000          <1> 	call	load_text_8_14_pat
  6778 00003060 E9C4EAFFFF          <1>         jmp     VIDEO_RETURN
  6779                              <1> font_setup_error:
  6780 00003065 29C0                <1> 	sub	eax, eax ; 0 -> fonts could not be loaded
  6781 00003067 E9C2EAFFFF          <1> 	jmp	_video_return
  6782                              <1> font_setup_3:
  6783                              <1> 	; AX = 1102H ; Load ROM 8x8 Character Set (EGA/VGA)
  6784                              <1> 	; case 0x02:
  6785                              <1>         ; case 0x12:
  6786                              <1>         ; biosfn_load_text_8_8_pat(GET_AL(),GET_BL());
  6787                              <1>         ; break;
  6788 0000306C 3C02                <1> 	cmp	al, 2
  6789 0000306E 7404                <1> 	je	short font_setup_4
  6790 00003070 3C12                <1> 	cmp	al, 12h
  6791 00003072 750A                <1> 	jne	short font_setup_5	
  6792                              <1> font_setup_4:
  6793                              <1> 	; AX = 1112H ; Load and Activate ROM 8x8 Character Set (EGA/VGA)
  6794                              <1> 	; (BL = font block to load (EGA: 0-3; VGA: 0-7))
  6795 00003074 E8E1020000          <1> 	call	load_text_8_8_pat
  6796 00003079 E9ABEAFFFF          <1>         jmp     VIDEO_RETURN
  6797                              <1> font_setup_5:
  6798                              <1> 	; AX = 1104H ; Load ROM 8x16 Character Set (EGA/VGA)
  6799                              <1> 	; case 0x04:
  6800                              <1>         ; case 0x14:
  6801                              <1>         ; biosfn_load_text_8_16_pat(GET_AL(),GET_BL());
  6802                              <1>         ; break;
  6803 0000307E 3C04                <1> 	cmp	al, 4
  6804 00003080 7404                <1> 	je	short font_setup_6
  6805 00003082 3C14                <1> 	cmp	al, 14h
  6806 00003084 750A                <1> 	jne	short font_setup_7	
  6807                              <1> font_setup_6:
  6808                              <1> 	; AX = 1114H ; Load and Activate ROM 8x16 Character Set (EGA/VGA)
  6809                              <1> 	; (BL = font block to load (EGA: 0-3; VGA: 0-7))
  6810 00003086 E819030000          <1> 	call	load_text_8_16_pat
  6811 0000308B E999EAFFFF          <1>         jmp     VIDEO_RETURN
  6812                              <1> font_setup_7:
  6813                              <1> 	; Note: AX=1120h (Setup INT 1Fh, EXT_PTR) is not needed
  6814                              <1> 	; for TRDOS 386 (TRDOS v2.0) video functionality;
  6815                              <1> 	; because, originally EXT_PTR (font address) was used for
  6816                              <1> 	; chars 80h to 0FFh (after the first 128 ASCII char fonts), for
  6817                              <1> 	; CGA graphics mode; currenty, 'vgafont8' address has 256 chars!
  6818                              <1> 	; 
  6819                              <1> 	; case 0x20:
  6820                              <1>         ; biosfn_load_gfx_8_8_chars(ES,BP);
  6821                              <1>         ; break; 
  6822                              <1> 	; case 0x21:
  6823                              <1>         ; biosfn_load_gfx_user_chars(ES,BP,CX,GET_BL(),GET_DL());
  6824                              <1>         ; break;
  6825                              <1> 	; AX = 1121H ; Setup User-Defined Font for Graphics Mode (VGA)
  6826                              <1> 	; BL   screen rows code: 00H = user-specified (in DL)
  6827                              <1>         ;                        01H = 14 rows
  6828                              <1>         ;                        02H = 25 rows
  6829                              <1>         ;                        03H = 43 rows
  6830                              <1>         ; CX   bytes per character definition
  6831                              <1>         ; DL   (when BL=0) custom number of character rows on screen
  6832                              <1>         ; EBP  address of font-definition information (user's mem space)
  6833                              <1> 
  6834 00003090 3C21                <1> 	cmp	al, 21h
  6835 00003092 7531                <1> 	jne	short font_setup_9
  6836                              <1> 
  6837                              <1> 	; TRDOS 386 modification !
  6838                              <1> 	; dh = 0 -> 256 characters
  6839                              <1> 	; dh = 80h -> second 128 characters
  6840                              <1> 	; dh = 0FFh -> first 128 characters
  6841                              <1> 
  6842                              <1> 	; 09/01/2021 (TRDOS 386 v2.0.3)
  6843                              <1> 	;push	ebx
  6844 00003094 51                  <1> 	push	ecx
  6845 00003095 52                  <1> 	push	edx
  6846 00003096 30D2                <1> 	xor	dl, dl
  6847 00003098 88CF                <1> 	mov	bh, cl ; character height
  6848                              <1> 	;mov	cx, 100h ; 256
  6849                              <1> 	; 03/08/2022
  6850 0000309A 31C9                <1> 	xor 	ecx, ecx
  6851 0000309C FEC5                <1> 	inc	ch
  6852                              <1> 	; ecx = 100h
  6853 0000309E 08F6                <1> 	or	dh, dh ; 0
  6854 000030A0 7410                <1> 	jz	short  font_setup_8
  6855 000030A2 FECD                <1> 	dec	ch ; cx = 0
  6856 000030A4 80FEFF              <1> 	cmp	dh, 0FFh
  6857 000030A7 7409                <1> 	je	short font_setup_8 ; 1st 128 chars
  6858                              <1> 	; 2nd 128 chars
  6859 000030A9 80FE80              <1> 	cmp	dh, 80h
  6860 000030AC 75B7                <1> 	jne	short font_setup_error ; invalid !
  6861 000030AE 88F1                <1> 	mov	cl, dh
  6862 000030B0 86D6                <1> 	xchg	dl, dh
  6863                              <1> 	; number of chars, cx = 80h 
  6864                              <1> 	; start char, dl = 80h
  6865                              <1> font_setup_8:	
  6866 000030B2 E85E000000          <1> 	call	transfer_user_fonts
  6867 000030B7 5A                  <1> 	pop	edx
  6868 000030B8 59                  <1> 	pop	ecx
  6869                              <1> 	;pop	ebx
  6870 000030B9 72AA                <1> 	jc	short font_setup_error
  6871                              <1> 	; ebp = user's font data address in system's memory space
  6872 000030BB E82F030000          <1> 	call	load_gfx_user_chars
  6873 000030C0 E964EAFFFF          <1>         jmp     VIDEO_RETURN 
  6874                              <1> font_setup_9:
  6875                              <1> 	; case 0x22:
  6876                              <1>         ; biosfn_load_gfx_8_14_chars(GET_BL());
  6877                              <1>         ; break;
  6878 000030C5 3C22                <1> 	cmp	al, 22h
  6879 000030C7 750A                <1> 	jne	short font_setup_10
  6880 000030C9 E85D030000          <1> 	call	load_gfx_8_14_chars	
  6881 000030CE E956EAFFFF          <1>         jmp     VIDEO_RETURN 
  6882                              <1> font_setup_10:	
  6883                              <1> 	; case 0x23:
  6884                              <1>         ; biosfn_load_gfx_8_8_dd_chars(GET_BL());
  6885                              <1>         ; break;
  6886 000030D3 3C23                <1> 	cmp	al, 23h
  6887 000030D5 750A                <1> 	jne	short font_setup_11
  6888 000030D7 E890030000          <1> 	call	load_gfx_8_8_chars	
  6889 000030DC E948EAFFFF          <1>         jmp     VIDEO_RETURN 
  6890                              <1> font_setup_11:	
  6891                              <1> 	; case 0x24:
  6892                              <1>         ; biosfn_load_gfx_8_16_chars(GET_BL());
  6893                              <1>         ; break;
  6894 000030E1 3C24                <1> 	cmp	al, 24h
  6895 000030E3 750A                <1> 	jne	short font_setup_12
  6896 000030E5 E8C3030000          <1> 	call	load_gfx_8_16_chars	
  6897 000030EA E93AEAFFFF          <1>         jmp     VIDEO_RETURN 
  6898                              <1> font_setup_12:
  6899                              <1>  	; case 0x30:
  6900                              <1>         ; biosfn_get_font_info(GET_BH(),&ES,&BP,&CX,&DX);
  6901                              <1>         ; break;
  6902 000030EF 3C30                <1> 	cmp	al, 30h
  6903 000030F1 750A                <1> 	jne	short font_setup_13			
  6904 000030F3 E8F6030000          <1> 	call	get_font_info
  6905                              <1> 	; eax = return value (info: 4 bytes for 4 parms)
  6906                              <1> 	; eax = 0 -> invalid function (input)
  6907 000030F8 E931EAFFFF          <1>         jmp     _video_return
  6908                              <1> font_setup_13:
  6909 000030FD 3C03                <1> 	cmp	al, 03h ; AX = 1103h	
  6910 000030FF 750D                <1> 	jne	short font_setup_14
  6911                              <1> 	; biosfn_set_text_block_specifier:
  6912                              <1> 	; BL = font block selector code	
  6913                              <1> 	; NOTE: TRDOS 386 only uses and sets font block 0
  6914                              <1> 	; (It is as BL = 0 for TRDOS 386)
  6915 00003101 66BAC403            <1> 	mov	dx, 3C4h ; VGAREG_SEQU_ADDRESS
  6916                              <1> 	;mov	ah, bl
  6917 00003105 28E4                <1> 	sub	ah, ah ; 0
  6918                              <1> 	;mov	al, 03h
  6919 00003107 66EF                <1> 	out	dx, ax
  6920 00003109 E91BEAFFFF          <1> 	jmp     VIDEO_RETURN 
  6921                              <1> 	
  6922                              <1> font_setup_14:
  6923 0000310E 29C0                <1> 	sub	eax, eax ; 0 = invalid function
  6924 00003110 E919EAFFFF          <1>         jmp     _video_return
  6925                              <1> 
  6926                              <1> transfer_user_fonts:
  6927                              <1> 	; 02/08/2022 (TRDOS 386 Kernel v2.0.5)
  6928                              <1> 	; 19/01/2021
  6929                              <1> 	; 09/01/2021
  6930                              <1> 	; 05/01/2021 (TRDOS 386 v2.0.3)
  6931                              <1> 
  6932                              <1> 	; BH =  height of each character (bytes per character)
  6933                              <1> 	; CX =  number of characters to redefine (<=256)
  6934                              <1>         ; DX =  ASCII code of the first character defined at EBP
  6935                              <1>         ; EBP =	address of font-definition information
  6936                              <1> 	;	(in user's memory space)
  6937                              <1> 
  6938                              <1> 	; Modified registers: eax, edx, ecx, esi, edi, ebp
  6939                              <1> 	;
  6940                              <1> 	; output:
  6941                              <1> 	;	ebp = user font data address in system memory
  6942                              <1> 
  6943 00003115 81E2FFFF0000        <1> 	and	edx, 0FFFFh
  6944 0000311B 81E1FFFF0000        <1> 	and	ecx, 0FFFFh
  6945 00003121 7537                <1> 	jnz	short transfer_user_fonts_5
  6946                              <1> 
  6947 00003123 09D2                <1> 	or	edx, edx
  6948 00003125 7531                <1> 	jnz	short transfer_user_fonts_4
  6949 00003127 09ED                <1> 	or	ebp, ebp
  6950 00003129 752D                <1> 	jnz	short transfer_user_fonts_4
  6951                              <1> 
  6952                              <1> 	; cx = 0, dx = 0, ebp = 0
  6953                              <1> 	; copy system font to user font
  6954                              <1> 
  6955 0000312B B140                <1> 	mov	cl, 64 ; 64 dwords
  6956                              <1> 	
  6957 0000312D 80FF10              <1> 	cmp	bh, 16
  6958 00003130 7417                <1> 	je	short transfer_user_fonts_2
  6959 00003132 80FF08              <1> 	cmp	bh, 8
  6960 00003135 7406                <1> 	je	short transfer_user_fonts_1
  6961                              <1> 
  6962 00003137 BD[1C570100]        <1> 	mov	ebp, vgafont14
  6963 0000313C C3                  <1> 	retn 
  6964                              <1> 
  6965                              <1> transfer_user_fonts_1:
  6966 0000313D BF00500900          <1> 	mov	edi, VGAFONT8USER
  6967 00003142 BE[1C4F0100]        <1> 	mov	esi, vgafont8
  6968 00003147 EB0A                <1> 	jmp	short transfer_user_fonts_3
  6969                              <1> 
  6970                              <1> transfer_user_fonts_2:
  6971 00003149 BF00400900          <1> 	mov	edi, VGAFONT16USER
  6972 0000314E BE[1C650100]        <1> 	mov	esi, vgafont16
  6973                              <1> transfer_user_fonts_3:
  6974 00003153 89FD                <1> 	mov	ebp, edi
  6975 00003155 F3A5                <1> 	rep	movsd
  6976 00003157 C3                  <1> 	retn
  6977                              <1> 
  6978                              <1> transfer_user_fonts_4:
  6979 00003158 F9                  <1> 	stc	
  6980 00003159 C3                  <1> 	retn
  6981                              <1> 	
  6982                              <1> transfer_user_fonts_5:
  6983 0000315A 09ED                <1> 	or	ebp, ebp
  6984 0000315C 74FA                <1> 	jz	short transfer_user_fonts_4 ; invalid address !
  6985                              <1> 
  6986 0000315E 6681F90001          <1> 	cmp	cx, 256
  6987 00003163 77F3                <1> 	ja	short transfer_user_fonts_4
  6988 00003165 29D1                <1> 	sub	ecx, edx
  6989 00003167 76EF                <1> 	jna	short transfer_user_fonts_4
  6990                              <1> 
  6991 00003169 80FF0E              <1> 	cmp	bh, 14 ; 8x14 font
  6992                              <1> 		       ; (there is not an alternative buffer)
  6993 0000316C 7524                <1> 	jne	short transfer_user_fonts_6
  6994                              <1> 	
  6995                              <1> 	; use system's 8x14 font space if permission flag is 1
  6996 0000316E F605[369F0100]80    <1> 	test	byte [ufont], 80h
  6997 00003175 74E1                <1> 	jz	short transfer_user_fonts_4 ; not allowed
  6998                              <1> 
  6999                              <1> 	; permission is given (for vgafont14 location etc.)
  7000                              <1> 	; (for permanent font modification)
  7001                              <1> 	;
  7002                              <1> 	; 19/01/2021
  7003                              <1> 	; Note: Permission flag can be set by 'root' while
  7004                              <1> 	;	system is not in multi tasking/user mode
  7005                              <1> 	;	while [multi_tasking] = 0 and [u.uid] = 0
  7006                              <1> 
  7007                              <1> 	;push	edx	
  7008                              <1> 	; 02/08/2022
  7009 00003177 87D1                <1> 	xchg	edx, ecx
  7010                              <1> 	;xor	ah, ah
  7011                              <1> 	; 02/08/2022
  7012 00003179 31C0                <1> 	xor	eax, eax
  7013 0000317B 88F8                <1> 	mov	al, bh ; mov al, 14 
  7014                              <1> 	;mul	cx 
  7015                              <1> 	; 02/08/2022
  7016 0000317D F7E2                <1> 	mul	edx  ; char count * 14	
  7017                              <1> 	; 02/08/2022
  7018 0000317F 89CA                <1> 	mov	edx, ecx ; ascii code
  7019 00003181 89C1                <1> 	mov	ecx, eax
  7020                              <1> 		; ecx = byte count 
  7021                              <1> 	;pop	edx
  7022                              <1> 	; 02/08/2022
  7023                              <1> 	;xor	eax, eax	
  7024 00003183 30E4                <1> 	xor	ah, ah
  7025 00003185 88F8                <1> 	mov	al, bh ; mov ax, 14 ; bytes per character
  7026                              <1> 	;mul	dx
  7027                              <1> 	;mov	dx, ax ; char offset
  7028                              <1> 	; 02/08/2022
  7029 00003187 F7E2                <1> 	mul	edx
  7030 00003189 89C2                <1> 	mov	edx, eax ; char offset
  7031 0000318B BF[1C570100]        <1> 	mov	edi, vgafont14
  7032 00003190 EB48                <1> 	jmp	short transfer_user_fonts_8			
  7033                              <1> transfer_user_fonts_6:
  7034 00003192 80FF08              <1> 	cmp	bh, 8 ; 8x8 font
  7035 00003195 7520                <1> 	jne	short transfer_user_fonts_7 ; 8x16 font
  7036                              <1> 	;shl	dx, 3 ; * 8
  7037                              <1> 	;shl	cx, 3 ; * 8
  7038                              <1> 	; 02/08/2022
  7039 00003197 C1E203              <1> 	shl	edx, 3 ; byte offset
  7040 0000319A C1E103              <1> 	shl	ecx, 3 ; byte count
  7041                              <1> 	; 09/01/2021
  7042 0000319D BF00500900          <1> 	mov	edi, VGAFONT8USER
  7043 000031A2 F605[369F0100]08    <1> 	test	byte [ufont], 8  ; already loaded ?	
  7044 000031A9 752F                <1> 	jnz	short transfer_user_fonts_8 ; yes
  7045 000031AB BE[1C4F0100]        <1> 	mov	esi, vgafont8
  7046 000031B0 E839000000          <1> 	call	transfer_user_fonts_10
  7047 000031B5 EB23                <1> 	jmp	short transfer_user_fonts_8
  7048                              <1> transfer_user_fonts_7:
  7049 000031B7 80FF10              <1> 	cmp	bh, 16 ; 8x16 font
  7050 000031BA 759C                <1> 	jne	short transfer_user_fonts_4  ; invalid !
  7051                              <1> 	;shl	dx, 4 ; * 16
  7052                              <1> 	;shl	cx, 4 ; * 16
  7053                              <1> 	; 02/08/2022
  7054 000031BC C1E204              <1> 	shl	edx, 4 ; byte offset
  7055 000031BF C1E104              <1> 	shl	ecx, 4 ; byte count
  7056 000031C2 BF00400900          <1>  	mov	edi, VGAFONT16USER
  7057 000031C7 F605[369F0100]10    <1> 	test	byte [ufont], 16  ; already loaded ?	
  7058 000031CE 750A                <1> 	jnz	short transfer_user_fonts_8 ; yes
  7059 000031D0 BE[1C650100]        <1> 	mov	esi, vgafont16
  7060 000031D5 E814000000          <1> 	call	transfer_user_fonts_10
  7061                              <1> transfer_user_fonts_8:
  7062 000031DA 01D7                <1> 	add	edi, edx ; char offset
  7063                              <1> 	; 09/07/2016
  7064                              <1> 	;and	ecx, 0FFFFh
  7065                              <1> 	; ECX = byte count
  7066                              <1> 	;push	ecx
  7067 000031DC 89EE                <1> 	mov	esi, ebp ; user's font buffer
  7068                              <1> 	; 09/01/2021
  7069 000031DE 89FD                <1> 	mov	ebp, edi ; system addr for user's font
  7070                              <1> 	; 05/01/2021
  7071                              <1> 	;mov	edi, Cluster_Buffer  ; system buffer
  7072 000031E0 E8F6DC0000          <1> 	call	transfer_from_user_buffer
  7073                              <1> 	;pop	ecx
  7074                              <1> 	; ecx = transfer (byte) count = character count
  7075 000031E5 7206                <1> 	jc	short transfer_user_fonts_9
  7076                              <1> 	; 05/01/2021
  7077                              <1> 	;mov	ebp, Cluster_Buffer
  7078                              <1> 	
  7079 000031E7 083D[369F0100]      <1> 	or	byte [ufont], bh 
  7080                              <1> 			; 8x8 or 8x16 user font ready 
  7081                              <1> transfer_user_fonts_9:
  7082 000031ED C3                  <1> 	retn
  7083                              <1> 
  7084                              <1> transfer_user_fonts_10:
  7085                              <1> 	; 02/08/2022
  7086                              <1> 	; 09/01/2021
  7087 000031EE 56                  <1> 	push	esi
  7088 000031EF 57                  <1> 	push	edi
  7089 000031F0 51                  <1> 	push	ecx
  7090                              <1> 	;mov	cx, 64
  7091                              <1> 	; 02/08/2022
  7092 000031F1 31C9                <1> 	xor	ecx, ecx
  7093 000031F3 B140                <1> 	mov	cl, 64
  7094 000031F5 F3A5                <1> 	rep	movsd
  7095 000031F7 59                  <1> 	pop	ecx
  7096 000031F8 5F                  <1> 	pop	edi
  7097 000031F9 5E                  <1> 	pop	esi
  7098 000031FA C3                  <1> 	retn
  7099                              <1> 
  7100                              <1> load_text_user_pat:
  7101                              <1> 	; 02/08/2022 (TRDOS 3386 v2.0.5)
  7102                              <1> 	; 26/07/2016
  7103                              <1> 	; 09/07/2016
  7104                              <1> 	; load user defined (EGA/VGA) text fonts
  7105                              <1> 	;
  7106                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  7107                              <1> 	; vgabios-0.7a (2011)
  7108                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  7109                              <1> 	; 'vgabios.c', 'biosfn_load_text_user_pat'
  7110                              <1> 
  7111                              <1> 	; biosfn_load_text_user_pat (AL,ES,BP,CX,DX,BL,BH)
  7112                              <1> 
  7113                              <1> 	; get_font_access();
  7114                              <1> 	; blockaddr = ((BL & 0x03) << 14) + ((BL & 0x04) << 11);
  7115                              <1> 	; for(i=0;i<CX;i++)
  7116                              <1> 	; {
  7117                              <1> 	;  src = BP + i * BH;
  7118                              <1> 	;  dest = blockaddr + (DX + i) * 32;
  7119                              <1> 	;  memcpyb(0xA000, dest, ES, src, BH);
  7120                              <1> 	; }
  7121                              <1> 	; release_font_access();
  7122                              <1> 	; if(AL>=0x10)
  7123                              <1> 	; {
  7124                              <1> 	; set_scan_lines(BH);
  7125                              <1> 	; }
  7126                              <1> 
  7127 000031FB 50                  <1> 	push	eax
  7128 000031FC E839000000          <1> 	call	get_font_access
  7129 00003201 28DB                <1> 	sub	bl, bl ; i = 0
  7130                              <1> 	; 02/08/2022
  7131                              <1> 	; ecx <= 256
  7132 00003203 30ED                <1> 	xor	ch, ch
  7133                              <1> ltup_1:
  7134 00003205 88D8                <1> 	mov	al, bl
  7135 00003207 F6E7                <1> 	mul	bh	
  7136                              <1> 	;movzx	esi, ax
  7137                              <1> 	; 02/08/2022
  7138 00003209 89C6                <1> 	mov	esi, eax
  7139 0000320B 01EE                <1> 	add	esi, ebp
  7140 0000320D 88D8                <1> 	mov	al, bl
  7141 0000320F 28E4                <1> 	sub	ah, ah
  7142                              <1> 	;add	ax, dx ; (DX + i)
  7143                              <1> 	;shl	ax, 5  ; * 32
  7144                              <1> 	; 02/08/2022
  7145 00003211 01D0                <1> 	add	eax, edx
  7146 00003213 C1E005              <1> 	shl	eax, 5
  7147                              <1> 	;movzx	edi, ax
  7148                              <1> 	; 02/08/2022
  7149 00003216 89C7                <1> 	mov	edi, eax
  7150 00003218 81C700000A00        <1> 	add	edi, 0A0000h
  7151 0000321E 51                  <1> 	push	ecx
  7152                              <1> 	;movzx	ecx, bh
  7153                              <1> 	; 02/08/2022
  7154 0000321F 88F9                <1> 	mov	cl, bh
  7155 00003221 F3A4                <1> 	rep	movsb
  7156 00003223 59                  <1> 	pop	ecx
  7157 00003224 FEC3                <1> 	inc	bl
  7158 00003226 38CB                <1> 	cmp	bl, cl
  7159 00003228 75DB                <1> 	jne	short ltup_1
  7160                              <1> 	;
  7161 0000322A E83E000000          <1> 	call	release_font_access
  7162                              <1> 	;
  7163 0000322F 58                  <1> 	pop	eax
  7164                              <1> 	; if(AL>=0x10)
  7165 00003230 3C10                <1> 	cmp	al, 10h
  7166 00003232 7205                <1> 	jb	short ltup_2
  7167                              <1>    	; set_scan_lines(BH);
  7168 00003234 E86F000000          <1> 	call	set_scan_lines
  7169                              <1> ltup_2:
  7170 00003239 C3                  <1> 	retn
  7171                              <1> 
  7172                              <1> get_font_access:
  7173                              <1> 	; 02/08/2022
  7174                              <1> 	; 09/07/2016
  7175                              <1> 	;
  7176                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  7177                              <1> 	; vgabios-0.7a (2011)
  7178                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  7179                              <1> 	; 'vgabios.c', 'get_font_access'
  7180                              <1> 
  7181                              <1> 	; get_font_access()
  7182 0000323A 52                  <1> 	push	edx
  7183 0000323B 66BAC403            <1> 	mov	dx, 3C4h ; VGAREG_SEQU_ADDRESS
  7184                              <1> 	; 02/08/2022
  7185 0000323F 31C0                <1>  	xor	eax, eax
  7186                              <1> 	;mov	ax, 0100h
  7187 00003241 B401                <1> 	mov	ah, 1
  7188                              <1> 	; ax = 0100h
  7189 00003243 66EF                <1> 	out	dx, ax
  7190 00003245 66B80204            <1> 	mov	ax, 0402h
  7191 00003249 66EF                <1> 	out	dx, ax
  7192 0000324B 66B80407            <1> 	mov	ax, 0704h
  7193 0000324F 66EF                <1> 	out	dx, ax
  7194 00003251 66B80003            <1> 	mov	ax, 0300h
  7195 00003255 66EF                <1> 	out	dx, ax
  7196                              <1> 	;mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  7197                              <1> 	; 02/08/2022
  7198 00003257 B2CE                <1> 	mov	dl, 0CEh
  7199 00003259 66B80402            <1> 	mov	ax, 0204h
  7200 0000325D 66EF                <1> 	out	dx, ax
  7201 0000325F 66B80500            <1> 	mov	ax, 0005h
  7202 00003263 66EF                <1> 	out	dx, ax
  7203 00003265 66B80604            <1> 	mov	ax, 0406h
  7204 00003269 66EF                <1> 	out	dx, ax
  7205 0000326B 5A                  <1> 	pop	edx
  7206 0000326C C3                  <1> 	retn
  7207                              <1> 
  7208                              <1> release_font_access:
  7209                              <1> 	; 02/08/2022
  7210                              <1> 	; 29/07/2016
  7211                              <1> 	; 09/07/2016
  7212                              <1> 	;
  7213                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  7214                              <1> 	; vgabios-0.7a (2011)
  7215                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  7216                              <1> 	; 'vgabios.c', 'release_font_access'
  7217                              <1> 
  7218 0000326D 66BAC403            <1> 	mov	dx, 3C4h ; VGAREG_SEQU_ADDRESS
  7219                              <1> 	;mov	ax, 0100h
  7220                              <1> 	; 02/08/2022
  7221 00003271 29C0                <1> 	sub	eax, eax
  7222 00003273 B401                <1> 	mov	ah, 1
  7223                              <1> 	; ax = 0100h
  7224 00003275 66EF                <1> 	out	dx, ax
  7225 00003277 66B80203            <1> 	mov	ax, 0302h
  7226 0000327B 66EF                <1> 	out	dx, ax
  7227 0000327D 66B80403            <1> 	mov	ax, 0304h
  7228 00003281 66EF                <1> 	out	dx, ax
  7229 00003283 66B80003            <1> 	mov	ax, 0300h
  7230 00003287 66EF                <1> 	out	dx, ax
  7231                              <1> 	;mov	dx, 3CCh ; VGAREG_READ_MISC_OUTPUT
  7232                              <1>  	; 02/08/2022
  7233 00003289 B2CC                <1> 	mov	dl, 0CCh
  7234 0000328B EC                  <1> 	in	al, dx
  7235 0000328C 2401                <1> 	and	al, 01h
  7236 0000328E C0E002              <1> 	shl	al, 2
  7237 00003291 0C0A                <1> 	or	al, 0Ah
  7238 00003293 88C4                <1> 	mov	ah, al
  7239 00003295 B006                <1> 	mov	al, 06h
  7240                              <1> 	;mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
  7241                              <1> 	; 02/08/2022
  7242 00003297 B2CE                <1> 	mov	dl, 0CEh
  7243 00003299 66EF                <1> 	out	dx, ax
  7244 0000329B 66B80400            <1> 	mov	ax, 0004h
  7245 0000329F 66EF                <1> 	out	dx, ax
  7246 000032A1 66B80510            <1> 	mov	ax, 1005h
  7247 000032A5 66EF                <1> 	out	dx, ax
  7248 000032A7 C3                  <1> 	retn
  7249                              <1> 
  7250                              <1> set_scan_lines:
  7251                              <1> 	; 02/08/2022
  7252                              <1> 	; 09/07/2016
  7253                              <1> 	;
  7254                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  7255                              <1> 	; vgabios-0.7a (2011)
  7256                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  7257                              <1> 	; 'vgabios.c', 'set_scan_lines'
  7258                              <1> 
  7259                              <1> 	; set_scan_lines(lines)
  7260                              <1> 	; BH = lines
  7261                              <1> 
  7262                              <1> 	; outb(crtc_addr, 0x09);
  7263 000032A8 66BAD403            <1> 	mov	dx, 3D4h ; CRTC_ADDRESS = 3D4h (always)
  7264 000032AC B009                <1> 	mov	al, 09h
  7265 000032AE EE                  <1> 	out	dx, al
  7266                              <1> 	; crtc_r9 = inb(crtc_addr+1);
  7267                              <1> 	;inc	dx ; 3D5h
  7268                              <1> 	; 02/08/2022
  7269 000032AF FEC2                <1> 	inc	dl
  7270 000032B1 EC                  <1> 	in	al, dx
  7271                              <1> 	; crtc_r9 = (crtc_r9 & 0xe0) | (lines - 1);
  7272 000032B2 24E0                <1> 	and	al, 0E0h
  7273 000032B4 FECF                <1> 	dec	bh ; lines - 1
  7274 000032B6 08F8                <1> 	or	al, bh
  7275                              <1> 	; outb(crtc_addr+1, crtc_r9);
  7276 000032B8 EE                  <1> 	out	dx, al
  7277                              <1> 	;inc	bh 
  7278                              <1> 	; if(lines==8)
  7279                              <1> 	;cmp	bh, 8
  7280 000032B9 80FF07              <1> 	cmp	bh, 7
  7281 000032BC 7506                <1> 	jne	short ssl_1
  7282                              <1> 	; biosfn_set_cursor_shape(0x06,0x07);
  7283 000032BE 66B90706            <1> 	mov	cx, 0607h
  7284 000032C2 EB06                <1> 	jmp	short ssl_2
  7285                              <1> ssl_1:
  7286                              <1> 	; biosfn_set_cursor_shape(lines-4,lines-3);
  7287 000032C4 88F9                <1> 	mov	cl, bh ; lines - 1
  7288 000032C6 88CD                <1> 	mov	ch, cl ; lines - 1 (16 -> 15)
  7289 000032C8 FECD                <1> 	dec	ch  ; lines - 2 (16 -> 14)
  7290                              <1> ssl_2:
  7291                              <1> 	; CH = start line, CL = stop line
  7292 000032CA B40A                <1> 	mov	ah, 10	; 6845 register for cursor set
  7293 000032CC 66890D[D7670000]    <1> 	mov	[CURSOR_MODE], cx ; save in data area
  7294 000032D3 E877F0FFFF          <1> 	call	m16	; output cx register
  7295                              <1> 	; write_word(BIOSMEM_SEG,BIOSMEM_CHAR_HEIGHT, lines);
  7296 000032D8 FEC7                <1> 	inc	bh ; lines
  7297 000032DA 883D[C2670000]      <1> 	mov	[CHAR_HEIGHT], bh
  7298                              <1> 	;  outb(crtc_addr, 0x12);
  7299 000032E0 66BAD403            <1> 	mov	dx, 3D4h ; CRTC_ADDRESS
  7300 000032E4 B012                <1> 	mov	al, 12h
  7301 000032E6 EE                  <1> 	out	dx, al
  7302                              <1> 	; vde = inb(crtc_addr+1);
  7303                              <1> 	;inc	dx
  7304                              <1> 	; 02/08/2022
  7305 000032E7 FEC2                <1> 	inc	dl
  7306 000032E9 EC                  <1> 	in	al, dx
  7307 000032EA 88C4                <1> 	mov	ah, al
  7308                              <1> 	; outb(crtc_addr, 0x07);
  7309                              <1> 	;dec	dx
  7310                              <1> 	; 02/08/2022
  7311 000032EC FECA                <1> 	dec	dl
  7312 000032EE B007                <1> 	mov	al, 07h
  7313 000032F0 EE                  <1> 	out	dx, al
  7314                              <1> 	; ovl = inb(crtc_addr+1);
  7315                              <1> 	;inc	dx
  7316                              <1> 	; 02/08/2022
  7317 000032F1 FEC2                <1> 	inc	dl
  7318 000032F3 EC                  <1> 	in	al, dx
  7319                              <1> 	; vde += (((ovl & 0x02) << 7) + ((ovl & 0x40) << 3) + 1);
  7320 000032F4 88E2                <1> 	mov	dl, ah ; vde
  7321 000032F6 88C6                <1> 	mov	dh, al ; ovl
  7322                              <1> 	;and	ax, 02h
  7323                              <1> 	;shl	ax, 7
  7324                              <1> 	; 02/08/2022
  7325 000032F8 31C0                <1> 	xor	eax, eax
  7326 000032FA 88F0                <1> 	mov	al, dh
  7327 000032FC 2402                <1> 	and	al, 2
  7328 000032FE C1E007              <1> 	shl	eax, 7
  7329                              <1> 	;mov	cx, ax ; (ovl & 0x02) << 7)	
  7330                              <1> 	; 02/08/2022
  7331 00003301 89C1                <1> 	mov	ecx, eax
  7332 00003303 28E4                <1> 	sub	ah, ah
  7333 00003305 88F0                <1> 	mov	al, dh ; ovl
  7334                              <1> 	;and	ax, 40h			
  7335                              <1> 	;shl	ax, 3  ; (ovl & 0x40) << 3)
  7336                              <1> 	;inc	ax ; + 1 
  7337                              <1> 	;add	ax, cx
  7338                              <1> 	; 02/08/2022	
  7339 00003307 2440                <1> 	and	al, 40h
  7340 00003309 C1E003              <1> 	shl	eax, 3
  7341 0000330C 40                  <1> 	inc	eax
  7342 0000330D 01C8                <1> 	add	eax, ecx
  7343 0000330F 30F6                <1> 	xor	dh, dh
  7344                              <1> 	;add	ax, dx ; + vde
  7345                              <1> 	; 02/08/2022
  7346 00003311 01D0                <1> 	add	eax, edx
  7347                              <1> 	; rows = vde / lines;
  7348 00003313 F6F7                <1> 	div	bh
  7349                              <1> 	;dec	al ; rows -1
  7350                              <1> 	; write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, rows-1);
  7351 00003315 A2[C6670000]        <1> 	mov	[VGA_ROWS], al ; rows (not 'rows-1' !)
  7352                              <1> 	; write_word(BIOSMEM_SEG,BIOSMEM_PAGE_SIZE, rows * cols * 2);
  7353                              <1> 	;mov	ah, [CRT_COLS]
  7354                              <1> 	;mul	ah
  7355                              <1> 	; 17/11/2020
  7356 0000331A F625[C0670000]      <1> 	mul	byte [CRT_COLS]
  7357                              <1> 	;shl	ax, 1
  7358                              <1> 	; 02/08/2022
  7359 00003320 D1E0                <1> 	shl	eax, 1
  7360 00003322 66A3[1C850100]      <1> 	mov 	[CRT_LEN], ax	
  7361 00003328 C3                  <1> 	retn
  7362                              <1> 
  7363                              <1> load_text_8_14_pat:
  7364                              <1> 	; 02/08/2022 (TRDOS 3386 v2.0.5)
  7365                              <1> 	; 26/07/2016
  7366                              <1> 	; 25/07/2016
  7367                              <1> 	; 23/07/2016
  7368                              <1> 	; 09/07/2016
  7369                              <1> 	; load user defined (EGA/VGA) text fonts
  7370                              <1> 	;
  7371                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  7372                              <1> 	; vgabios-0.7a (2011)
  7373                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  7374                              <1> 	; 'vgabios.c', 'biosfn_load_text_8_14_pat'
  7375                              <1> 
  7376                              <1> 	; biosfn_load_text_8_14_pat (AL,BL)
  7377                              <1> 
  7378                              <1> 	; get_font_access();
  7379                              <1> 	; blockaddr = ((BL & 0x03) << 14) + ((BL & 0x04) << 11);
  7380                              <1> 	; for(i=0;i<0x100;i++)
  7381                              <1> 	; {
  7382                              <1> 	;  src = i * 14;
  7383                              <1> 	;  dest = blockaddr + i * 32;
  7384                              <1> 	;  memcpyb(0xA000, dest, 0xC000, vgafont14+src, 14);
  7385                              <1> 	; }
  7386                              <1> 	; release_font_access();
  7387                              <1> 	; if(AL>=0x10)
  7388                              <1> 	; {
  7389                              <1> 	; set_scan_lines(14);
  7390                              <1> 	; }
  7391                              <1> 
  7392 00003329 50                  <1> 	push	eax
  7393 0000332A E80BFFFFFF          <1> 	call	get_font_access
  7394                              <1> 
  7395                              <1> 	; blockaddr = ((BL & 0x03) << 14) + ((BL & 0x04) << 11);
  7396                              <1> 	;mov	dl, bl
  7397                              <1> 	;and	dl, 3
  7398                              <1> 	;shl	dx, 14
  7399                              <1> 	;xchg	dx, bx
  7400                              <1> 	;and	dl, 4
  7401                              <1> 	;shl	dx, 11
  7402                              <1> 	;add	dx, bx 	
  7403                              <1>  
  7404                              <1> 	;xor	dx, dx  ; blockaddr = 0
  7405                              <1> 	; Always block 0 for TRDOS 386 ! (blockaddr=0)
  7406                              <1> 
  7407 0000332F 28DB                <1> 	sub	bl, bl ; i = 0
  7408 00003331 B70E                <1> 	mov	bh, 14
  7409 00003333 BE[1C570100]        <1> 	mov	esi, vgafont14
  7410 00003338 BF00000A00          <1> 	mov	edi, 0A0000h
  7411                              <1> 	; 02/08/2022
  7412 0000333D 29C9                <1> 	sub	ecx, ecx		
  7413                              <1> lt8_14_1:
  7414                              <1> 	;mov	al, bl
  7415                              <1> 	;mul	bh
  7416                              <1> 	;movzx	esi, ax
  7417                              <1> 	;add	esi, vgafont14
  7418                              <1> 	;mov	al, bl
  7419                              <1> 	;sub	ah, ah
  7420                              <1> 	;shl	ax, 5 ; * 32
  7421                              <1> 	;;add	ax, dx ; blockaddr + i * 32;
  7422                              <1> 	;movzx	edi, ax ; dest
  7423                              <1> 	;add	edi, 0A0000h
  7424                              <1> 	;02/08/2022
  7425                              <1> 	;movzx	ecx, bh
  7426 0000333F 88F9                <1> 	mov	cl, bh
  7427 00003341 F3A4                <1> 	rep	movsb
  7428 00003343 83C712              <1> 	add	edi, 18 ; 32 - 14
  7429 00003346 FEC3                <1> 	inc	bl
  7430 00003348 75F5                <1> 	jnz	short lt8_14_1	
  7431                              <1> 	;
  7432 0000334A E81EFFFFFF          <1> 	call	release_font_access
  7433                              <1> 	;
  7434 0000334F 58                  <1> 	pop	eax
  7435                              <1> 	; if(AL>=0x10)
  7436 00003350 3C10                <1> 	cmp	al, 10h
  7437 00003352 7205                <1> 	jb	short lt8_14_4
  7438                              <1> 	; BH = 14
  7439                              <1>    	; set_scan_lines(14);
  7440 00003354 E84FFFFFFF          <1> 	call	set_scan_lines
  7441                              <1> lt8_14_4:
  7442 00003359 C3                  <1> 	retn
  7443                              <1> 
  7444                              <1> load_text_8_8_pat:
  7445                              <1> 	; 02/08/2022 (TRDOS 3386 v2.0.5)
  7446                              <1> 	; 05/01/2021 (TRDOS 386 v2.0.3)
  7447                              <1> 	; 26/07/2016
  7448                              <1> 	; 25/07/2016
  7449                              <1> 	; 23/07/2016
  7450                              <1> 	; 09/07/2016
  7451                              <1> 	; load user defined (EGA/VGA) text fonts
  7452                              <1> 	;
  7453                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  7454                              <1> 	; vgabios-0.7a (2011)
  7455                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  7456                              <1> 	; 'vgabios.c', 'biosfn_load_text_8_8_pat'
  7457                              <1> 
  7458                              <1> 	; biosfn_load_text_8_8_pat (AL,BL)
  7459                              <1> 
  7460                              <1> 	; get_font_access();
  7461                              <1> 	; blockaddr = ((BL & 0x03) << 14) + ((BL & 0x04) << 11);
  7462                              <1> 	; for(i=0;i<0x100;i++)
  7463                              <1> 	; {
  7464                              <1> 	;  src = i * 8;
  7465                              <1> 	;  dest = blockaddr + i * 32;
  7466                              <1> 	;  memcpyb(0xA000, dest, 0xC000, vgafont8+src, 8);
  7467                              <1> 	; }
  7468                              <1> 	; release_font_access();
  7469                              <1> 	; if(AL>=0x10)
  7470                              <1> 	; {
  7471                              <1> 	; set_scan_lines(8);
  7472                              <1> 	; }
  7473                              <1> 
  7474 0000335A 50                  <1> 	push	eax
  7475 0000335B E8DAFEFFFF          <1> 	call	get_font_access
  7476                              <1> 
  7477                              <1> 	; blockaddr = ((BL & 0x03) << 14) + ((BL & 0x04) << 11);
  7478                              <1> 	;mov	dl, bl
  7479                              <1> 	;and	dl, 3
  7480                              <1> 	;shl	dx, 14
  7481                              <1> 	;xchg	dx, bx
  7482                              <1> 	;and	dl, 4
  7483                              <1> 	;shl	dx, 11
  7484                              <1> 	;add	dx, bx 	
  7485                              <1>  
  7486                              <1> 	;xor	dx, dx  ; blockaddr = 0
  7487                              <1> 	; Always block 0 for TRDOS 386 ! (blockaddr=0)
  7488                              <1> 
  7489 00003360 28DB                <1> 	sub	bl, bl ; i = 0
  7490 00003362 B708                <1> 	mov	bh, 8
  7491                              <1> 	;mov	esi, vgafont8
  7492 00003364 BF00000A00          <1> 	mov	edi, 0A0000h
  7493                              <1> 
  7494                              <1> 	; 02/08/2022
  7495 00003369 29C9                <1> 	sub	ecx, ecx
  7496                              <1> 
  7497                              <1> 	; 05/01/2021
  7498 0000336B F605[369F0100]80    <1> 	test	byte [ufont], 80h
  7499 00003372 7410                <1> 	jz	short lt8_8_0
  7500                              <1> 		; user font permission (after set mode)
  7501 00003374 F605[369F0100]08    <1>  	test	byte [ufont], 8
  7502 0000337B 7407                <1> 	jz	short lt8_8_0
  7503 0000337D BE00500900          <1> 	mov	esi, VGAFONT8USER
  7504 00003382 EB05                <1> 	jmp	short lt8_8_1
  7505                              <1> lt8_8_0:
  7506 00003384 BE[1C4F0100]        <1> 	mov	esi, vgafont8	
  7507                              <1> lt8_8_1:
  7508                              <1> 	;mov	al, bl
  7509                              <1> 	;mul	bh
  7510                              <1> 	;movzx	esi, ax
  7511                              <1> 	;add	esi, vgafont8
  7512                              <1> 	;mov	al, bl
  7513                              <1> 	;sub	ah, ah
  7514                              <1> 	;shl	ax, 5 ; * 32
  7515                              <1> 	;;add	ax, dx ; blockaddr + i * 32;
  7516                              <1> 	;movzx	edi, ax ; dest
  7517                              <1> 	;add	edi, 0A0000h
  7518                              <1> 	; 02/08/2022
  7519                              <1> 	;movzx	ecx, bh 		
  7520 00003389 88F9                <1> 	mov	cl, bh
  7521 0000338B F3A4                <1> 	rep	movsb
  7522 0000338D 83C718              <1> 	add	edi, 24 ; 32 - 8
  7523 00003390 FEC3                <1> 	inc	bl
  7524 00003392 75F5                <1> 	jnz	short lt8_8_1
  7525                              <1> 	;
  7526 00003394 E8D4FEFFFF          <1> 	call	release_font_access
  7527                              <1> 	;
  7528 00003399 58                  <1> 	pop	eax
  7529                              <1> 	; if(AL>=0x10)
  7530 0000339A 3C10                <1> 	cmp	al, 10h
  7531 0000339C 7205                <1> 	jb	short lt8_8_2
  7532                              <1> 	; BH = 8
  7533                              <1>    	; set_scan_lines(8);
  7534 0000339E E805FFFFFF          <1> 	call	set_scan_lines
  7535                              <1> lt8_8_2:
  7536 000033A3 C3                  <1> 	retn
  7537                              <1> 
  7538                              <1> load_text_8_16_pat:
  7539                              <1> 	; 02/08/2022 (TRDOS 3386 v2.0.5)
  7540                              <1> 	; 05/01/2021 (TRDOS 386 v2.0.3)
  7541                              <1> 	; 26/07/2016
  7542                              <1> 	; 25/07/2016
  7543                              <1> 	; 23/07/2016
  7544                              <1> 	; 09/07/2016
  7545                              <1> 	; load user defined (EGA/VGA) text fonts
  7546                              <1> 	;
  7547                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  7548                              <1> 	; vgabios-0.7a (2011)
  7549                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  7550                              <1> 	; 'vgabios.c', 'biosfn_load_text_8_16_pat'
  7551                              <1> 
  7552                              <1> 	; biosfn_load_text_8_16_pat (AL,BL)
  7553                              <1> 
  7554                              <1> 	; get_font_access();
  7555                              <1> 	; blockaddr = ((BL & 0x03) << 14) + ((BL & 0x04) << 11);
  7556                              <1> 	; for(i=0;i<0x100;i++)
  7557                              <1> 	; {
  7558                              <1> 	;  src = i * 16;
  7559                              <1> 	;  dest = blockaddr + i * 32;
  7560                              <1> 	;  memcpyb(0xA000, dest, 0xC000, vgafont16+src, 16);
  7561                              <1> 	; }
  7562                              <1> 	; release_font_access();
  7563                              <1> 	; if(AL>=0x10)
  7564                              <1> 	; {
  7565                              <1> 	; set_scan_lines(16);
  7566                              <1> 	; }
  7567                              <1> 
  7568 000033A4 50                  <1> 	push	eax
  7569 000033A5 E890FEFFFF          <1> 	call	get_font_access
  7570                              <1> 
  7571                              <1> 	; blockaddr = ((BL & 0x03) << 14) + ((BL & 0x04) << 11);
  7572                              <1> 	;mov	dl, bl
  7573                              <1> 	;and	dl, 3
  7574                              <1> 	;shl	dx, 14
  7575                              <1> 	;xchg	dx, bx
  7576                              <1> 	;and	dl, 4
  7577                              <1> 	;shl	dx, 11
  7578                              <1> 	;add	dx, bx 	
  7579                              <1>  
  7580                              <1> 	;xor	dx, dx  ; blockaddr = 0
  7581                              <1> 	; Always block 0 for TRDOS 386 ! (blockaddr=0)
  7582                              <1> 
  7583 000033AA 28DB                <1> 	sub	bl, bl ; i = 0
  7584 000033AC B710                <1> 	mov	bh, 16
  7585                              <1> 	;mov	esi, vgafont16
  7586 000033AE BF00000A00          <1> 	mov	edi, 0A0000h
  7587                              <1> 	;movzx	eax, bh
  7588                              <1> 	; 02/08/2022
  7589 000033B3 29C0                <1> 	sub	eax, eax
  7590 000033B5 88F8                <1> 	mov	al, bh
  7591                              <1> 
  7592                              <1> 	; 05/01/2021
  7593 000033B7 F605[369F0100]80    <1> 	test	byte [ufont], 80h
  7594 000033BE 7410                <1> 	jz	short lt8_16_0
  7595                              <1> 		; user font permission (after set mode)
  7596 000033C0 F605[369F0100]10    <1>  	test	byte [ufont], 16
  7597 000033C7 7407                <1> 	jz	short lt8_16_0
  7598 000033C9 BE00400900          <1> 	mov	esi, VGAFONT16USER
  7599 000033CE EB05                <1> 	jmp	short lt8_16_1
  7600                              <1> lt8_16_0:
  7601 000033D0 BE[1C650100]        <1> 	mov	esi, vgafont16
  7602                              <1> lt8_16_1:
  7603                              <1> 	;mov	al, bl
  7604                              <1> 	;mul	bh
  7605                              <1> 	;movzx	esi, ax
  7606                              <1> 	;add	esi, vgafont16
  7607                              <1> 	;mov	al, bl ; i
  7608                              <1> 	;sub	ah, ah
  7609                              <1> 	;shl	ax, 5 ; * 32
  7610                              <1> 	;;add	ax, dx ; blockaddr + i * 32;
  7611                              <1> 	;movzx	edi, ax ; dest
  7612                              <1> 	;add	edi, 0A0000h
  7613                              <1> 	;movzx	ecx, bh
  7614 000033D5 89C1                <1> 	mov	ecx, eax ; 16	
  7615 000033D7 F3A4                <1> 	rep	movsb
  7616 000033D9 01C7                <1> 	add	edi, eax ; add edi, 16
  7617 000033DB FEC3                <1> 	inc	bl
  7618 000033DD 75F6                <1> 	jnz	short lt8_16_1
  7619                              <1> 	;
  7620 000033DF E889FEFFFF          <1> 	call	release_font_access
  7621                              <1> 	;
  7622 000033E4 58                  <1> 	pop	eax
  7623                              <1> 	; if(AL>=0x10)
  7624 000033E5 3C10                <1> 	cmp	al, 10h
  7625 000033E7 7205                <1> 	jb	short lt8_16_2
  7626                              <1> 	; BH = 16
  7627                              <1>    	; set_scan_lines(16);
  7628 000033E9 E8BAFEFFFF          <1> 	call	set_scan_lines
  7629                              <1> lt8_16_2:
  7630 000033EE C3                  <1> 	retn
  7631                              <1> 
  7632                              <1> load_gfx_user_chars:
  7633                              <1> 	; 08/01/2021
  7634                              <1> 	; 05/01/2021 (TRDOS 386 v2.0.3)
  7635                              <1> 	; 08/08/2016
  7636                              <1> 	; 10/07/2016
  7637                              <1> 	; Setup User-Defined Font for Graphics Mode (VGA)
  7638                              <1> 	;
  7639                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  7640                              <1> 	; vgabios-0.7a (2011)
  7641                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  7642                              <1> 	; 'vgabios.c', 'biosfn_load_gfx_user_chars'
  7643                              <1> 
  7644                              <1> 	; biosfn_load_gfx_user_chars (ES,BP,CX,BL,DL)
  7645                              <1> 	; /* set 0x43 INT pointer */
  7646                              <1>     	; write_word(0x0, 0x43*4, BP);
  7647                              <1>     	; write_word(0x0, 0x43*4+2, ES);
  7648                              <1> 	
  7649                              <1> 	; 08/01/2021
  7650                              <1> 		
  7651                              <1> 	; BL   screen rows code: 00H = user-specified (in DL)
  7652                              <1>         ;                        01H = 14 rows
  7653                              <1>         ;                        02H = 25 rows
  7654                              <1>         ;                        03H = 43 rows
  7655                              <1>         ; CX   bytes per character definition
  7656                              <1>         ; DL   (when BL=0) custom number of character rows on screen
  7657                              <1>         ; EBP  address of font-definition information (user's mem space)
  7658                              <1> 
  7659                              <1> 	; 05/01/2021
  7660                              <1> 	;xor	eax, eax
  7661                              <1> 	;dec	eax ; 0FFFFFFFFh (user defined fonts)
  7662                              <1> 	;mov	[VGA_INT43H], eax
  7663                              <1> 
  7664                              <1> 	; 08/01/2021
  7665                              <1> 	; ebp = video font data (buffer) address
  7666 000033EF 892D[2E850100]      <1> 	mov	[VGA_INT43H], ebp
  7667                              <1> 
  7668                              <1> 	; switch (BL) {
  7669                              <1> 	; case 0:
  7670                              <1> 	;    write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, DL-1);
  7671                              <1> 	;    break;
  7672 000033F5 20DB                <1> 	and	bl, bl
  7673 000033F7 7508                <1> 	jnz	short l_gfx_uc_1
  7674 000033F9 8815[C6670000]      <1> 	mov	[VGA_ROWS], dl  ; not DL-1 !
  7675 000033FF EB23                <1> 	jmp	short l_gfx_uc_4
  7676                              <1> l_gfx_uc_1:
  7677                              <1> 	; case 1:
  7678                              <1> 	;    write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, 13);
  7679                              <1> 	;    break;
  7680 00003401 FECB                <1> 	dec	bl
  7681 00003403 7509                <1> 	jnz	short l_gfx_uc_2
  7682                              <1> 	; bl = 1
  7683 00003405 C605[C6670000]0E    <1> 	mov	byte [VGA_ROWS], 14  ; not 13 !
  7684 0000340C EB16                <1> 	jmp	short l_gfx_uc_4
  7685                              <1> l_gfx_uc_2:
  7686 0000340E FECB                <1> 	dec	bl
  7687 00003410 740B                <1> 	jz	short l_gfx_uc_3 ; bl = 2
  7688 00003412 FECB                <1> 	dec	bl
  7689 00003414 750E                <1> 	jnz	short l_gfx_uc_4 ; bl > 3
  7690                              <1> 	; bl = 3
  7691                              <1> 	; case 3:
  7692                              <1> 	;    write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, 42);
  7693                              <1> 	;    break;
  7694 00003416 C605[C6670000]2B    <1> 	mov	byte [VGA_ROWS], 43  ; not 42 !
  7695                              <1> l_gfx_uc_3:
  7696                              <1>     	; case 2:
  7697                              <1>     	; default:
  7698                              <1> 	;    write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, 24);
  7699                              <1> 	;    break;
  7700                              <1> 	; bl = 2 or bl > 3
  7701 0000341D C605[C6670000]19    <1> 	mov	byte [VGA_ROWS], 25  ; not 24 !	
  7702                              <1>     	; }
  7703                              <1> l_gfx_uc_4:
  7704                              <1>     	; write_byte(BIOSMEM_SEG, BIOSMEM_CHAR_HEIGHT, CX);
  7705 00003424 880D[C2670000]      <1> 	mov	[CHAR_HEIGHT], cl
  7706                              <1> 	; }
  7707 0000342A C3                  <1> 	retn
  7708                              <1> 
  7709                              <1> load_gfx_8_14_chars:
  7710                              <1> 	; 08/08/2016
  7711                              <1> 	; 10/07/2016
  7712                              <1> 	; Setup ROM 8x14 Font for Graphics Mode (VGA)
  7713                              <1> 	;
  7714                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  7715                              <1> 	; vgabios-0.7a (2011)
  7716                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  7717                              <1> 	; 'vgabios.c', 'biosfn_load_gfx_8_14_chars'
  7718                              <1> 
  7719                              <1> 	; biosfn_load_gfx_8_14_chars (BL)
  7720                              <1> 	; /* set 0x43 INT pointer */
  7721                              <1>     	; write_word(0x0, 0x43*4, &vgafont14);
  7722                              <1>     	; write_word(0x0, 0x43*4+2, 0xC000);
  7723 0000342B C705[2E850100]-     <1> 	mov	dword [VGA_INT43H], vgafont14
  7723 00003431 [1C570100]          <1>
  7724                              <1> 		
  7725                              <1> 	; BL    screen rows code: 00H = user-specified (in DL)
  7726                              <1>         ;                         01H = 14 rows
  7727                              <1>         ;                         02H = 25 rows
  7728                              <1>         ;                         03H = 43 rows
  7729                              <1>         ; DL    (when BL=0) custom number of char rows on screen
  7730                              <1> 
  7731                              <1> 	; switch (BL) {
  7732                              <1> 	; case 0:
  7733                              <1> 	;    write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, DL-1);
  7734                              <1> 	;    break;
  7735 00003435 20DB                <1> 	and	bl, bl
  7736 00003437 7508                <1> 	jnz	short l_gfx_8_14c_1
  7737 00003439 8815[C6670000]      <1> 	mov	[VGA_ROWS], dl  ; not DL-1 !
  7738 0000343F EB23                <1> 	jmp	short l_gfx_8_14c_4
  7739                              <1> l_gfx_8_14c_1:
  7740                              <1> 	; case 1:
  7741                              <1> 	;    write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, 13);
  7742                              <1> 	;    break;
  7743 00003441 FECB                <1> 	dec	bl
  7744 00003443 7509                <1> 	jnz	short l_gfx_8_14c_2
  7745                              <1> 	; bl = 1
  7746 00003445 C605[C6670000]0E    <1> 	mov	byte [VGA_ROWS], 14  ; not 13 !
  7747 0000344C EB16                <1> 	jmp	short l_gfx_8_14c_4
  7748                              <1> l_gfx_8_14c_2:
  7749 0000344E FECB                <1> 	dec	bl
  7750 00003450 740B                <1> 	jz	short l_gfx_8_14c_3 ; bl = 2
  7751 00003452 FECB                <1> 	dec	bl
  7752 00003454 750E                <1> 	jnz	short l_gfx_8_14c_4 ; bl > 3
  7753                              <1> 	; bl = 3
  7754                              <1> 	; case 3:
  7755                              <1> 	;    write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, 42);
  7756                              <1> 	;    break;
  7757 00003456 C605[C6670000]2B    <1> 	mov	byte [VGA_ROWS], 43  ; not 42 !
  7758                              <1> l_gfx_8_14c_3:
  7759                              <1>     	; case 2:
  7760                              <1>     	; default:
  7761                              <1> 	;    write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, 24);
  7762                              <1> 	;    break;
  7763                              <1> 	; bl = 2 or bl > 3
  7764 0000345D C605[C6670000]19    <1> 	mov	byte [VGA_ROWS], 25  ; not 24 !
  7765                              <1>     	; }
  7766                              <1> l_gfx_8_14c_4:
  7767                              <1>     	; write_byte(BIOSMEM_SEG, BIOSMEM_CHAR_HEIGHT, 14);
  7768 00003464 C605[C2670000]0E    <1>         mov     byte [CHAR_HEIGHT], 14
  7769                              <1> 	; }
  7770 0000346B C3                  <1> 	retn	
  7771                              <1> 
  7772                              <1> load_gfx_8_8_chars:
  7773                              <1> 	; 08/08/2016
  7774                              <1> 	; 10/07/2016
  7775                              <1> 	; Setup ROM 8x14 Font for Graphics Mode (VGA)
  7776                              <1> 	;
  7777                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  7778                              <1> 	; vgabios-0.7a (2011)
  7779                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  7780                              <1> 	; 'vgabios.c', 'biosfn_load_gfx_8_8_dd_chars'
  7781                              <1> 
  7782                              <1> 	; biosfn_load_gfx_8_8_dd_chars (BL)
  7783                              <1> 	; /* set 0x43 INT pointer */
  7784                              <1>     	; write_word(0x0, 0x43*4, &vgafont8);
  7785                              <1>     	; write_word(0x0, 0x43*4+2, 0xC000);
  7786 0000346C C705[2E850100]-     <1> 	mov	dword [VGA_INT43H], vgafont8
  7786 00003472 [1C4F0100]          <1>
  7787                              <1> 		
  7788                              <1> 	; BL    screen rows code: 00H = user-specified (in DL)
  7789                              <1>         ;                         01H = 14 rows
  7790                              <1>         ;                         02H = 25 rows
  7791                              <1>         ;                         03H = 43 rows
  7792                              <1>         ; DL    (when BL=0) custom number of char rows on screen
  7793                              <1> 
  7794                              <1> 	; switch (BL) {
  7795                              <1> 	; case 0:
  7796                              <1> 	;    write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, DL-1);
  7797                              <1> 	;    break;
  7798 00003476 20DB                <1> 	and	bl, bl
  7799 00003478 7508                <1> 	jnz	short l_gfx_8_8c_1
  7800 0000347A 8815[C6670000]      <1> 	mov	[VGA_ROWS], dl  ; not DL-1 !
  7801 00003480 EB23                <1> 	jmp	short l_gfx_8_8c_4 	
  7802                              <1> l_gfx_8_8c_1:
  7803                              <1> 	; case 1:
  7804                              <1> 	;    write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, 13);
  7805                              <1> 	;    break;
  7806 00003482 FECB                <1> 	dec	bl
  7807 00003484 7509                <1> 	jnz	short l_gfx_8_8c_2
  7808                              <1> 	; bl = 1
  7809 00003486 C605[C6670000]0E    <1> 	mov	byte [VGA_ROWS], 14  ; not 13 !
  7810 0000348D EB16                <1> 	jmp	short l_gfx_8_8c_4 	
  7811                              <1> l_gfx_8_8c_2:
  7812 0000348F FECB                <1> 	dec	bl
  7813 00003491 740B                <1> 	jz	short l_gfx_8_8c_3 ; bl = 2
  7814 00003493 FECB                <1> 	dec	bl
  7815 00003495 750E                <1> 	jnz	short l_gfx_8_8c_4 ; bl > 3
  7816                              <1> 	; bl = 3
  7817                              <1> 	; case 3:
  7818                              <1> 	;    write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, 42);
  7819                              <1> 	;    break;
  7820 00003497 C605[C6670000]2B    <1> 	mov	byte [VGA_ROWS], 43  ; not 42 !
  7821                              <1> l_gfx_8_8c_3:
  7822                              <1>     	; case 2:
  7823                              <1>     	; default:
  7824                              <1> 	;    write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, 24);
  7825                              <1> 	;    break;
  7826                              <1> 	; bl = 2 or bl > 3
  7827 0000349E C605[C6670000]19    <1> 	mov	byte [VGA_ROWS], 25  ; not 24 !	
  7828                              <1>     	; }
  7829                              <1> l_gfx_8_8c_4:
  7830                              <1>     	; write_byte(BIOSMEM_SEG, BIOSMEM_CHAR_HEIGHT, 8);
  7831 000034A5 C605[C2670000]08    <1>         mov     byte [CHAR_HEIGHT], 8
  7832                              <1> 	; }
  7833 000034AC C3                  <1> 	retn
  7834                              <1> 
  7835                              <1> load_gfx_8_16_chars:
  7836                              <1> 	; 08/08/2016
  7837                              <1> 	; 10/07/2016
  7838                              <1> 	; Setup ROM 8x14 Font for Graphics Mode (VGA)
  7839                              <1> 	;
  7840                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  7841                              <1> 	; vgabios-0.7a (2011)
  7842                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  7843                              <1> 	; 'vgabios.c', 'biosfn_load_gfx_8_16_chars'
  7844                              <1> 
  7845                              <1> 	; biosfn_load_gfx_8_16_chars (BL)
  7846                              <1> 	; /* set 0x43 INT pointer */
  7847                              <1>     	; write_word(0x0, 0x43*4, &vgafont16);
  7848                              <1>     	; write_word(0x0, 0x43*4+2, 0xC000);
  7849 000034AD C705[2E850100]-     <1> 	mov	dword [VGA_INT43H], vgafont16
  7849 000034B3 [1C650100]          <1>
  7850                              <1> 		
  7851                              <1> 	; BL    screen rows code: 00H = user-specified (in DL)
  7852                              <1>         ;                         01H = 14 rows
  7853                              <1>         ;                         02H = 25 rows
  7854                              <1>         ;                         03H = 43 rows
  7855                              <1>         ; DL    (when BL=0) custom number of char rows on screen
  7856                              <1> 
  7857                              <1> 	; switch (BL) {
  7858                              <1> 	; case 0:
  7859                              <1> 	;    write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, DL-1);
  7860                              <1> 	;    break;
  7861 000034B7 20DB                <1> 	and	bl, bl
  7862 000034B9 7508                <1> 	jnz	short l_gfx_8_16c_1
  7863 000034BB 8815[C6670000]      <1> 	mov	[VGA_ROWS], dl  ; not DL-1 !
  7864 000034C1 EB23                <1> 	jmp	short l_gfx_8_16c_4 	
  7865                              <1> l_gfx_8_16c_1:
  7866                              <1> 	; case 1:
  7867                              <1> 	;    write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, 13);
  7868                              <1> 	;    break;
  7869 000034C3 FECB                <1> 	dec	bl
  7870 000034C5 7509                <1> 	jnz	short l_gfx_8_16c_2
  7871                              <1> 	; bl = 1
  7872 000034C7 C605[C6670000]0E    <1> 	mov	byte [VGA_ROWS], 14  ; not 13 !
  7873 000034CE EB16                <1> 	jmp	short l_gfx_8_16c_4
  7874                              <1> l_gfx_8_16c_2:
  7875 000034D0 FECB                <1> 	dec	bl
  7876 000034D2 740B                <1> 	jz	short l_gfx_8_16c_3 ; bl = 2
  7877 000034D4 FECB                <1> 	dec	bl
  7878 000034D6 750E                <1> 	jnz	short l_gfx_8_16c_4 ; bl > 3
  7879                              <1> 	; bl = 3
  7880                              <1> 	; case 3:
  7881                              <1> 	;    write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, 42);
  7882                              <1> 	;    break;
  7883 000034D8 C605[C6670000]2B    <1> 	mov	byte [VGA_ROWS], 43  ; not 42 !
  7884                              <1> l_gfx_8_16c_3:
  7885                              <1>     	; case 2:
  7886                              <1>     	; default:
  7887                              <1> 	;    write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, 24);
  7888                              <1> 	;    break;
  7889                              <1> 	; bl = 2 or bl > 3
  7890 000034DF C605[C6670000]19    <1> 	mov	byte [VGA_ROWS], 25  ; not 24 !	
  7891                              <1>     	; }
  7892                              <1> l_gfx_8_16c_4:
  7893                              <1>     	; write_byte(BIOSMEM_SEG, BIOSMEM_CHAR_HEIGHT, 16);
  7894 000034E6 C605[C2670000]10    <1>         mov     byte [CHAR_HEIGHT], 16
  7895                              <1> 	; }
  7896 000034ED C3                  <1> 	retn
  7897                              <1> 			
  7898                              <1> get_font_info:
  7899                              <1> 	; 03/08/2022 (TRDOS 386 v2.0.5)
  7900                              <1> 	; 08/01/2021 (TRDOS 386 v2.0.3)
  7901                              <1> 	; 19/09/2016
  7902                              <1> 	; 08/08/2016
  7903                              <1> 	; 10/07/2016
  7904                              <1> 	; Get Current Character Generator Info (VGA)
  7905                              <1> 	;
  7906                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  7907                              <1> 	; vgabios-0.7a (2011)
  7908                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  7909                              <1> 	; 'vgabios.c', 'biosfn_get_font_info'
  7910                              <1> 
  7911                              <1> 	; Modified for TRDOS 386 !
  7912                              <1> 	;
  7913                              <1> 	; INPUT ->
  7914                              <1> 	;    AX = 1130h
  7915                              <1> 	;    BL = 0 -> Get info for current VGA font
  7916                              <1> 	;	       (BH = unused)
  7917                              <1> 	;    19/09/2016
  7918                              <1> 	;    BL > 0 -> Get requested character font data
  7919                              <1> 	;	 BL = 1 -> vgafont8
  7920                              <1> 	;        BL = 2 -> vgafont14
  7921                              <1> 	;	 BL = 3 -> vgafont16   
  7922                              <1> 	;	;08/01/2021
  7923                              <1> 	;	 BL = 4 -> user defined 8x8 font
  7924                              <1> 	;	 BL = 5 -> user defined 8x14 font
  7925                              <1> 	;	 BL = 6 -> user defined 8x16 font
  7926                              <1> 	;	 BL > 6 -> Invalid function (for now!)
  7927                              <1> 	;	 BH = ASCII code of the first character
  7928                              <1> 	;	 ECX = Number of characters from the 1st char
  7929                              <1> 	;	 ECX >= 256 -> All (256-BH) characters
  7930                              <1> 	;	 ECX = 0 -> All characters (BH = unused)
  7931                              <1> 	;        EDX = User's Buffer Address	
  7932                              <1> 	; OUTPUT ->
  7933                              <1> 	;    AL = height (scanlines), bytes per character
  7934                              <1> 	;    AH = screen rows
  7935                              <1> 	;    Byte 16-23 of EAX = number of columns
  7936                              <1> 	;    Byte 24-31 of EAX = 
  7937                              <1> 	;	  0 -> default font (not configured yet)
  7938                              <1> 	;	  0FFh -> user defined font
  7939                              <1> 	;	  14 = vgafont14
  7940                              <1> 	;	   8 = vgafont8
  7941                              <1> 	;	  16 = vgafont16
  7942                              <1> 	;   If BL input > 0 -> 
  7943                              <1> 	;       EAX = Actual transfer count
  7944                              <1> 	;
  7945 000034EE 20DB                <1> 	and	bl, bl
  7946 000034F0 740F                <1> 	jz	short gfi_1
  7947                              <1> 	; invalid function (input)
  7948                              <1> 	; 08/01/2021
  7949 000034F2 80FB04              <1> 	cmp	bl, 4
  7950 000034F5 7263                <1> 	jb	short gfi_5
  7951 000034F7 7441                <1> 	je	short gfi_3	
  7952 000034F9 80FB06              <1> 	cmp	bl, 6
  7953 000034FC 744C                <1> 	je	short gfi_4
  7954                              <1> 	; bh = 5 or bh > 6
  7955                              <1> gfi_0:
  7956 000034FE 31C0                <1> 	xor	eax, eax ; 0
  7957 00003500 C3                  <1> 	retn
  7958                              <1> gfi_1:
  7959 00003501 A0[C2670000]        <1> 	mov	al, [CHAR_HEIGHT]
  7960 00003506 8A25[C6670000]      <1> 	mov	ah, [VGA_ROWS]
  7961 0000350C C1E010              <1> 	shl	eax, 16
  7962 0000350F A0[C0670000]        <1> 	mov	al, [CRT_COLS]
  7963 00003514 8B0D[2E850100]      <1> 	mov	ecx, [VGA_INT43H]
  7964 0000351A 21C9                <1> 	and	ecx, ecx
  7965 0000351C 7418                <1> 	jz	short gfi_2 ; 0 = default font
  7966                              <1> 	; 08/01/2021
  7967 0000351E FECC                <1> 	dec	ah ; 0FFh
  7968 00003520 81F900400900        <1> 	cmp	ecx, VGAFONT16USER
  7969 00003526 740E                <1> 	je	short gfi_2
  7970 00003528 81F900500900        <1> 	cmp	ecx, VGAFONT8USER
  7971 0000352E 7406                <1> 	je	short gfi_2	
  7972 00003530 8A25[C2670000]      <1> 	mov	ah, [CHAR_HEIGHT] ; font size = height
  7973                              <1> gfi_2:
  7974 00003536 C1C010              <1> 	rol	eax, 16
  7975 00003539 C3                  <1> 	retn
  7976                              <1> gfi_3:
  7977                              <1> 	; 08/01/2021
  7978 0000353A F605[369F0100]08    <1> 	test	byte [ufont], 08h ; 8x8 user font
  7979 00003541 74BB                <1> 	jz	short gfi_0 ; not loaded !
  7980 00003543 BE00500900          <1> 	mov	esi, VGAFONT8USER ; *
  7981                              <1> 	;mov	bl, 8
  7982                              <1> 	;jmp	short gfi_8
  7983 00003548 EB4A                <1> 	jmp	short gfi_10
  7984                              <1> gfi_4:
  7985                              <1> 	; 08/01/2021
  7986 0000354A F605[369F0100]10    <1> 	test	byte [ufont], 10h ; 8x16 user font
  7987 00003551 74AB                <1> 	jz	short gfi_0 ; not loaded !
  7988 00003553 BE00400900          <1> 	mov	esi, VGAFONT16USER ; *
  7989 00003558 EB15                <1> 	jmp	short gfi_7
  7990                              <1> gfi_5:
  7991 0000355A 80FB02              <1> 	cmp	bl, 2
  7992 0000355D 7230                <1> 	jb	short gfi_9
  7993 0000355F 7709                <1> 	ja	short gfi_6
  7994                              <1> 	; BL = 2 -> vgafont14
  7995 00003561 BE[1C570100]        <1> 	mov	esi, vgafont14 ; *
  7996 00003566 B30E                <1> 	mov	bl, 14
  7997 00003568 EB07                <1> 	jmp	short gfi_8 
  7998                              <1> gfi_6:
  7999                              <1> 	; BL = 3 -> vgafont16
  8000 0000356A BE[1C650100]        <1> 	mov	esi, vgafont16 ; *
  8001                              <1> gfi_7:
  8002 0000356F B310                <1> 	mov	bl, 16
  8003                              <1> gfi_8:
  8004 00003571 89D7                <1> 	mov	edi, edx ; **
  8005 00003573 09C9                <1> 	or	ecx, ecx
  8006 00003575 7421                <1> 	jz	short gfi_11 ; all chars from the 00h
  8007                              <1> 	;mov	al, bh ; character index
  8008                              <1> 	; 03/08/2022
  8009 00003577 0FB6C7              <1> 	movzx	eax, bh
  8010 0000357A F6E3                <1> 	mul	bl ; char index * char height/size
  8011                              <1> 	;movzx	edx, ax
  8012                              <1> 	; 03/08/2022
  8013                              <1> 	;add	esi, edx ; *
  8014 0000357C 01C6                <1> 	add	esi, eax
  8015 0000357E 31D2                <1> 	xor	edx, edx
  8016 00003580 FECA                <1> 	dec	dl 
  8017                              <1> 	; edx = 0FFh = 255
  8018                              <1> 	;mov	dx, 255
  8019 00003582 28FA                <1> 	sub	dl, bh
  8020                              <1> 	;inc	dx	
  8021                              <1> 	; 03/08/2022
  8022 00003584 42                  <1> 	inc	edx
  8023 00003585 39D1                <1> 	cmp	ecx, edx
  8024 00003587 770F                <1> 	ja	short gfi_11
  8025 00003589 7411                <1> 	je	short gfi_12
  8026 0000358B 89D1                <1> 	mov	ecx, edx
  8027 0000358D EB0D                <1> 	jmp	short gfi_12
  8028                              <1> gfi_9:
  8029                              <1> 	;BL = 1 -> vgafont8
  8030 0000358F BE[1C4F0100]        <1> 	mov	esi, vgafont8 ; *
  8031                              <1> gfi_10:
  8032 00003594 B308                <1> 	mov	bl, 8
  8033 00003596 EBD9                <1> 	jmp	short gfi_8
  8034                              <1> gfi_11:
  8035                              <1> 	;mov	ecx, 256
  8036                              <1> 	; 03/08/2022
  8037 00003598 29C9                <1> 	sub	ecx, ecx
  8038 0000359A FEC5                <1> 	inc	ch
  8039                              <1> 	; ecx = 100h 
  8040                              <1> gfi_12:
  8041                              <1> 	; 08/01/2021
  8042 0000359C 89C8                <1> 	mov	eax, ecx ; character count
  8043 0000359E 30FF                <1> 	xor	bh, bh
  8044 000035A0 66F7E3              <1> 	mul	bx ; char count * char height/size
  8045 000035A3 89C1                <1>  	mov	ecx, eax
  8046                              <1> 
  8047                              <1> 	; ESI = source address in system space
  8048                              <1> 	; EDI = user's buffer address
  8049                              <1> 	; ECX = transfer (byte) count
  8050 000035A5 E8E7D80000          <1> 	call	transfer_to_user_buffer
  8051 000035AA 89C8                <1> 	mov	eax, ecx ; actual transfer count
  8052 000035AC C3                  <1> 	retn
  8053                              <1> 
  8054                              <1> set_all_palette_reg:
  8055                              <1> 	; 03/08/2022
  8056                              <1> 	; 10/08/2016
  8057                              <1> 	; Set All Palette Registers and Overscan
  8058                              <1> 	; EDX = Address of 17 bytes; 
  8059                              <1> 	; an rgbRGB value for each of 16 palette
  8060                              <1> 	; registers plus one for the border.
  8061                              <1> 
  8062 000035AD 89D6                <1> 	mov	esi, edx ; user buffer
  8063                              <1> 	;mov	ecx, 17
  8064                              <1> 	; 03/08/2022
  8065 000035AF 29C9                <1> 	sub	ecx, ecx
  8066 000035B1 B111                <1> 	mov	cl, 17
  8067 000035B3 89E7                <1> 	mov	edi, esp
  8068 000035B5 83EC14              <1> 	sub	esp, 20	 	 
  8069 000035B8 E81ED90000          <1> 	call	transfer_from_user_buffer
  8070                              <1> 	;jc	VIDEO_RETURN
  8071                              <1> 
  8072 000035BD 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8073 000035C1 EC                  <1> 	in	al, dx
  8074                              <1> 	;mov	cl, 0
  8075                              <1> 	; 03/08/2022
  8076 000035C2 28C9                <1> 	sub	cl, cl
  8077                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  8078                              <1> 	; 03/08/2022
  8079 000035C4 B2C0                <1> 	mov	dl, 0C0h
  8080                              <1> set_palette_loop:
  8081 000035C6 88C8                <1> 	mov	al, cl
  8082 000035C8 EE                  <1> 	out	dx, al
  8083 000035C9 8A07                <1> 	mov	al, [edi]
  8084 000035CB EE                  <1> 	out	dx, al
  8085 000035CC 47                  <1> 	inc	edi
  8086 000035CD FEC1                <1> 	inc	cl
  8087 000035CF 80F910              <1> 	cmp	cl, 10h
  8088 000035D2 75F2                <1> 	jne	short set_palette_loop
  8089 000035D4 B011                <1> 	mov	al, 11h
  8090 000035D6 EE                  <1> 	out	dx, al
  8091 000035D7 8A07                <1> 	mov	al, [edi]
  8092 000035D9 EE                  <1> 	out	dx, al
  8093 000035DA B020                <1> 	mov	al, 20h
  8094 000035DC EE                  <1> 	out	dx, al
  8095                              <1> 	; ifdef VBOX
  8096                              <1> 	;mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8097                              <1> 	; 03/08/2022
  8098 000035DD B2DA                <1> 	mov	dl, 0DAh
  8099 000035DF EC                  <1> 	in	al, dx
  8100                              <1> 	; endif ; VBOX
  8101 000035E0 83C414              <1> 	add	esp, 20
  8102 000035E3 E941E5FFFF          <1> 	jmp	VIDEO_RETURN
  8103                              <1> 	
  8104                              <1> 	; 07/08/2022
  8105                              <1> toggle_intensity:
  8106                              <1> 	; 03/08/2022
  8107                              <1> 	; 10/08/2016
  8108                              <1> 	; Select Foreground Blink or Bold Background
  8109                              <1> 	; BL = 00h = enable bold backgrounds
  8110                              <1> 	;	    (16 background colors)
  8111                              <1>         ;      01h = enable blinking foreground
  8112                              <1> 	;	    (8 background colors)
  8113                              <1> 
  8114 000035E8 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8115 000035EC EC                  <1> 	in	al, dx
  8116                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  8117                              <1> 	; 03/08/2022
  8118 000035ED B2C0                <1> 	mov	dl, 0C0h
  8119 000035EF B010                <1> 	mov	al, 10h
  8120 000035F1 EE                  <1> 	out	dx, al
  8121                              <1> 	;mov	dx, 3C1h ; VGAREG_ACTL_READ_DATA
  8122                              <1> 	; 03/08/2022
  8123 000035F2 FEC2                <1> 	inc	dl ; dx = 3C1h
  8124 000035F4 EC                  <1> 	in	al, dx
  8125 000035F5 24F7                <1> 	and	al, 0F7h
  8126 000035F7 80E301              <1> 	and	bl, 01h
  8127 000035FA C0E303              <1> 	shl	bl, 3
  8128 000035FD 08D8                <1> 	or	al, bl
  8129                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  8130                              <1> 	; 03/08/2022
  8131 000035FF FECA                <1> 	dec	dl ; dx = 3C0h
  8132 00003601 EE                  <1> 	out	dx, al
  8133 00003602 B020                <1> 	mov	al, 20h
  8134 00003604 EE                  <1> 	out	dx, al
  8135                              <1> 	; ifdef VBOX
  8136                              <1> 	;mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8137                              <1> 	; 03/08/2022
  8138 00003605 B2DA                <1> 	mov	dl, 0DAh
  8139 00003607 EC                  <1> 	in	al, dx
  8140                              <1> 	; endif ; VBOX
  8141 00003608 E91CE5FFFF          <1> 	jmp	VIDEO_RETURN
  8142                              <1> 
  8143                              <1> 	; 07/08/2022
  8144                              <1> vga_palf_unknown:
  8145 0000360D 29C0                <1> 	sub	eax, eax ; 0 = invalid function
  8146 0000360F E91AE5FFFF          <1>         jmp     _video_return
  8147                              <1> 
  8148                              <1> 	; 07/08/2022
  8149                              <1> vga_palf_101B:
  8150 00003614 3C1B                <1> 	cmp	al, 1Bh
  8151                              <1> 	;jne	short vga_palf_unknown
  8152 00003616 77F5                <1> 	ja	short vga_palf_unknown
  8153                              <1>  
  8154 00003618 E810F6FFFF          <1> 	call	gray_scale_summing
  8155 0000361D E907E5FFFF          <1>         jmp     VIDEO_RETURN 
  8156                              <1> 	
  8157                              <1> vga_pal_funcs:
  8158                              <1> 	; 07/08/2022
  8159                              <1> 	; 10/08/2016
  8160                              <1> 	; VGA Palette functions
  8161                              <1> 	;
  8162                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
  8163                              <1> 	; vgabios-0.7a (2011)
  8164                              <1> 	; by the LGPL VGABios developers Team (2001-2008)
  8165                              <1> 	; 'vgabios.c', 'vgarom.asm'
  8166                              <1> 
  8167 00003622 3C00                <1> 	cmp	al, 0
  8168 00003624 7467                <1>         je      short set_single_palette_reg
  8169                              <1> vga_palf_1002:
  8170 00003626 3C02                <1> 	cmp	al, 2
  8171 00003628 7483                <1>         je      short set_all_palette_reg
  8172                              <1> 	; 07/08/2022
  8173 0000362A 7702                <1> 	ja	short vga_palf_1003
  8174 0000362C EB5D                <1> 	jmp	short set_overscan_border_color 
  8175                              <1> 	; 07/08/2022
  8176                              <1> ;vga_palf_1001:
  8177                              <1> ;	cmp	al, 1
  8178                              <1> ;	je	short set_overscan_border_color
  8179                              <1> vga_palf_1003:
  8180 0000362E 3C03                <1> 	cmp	al, 3
  8181 00003630 74B6                <1> 	je	short toggle_intensity
  8182                              <1> vga_palf_1007:
  8183 00003632 3C07                <1> 	cmp	al, 7
  8184 00003634 747F                <1>         je      short get_single_palette_reg
  8185 00003636 72D5                <1> 	jb	short vga_palf_unknown
  8186                              <1> vga_palf_1008:
  8187 00003638 3C08                <1> 	cmp	al, 8
  8188 0000363A 7477                <1>         je      short read_overscan_border_color
  8189                              <1> vga_palf_1009:
  8190 0000363C 3C09                <1> 	cmp	al, 9
  8191                              <1> 	;je	short get_all_palette_reg
  8192                              <1> 	; 07/08/2022
  8193 0000363E 7505                <1> 	jne	short vga_palf_1010
  8194 00003640 E966010000          <1> 	jmp	get_all_palette_reg
  8195                              <1> vga_palf_1010:
  8196 00003645 3C10                <1> 	cmp	al, 10h
  8197                              <1> 	;je 	short set_single_dac_reg
  8198                              <1> 	; 07/08/2022
  8199 00003647 7707                <1> 	ja	short vga_palf_1012
  8200 00003649 72C2                <1> 	jb	short vga_palf_unknown
  8201 0000364B E908010000          <1> 	jmp	set_single_dac_reg
  8202                              <1> vga_palf_1012:
  8203 00003650 3C12                <1> 	cmp	al, 12h
  8204                              <1> 	;je	short set_all_dac_reg
  8205                              <1> 	; 07/08/2022
  8206 00003652 7707                <1> 	ja	short vga_palf_1013
  8207 00003654 72B7                <1> 	jb	short vga_palf_unknown
  8208 00003656 E916010000          <1> 	jmp	set_all_dac_reg	
  8209                              <1> vga_palf_1013:
  8210 0000365B 3C13                <1> 	cmp	al, 13h
  8211                              <1> 	;je	short select_video_dac_color_page
  8212                              <1> 	; 07/08/2022
  8213 0000365D 7505                <1> 	jne	short vga_palf_1015
  8214 0000365F E992010000          <1> 	jmp	select_video_dac_color_page
  8215                              <1> vga_palf_1015:
  8216 00003664 3C15                <1> 	cmp	al, 15h
  8217                              <1> 	;je	short read_single_dac_reg
  8218                              <1> 	; 07/08/2022
  8219 00003666 7707                <1> 	ja	short vga_palf_1017
  8220 00003668 72A3                <1> 	jb	short vga_palf_unknown
  8221 0000366A E98D000000          <1> 	jmp	read_single_dac_reg
  8222                              <1> vga_palf_1017:
  8223 0000366F 3C17                <1> 	cmp	al, 17h
  8224                              <1> 	;je	short read_all_dac_reg
  8225                              <1> 	; 07/08/2022
  8226 00003671 7707                <1> 	ja	short vga_palf_1018
  8227 00003673 7298                <1> 	jb	short vga_palf_unknown
  8228 00003675 E9A0000000          <1> 	jmp	read_all_dac_reg
  8229                              <1> vga_palf_1018:
  8230 0000367A 3C18                <1> 	cmp	al, 18h
  8231 0000367C 7464                <1>         je	short set_pel_mask
  8232                              <1> vga_palf_1019:
  8233 0000367E 3C19                <1> 	cmp	al, 19h
  8234 00003680 746C                <1>         je	short read_pel_mask
  8235                              <1> vga_palf_101A:
  8236 00003682 3C1A                <1> 	cmp	al, 1Ah
  8237                              <1>         ;je	short read_video_dac_state
  8238                              <1> 	; 07/08/2022
  8239 00003684 758E                <1> 	jne	short vga_palf_101B
  8240 00003686 E9AD010000          <1> 	jmp	read_video_dac_state
  8241                              <1> 
  8242                              <1> 	; 07/08/2022
  8243                              <1> set_overscan_border_color:
  8244                              <1> 	; 10/08/2016
  8245                              <1> 	; Set Overscan/Border Color Register
  8246                              <1> 	; BH = 6-bit RGB color to display 
  8247                              <1> 	;      for that attribute
  8248                              <1> 	
  8249 0000368B B311                <1> 	mov	bl, 11h
  8250                              <1>   	; 07/08/2022
  8251                              <1> 	;jmp	short set_single_palette_reg
  8252                              <1> 
  8253                              <1> set_single_palette_reg:
  8254                              <1> 	; 03/08/2022 (TRDOS 386 v2.0.5)
  8255                              <1> 	; 12/04/2021 (TRDOS 386 v2.0.3, 32 bit push/pop)
  8256                              <1> 	; 10/08/2016
  8257                              <1> 	; Set One Palette Register
  8258                              <1> 	; BL = register number to set
  8259                              <1> 	;     (a 4-bit attribute nibble: 00h-0Fh)
  8260                              <1> 	; BH = 6-bit RGB color to display 
  8261                              <1> 	;      for that attribute
  8262                              <1> 
  8263 0000368D 80FB14              <1> 	cmp	bl, 14h
  8264                              <1> 	;;ja	short no_actl_reg1
  8265                              <1> 	;ja	VIDEO_RETURN
  8266                              <1> 	; 03/08/2022
  8267 00003690 7605                <1> 	jna	short sspr_1
  8268 00003692 E992E4FFFF          <1> 	jmp	VIDEO_RETURN
  8269                              <1> sspr_1:
  8270                              <1> 	;push	ax
  8271                              <1> 	;push	dx
  8272                              <1> 	; 12/04/2021
  8273 00003697 50                  <1> 	push	eax
  8274 00003698 52                  <1> 	push	edx
  8275 00003699 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8276 0000369D EC                  <1> 	in	al, dx
  8277                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  8278                              <1> 	; 03/08/2022
  8279 0000369E B2C0                <1> 	mov	dl, 0C0h
  8280 000036A0 88D8                <1> 	mov	al, bl
  8281 000036A2 EE                  <1> 	out	dx, al
  8282 000036A3 88F8                <1> 	mov	al, bh
  8283 000036A5 EE                  <1> 	out	dx, al
  8284 000036A6 B020                <1> 	mov	al, 20h
  8285 000036A8 EE                  <1> 	out	dx, al
  8286                              <1> 	; ifdef VBOX
  8287                              <1> 	;mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8288                              <1> 	; 03/08/2022
  8289 000036A9 B2DA                <1> 	mov	dl, 0DAh
  8290 000036AB EC                  <1> 	in	al, dx
  8291                              <1> 	; endif ; VBOX
  8292                              <1> 	;pop	dx
  8293                              <1> 	;pop	ax
  8294                              <1> 	; 12/04/2021
  8295 000036AC 5A                  <1> 	pop	edx
  8296 000036AD 58                  <1> 	pop	eax
  8297                              <1> ;no_actl_reg1:
  8298 000036AE E976E4FFFF          <1> 	jmp	VIDEO_RETURN
  8299                              <1> 
  8300                              <1> 	; 07/08/2022
  8301                              <1> read_overscan_border_color:
  8302                              <1> 	; 10/08/2016
  8303                              <1> 	; Read Overscan Register
  8304                              <1> 	; OUTPUT:
  8305                              <1> 	; BH = current rgbRGB value 
  8306                              <1> 	;      of the overscan/border register
  8307                              <1> 
  8308 000036B3 B311                <1> 	mov	bl, 11h
  8309                              <1> 	; 07/08/2022
  8310                              <1> 	;jmp	short get_single_palette_reg
  8311                              <1> 
  8312                              <1> get_single_palette_reg:
  8313                              <1> 	; 03/08/2022
  8314                              <1> 	; 10/08/2016
  8315                              <1> 	; Read One Palette Register
  8316                              <1>         ; INPUT:
  8317                              <1> 	; BL = Palette register to read (00h-0Fh)
  8318                              <1> 	; OUTPUT:
  8319                              <1> 	; BH = Current rgbRGB value of specified register
  8320                              <1> 	;      for that attribute
  8321                              <1> 
  8322 000036B5 80FB14              <1> 	cmp	bl, 14h
  8323                              <1> 	;;ja	short no_actl_reg2
  8324                              <1> 	;ja	VIDEO_RETURN
  8325                              <1> 	; 03/08/2022
  8326 000036B8 7605                <1> 	jna	short gspr_1
  8327 000036BA E96AE4FFFF          <1> 	jmp	VIDEO_RETURN
  8328                              <1> gspr_1:
  8329 000036BF 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8330                              <1> 	; 03/08/2022
  8331 000036C3 B2DA                <1> 	mov	dl, 0DAh
  8332 000036C5 EC                  <1> 	in	al, dx
  8333                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  8334                              <1> 	; 03/08/2022
  8335 000036C6 B2C0                <1> 	mov	dl, 0C0h
  8336 000036C8 88D8                <1> 	mov	al, bl
  8337 000036CA EE                  <1> 	out	dx, al
  8338                              <1> 	;mov	dx, 3C1h ; VGAREG_ACTL_READ_DATA
  8339                              <1> 	; 03/08/2022
  8340 000036CB FEC2                <1> 	inc	dl ; dx = 3C1h
  8341 000036CD EC                  <1> 	in	al, dx
  8342 000036CE 8844240D            <1> 	mov	[esp+13], al ; bh
  8343                              <1> 	;mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8344                              <1> 	; 03/08/2022
  8345 000036D2 B2DA                <1> 	mov	dl, 0DAh
  8346 000036D4 EC                  <1> 	in	al, dx
  8347                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  8348                              <1> 	; 03/08/2022
  8349 000036D5 B2C0                <1> 	mov	dl, 0C0h
  8350 000036D7 B020                <1> 	mov	al, 20h
  8351 000036D9 EE                  <1> 	out	dx, al
  8352                              <1> 	; ifdef VBOX
  8353                              <1> 	;mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8354                              <1> 	; 03/08/2022
  8355 000036DA B2DA                <1> 	mov	dl, 0DAh
  8356 000036DC EC                  <1> 	in	al, dx
  8357                              <1> 	; endif ; VBOX
  8358 000036DD E947E4FFFF          <1> 	jmp	VIDEO_RETURN
  8359                              <1> 
  8360                              <1> set_pel_mask:
  8361                              <1> 	; 10/08/2016
  8362                              <1> 	; BL = mask value
  8363 000036E2 66BAC603            <1> 	mov	dx, 3C6h ; VGAREG_PEL_MASK
  8364 000036E6 88D8                <1> 	mov	al, bl
  8365 000036E8 EE                  <1> 	out	dx, al
  8366 000036E9 E93BE4FFFF          <1> 	jmp	VIDEO_RETURN
  8367                              <1> 
  8368                              <1> read_pel_mask:
  8369                              <1> 	; 10/08/2016
  8370                              <1> 	; Output: BL = mask value 
  8371 000036EE 66BAC603            <1> 	mov	dx, 3C6h ; VGAREG_PEL_MASK
  8372 000036F2 EC                  <1> 	in	al, dx
  8373 000036F3 8844240C            <1> 	mov	[esp+12], al ; bl
  8374 000036F7 E92DE4FFFF          <1> 	jmp	VIDEO_RETURN
  8375                              <1> 
  8376                              <1> read_single_dac_reg:
  8377                              <1> 	; 02/08/2022
  8378                              <1> 	; 10/08/2016
  8379                              <1> 	; Read One DAC Color Register
  8380                              <1> 	; INPUT:
  8381                              <1> 	; BX = color register to read (0-255)
  8382                              <1> 	; OUTPUT:
  8383                              <1> 	; CH = green value (00h-3Fh)
  8384                              <1>         ; CL = blue value  (00h-3Fh)
  8385                              <1>         ; DH = red value   (00h-3Fh)
  8386                              <1> 
  8387 000036FC 66BAC703            <1> 	mov	dx, 3C7h ; VGAREG_DAC_READ_ADDRESS
  8388 00003700 88D8                <1> 	mov	al, bl
  8389 00003702 EE                  <1> 	out	dx, al
  8390                              <1> 	;mov	dx, 3C9h ; VGAREG_DAC_DATA
  8391                              <1> 	; 02/08/2022
  8392 00003703 B2C9                <1> 	mov	dl, 0C9h
  8393 00003705 EC                  <1> 	in	al, dx
  8394 00003706 88442415            <1> 	mov	[esp+21], al ; dh
  8395 0000370A EC                  <1> 	in	al, dx
  8396 0000370B 88C5                <1> 	mov	ch, al
  8397 0000370D EC                  <1> 	in	al, dx
  8398 0000370E 88C1                <1> 	mov	cl, al
  8399 00003710 66894C2410          <1> 	mov	[esp+16], cx ; cx
  8400 00003715 E90FE4FFFF          <1> 	jmp	VIDEO_RETURN
  8401                              <1> 
  8402                              <1> read_all_dac_reg:
  8403                              <1> 	; 02/08/2022
  8404                              <1> 	; 12/08/2016
  8405                              <1> 	; 11/08/2016
  8406                              <1> 	; 10/08/2016
  8407                              <1> 	; Read a Block of DAC Color Registers
  8408                              <1>         ; BX = first DAC register to read (0-00FFh)
  8409                              <1>         ; ECX = number of registers to read (0-00FFh)
  8410                              <1>         ; EDX = addr of a buffer to hold R,G,B values
  8411                              <1> 	;	(CX*3 bytes long)
  8412                              <1> 
  8413 0000371A 89D7                <1> 	mov	edi, edx ; user buffer
  8414 0000371C 89CA                <1> 	mov	edx, ecx
  8415                              <1> 	;shl	dx, 1 ; *2
  8416                              <1> 	; 02/08/2022
  8417 0000371E D1E2                <1> 	shl	edx, 1
  8418 00003720 01CA                <1> 	add	edx, ecx ; edx = 3*ecx
  8419 00003722 89E5                <1> 	mov	ebp, esp
  8420 00003724 89EE                <1> 	mov	esi, ebp
  8421 00003726 29D6                <1> 	sub	esi, edx
  8422 00003728 6683E6FC            <1> 	and	si, 0FFFCh ; (dword alignment)
  8423 0000372C 89F4                <1> 	mov	esp, esi
  8424 0000372E 52                  <1> 	push	edx ; 3*ecx
  8425 0000372F 66BAC703            <1> 	mov	dx, 3C7h ; VGAREG_DAC_READ_ADDRESS
  8426 00003733 88D8                <1> 	mov	al, bl
  8427 00003735 EE                  <1> 	out	dx, al
  8428 00003736 66BAC903            <1> 	mov	dx, 3C9h ; VGAREG_DAC_DATA
  8429 0000373A 89F3                <1> 	mov	ebx, esi
  8430                              <1> read_dac_loop:
  8431 0000373C EC                  <1> 	in	al, dx
  8432 0000373D 8803                <1> 	mov	[ebx], al
  8433 0000373F 43                  <1> 	inc	ebx
  8434 00003740 EC                  <1> 	in	al, dx
  8435 00003741 8803                <1> 	mov	[ebx], al
  8436 00003743 43                  <1> 	inc	ebx
  8437 00003744 EC                  <1> 	in	al, dx
  8438 00003745 8803                <1> 	mov	[ebx], al
  8439 00003747 43                  <1> 	inc	ebx
  8440                              <1> 	;dec	cx
  8441                              <1> 	; 02/08/2022
  8442 00003748 49                  <1> 	dec	ecx
  8443 00003749 75F1                <1> 	jnz	short read_dac_loop
  8444 0000374B 59                  <1> 	pop	ecx ; 3*ecx
  8445                              <1> 	; ECX = transfer (byte) count
  8446                              <1> 	; ESI = source address in system space
  8447                              <1> 	; EDI = user's buffer address
  8448 0000374C E840D70000          <1> 	call	transfer_to_user_buffer
  8449 00003751 89EC                <1> 	mov	esp, ebp
  8450 00003753 E9D1E3FFFF          <1> 	jmp	VIDEO_RETURN
  8451                              <1> 
  8452                              <1> set_single_dac_reg:
  8453                              <1> 	; 03/08/2022 (TRDOS 386 v2.0.5)
  8454                              <1> 	; 12/04/2021 (TRDOS 386 v2.0.3, 32 bit push/pop)
  8455                              <1> 	; 10/08/2016
  8456                              <1> 	; Set One DAC Color Register
  8457                              <1> 	; BX = color register to set (0-255)
  8458                              <1>         ; CH = green value (00h-3Fh)
  8459                              <1>         ; CL = blue value  (00h-3Fh)
  8460                              <1>         ; DH = red value   (00h-3Fh)
  8461                              <1> 
  8462                              <1> 	;push	dx
  8463                              <1> 	; 12/04/2021
  8464 00003758 52                  <1> 	push	edx
  8465 00003759 66BAC803            <1> 	mov	dx, 3C8h ; VGAREG_DAC_WRITE_ADDRESS
  8466 0000375D 88D8                <1> 	mov	al, bl
  8467 0000375F EE                  <1> 	out	dx, al
  8468                              <1> 	;;mov	dx, 3C9h ; VGAREG_DAC_DATA
  8469                              <1> 	;inc	dx
  8470                              <1> 	; 03/08/2022
  8471 00003760 FEC2                <1> 	inc	dl
  8472                              <1> 	;pop	ax
  8473                              <1> 	; 12/04/2021
  8474 00003762 58                  <1> 	pop	eax
  8475 00003763 88E0                <1> 	mov	al, ah
  8476 00003765 EE                  <1> 	out	dx, al
  8477 00003766 88E8                <1> 	mov	al, ch
  8478 00003768 EE                  <1> 	out	dx, al
  8479 00003769 88C8                <1> 	mov	al, cl
  8480 0000376B EE                  <1> 	out	dx, al
  8481 0000376C E9B8E3FFFF          <1> 	jmp	VIDEO_RETURN
  8482                              <1> 
  8483                              <1> set_all_dac_reg:
  8484                              <1> 	; 02/08/2022 
  8485                              <1> 	; 12/08/2016
  8486                              <1> 	; 11/08/2016
  8487                              <1> 	; 10/08/2016
  8488                              <1> 	; Set a Block of DAC Color Register
  8489                              <1> 	; BX = first DAC register to set (0-00FFh)
  8490                              <1> 	; ECX = number of registers to set (0-00FFh)
  8491                              <1> 	; EDX = addr of a table of R,G,B values 
  8492                              <1> 	;	(it will be CX*3 bytes long)
  8493                              <1> 
  8494 00003771 89D6                <1> 	mov	esi, edx ; user buffer
  8495 00003773 89CA                <1> 	mov	edx, ecx
  8496                              <1> 	;shl	cx, 1 ; *2
  8497                              <1> 	; 02/08/2022
  8498 00003775 D1E1                <1> 	shl	ecx, 1
  8499 00003777 01D1                <1> 	add	ecx, edx ; ecx = 3*ecx
  8500 00003779 89E5                <1> 	mov	ebp, esp
  8501 0000377B 89EF                <1> 	mov	edi, ebp
  8502 0000377D 29CF                <1> 	sub	edi, ecx
  8503 0000377F 6683E7FC            <1> 	and	di, 0FFFCh ; (dword alignment)
  8504 00003783 89FC                <1> 	mov	esp, edi
  8505 00003785 E851D70000          <1> 	call	transfer_from_user_buffer
  8506                              <1> 	;jc	VIDEO_RETURN
  8507                              <1> 
  8508 0000378A 89D1                <1> 	mov	ecx, edx
  8509 0000378C 66BAC803            <1> 	mov	dx, 3C8h ; VGAREG_DAC_WRITE_ADDRESS
  8510 00003790 88D8                <1> 	mov	al, bl
  8511 00003792 EE                  <1> 	out	dx, al
  8512                              <1> 	;mov	dx, 3C9h ; VGAREG_DAC_DATA
  8513                              <1> 	; 02/08/2022
  8514 00003793 FEC2                <1> 	inc	dl
  8515                              <1> set_dac_loop:
  8516 00003795 8A07                <1> 	mov	al, [edi]
  8517 00003797 EE                  <1> 	out	dx, al
  8518 00003798 47                  <1> 	inc	edi
  8519 00003799 8A07                <1> 	mov	al, [edi]
  8520 0000379B EE                  <1> 	out	dx, al
  8521 0000379C 47                  <1> 	inc	edi
  8522 0000379D 8A07                <1> 	mov	al, [edi]
  8523 0000379F EE                  <1> 	out	dx, al
  8524 000037A0 47                  <1> 	inc	edi
  8525                              <1> 	;dec	cx
  8526                              <1> 	; 02/08/2022
  8527 000037A1 49                  <1> 	dec	ecx
  8528 000037A2 75F1                <1> 	jnz	short set_dac_loop
  8529 000037A4 89EC                <1> 	mov	esp, ebp
  8530 000037A6 E97EE3FFFF          <1> 	jmp	VIDEO_RETURN
  8531                              <1> 
  8532                              <1> get_all_palette_reg:
  8533                              <1> 	; 03/08/2022
  8534                              <1> 	; 10/08/2016
  8535                              <1> 	; Read All Palette Registers
  8536                              <1> 	; EDX = Address of 17-byte buffer 
  8537                              <1> 	;	to receive data
  8538                              <1> 	
  8539 000037AB 89D7                <1> 	mov	edi, edx
  8540 000037AD 89E3                <1> 	mov	ebx, esp
  8541 000037AF 89DE                <1> 	mov	esi, ebx
  8542 000037B1 83EC14              <1> 	sub	esp, 20	 
  8543                              <1> 
  8544 000037B4 B100                <1> 	mov	cl, 0
  8545                              <1> get_palette_loop:
  8546 000037B6 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8547 000037BA EC                  <1> 	in	al, dx
  8548                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  8549                              <1> 	; 03/08/2022
  8550 000037BB B2C0                <1> 	mov	dl, 0C0h
  8551 000037BD 88C8                <1> 	mov	al, cl
  8552 000037BF EE                  <1> 	out	dx, al
  8553                              <1> 	;mov	dx, 3C1h ; VGAREG_ACTL_READ_DATA
  8554                              <1> 	; 03/08/2022
  8555                              <1> 	;mov	dl, 0C1h
  8556 000037C0 FEC2                <1> 	inc	dl
  8557 000037C2 EC                  <1> 	in	al, dx
  8558 000037C3 8803                <1> 	mov	[ebx], al
  8559 000037C5 43                  <1> 	inc	ebx
  8560 000037C6 FEC1                <1> 	inc	cl
  8561 000037C8 80F910              <1> 	cmp	cl, 10h
  8562 000037CB 75E9                <1> 	jne	short get_palette_loop
  8563                              <1> 	;mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8564                              <1> 	; 03/08/2022
  8565 000037CD B2DA                <1> 	mov	dl, 0DAh
  8566 000037CF EC                  <1> 	in	al, dx
  8567                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  8568                              <1> 	; 03/08/2022
  8569 000037D0 B2C0                <1> 	mov	dl, 0C0h
  8570 000037D2 B011                <1> 	mov	al, 11h
  8571 000037D4 EE                  <1> 	out	dx, al
  8572                              <1> 	;mov	dx, 3C1h ; VGAREG_ACTL_READ_DATA
  8573                              <1> 	; 03/08/2022
  8574 000037D5 FEC2                <1> 	inc	dl ; dx = 3C1h
  8575 000037D7 EC                  <1> 	in	al, dx
  8576 000037D8 8803                <1> 	mov	[ebx], al
  8577                              <1> 	;mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8578                              <1> 	; 03/08/2022
  8579 000037DA B2DA                <1> 	mov	dl, 0DAh
  8580 000037DC EC                  <1> 	in	al, dx
  8581                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  8582                              <1> 	; 03/08/2022
  8583 000037DD B2C0                <1> 	mov	dl, 0C0h
  8584 000037DF B020                <1> 	mov	al, 20h
  8585 000037E1 EE                  <1> 	out	dx, al
  8586                              <1> 	; ifdef VBOX
  8587                              <1> 	;mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8588                              <1> 	; 03/08/2022
  8589 000037E2 B2DA                <1> 	mov	dl, 0DAh
  8590 000037E4 EC                  <1> 	in	al, dx
  8591                              <1> 	; endif ; VBOX
  8592                              <1> 
  8593                              <1> 	;mov	ecx, 17 ; transfer (byte) count
  8594                              <1> 	; 03/08/2022
  8595 000037E5 29C9                <1> 	sub	ecx, ecx
  8596 000037E7 B111                <1> 	mov	cl, 17	
  8597                              <1> 
  8598                              <1> 	; ESI = source address in system space
  8599                              <1> 	; EDI = user's buffer address
  8600 000037E9 E8A3D60000          <1> 	call	transfer_to_user_buffer
  8601                              <1> 
  8602 000037EE 83C414              <1> 	add	esp, 20
  8603 000037F1 E933E3FFFF          <1> 	jmp	VIDEO_RETURN
  8604                              <1> 
  8605                              <1> select_video_dac_color_page:
  8606                              <1> 	; 02/08/2022 (TRDOS 386 v2.0.5, code optimization)
  8607                              <1> 	; 12/04/2021 (TRDOS 386 v2.0.3, 32 bit push/pop)
  8608                              <1> 	; 10/08/2016
  8609                              <1> 	; DAC Color Paging Functions
  8610                              <1> 	; BL = 00H = select color paging mode
  8611                              <1>         ;       BH = paging mode
  8612                              <1>         ;            00h = 4 blocks of 64 registers
  8613                              <1>         ;            01h = 16 blocks of 16 registers
  8614                              <1> 	; BL = 01H = activate color page
  8615                              <1>         ;       BH = DAC color page number
  8616                              <1>         ;            00h-03h (4-page/64-reg mode)
  8617                              <1>         ;            00h-0Fh (16-page/16-reg mode)
  8618                              <1> 
  8619 000037F6 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8620 000037FA EC                  <1> 	in	al, dx
  8621                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  8622                              <1> 	; 02/08/2022
  8623 000037FB B240                <1> 	mov	dl, 40h
  8624 000037FD B010                <1> 	mov	al, 10h
  8625 000037FF EE                  <1> 	out	dx, al
  8626                              <1> 	;mov	dx, 3C1h ; VGAREG_ACTL_READ_DATA
  8627                              <1> 	; 02/08/2022
  8628 00003800 FEC2                <1> 	inc	dl ; mov dl, 0C1h
  8629 00003802 EC                  <1> 	in	al, dx
  8630 00003803 80E301              <1> 	and	bl, 01h
  8631 00003806 750C                <1> 	jnz	short set_dac_page
  8632 00003808 247F                <1> 	and	al, 07Fh
  8633 0000380A C0E707              <1> 	shl	bh, 7
  8634 0000380D 08F8                <1> 	or	al, bh
  8635                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  8636                              <1> 	; 02/08/2022
  8637 0000380F FECA                <1> 	dec	dl ; mov dl, 0C0h
  8638 00003811 EE                  <1> 	out	dx, al
  8639 00003812 EB19                <1> 	jmp	short set_actl_normal
  8640                              <1> set_dac_page:
  8641                              <1> 	;push	ax
  8642                              <1> 	; 12/04/2021
  8643 00003814 50                  <1> 	push	eax
  8644 00003815 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8645 00003819 EC                  <1> 	in	al, dx
  8646                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  8647                              <1> 	; 02/08/2022
  8648 0000381A B2C0                <1> 	mov	dl, 0C0h
  8649 0000381C B014                <1> 	mov	al, 14h
  8650 0000381E EE                  <1> 	out	dx, al
  8651                              <1> 	;pop	ax
  8652                              <1> 	; 12/04/2021
  8653 0000381F 58                  <1> 	pop	eax
  8654 00003820 2480                <1> 	and	al, 80h
  8655 00003822 7503                <1> 	jnz	short set_dac_16_page
  8656 00003824 C0E702              <1> 	shl	bh, 2
  8657                              <1> set_dac_16_page:
  8658 00003827 80E70F              <1> 	and	bh, 0Fh
  8659 0000382A 88F8                <1> 	mov	al, bh
  8660 0000382C EE                  <1> 	out	dx, al
  8661                              <1> set_actl_normal:
  8662 0000382D B020                <1> 	mov	al, 20h
  8663 0000382F EE                  <1> 	out	dx, al
  8664                              <1> 	; ifdef VBOX
  8665                              <1> 	;mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8666                              <1> 	; 02/08/2022
  8667 00003830 B2DA                <1> 	mov	dl, 0DAh
  8668 00003832 EC                  <1> 	in	al, dx
  8669                              <1> 	; endif ; VBOX
  8670 00003833 E9F1E2FFFF          <1> 	jmp	VIDEO_RETURN
  8671                              <1> 
  8672                              <1> read_video_dac_state:
  8673                              <1> 	; 10/08/2016
  8674                              <1> 	; Query DAC Color Paging State
  8675                              <1> 	; Output:
  8676                              <1> 	; BH = current active DAC color page
  8677                              <1>         ; BL = current active DAC paging mode
  8678                              <1> 
  8679 00003838 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8680 0000383C EC                  <1> 	in	al, dx
  8681 0000383D 66BAC003            <1> 	mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  8682 00003841 B010                <1> 	mov	al, 10h
  8683 00003843 EE                  <1> 	out	dx, al
  8684 00003844 66BAC103            <1> 	mov	dx, 3C1h ; VGAREG_ACTL_READ_DATA
  8685 00003848 EC                  <1> 	in	al, dx
  8686 00003849 88C3                <1> 	mov	bl, al
  8687 0000384B C0EB07              <1> 	shr	bl, 7
  8688 0000384E 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8689 00003852 EC                  <1> 	in	al, dx
  8690 00003853 66BAC003            <1> 	mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  8691 00003857 B014                <1> 	mov	al, 14h
  8692 00003859 EE                  <1> 	out	dx, al
  8693 0000385A 66BAC103            <1> 	mov	dx, 3C1h ; VGAREG_ACTL_READ_DATA
  8694 0000385E EC                  <1> 	in	al, dx
  8695 0000385F 88C7                <1> 	mov	bh, al
  8696 00003861 80E70F              <1> 	and	bh, 0Fh
  8697 00003864 F6C301              <1> 	test	bl, 01
  8698 00003867 7503                <1> 	jnz	short get_dac_16_page
  8699 00003869 C0EF02              <1> 	shr	bh, 2
  8700                              <1> get_dac_16_page:
  8701 0000386C 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8702 00003870 EC                  <1> 	in	al, dx
  8703 00003871 66BAC003            <1> 	mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
  8704 00003875 B020                <1> 	mov	al, 20h
  8705 00003877 EE                  <1> 	out	dx, al
  8706                              <1> 	; ifdef VBOX
  8707 00003878 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
  8708 0000387C EC                  <1> 	in	al, dx
  8709                              <1> 	; endif ; VBOX 
  8710 0000387D 66895C240C          <1> 	mov	[esp+12], bx ; bx
  8711 00003882 E9A2E2FFFF          <1> 	jmp	VIDEO_RETURN
  8712                              <1> 
  8713                              <1> ; 23/11/2020 - TRDOS 386 v2.0.3
  8714                              <1> ; VBE 2 BOCHS/QEMU emulator extensions 
  8715                              <1> ;	for TRDOS 386 v2 kernel (video bios)
  8716                              <1> 
  8717                              <1> ; BOCH/QEMU VBE2 VGA BIOS code 
  8718                              <1> ;	by Jeroen Janssen (2002)
  8719                              <1> ;	by Volker Rupper (2003-2020)
  8720                              <1> ; vbe.c (02/01/2020) 
  8721                              <1> 
  8722                              <1> ; vbe.h (02/01/2020)
  8723                              <1> 
  8724                              <1> VBE_DISPI_BANK_ADDRESS	equ	0A0000h
  8725                              <1> VBE_DISPI_BANK_SIZE_KB	equ	64
  8726                              <1> 
  8727                              <1> VBE_DISPI_MAX_XRES	equ	2560
  8728                              <1> VBE_DISPI_MAX_YRES	equ	1600
  8729                              <1> 
  8730                              <1> VBE_DISPI_IOPORT_INDEX	equ	01CEh
  8731                              <1> VBE_DISPI_IOPORT_DATA	equ	01CFh
  8732                              <1> 
  8733                              <1> VBE_DISPI_INDEX_ID	equ	00h
  8734                              <1> VBE_DISPI_INDEX_XRES	equ	01h
  8735                              <1> VBE_DISPI_INDEX_YRES	equ	02h
  8736                              <1> VBE_DISPI_INDEX_BPP	equ	03h
  8737                              <1> VBE_DISPI_INDEX_ENABLE	equ	04h
  8738                              <1> VBE_DISPI_INDEX_BANK	equ	05h
  8739                              <1> VBE_DISPI_INDEX_VIRT_WIDTH equ	06h
  8740                              <1> VBE_DISPI_INDEX_VIRT_HEIGHT equ	07h
  8741                              <1> VBE_DISPI_INDEX_X_OFFSET equ	08h
  8742                              <1> VBE_DISPI_INDEX_Y_OFFSET equ	09h
  8743                              <1> VBE_DISPI_INDEX_VIDEO_MEMORY_64K equ 0Ah
  8744                              <1> VBE_DISPI_INDEX_DDC	equ	0Bh
  8745                              <1> 
  8746                              <1> VBE_DISPI_ID0		equ	0B0C0h
  8747                              <1> VBE_DISPI_ID1		equ	0B0C1h
  8748                              <1> VBE_DISPI_ID2		equ	0B0C2h
  8749                              <1> VBE_DISPI_ID3		equ	0B0C3h
  8750                              <1> VBE_DISPI_ID4		equ	0B0C4h
  8751                              <1> VBE_DISPI_ID5		equ	0B0C5h
  8752                              <1> 
  8753                              <1> VBE_DISPI_DISABLED	equ	00h
  8754                              <1> VBE_DISPI_ENABLED	equ	01h
  8755                              <1> VBE_DISPI_GETCAPS	equ	02h
  8756                              <1> VBE_DISPI_8BIT_DAC	equ	20h
  8757                              <1> VBE_DISPI_LFB_ENABLED	equ	40h
  8758                              <1> VBE_DISPI_NOCLEARMEM	equ	80h
  8759                              <1> 
  8760                              <1> VBE_DISPI_LFB_PHYSICAL_ADDRESS equ 0E0000000h
  8761                              <1> 
  8762                              <1> ; ***
  8763                              <1> 
  8764                              <1> ;// VBE Return Status Info
  8765                              <1> ;// AL
  8766                              <1> VBE_RETURN_STATUS_SUPPORTED	equ	4Fh
  8767                              <1> VBE_RETURN_STATUS_UNSUPPORTED	equ	00h
  8768                              <1> ;// AH
  8769                              <1> VBE_RETURN_STATUS_SUCCESSFULL	equ	00h
  8770                              <1> VBE_RETURN_STATUS_FAILED	equ	01h
  8771                              <1> VBE_RETURN_STATUS_NOT_SUPPORTED	equ	02h
  8772                              <1> VBE_RETURN_STATUS_INVALID	equ	03h
  8773                              <1> 
  8774                              <1> ;// VBE Mode Numbers
  8775                              <1> 
  8776                              <1> VBE_MODE_VESA_DEFINED		equ	0100h
  8777                              <1> VBE_MODE_REFRESH_RATE_USE_CRTC	equ	0800h
  8778                              <1> VBE_MODE_LINEAR_FRAME_BUFFER	equ	4000h
  8779                              <1> VBE_MODE_PRESERVE_DISPLAY_MEMORY equ	8000h
  8780                              <1> 
  8781                              <1> ;// Mode Attributes
  8782                              <1> 
  8783                              <1> VBE_MODE_ATTRIBUTE_SUPPORTED		   equ	0001h
  8784                              <1> VBE_MODE_ATTRIBUTE_EXTENDED_INFO_AVAILABLE equ	0002h
  8785                              <1> VBE_MODE_ATTRIBUTE_COLOR_MODE		   equ	0008h
  8786                              <1> VBE_MODE_ATTRIBUTE_GRAPHICS_MODE	   equ	0010h
  8787                              <1> VBE_MODE_ATTRIBUTE_LINEAR_FRAME_BUFFER_MODE equ	0080h
  8788                              <1> VBE_MODE_ATTRIBUTE_DOUBLE_SCAN_MODE	   equ	0100h
  8789                              <1> VBE_MODE_ATTRIBUTE_INTERLACE_MODE	   equ	0200h
  8790                              <1> 
  8791                              <1> ;// Window attributes
  8792                              <1> 
  8793                              <1> VBE_WINDOW_ATTRIBUTE_RELOCATABLE equ	01h
  8794                              <1> VBE_WINDOW_ATTRIBUTE_READABLE	 equ	02h
  8795                              <1> VBE_WINDOW_ATTRIBUTE_WRITEABLE	 equ	04h
  8796                              <1> 
  8797                              <1> ;/* Video memory */
  8798                              <1> VGAMEM_GRAPH equ 0A000h
  8799                              <1> VGAMEM_CTEXT equ 0B800h
  8800                              <1> ;VGAMEM_MTEXT equ 0B000h
  8801                              <1> 
  8802                              <1> ;// Memory model
  8803                              <1> 
  8804                              <1> ;VBE_MEMORYMODEL_TEXT_MODE	equ	00h
  8805                              <1> ;VBE_MEMORYMODEL_CGA_GRAPHICS	equ	01h
  8806                              <1> ;VBE_MEMORYMODEL_PLANAR		equ	03h
  8807                              <1> VBE_MEMORYMODEL_PACKED_PIXEL	equ	04h
  8808                              <1> ;VBE_MEMORYMODEL_NON_CHAIN_4_256 equ	05h
  8809                              <1> VBE_MEMORYMODEL_DIRECT_COLOR	equ	06h
  8810                              <1> ;VBE_MEMORYMODEL_YUV		equ	07h
  8811                              <1> 
  8812                              <1> ;// DirectColorModeInfo
  8813                              <1> 
  8814                              <1> ;VBE_DIRECTCOLOR_COLOR_RAMP_PROGRAMMABLE equ 01h
  8815                              <1> VBE_DIRECTCOLOR_RESERVED_BITS_AVAILABLE equ 02h
  8816                              <1> 
  8817                              <1> VBE_DISPI_TOTAL_VIDEO_MEMORY_MB	equ 16
  8818                              <1> 
  8819                              <1> ; 24/11/2020
  8820                              <1> ; vbe.c
  8821                              <1> 
  8822                              <1> %if 1
  8823                              <1> 
  8824                              <1> _vbe_biosfn_return_mode_info:
  8825                              <1> 	; 15/12/2020
  8826                              <1> 	; 12/12/2020
  8827                              <1> 	; Return VBE Mode Information	
  8828                              <1> 	; (call from 'sysvideo')
  8829                              <1> 	;
  8830                              <1> 	; Input:
  8831                              <1> 	;	cx = video (bios) mode
  8832                              <1> 	; Output:
  8833                              <1> 	;	cf = 0 -> (successful)
  8834                              <1> 	;	   MODE_INFO_LIST addr contains MODEINFO
  8835                              <1> 	;	cf = 1 -> error
  8836                              <1> 	;
  8837                              <1> 	; Modified registers: eax, edx, edi
  8838                              <1> 	;
  8839                              <1> 
  8840                              <1> 	; pushes for subroutine stack pops compatibility
  8841                              <1> 	
  8842                              <1> 	;push	ds  ; *
  8843                              <1> 	;push	es  ; **
  8844                              <1> 
  8845 00003887 55                  <1> 	push	ebp ; ***
  8846 00003888 56                  <1> 	push	esi ; **** 
  8847                              <1> 	
  8848 00003889 31FF                <1> 	xor	edi, edi  ; mov edi, 0
  8849                              <1> 
  8850 0000388B 803D[86090000]03    <1> 	cmp	byte [vbe3], 3
  8851 00003892 7221                <1> 	jb	short _vbe_rmi_1
  8852                              <1> 
  8853                              <1> 	;sub	edi, edi  ; 0 = kernel call (sign)
  8854                              <1> 	;	; no transfer to user's buffer
  8855                              <1> 	
  8856                              <1> 	; cx = Video mode (for 4F01h, with LFB flag)
  8857                              <1> 
  8858 00003894 66B8014F            <1> 	mov	ax, 4F01h
  8859                              <1> 
  8860 00003898 E826E0FFFF          <1> 	call	_vbe3_pmfn_return_mode_info
  8861                              <1> 
  8862 0000389D 6683F84F            <1> 	cmp	ax, 004Fh
  8863 000038A1 7533                <1> 	jne	short _vbe_rmi_2 ; fail
  8864                              <1> 
  8865                              <1> 	; 15/12/2020
  8866                              <1> 	; cx = vbe video mode
  8867 000038A3 80E501              <1> 	and	ch, 01h ; clear LFB flag
  8868 000038A6 BEFE7B0900          <1> 	mov	esi, VBE3MODEINFOBLOCK - 2
  8869 000038AB 66890E              <1> 	mov	[esi], cx ; MODEINFO.mode
  8870 000038AE E8A5000000          <1> 	call	set_lfbinfo_table
  8871 000038B3 EB22                <1> 	jmp	short _vbe_rmi_3  ; cf = 0 
  8872                              <1> _vbe_rmi_1:
  8873 000038B5 803D[86090000]02    <1> 	cmp	byte [vbe3], 2
  8874 000038BC 7219                <1> 	jb	short _vbe_rmi_3 ; cf = 1
  8875 000038BE A0[87090000]        <1> 	mov	al, [vbe2bios] ; 0C0h-0C5h for emu (*)
  8876 000038C3 3CC0                <1> 	cmp	al, 0C0h ; BOCHS/QEMU/VIRTUALBOX (*) ? 
  8877 000038C5 7210                <1> 	jb	short _vbe_rmi_3  ; cf = 1
  8878 000038C7 3CC5                <1> 	cmp	al, 0C5h ; (*)
  8879 000038C9 770B                <1> 	ja	short _vbe_rmi_2 ; unknown vbios !? 
  8880                              <1> 	
  8881                              <1> 	;xor	edi, edi  ; 0 = kernel call (sign)
  8882                              <1> 	;	; no transfer to user's buffer
  8883                              <1> 
  8884                              <1> 	;mov	ax, 4F01h
  8885                              <1> 
  8886                              <1> 	; cx = Video mode (for 4F01h, with LFB flag)
  8887                              <1> 
  8888 000038CB E80A000000          <1> 	call	vbe_biosfn_return_mode_info
  8889 000038D0 6683F84F            <1> 	cmp	ax, 004Fh ; successful ?
  8890 000038D4 7401                <1> 	je	short _vbe_rmi_3  ; cf = 0
  8891                              <1> _vbe_rmi_2:
  8892 000038D6 F9                  <1> 	stc
  8893                              <1> 	; cf = 1	
  8894                              <1> _vbe_rmi_3:
  8895 000038D7 5E                  <1> 	pop	esi ; ****
  8896 000038D8 5D                  <1> 	pop	ebp ; ***
  8897                              <1> 	
  8898                              <1> 	;pop	es  ; **
  8899                              <1> 	;pop	ss  ; *
  8900                              <1> 	
  8901 000038D9 C3                  <1> 	retn
  8902                              <1> 
  8903                              <1> 
  8904                              <1> ; * (TRDOS 386, INT 31h, VESA Video Bios functions) 
  8905                              <1> ; * ---------------------------------------------------------
  8906                              <1> ; * Function 01h - Return VBE Mode Information
  8907                              <1> ; * ---------------------------------------------------------
  8908                              <1> ; * Input:
  8909                              <1> ; *		AX = 4F01h
  8910                              <1> ; *		CX = Mode number
  8911                              <1> ; *    (ES:DI) EDI = Pointer to ModeInfoBlock structure	
  8912                              <1> ; * Output:
  8913                              <1> ; *		AX = VBE Return Status
  8914                              <1> ; * 
  8915                              <1> ; *----------------------------------------------------------
  8916                              <1> ; *
  8917                              <1> 
  8918                              <1> vbe_biosfn_return_mode_info:
  8919                              <1> 	; 03/08/2022 (TRDOS 386 v2.0.5)
  8920                              <1> 	; 15/12/2020 
  8921                              <1> 	; 14/12/2020
  8922                              <1> 	; 12/12/2020
  8923                              <1> 	; 11/12/2020 (TRDOS 386 v2.0.3)
  8924                              <1> 	;
  8925                              <1> 	; Input:
  8926                              <1> 	;	cx = video (bios) mode
  8927                              <1> 	;      edi = ModeInfoBlock buffer address
  8928                              <1> 	;	     (in user's memory space)
  8929                              <1> 	;      (ax = 4F01h)
  8930                              <1> 	; Output:
  8931                              <1> 	;	ax = 004Fh (successful)
  8932                              <1> 	;	ah > 0 -> error
  8933                              <1> 	;
  8934                              <1> 	; Modified registers: esi
  8935                              <1> 
  8936                              <1> 	;;push	ds  ; *
  8937                              <1> 	;;push	es  ; **
  8938                              <1> 	;;push	ebp ; ***
  8939                              <1> 	;;push	esi ; **** 
  8940                              <1> 
  8941 000038DA F6C501              <1> 	test	ch, 1
  8942 000038DD 7505                <1> 	jnz	short vbe_rmi_1
  8943                              <1> 
  8944                              <1> 	; mode number < 100h
  8945                              <1> 	; CGA/VGA mode is not proper this VBE function 
  8946                              <1> 
  8947 000038DF 29C0                <1> 	sub	eax, eax
  8948                              <1> vbe_rmi_0:	
  8949                              <1> 	;mov	ax, 0100h  ; Function is not supported
  8950 000038E1 B401                <1> 	mov	ah, 1
  8951 000038E3 C3                  <1> 	retn
  8952                              <1> vbe_rmi_1:
  8953 000038E4 52                  <1> 	push	edx ; *****
  8954 000038E5 51                  <1> 	push	ecx ; ******
  8955 000038E6 53                  <1> 	push	ebx ; *******	
  8956 000038E7 57                  <1> 	push	edi ; ********
  8957                              <1> 	
  8958                              <1> 	; 14/12/2020
  8959 000038E8 89CB                <1> 	mov	ebx, ecx
  8960                              <1>  			
  8961                              <1> 	;xor	eax, eax
  8962 000038EA 80E7C1              <1> 	and	bh, 0C1h ; use bit 15, 14, 8 only (for bh)
  8963 000038ED 883D[D59E0100]      <1> 	mov	[vbe_mode_x], bh
  8964                              <1> 	;and	bx, 1FFh
  8965 000038F3 80E701              <1> 	and	bh, 1
  8966                              <1> 	;mov	bh, 1
  8967                              <1> 
  8968                              <1> 	; Alternative 2 (instead of 'Mode_info_find_mode')
  8969 000038F6 E86A060000          <1> 	call	set_mode_info_list ; (alternative 2)
  8970                              <1> 
  8971                              <1> 	; eax = 0	
  8972                              <1> 
  8973                              <1> 	;mov	bx, [esi] ; mode
  8974                              <1> 
  8975                              <1> 	; Alternative 1 (instead of 'set_mode_info_list')
  8976                              <1> 	;call	mode_info_find_mode ; (alternative 1)
  8977                              <1> 
  8978 000038FB 09F6                <1> 	or	esi, esi
  8979                              <1> 	; 14/12/2020
  8980 000038FD 744C                <1> 	jz	short vbe_rmi_4	; VBE mode number is wrong
  8981                              <1> 				; or it is not supported
  8982                              <1> 
  8983                              <1> 	; 15/12/2020
  8984                              <1> 	;mov	bx, [esi] ; mode
  8985                              <1> 
  8986                              <1> 	; 12/12/2020
  8987                              <1> 	;call	set_lfbinfo_table
  8988                              <1> 
  8989 000038FF F605[D59E0100]40    <1> 	test	byte [vbe_mode_x], 40h ; LFB model ?
  8990 00003906 7404                <1> 	jz	short vbe_rmi_2
  8991                              <1> 	
  8992 00003908 C6461C01            <1> 	mov	byte [esi+MODEINFO.NumberOfBanks], 1
  8993                              <1> vbe_rmi_2:
  8994                              <1> 	; (vbe.c, 02/01/2020, vruppert)
  8995                              <1> 	; 11/12/2020 (Erdogan Tan, video.s) 
  8996                              <1> 	; Bochs Graphics Adapter
  8997                              <1> 	; vendor_id: 1111h, device id: 1234h
  8998                              <1> 
  8999 0000390C E835070000          <1> 	call	pci_get_lfb_addr
  9000                              <1> 	;or	eax, eax
  9001 00003911 7404                <1> 	jz	short vbe_rmi_3
  9002                              <1> 	; zf = 0, ax > 0 (high word of LFB address)
  9003                              <1> 	; set/change LFB address in MODEINFO structure
  9004 00003913 6689462C            <1> 	mov	[esi+MODEINFO.PhysBasePtr+2], ax
  9005                              <1> 	; 12/12/2020
  9006                              <1> 	;mov	[edi+LFBINFO.LFB_addr+2], ax
  9007                              <1> vbe_rmi_3:
  9008                              <1> 	;test	byte [esi+MODEINFO.WinAAttributes], 1 
  9009                              <1> 	;		; VBE_WINDOW_ATTRIBUTE_RELOCATABLE = 1
  9010                              <1>         ;jz	short vbe_rmi_4
  9011                              <1> 	;; 11/12/2020
  9012                              <1> 	;; In fact, this is far call address in (Bochs/BGA) Video Bios
  9013                              <1> 	;; Direct user access to kernel subroutines is not possible 
  9014                              <1> 	;; in TRDOS 386. Also, TRDOS 386 kernel will support only LFB.
  9015                              <1> 	;; Bank select may be a seperate sysvideo function in future
  9016                              <1> 	;; (if it will be required).
  9017                              <1> 	;mov	dword [esi+MODEINFO.WinFuncPtr], dispi_set_bank_farcall
  9018                              <1> ;vbe_rmi_4:
  9019                              <1> 	; 12/12/2020
  9020 00003917 E83C000000          <1> 	call	set_lfbinfo_table
  9021                              <1> 
  9022                              <1> 	; 11/12/2020
  9023                              <1> 	; copy 68 bytes of MODE_INFO_LIST to user
  9024                              <1> 
  9025 0000391C 8B3C24              <1> 	mov	edi, [esp]  ; user's buffer address
  9026                              <1> 	; 12/12/2020
  9027 0000391F 09FF                <1> 	or	edi, edi ; 0 = kernel call 
  9028                              <1> 			 ; (call from '_vbe_biosfn_return_mode_info')
  9029 00003921 7431                <1> 	jz	short vbe_rmi_6
  9030                              <1> 
  9031                              <1> 	; 15/12/2020
  9032                              <1> 	; prepare 256 bytes MODEINFO buffer at VBE3MODEINFOBLOCK
  9033                              <1> 	; and then, copy buffer conttent to user's buffer
  9034 00003923 57                  <1> 	push	edi
  9035 00003924 BE[F49E0100]        <1> 	mov	esi, MODE_INFO_LIST + 2	; MODEINFO.ModeAttributes
  9036 00003929 BF007C0900          <1> 	mov	edi, VBE3MODEINFOBLOCK
  9037                              <1> 	;mov	ecx, 66/4  ; 66 bytes
  9038                              <1> 	; 03/08/2022
  9039 0000392E 29C9                <1> 	sub	ecx, ecx
  9040 00003930 B110                <1> 	mov	cl, 66/4
  9041 00003932 F3A5                <1> 	rep	movsd
  9042 00003934 31C0                <1> 	xor	eax, eax
  9043 00003936 B12F                <1> 	mov	cl, (256-68)/4 ; 188 bytes
  9044 00003938 F3AB                <1> 	rep	stosd
  9045 0000393A 66AB                <1> 	stosw	; 2 bytes
  9046 0000393C 5F                  <1> 	pop	edi
  9047 0000393D BE007C0900          <1> 	mov	esi, VBE3MODEINFOBLOCK
  9048                              <1> 	;mov	cx, 256 
  9049 00003942 FEC5                <1> 	inc	ch ; cx = 256
  9050 00003944 E848D50000          <1> 	call	transfer_to_user_buffer
  9051 00003949 7309                <1> 	jnc	short vbe_rmi_5
  9052                              <1> vbe_rmi_4:
  9053                              <1> 	;mov	eax, 014Fh ; fail/error
  9054 0000394B 31C0                <1> 	xor	eax, eax
  9055 0000394D B401                <1> 	mov	ah, 01h
  9056                              <1> 	;jmp	short vbe_rmi_6
  9057 0000394F E981000000          <1> 	jmp	vbe_sm_ret1 ; 11/12/2020
  9058                              <1> vbe_rmi_5:
  9059                              <1> 	; 256 bytes of MODEINFO have been transferred to user
  9060                              <1> 	;mov	eax, 4Fh ; succesfull
  9061                              <1> vbe_rmi_6: ; 12/12/2020
  9062 00003954 31C0                <1> 	xor	eax, eax
  9063                              <1> ;vbe_rmi_6:
  9064 00003956 EB7D                <1> 	jmp	vbe_sm_ret1 ; 11/12/2020
  9065                              <1> 
  9066                              <1> 	;pop	edi ; ********
  9067                              <1> 	;pop	ebx ; *******
  9068                              <1> 	;pop	ecx ; ******
  9069                              <1> 	;pop	edx ; *****	
  9070                              <1> 	
  9071                              <1> 	;;pop	esi ; ****
  9072                              <1> 	;;pop	ebp ; ***
  9073                              <1> 	;;pop	es  ; **
  9074                              <1> 	;;pop	ds  ; * 
  9075                              <1> 
  9076                              <1> 	;retn
  9077                              <1> 
  9078                              <1> set_lfbinfo_table:
  9079                              <1> 	; 19/12/2020
  9080                              <1> 	; 11/12/2020
  9081                              <1> 	; Set/Fill LFBINFO structure/table
  9082                              <1> 	;
  9083                              <1> 	; Input:
  9084                              <1> 	;	esi = Mode info list address 
  9085                              <1> 	; Output:
  9086                              <1> 	;	LFB_Info address is filled with LFBINFO
  9087                              <1> 	;	edi = LFB_Info address
  9088                              <1> 	;
  9089                              <1> 	; Modified registers: eax, edx (=0), edi
  9090                              <1> 
  9091 00003958 BF[E29E0100]        <1> 	mov	edi, LFB_Info
  9092 0000395D 8B462A              <1> 	mov	eax, [esi+MODEINFO.PhysBasePtr]
  9093 00003960 894702              <1> 	mov	[edi+LFBINFO.LFB_addr], eax ; LFB address
  9094                              <1> 	;mov	ax, [esi+MODEINFO.mode]
  9095 00003963 668B06              <1> 	mov	ax, [esi]
  9096 00003966 668907              <1> 	mov	[edi+LFBINFO.mode],ax
  9097 00003969 8A461B              <1> 	mov	al, [esi+MODEINFO.BitsPerPixel]
  9098 0000396C 88470E              <1> 	mov	[edi+LFBINFO.bpp], al
  9099 0000396F 29C0                <1> 	sub	eax, eax
  9100 00003971 668B4614            <1> 	mov	ax, [esi+MODEINFO.XResolution]
  9101 00003975 6689470A            <1> 	mov	[edi+LFBINFO.X_res], ax
  9102 00003979 89C2                <1> 	mov	edx, eax ; 19/12/2020
  9103 0000397B 668B4616            <1> 	mov	ax, [esi+MODEINFO.YResolution]
  9104 0000397F 6689470C            <1> 	mov	[edi+LFBINFO.Y_res], ax
  9105                              <1> 	; eax = Y_res ; screen height
  9106                              <1> 	; 19/12/2020	
  9107 00003983 F7E2                <1> 	mul	edx ; X_res*Y_res
  9108                              <1> 	; edx = 0
  9109 00003985 8A570E              <1> 	mov	dl, [edi+LFBINFO.bpp]
  9110                              <1> 	; Note:
  9111                              <1> 	; Bits per pixel may be 8,16,24,32 for TRDOS 386 v2.
  9112                              <1> 	; (4 bits for pixel is not used for VESA modes here)
  9113 00003988 C0EA03              <1> 	shr	dl, 3 ; convert bits to byte
  9114 0000398B F7E2                <1> 	mul	edx
  9115                              <1> 	; eax = screen/page/buffer size in bytes
  9116 0000398D 894706              <1> 	mov	[edi+LFBINFO.LFB_size], eax
  9117                              <1> 	; edx = 0
  9118                              <1> 	; clear reserved byte in LFBINFO structure/table
  9119 00003990 88570F              <1> 	mov	[edi+LFBINFO.reserved], dl ; not necessary
  9120 00003993 C3                  <1> 	retn
  9121                              <1> 
  9122                              <1> ; * (TRDOS 386, INT 31h, VESA Video Bios functions) 
  9123                              <1> ; * ---------------------------------------------------------
  9124                              <1> ; * Function 02h - Set VBE Mode
  9125                              <1> ; * ---------------------------------------------------------
  9126                              <1> ; * Input:
  9127                              <1> ; *		AX = 4F02h
  9128                              <1> ; *		BX = Desired Mode to set
  9129                              <1> ; * Output:
  9130                              <1> ; *		AX = VBE Return Status
  9131                              <1> ; * 
  9132                              <1> ; *----------------------------------------------------------
  9133                              <1> ; *
  9134                              <1> 
  9135                              <1> vbe_biosfn_set_mode:
  9136                              <1> 	; 07/03/2021
  9137                              <1> 	; 12/12/2020
  9138                              <1> 	; 11/12/2020 (LFBINFO table for VESA VBE modes)
  9139                              <1> 	; 27/11/2020
  9140                              <1> 	; 25/11/2020
  9141                              <1> 	; 23/11/2020 (TRDOS 386 v2.0.3)
  9142                              <1> 	; (ref: vbe.c, 02/01/2020, vruppert)
  9143                              <1> 	;
  9144                              <1> 	; Input:
  9145                              <1> 	;	bx = video (bios) mode
  9146                              <1> 	;	ax = 4F02h
  9147                              <1> 	; Output:
  9148                              <1> 	;	ax = 004Fh (successful)
  9149                              <1> 	;	ah > 0 -> error
  9150                              <1> 	;
  9151                              <1> 	; Modified registers: esi
  9152                              <1> 
  9153                              <1> 	; 27/11/2020
  9154                              <1> 
  9155                              <1> 	;;push	ds  ; *
  9156                              <1> 	;;push	es  ; **
  9157                              <1> 	;;push	ebp ; ***
  9158                              <1> 	;;push	esi ; **** 
  9159                              <1> 	
  9160                              <1> 	; 11/12/2020 			
  9161 00003994 52                  <1> 	push	edx ; *****
  9162 00003995 51                  <1> 	push	ecx ; ******
  9163 00003996 53                  <1> 	push	ebx ; *******	
  9164 00003997 57                  <1> 	push	edi ; ********
  9165                              <1> 
  9166                              <1> 	;xor	eax, eax
  9167 00003998 80E7C1              <1> 	and	bh, 0C1h ; use bit 15, 14, 8 only (for bh)
  9168 0000399B 883D[D59E0100]      <1> 	mov	[vbe_mode_x], bh
  9169 000039A1 80E701              <1> 	and	bh, 1
  9170 000039A4 753C                <1> 	jnz	short vbe_sm_3  ; VESA VBE mode
  9171                              <1> 
  9172                              <1>  	;;test	bx, 4000h ; VBE_MODE_LINEAR_FRAME_BUFFER
  9173                              <1> 	;test	bh, 40h
  9174                              <1> 	;jz	short vbe_sm_0
  9175                              <1> 	;; lfb_flag
  9176                              <1> 	;mov	al, 40h	; VBE_DISPI_LFB_ENABLED
  9177                              <1> vbe_sm_0:
  9178                              <1> 	; 27/11/2020
  9179 000039A6 B080                <1> 	mov	al, 80h
  9180                              <1> 	;test	bh, 80h ; VBE_MODE_PRESERVE_DISPLAY_MEMORY 	
  9181                              <1> 	;jnz	short vbe_sm_1 ; no_clear
  9182                              <1> 	;; clear
  9183                              <1> 	;sub	al, al ; 0
  9184 000039A8 8405[D59E0100]      <1> 	test	[vbe_mode_x], al ; 80h
  9185 000039AE 7402                <1> 	jz	short vbe_sm_1 ; clear display memory
  9186                              <1> 	; no_clear
  9187 000039B0 08C3                <1> 	or	bl, al ; VBE_MODE_PRESERVE_DISPLAY_MEMORY
  9188                              <1> vbe_sm_1:
  9189                              <1> 	; check non vesa mode
  9190                              <1> 	;;cmp	bx, 100h ; VBE_MODE_VESA_DEFINED
  9191                              <1> 	;;jna	short vbe_sm_2
  9192                              <1> 	;and	bh, 1
  9193                              <1> 	;jnz	short vbe_sm_3 
  9194                              <1> 
  9195                              <1> 	; BX <= 1FFh
  9196                              <1> 
  9197                              <1> 	; 27/11/2020
  9198                              <1> 	;or	bl, al	; al = 80h if no_clear option is set 
  9199                              <1> 	;		; al = 0 if no_clear option is not set 
  9200                              <1> 
  9201                              <1> 	; 25/11/2020
  9202                              <1> 	; VBE DISPI will be disabled in 'biosfn_set_video_mode'
  9203                              <1>  
  9204                              <1> 	;xor	al, al ; 0 ; VBE_DISPI_DISABLED
  9205                              <1> 	;call	dispi_set_enable
  9206                              <1> 
  9207                              <1> 	; call the vgabios in order to set the video mode
  9208                              <1> 	; this allows for going back to textmode with a VBE call
  9209                              <1> 	; (some applications expect that to work)
  9210                              <1> 
  9211                              <1> 	;and	bx, 0FFh
  9212                              <1> 	
  9213                              <1> 	; 27/11/2020
  9214                              <1> biosfn_set_video_mode:
  9215                              <1> 	; _call: call subroutine
  9216                              <1> 	; 26/11/2020 (TRDOS 386 v2.0.3)
  9217                              <1> 	; (ref: vgabios.c, 02/01/2020, vruppert)
  9218                              <1> 	; Input:
  9219                              <1> 	;	bl = VGA video (bios) mode
  9220                              <1> 	; Output:
  9221                              <1> 	;	cf = 1 -> error
  9222                              <1> 	;	cf = 0 -> ok
  9223                              <1> 	;
  9224                              <1> 	; Modified registers: esi
  9225                              <1> 
  9226                              <1> 	; 'dispi_set_enable(VBE_DISPI_DISABLED);'
  9227                              <1> 	
  9228                              <1> 	;mov	ax, 0 ; VBE_DISPI_DISABLED 
  9229 000039B2 31C0                <1> 	xor	eax, eax ; 0 
  9230 000039B4 E89C040000          <1> 	call	dispi_set_enable
  9231                              <1> 	
  9232 000039B9 88D8                <1> 	mov	al, bl
  9233                              <1> 	;jmp	_set_mode ; (in 'biosfn_set_video_mode' sub)
  9234 000039BB E87AE1FFFF          <1> 	call	_set_mode ; will return with cf=1 only if
  9235                              <1> 			; desired mode is not implemented
  9236                              <1> 	; _retn: return from subroutine
  9237 000039C0 721A                <1> 	jc	short vbe_sm_2 ; 25/11/2020
  9238                              <1> 
  9239                              <1> 	; 26/11/2020
  9240 000039C2 31C0                <1> 	xor	eax, eax 
  9241 000039C4 A0[BE670000]        <1> 	mov	al, [CRT_MODE]
  9242                              <1> 	; 27/11/2020
  9243 000039C9 8A25[1B850100]      <1> 	mov	ah, [noclearmem] ; 80h or 0
  9244                              <1> 	;and	ah 80h
  9245 000039CF 66A3[D69E0100]      <1> 	mov	[video_mode], ax ; bit 15 = no_clear flag
  9246                              <1> 				 ; bit 14 = 0 (not LFB model)
  9247                              <1> vbe_sm_ret1:
  9248                              <1> 	; 11/12/2020
  9249                              <1> 	; (vbe_rmi_4 and vbe_rmi_6 jump here)
  9250                              <1> 	; 27/11/2020
  9251 000039D5 B04F                <1> 	mov	al, 4Fh ; Function call successful
  9252                              <1> 	; eax = 004Fh
  9253                              <1> vbe_sm_ret2:
  9254                              <1> 	; 11/12/2020
  9255 000039D7 5F                  <1> 	pop	edi ; ********
  9256 000039D8 5B                  <1> 	pop	ebx ; *******
  9257 000039D9 59                  <1> 	pop	ecx ; ******
  9258 000039DA 5A                  <1> 	pop	edx ; *****
  9259                              <1> 
  9260                              <1> 	;;pop	esi ; ****
  9261                              <1> 	;;pop	ebp ; ***
  9262                              <1> 	;;pop	es  ; **
  9263                              <1> 	;;pop	ds  ; * 
  9264                              <1> 
  9265 000039DB C3                  <1> 	retn
  9266                              <1> 
  9267                              <1> vbe_sm_2:
  9268                              <1> 	;mov	ax, 0100h ; Function is not supported
  9269                              <1> 	; 27/11/2020
  9270 000039DC 31C0                <1> 	xor	eax, eax
  9271 000039DE B401                <1> 	mov	ah, 01h
  9272                              <1> 	; eax = 0100h
  9273                              <1> 	;retn
  9274 000039E0 EBF5                <1> 	jmp	short vbe_sm_ret2
  9275                              <1> 
  9276                              <1> vbe_sm_3:
  9277                              <1> 	; 12/12/2020
  9278                              <1> 	; check current mode, if it is 03h
  9279                              <1> 	; save page contents and cursor positions
  9280 000039E2 803D[BE670000]03    <1> 	cmp	byte [CRT_MODE], 03h
  9281                              <1> 	;jne	short vbe_sm_0
  9282 000039E9 7505                <1> 	jne	short vbe_sm_4 ; 07/03/2021
  9283 000039EB E8ECE3FFFF          <1> 	call	save_mode3_multiscreen
  9284                              <1> 	; set current mode to extended (SVGA) mode
  9285                              <1> 	;mov	byte [CRT_MODE], 0FFh ; VESA VBE mode
  9286                              <1> vbe_sm_4:
  9287                              <1> 	; 27/11/2020
  9288                              <1> 	; bx = mode (bit 0 to 8)
  9289                              <1> 
  9290                              <1> 	; 25/11/2020
  9291                              <1> 
  9292                              <1> 	; Alternative 2 (instead of 'Mode_info_find_mode')
  9293                              <1> 	;push	edi
  9294 000039F0 E870050000          <1> 	call	set_mode_info_list ; (alternative 2)
  9295                              <1> 	;pop	edi
  9296                              <1> 
  9297                              <1> 	;mov	bx, [esi] ; mode
  9298                              <1> 
  9299                              <1> 	; Alternative 1 (instead of 'set_mode_info_list')
  9300                              <1> 	;call	mode_info_find_mode ; (alternative 1)
  9301                              <1> 
  9302 000039F5 09F6                <1> 	or	esi, esi
  9303 000039F7 74E3                <1> 	jz	short vbe_sm_2 ; VBE mode number is wrong
  9304                              <1> 			       ; or it is not supported
  9305                              <1> 
  9306                              <1> 	; 11/12/2020
  9307 000039F9 668B1E              <1> 	mov	bx, [esi] ; mode
  9308                              <1> 
  9309                              <1> 	; 27/11/2020
  9310 000039FC 0A3D[D59E0100]      <1> 	or	bh, [vbe_mode_x]
  9311                              <1> 
  9312                              <1> 	; save VESA VBE mode
  9313 00003A02 66891D[D69E0100]    <1> 	mov	[video_mode], bx
  9314                              <1> 		; 27/11/2020
  9315                              <1> 		; bit 0 to 8 = VESA VBE mode
  9316                              <1> 		; bit 9 to 13 = 0 (bit 0 to 13 = mode)
  9317                              <1> 		; bit 14 = Linear/Flat Frame Buffer flag
  9318                              <1> 		; bit 15 = 'memory not cleared
  9319                              <1> 		;	   at last mode set' flag
  9320                              <1> 
  9321                              <1> 	; first disable current mode
  9322                              <1> 	; (when switching between vesa modes)
  9323                              <1> 	; 'dispi_set_enable(VBE_DISPI_DISABLED);'
  9324                              <1> 
  9325                              <1> 	;mov	ax, VBE_DISPI_DISABLED ; 0
  9326 00003A09 29C0                <1> 	sub	eax, eax ; 0
  9327                              <1> 
  9328 00003A0B E845040000          <1> 	call	dispi_set_enable
  9329                              <1> 
  9330                              <1> 	; 11/12/2020
  9331 00003A10 8A461B              <1> 	mov	al, [esi+MODEINFO.BitsPerPixel]
  9332                              <1> 	; ah = 0
  9333                              <1> 
  9334                              <1> 	;cmp	byte [esi+MODEINFO.BitsPerPixel], 8
  9335 00003A13 3C08                <1> 	cmp	al, 8
  9336 00003A15 750B                <1> 	jne	short vbe_sm_5
  9337                              <1> 
  9338                              <1> 	; 11/12/2020
  9339                              <1> 	;push	edi
  9340 00003A17 50                  <1> 	push	eax
  9341                              <1> 	; 'load_dac_palette(3);'
  9342 00003A18 56                  <1> 	push	esi
  9343 00003A19 B403                <1> 	mov	ah, 3  ; palette3, 256 colors
  9344 00003A1B E8BBF1FFFF          <1> 	call	load_dac_palette
  9345 00003A20 5E                  <1> 	pop	esi
  9346                              <1> 	; 11/12/2020
  9347 00003A21 58                  <1> 	pop	eax
  9348                              <1> 	;pop	edi
  9349                              <1> vbe_sm_5:	
  9350                              <1>   	;'dispi_set_bpp(cur_info->info.BitsPerPixel);'
  9351                              <1> 	; 11/12/2020 (al = bits per pixel, ah = 0)
  9352                              <1> 	;xor	ah, ah
  9353                              <1> 	;mov	al, [esi+MODEINFO.BitsPerPixel]
  9354 00003A22 E841040000          <1> 	call	dispi_set_bpp
  9355                              <1>         ;'dispi_set_xres(cur_info->info.XResolution);'
  9356 00003A27 668B4614            <1> 	mov	ax, [esi+MODEINFO.XResolution]
  9357 00003A2B E83E040000          <1> 	call	dispi_set_xres
  9358                              <1>         ;'dispi_set_yres(cur_info->info.YResolution);'
  9359 00003A30 668B4616            <1> 	mov	ax, [esi+MODEINFO.YResolution]
  9360 00003A34 E83B040000          <1> 	call	dispi_set_yres
  9361                              <1> 
  9362                              <1> 	;'dispi_set_bank(0);'
  9363                              <1> 	;xor	ax, ax
  9364 00003A39 31C0                <1> 	xor	eax, eax ; 0
  9365 00003A3B E83A040000          <1> 	call	dispi_set_bank
  9366                              <1>         ;'dispi_set_enable(VBE_DISPI_ENABLED|no_clear|lfb_flag);'
  9367                              <1> 	;mov	ax, di
  9368                              <1> 	; ah = 0 ; 27/11/2020
  9369 00003A40 A0[D59E0100]        <1> 	mov	al, [vbe_mode_x] ; restore VBE mode bit 14 & 15
  9370 00003A45 0C01                <1> 	or	al, 1 ; VBE_DISPI_ENABLED
  9371 00003A47 E809040000          <1> 	call	dispi_set_enable
  9372                              <1> 
  9373                              <1>         ; 'vga_compat_setup();'
  9374 00003A4C E83E040000          <1> 	call	vga_compat_setup
  9375                              <1> 
  9376                              <1> 	; 11/12/2020
  9377 00003A51 E802FFFFFF          <1> 	call	set_lfbinfo_table
  9378                              <1> 
  9379                              <1> 	; 26/11/2020
  9380 00003A56 31C0                <1> 	xor	eax, eax
  9381 00003A58 FEC8                <1> 	dec	al 
  9382 00003A5A A2[BE670000]        <1> 	mov	[CRT_MODE], al ; 0FFh = VESA VBE mode sign
  9383                              <1> 
  9384                              <1> 	; 27/11/2020
  9385 00003A5F E971FFFFFF          <1> 	jmp	vbe_sm_ret1 ; Function call successful
  9386                              <1> 	
  9387                              <1> 	; 27/11/2020
  9388                              <1> 	;mov	al, 4Fh
  9389                              <1> 	;	; eax = 004Fh = Function call successful
  9390                              <1> 	;jmp	short vbe_sm_ret2
  9391                              <1> 
  9392                              <1> ; * (TRDOS 386, INT 31h, VESA Video Bios functions)
  9393                              <1> ; * ---------------------------------------------------------
  9394                              <1> ; * Function 03h - Return Current VBE Mode
  9395                              <1> ; * ---------------------------------------------------------
  9396                              <1> ; * Input:
  9397                              <1> ; *		AX = 4F03h
  9398                              <1> ; * Output:
  9399                              <1> ; *		AX = VBE Return Status
  9400                              <1> ; *		BX = Current VBE Mode
  9401                              <1> ; * 
  9402                              <1> ; *----------------------------------------------------------
  9403                              <1> ; *
  9404                              <1> 
  9405                              <1> vbe_biosfn_return_current_mode:
  9406                              <1> 	; 11/12/2020
  9407                              <1> 	; 27/11/2020 (TRDOS 386 v2.0.3)
  9408                              <1> 	; (ref: vbe.c, 02/01/2020, vruppert)
  9409                              <1> 	;
  9410                              <1> 	; Input:
  9411                              <1> 	;	none
  9412                              <1> 	; Output:
  9413                              <1> 	;	ax = 004Fh (successful)
  9414                              <1> 	;	ah > 0 -> error
  9415                              <1> 	;	bx = current video (bios) mode (if ah = 0)
  9416                              <1> 	;
  9417                              <1> 	; Modified registers: eax, ebx
  9418                              <1> 
  9419                              <1> 	; 27/11/2020
  9420                              <1> 
  9421                              <1> 	;;push	ds  ; *
  9422                              <1> 	;;push	es  ; **
  9423                              <1> 	;;push	ebp ; ***
  9424                              <1> 	;;push	esi ; **** 
  9425                              <1> 	 			
  9426                              <1> 	;push	edx ; *****
  9427                              <1> 
  9428                              <1> 	; (vbe.c)
  9429                              <1> 	;call	dispi_get_enable
  9430                              <1> 	;	; ax = vbe display interface status
  9431                              <1> 	;and	al, 1 ; VBE_DISPI_ENABLED
  9432                              <1> 	;jnz	short vbe_gm_1  ; VBE graphics mode
  9433                              <1> 
  9434 00003A64 A0[BE670000]        <1> 	mov	al, [CRT_MODE] ; current cga/vga mode
  9435 00003A69 3CFF                <1> 	cmp	al, 0FFh ; VBE extension signature
  9436 00003A6B 720E                <1> 	jb	short vbe_gm_1 ; get CGA/VGA mode
  9437                              <1> 
  9438                              <1> 	; get VBE mode
  9439                              <1> vbe_gm_0:
  9440 00003A6D 66A1[D69E0100]      <1> 	mov	ax, [video_mode]
  9441                              <1> 		; BX bits:
  9442                              <1> 		; bit 0 to 8 = VESA VBE video mode
  9443                              <1> 		; bit 9 to 13 = 0 
  9444                              <1> 		; bit 14 = last mode set LFB option
  9445                              <1> 		;	   1 - linear/flat frame buffer
  9446                              <1> 		;	   0 - windowed frame buffer
  9447                              <1> 		; bit 15 = last mode set no_clear option
  9448                              <1> 		;	   0 - video memory cleared
  9449                              <1> 		;	   1 - video memory not cleared
  9450                              <1> 	
  9451                              <1> vbe_gm_return:
  9452                              <1> 	;pop	edx ; ******
  9453 00003A73 0FB7D8              <1> 	movzx	ebx, ax
  9454                              <1> ;vbe_srs_retn:
  9455 00003A76 31C0                <1> 	xor	eax, eax ; 0
  9456 00003A78 B04F                <1> 	mov	al, 4Fh ; ax = 004Fh (successful)
  9457 00003A7A C3                  <1> 	retn	
  9458                              <1> 
  9459                              <1> vbe_gm_1:
  9460                              <1> 	; legacy (old, standard) CGA/VGA bios video mode
  9461 00003A7B 8A25[1B850100]      <1> 	mov	ah, [noclearmem] ; 80h or 0
  9462                              <1> 		; BX bits: 
  9463                              <1> 		; bit 0 to 7 = video mode
  9464                              <1> 		; bit 8 to 13 = 0 
  9465                              <1> 		; bit 14 = 0 (not LFB mode) CGA/VGA
  9466                              <1> 		; bit 15 = 1 if [noclearmem] = 80h
  9467                              <1> 		;	   0 if [noclearmem] = 0
  9468 00003A81 EBF0                <1> 	jmp	short vbe_gm_return
  9469                              <1> 
  9470                              <1> ; * (TRDOS 386, INT 31h, VESA Video Bios functions) 
  9471                              <1> ; * ---------------------------------------------------------
  9472                              <1> ; * Function 04h - Save/Restore State
  9473                              <1> ; * ---------------------------------------------------------
  9474                              <1> ; * Input:
  9475                              <1> ; *		AX = 4F04h
  9476                              <1> ; *             DL = 00h Return Save/Restore State buff size
  9477                              <1> ; *                  01h Save State
  9478                              <1> ; *                  02h Restore State
  9479                              <1> ; *             CX = Requested states
  9480                              <1> ; *		     bit 0 - controller hardware state
  9481                              <1> ; *		     bit 1 - BIOS data state
  9482                              <1> ; *		     bit 2 - DAC state
  9483                              <1> ; *		     bit 3 - register state
  9484                              <1> ; *    (ES:BX) EBX = Pointer to buffer (if DL <> 00h)
  9485                              <1> ; * Output:
  9486                              <1> ; *		AX = VBE Return Status
  9487                              <1> ; *		BX = Number of 64-byte blocks 
  9488                              <1> ; *		     to hold the state buffer (if DL=00h)
  9489                              <1> ; * 
  9490                              <1> ; *----------------------------------------------------------
  9491                              <1> ; *
  9492                              <1> 
  9493                              <1> vbe_biosfn_save_restore_state:
  9494                              <1> 	; 23/01/2021
  9495                              <1> 	; 16/01/2021
  9496                              <1> 	; 14/01/2021
  9497                              <1> 	; 13/01/2021
  9498                              <1> 	; 12/01/2021
  9499                              <1> 	; 11/01/2021 (TRDOS 386 v2.0.3)
  9500                              <1> 	; (ref: vbe.c, 02/01/2020, vruppert)
  9501                              <1> 	;
  9502                              <1> 	; Input:
  9503                              <1> 	;	dl = sub function
  9504                              <1> 	;	cl = requested state
  9505                              <1> 	;      ebx = pointer to buffer (if dl<>00h) 
  9506                              <1> 	; Output:
  9507                              <1> 	;	ax = 004Fh (successful)
  9508                              <1> 	;	ah > 0 -> error
  9509                              <1> 	;	bx = Number of 64-byte blocks 
  9510                              <1> 	;	     to hold the state buffer (if DL=00h)
  9511                              <1> 
  9512                              <1> 	; Modified registers: eax, ebx, edi
  9513                              <1> 	
  9514                              <1> 	; 14/01/2021
  9515 00003A83 09DB                <1> 	or	ebx, ebx ; user's buffer address
  9516 00003A85 750A                <1> 	jnz	short _vbe_biosfn_save_restore_state
  9517                              <1> 
  9518 00003A87 20D2                <1> 	and	dl, dl
  9519 00003A89 7406                <1> 	jz	short _vbe_biosfn_save_restore_state
  9520                              <1> 
  9521                              <1> 	; function failed
  9522                              <1> 	;mov	eax, 0100h
  9523                              <1> 	;xor	eax, eax
  9524                              <1> 	;inc	ah  ; eax = 0100h
  9525                              <1> 	; 16/01/2021
  9526 00003A8B B84F010000          <1> 	mov	eax, 014Fh
  9527 00003A90 C3                  <1> 	retn
  9528                              <1> 
  9529                              <1> _vbe_biosfn_save_restore_state:
  9530                              <1> 	; 23/01/2021
  9531                              <1> 	; 14/01/2021
  9532                              <1> 	; ebx = 0 if the caller is kernel ('sysvideo')
  9533                              <1> 
  9534                              <1> 	; 13/01/2021
  9535 00003A91 57                  <1> 	push	edi
  9536 00003A92 52                  <1> 	push	edx
  9537 00003A93 51                  <1> 	push	ecx
  9538                              <1> 
  9539                              <1> 	; 23/01/2021
  9540                              <1> 	; 12/01/2021
  9541 00003A94 80FA02              <1> 	cmp	dl, 2
  9542 00003A97 7757                <1> 	ja	short vbe_srs_7 ; 23/01/2021
  9543                              <1> 			; invalid sub function
  9544 00003A99 83F90F              <1> 	cmp	ecx, 0Fh
  9545 00003A9C 7752                <1> 	ja	short vbe_srs_7 ; invalid !
  9546                              <1> 	
  9547 00003A9E 20D2                <1> 	and	dl, dl
  9548 00003AA0 7515                <1> 	jnz	short vbe_srs_4
  9549                              <1> 
  9550                              <1> 	; DL = 0
  9551                              <1> 	; Return Save/Restore State buffer size
  9552                              <1> 
  9553                              <1> 	;mov	ebx, ecx
  9554                              <1> 	;shl	bl, 1
  9555                              <1> 	;mov	bx, [ebx+vbestatebufsize]
  9556 00003AA2 E881000000          <1> 	call	vbe_srs_gbs
  9557                              <1> 
  9558                              <1> ;	; 11/01/2021
  9559                              <1> ;	test	cl, 8
  9560                              <1> ;	jz	short vbe_srs_3
  9561                              <1> ;	; vbe_biosfn_read_video_state_size();
  9562                              <1> ;	; return 9 * 2;
  9563                              <1> ;	mov	bl, 18 ; register state size
  9564                              <1> ;vbe_srs_0:
  9565                              <1> ;	test	cl, 1
  9566                              <1> ;	jz	short vbe_srs_1
  9567                              <1> ;	; size += 0x46;
  9568                              <1> ;	add	bl, 70	; controller state size
  9569                              <1> ;vbe_srs_1:
  9570                              <1> ;	test	cl, 2
  9571                              <1> ;	jz	short vbe_srs_2
  9572                              <1> ;	; size += (5 + 8 + 5) * 2 + 6;
  9573                              <1> ;	;add	bl, 42 ; BIOS data state size ; Bochs/Plex86
  9574                              <1> ;	; 12/01/2021
  9575                              <1> ;	add	bl, 40 ; TRDOS 386 v2 VBIOS data state size
  9576                              <1> ;vbe_srs_2:
  9577                              <1> ;	test	cl, 4
  9578                              <1> ;	jz	short vbe_srs_3
  9579                              <1> ;	; size += 3 + 256 * 3 + 1;
  9580                              <1> ;	add	bx, 772 ; DAC state size
  9581                              <1> 
  9582                              <1> vbe_srs_3:
  9583 00003AA7 6683C33F            <1> 	add	bx, 63
  9584 00003AAB 66C1EB06            <1> 	shr	bx, 6 ; / 64
  9585                              <1> 
  9586                              <1> vbe_srs_retn:
  9587 00003AAF 31C0                <1> 	xor	eax, eax ; 0
  9588                              <1> vbe_srs_0:  ; 16/01/2021
  9589 00003AB1 B04F                <1> 	mov	al, 4Fh ; ax = 004Fh (successful)
  9590                              <1> ;vbe_srs_0:
  9591                              <1> 	; 13/01/2021
  9592 00003AB3 59                  <1> 	pop	ecx
  9593 00003AB4 5A                  <1> 	pop	edx
  9594 00003AB5 5F                  <1> 	pop	edi	
  9595                              <1> 
  9596 00003AB6 C3                  <1> 	retn
  9597                              <1> 
  9598                              <1> 	; 23/01/2021
  9599                              <1> ;vbe_srs_10:
  9600                              <1> 	;; 14/01/2021
  9601                              <1> 	; return to 'sysvideo'
  9602                              <1> 	;mov	ebx, ecx ; transfer count
  9603                              <1> 	;	; (byte count for saving current video state)
  9604                              <1> 	;jmp	short vbe_srs_retn 
  9605                              <1> 
  9606                              <1> vbe_srs_4:
  9607                              <1> 	; 23/01/2021
  9608 00003AB7 80E10F              <1> 	and	cl, 0Fh ; 8, 4, 2, 1
  9609 00003ABA 7434                <1> 	jz	short vbe_srs_7 ; cx = 0 -> invalid !
  9610                              <1> 
  9611 00003ABC BF00760900          <1> 	mov	edi, VBE3SAVERESTOREBLOCK
  9612                              <1> 
  9613 00003AC1 80FA01              <1> 	cmp	dl, 1
  9614 00003AC4 7730                <1> 	ja	short vbe_srs_8
  9615                              <1> 
  9616                              <1> 	; save video state
  9617                              <1> 
  9618 00003AC6 F6C107              <1> 	test	cl, 07h ; 4, 2, 1
  9619 00003AC9 740A                <1> 	jz	short vbe_srs_5  ; vbe dispi regs state
  9620                              <1> 
  9621 00003ACB E884000000          <1> 	call	biosfn_save_video_state
  9622                              <1> 	; edi = current position
  9623                              <1> 	;	in VBE3SAVERESTOREBLOCK
  9624                              <1> 	; 	(VGA save_state offset)
  9625                              <1> 	; modified regs: edi, eax, edx, ch
  9626 00003AD0 F6C108              <1> 	test	cl, 8
  9627 00003AD3 7405                <1> 	jz	short vbe_srs_6
  9628                              <1> vbe_srs_5:
  9629 00003AD5 E8AB010000          <1> 	call	vbe_biosfn_save_video_state
  9630                              <1> 	; edi = end position
  9631                              <1> 	;	in VBE3SAVERESTOREBLOCK
  9632                              <1> 	; 	(VGA save_state offset)
  9633                              <1> 	; modified regs: edi, eax, edx, ch
  9634                              <1> vbe_srs_6:
  9635                              <1> 	; 23/01/2021
  9636 00003ADA 21DB                <1> 	and	ebx, ebx 
  9637 00003ADC 74D1                <1> 	jz	short vbe_srs_retn ; the caller is kernel
  9638                              <1> 	
  9639 00003ADE BE00760900          <1> 	mov	esi, VBE3SAVERESTOREBLOCK
  9640 00003AE3 29F7                <1> 	sub	edi, esi
  9641 00003AE5 89F9                <1> 	mov	ecx, edi ; transfer count in bytes
  9642                              <1> 
  9643                              <1> 	;; 14/01/2021
  9644                              <1> 	;and	ebx, ebx 
  9645                              <1> 	;jz	short vbe_srs_10 ; the caller is kernel
  9646                              <1> 
  9647 00003AE7 89DF                <1> 	mov	edi, ebx ; user's buffer address
  9648 00003AE9 E8A3D30000          <1> 	call	transfer_to_user_buffer
  9649 00003AEE 73BF                <1> 	jnc	short vbe_srs_retn
  9650                              <1> vbe_srs_7:
  9651                              <1> 	; // function failed
  9652                              <1> 	;mov	eax, 0100h
  9653 00003AF0 31C0                <1> 	xor	eax, eax
  9654 00003AF2 FEC4                <1> 	inc	ah  ; eax = 0100h
  9655                              <1> 	; 16/01/2021
  9656                              <1> 	; ax = 0014Fh
  9657                              <1> 	;retn
  9658                              <1> 	; 13/01/2021
  9659 00003AF4 EBBB                <1> 	jmp	short vbe_srs_0
  9660                              <1> vbe_srs_8:
  9661                              <1> 	;cmp	dl, 2
  9662                              <1> 	;jne	short vbe_srs_7
  9663                              <1> 	;		; invalid sub function
  9664                              <1> 
  9665                              <1> 	; 14/01/2021
  9666 00003AF6 09DB                <1> 	or	ebx, ebx ; user's buffer address
  9667                              <1> 	;jnz	short vbe_srs_11
  9668                              <1> 
  9669                              <1> 	; the caller is kernel ('sysvideo')
  9670                              <1> 	;jmp	short vbe_srs_12
  9671                              <1> 	; 23/01/2021
  9672 00003AF8 7414                <1> 	jz	short vbe_srs_12 ; 'sysvideo' call
  9673                              <1> vbe_srs_11:
  9674 00003AFA 89DE                <1> 	mov	esi, ebx ; user's buffer address
  9675                              <1> 	; 23/01/2021
  9676                              <1> 	;push	ebx
  9677                              <1> 	
  9678 00003AFC E827000000          <1> 	call	vbe_srs_gbs
  9679                              <1> 	
  9680                              <1> 	; restore video state
  9681                              <1> 
  9682                              <1> 	;mov	edi, VBE3SAVERESTOREBLOCK
  9683 00003B01 51                  <1> 	push	ecx
  9684 00003B02 89D9                <1> 	mov	ecx, ebx ; transfer count in bytes
  9685 00003B04 E8D2D30000          <1> 	call	transfer_from_user_buffer
  9686 00003B09 59                  <1> 	pop	ecx
  9687                              <1> 	; 23/01/2021
  9688                              <1> 	;pop	ebx
  9689 00003B0A 89F3                <1> 	mov	ebx, esi
  9690 00003B0C 72E2                <1> 	jc	short vbe_srs_7
  9691                              <1> 
  9692                              <1> vbe_srs_12:
  9693                              <1> 	;mov	esi, VBE3SAVERESTOREBLOCK
  9694 00003B0E 89FE                <1> 	mov	esi, edi
  9695                              <1> 
  9696 00003B10 F6C107              <1> 	test	cl, 07h ; 4, 2, 1
  9697 00003B13 740C                <1> 	jz	short vbe_srs_9	; vbe dispi regs state
  9698                              <1> 
  9699 00003B15 E8A2010000          <1> 	call	biosfn_restore_video_state
  9700 00003B1A 72D4                <1> 	jc	short vbe_srs_7 ; invalid buffer content !
  9701                              <1> 	; esi = current position
  9702                              <1> 	;	in VBE3SAVERESTOREBLOCK
  9703                              <1> 	; 	(VGA save_state offset)
  9704                              <1> 	; modified regs: esi, eax, edx, ch
  9705 00003B1C F6C108              <1> 	test	cl, 8
  9706                              <1> 	;jz	short vbe_srs_10
  9707                              <1> 	; 23/01/2020
  9708 00003B1F EB8E                <1> 	jmp	short vbe_srs_retn
  9709                              <1> vbe_srs_9:
  9710 00003B21 E8F1020000          <1> 	call	vbe_biosfn_restore_video_state
  9711                              <1> 
  9712                              <1> 	; modified regs: esi, eax, edx, ch
  9713                              <1> 
  9714 00003B26 EB87                <1> 	jmp	short vbe_srs_retn
  9715                              <1> 
  9716                              <1> ;vbe_srs_10:
  9717                              <1> ;	; successful
  9718                              <1> ;	xor	eax, eax ; 0
  9719                              <1> ;	mov	al, 4Fh ; ax = 004Fh (successful)
  9720                              <1> ;	retn
  9721                              <1> 
  9722                              <1> vbe_srs_gbs:
  9723                              <1> 	; return buffer size according to flags
  9724 00003B28 89CB                <1> 	mov	ebx, ecx ; options/flags
  9725 00003B2A D0E3                <1> 	shl	bl, 1
  9726 00003B2C 668B9B[343B0000]    <1> 	mov	bx, [ebx+vbestatebufsize]
  9727 00003B33 C3                  <1> 	retn
  9728                              <1> 
  9729                              <1> vbestatebufsize:
  9730                              <1> 	; ----------------------------------------
  9731                              <1> 	; CL =	0  1   2    3    4    5    6    7
  9732                              <1> 	; ----------------------------------------
  9733 00003B34 0000460028006E0004- <1> 	dw	0, 70, 40, 110, 772, 842, 812, 882
  9733 00003B3D 034A032C037203      <1>
  9734                              <1> 	; ----------------------------------------
  9735                              <1> 	; CL =	8   9   10  11   12   13   14   15
  9736                              <1> 	; ----------------------------------------
  9737 00003B44 120058003A00800016- <1> 	dw	18, 88, 58, 128, 790, 860, 830, 900
  9737 00003B4D 035C033E038403      <1>
  9738                              <1> 
  9739                              <1> ; 11/01/2021
  9740                              <1> VGAREG_ACTL_ADDRESS	equ 3C0h
  9741                              <1> VGAREG_ACTL_WRITE_DATA	equ 3C0h
  9742                              <1> VGAREG_ACTL_READ_DATA	equ 3C1h
  9743                              <1> 
  9744                              <1> VGAREG_INPUT_STATUS	equ 3C2h
  9745                              <1> VGAREG_WRITE_MISC_OUTPUT equ 3C2h
  9746                              <1> VGAREG_VIDEO_ENABLE	equ 3C3h
  9747                              <1> VGAREG_SEQU_ADDRESS	equ 3C4h
  9748                              <1> VGAREG_SEQU_DATA	equ 3C5h
  9749                              <1> 
  9750                              <1> VGAREG_PEL_MASK		equ 3C6h
  9751                              <1> VGAREG_DAC_STATE	equ 3C7h
  9752                              <1> VGAREG_DAC_READ_ADDRESS	equ 3C7h
  9753                              <1> VGAREG_DAC_WRITE_ADDRESS equ 3C8h
  9754                              <1> VGAREG_DAC_DATA		equ 3C9h
  9755                              <1> 
  9756                              <1> VGAREG_READ_FEATURE_CTL	equ 3CAh
  9757                              <1> VGAREG_READ_MISC_OUTPUT	equ 3CCh
  9758                              <1> 
  9759                              <1> VGAREG_GRDC_ADDRESS	equ 3CEh
  9760                              <1> VGAREG_GRDC_DATA	equ 3CFh
  9761                              <1> 
  9762                              <1> ;VGAREG_MDA_CRTC_ADDRESS equ 3B4h
  9763                              <1> ;VGAREG_MDA_CRTC_DATA	equ 3B5h
  9764                              <1> VGAREG_VGA_CRTC_ADDRESS	equ 3D4h
  9765                              <1> VGAREG_VGA_CRTC_DATA	equ 3D5h
  9766                              <1> 
  9767                              <1> ;VGAREG_MDA_WRITE_FEATURE_CTL equ 3BAh
  9768                              <1> VGAREG_VGA_WRITE_FEATURE_CTL equ 3DAh
  9769                              <1> VGAREG_ACTL_RESET	equ 3DAh
  9770                              <1> 
  9771                              <1> ;VGAREG_MDA_MODECTL	equ 3B8h
  9772                              <1> VGAREG_CGA_MODECTL	equ 3D8h
  9773                              <1> VGAREG_CGA_PALETTE	equ 3D9h
  9774                              <1> 
  9775                              <1> biosfn_save_video_state:
  9776                              <1> 	; 03/08/2022 (TRDOS 386 v2.0.5)
  9777                              <1> 	; 22/01/2021
  9778                              <1> 	; 12/01/2021
  9779                              <1> 	; 11/01/2021 (TRDOS 386 v2.0.3)
  9780                              <1> 	; (vgabios.c)
  9781                              <1> 
  9782                              <1> 	; modified registers: eax, edx, edi, ch
  9783                              <1> 
  9784                              <1> 	;mov	edi, VBE3SAVERESTOREBLOCK
  9785                              <1> 
  9786                              <1> 	; input: edi = state buffer address
  9787                              <1> 
  9788 00003B54 F6C101              <1> 	test	cl, 1
  9789 00003B57 0F8485000000        <1> 	jz	bfn_svs_4
  9790                              <1> 
  9791 00003B5D 66BAC403            <1> 	mov	dx, VGAREG_SEQU_ADDRESS ; 3C7h
  9792 00003B61 EC                  <1> 	in	al, dx
  9793 00003B62 AA                  <1> 	stosb
  9794                              <1> 	;mov	dx, VGAREG_VGA_CRTC_ADDRESS ; 3D4h
  9795 00003B63 B2D4                <1> 	mov	dl, 0D4h
  9796 00003B65 EC                  <1> 	in	al, dx
  9797 00003B66 AA                  <1> 	stosb
  9798                              <1>   	;mov	dx, VGAREG_GRDC_ADDRESS ; 3CEh 
  9799 00003B67 B2CE                <1>         mov	dl, 0CEh
  9800 00003B69 EC                  <1> 	in	al, dx
  9801 00003B6A AA                  <1> 	stosb
  9802                              <1> 	;mov	dx, VGAREG_ACTL_RESET ; 3DAh
  9803 00003B6B B2DA                <1> 	mov	dl, 0DAh
  9804 00003B6D EC                  <1> 	in	al, dx
  9805                              <1> 	;mov	dx, VGAREG_ACTL_ADDRESS ; 3C0h
  9806 00003B6E B2C0                <1> 	mov	dl, 0C0h
  9807 00003B70 EC                  <1> 	in	al, dx
  9808 00003B71 AA                  <1> 	stosb
  9809 00003B72 88C4                <1> 	mov	ah, al ; ar_index
  9810                              <1> 	;mov	dx, VGAREG_READ_FEATURE_CTL ; 3CAh
  9811 00003B74 B2CA                <1> 	mov	dl, 0CAh
  9812 00003B76 EC                  <1> 	in	al, dx
  9813 00003B77 AA                  <1> 	stosb
  9814                              <1> 	; (5 bytes are writen above)
  9815                              <1> 
  9816                              <1> 	; for(i=1;i<=4;i++){
  9817 00003B78 B001                <1> 	mov	al, 1
  9818                              <1> 	;;mov	dx, VGAREG_SEQU_ADDRESS ; 3C4h
  9819                              <1> 	;mov	dl, 0C4h
  9820 00003B7A B504                <1> 	mov	ch, 4
  9821                              <1> bfn_svs_0:
  9822                              <1> 	; outb(VGAREG_SEQU_ADDRESS, i);
  9823                              <1> 	;mov	dx, VGAREG_SEQU_ADDRESS ; 3C4h
  9824 00003B7C B2C4                <1> 	mov	dl, 0C4h
  9825 00003B7E EE                  <1> 	out	dx, al
  9826                              <1> 	;mov	dx, VGAREG_SEQU_DATA  ; 3C5h
  9827 00003B7F FEC2                <1> 	inc	dl  ; dx = 3C5h
  9828                              <1> 	; inb(VGAREG_SEQU_DATA)
  9829 00003B81 50                  <1> 	push	eax
  9830 00003B82 EC                  <1> 	in	al, dx
  9831 00003B83 AA                  <1> 	stosb	; (4 bytes in loop)
  9832 00003B84 58                  <1> 	pop	eax
  9833                              <1> 	;mov	dx, VGAREG_SEQU_ADDRESS ; 3C4h
  9834                              <1> 	;dec	dl	
  9835 00003B85 FEC0                <1> 	inc	al  ; i++
  9836 00003B87 FECD                <1> 	dec	ch
  9837 00003B89 75F1                <1> 	jnz	short bfn_svs_0
  9838                              <1> 
  9839                              <1> 	; outb(VGAREG_SEQU_ADDRESS, 0);
  9840 00003B8B 28C0                <1> 	sub	al, al ; 0
  9841 00003B8D EE                  <1> 	out	dx, al
  9842                              <1> 	; inb(VGAREG_SEQU_DATA)
  9843                              <1> 	;mov	dx, VGAREG_SEQU_DATA ; 3C5h
  9844 00003B8E FEC2                <1> 	inc	dl  ; dx = 3C5h
  9845 00003B90 EC                  <1> 	in	al, dx
  9846 00003B91 AA                  <1> 	stosb	; (+1 byte)
  9847                              <1> 
  9848                              <1>         ; for(i=0;i<=0x18;i++) {
  9849 00003B92 28C0                <1> 	sub	al, al ; 0
  9850                              <1> 	;;mov	dx, VGAREG_VGA_CRTC_ADDRESS ; 3D4h
  9851                              <1> 	;mov	dl, 0D4h
  9852 00003B94 B519                <1> 	mov	ch, 25
  9853                              <1> bfn_svs_1:
  9854                              <1>         ; outb(crtc_addr,i);
  9855                              <1> 	;mov	dx, VGAREG_VGA_CRTC_ADDRESS ; 3D4h
  9856 00003B96 B2D4                <1> 	mov	dl, 0D4h
  9857 00003B98 EE                  <1> 	out	dx, al
  9858                              <1> 	;mov	dx, VGAREG_VGA_CRTC_DATA ; 3D5h
  9859 00003B99 FEC2                <1> 	inc	dl  ; dx = 3D5h
  9860                              <1> 	; inb(crtc_addr+1)
  9861 00003B9B 50                  <1> 	push	eax
  9862 00003B9C EC                  <1> 	in	al, dx
  9863 00003B9D AA                  <1> 	stosb	; (25 bytes in loop)
  9864 00003B9E 58                  <1> 	pop	eax
  9865                              <1> 	;mov	dx, VGAREG_VGA_CRTC_ADDRESS ; 3D4h
  9866                              <1> 	;dec	dl	
  9867 00003B9F FEC0                <1> 	inc	al  ; i++
  9868 00003BA1 FECD                <1> 	dec	ch
  9869 00003BA3 75F1                <1> 	jnz	short bfn_svs_1
  9870                              <1> 
  9871 00003BA5 80E420              <1> 	and	ah, 20h  ; (ar_index & 0x20)
  9872                              <1>         ; for(i=0;i<=0x13;i++) {
  9873 00003BA8 28C0                <1> 	sub	al, al ; 0
  9874 00003BAA B514                <1> 	mov	ch, 20
  9875                              <1> bfn_svs_2:
  9876                              <1> 	; inb(VGAREG_ACTL_RESET);
  9877                              <1> 	;mov	dx, VGAREG_ACTL_RESET ; 3DAh
  9878 00003BAC B2DA                <1> 	mov	dl, 0DAh
  9879 00003BAE 50                  <1> 	push	eax
  9880 00003BAF EC                  <1> 	in	al, dx
  9881 00003BB0 8A0424              <1> 	mov	al, [esp]
  9882                              <1>  	; outb(VGAREG_ACTL_ADDRESS, i | (ar_index & 0x20));
  9883 00003BB3 08E0                <1> 	or	al, ah
  9884                              <1> 	;mov	dx, VGAREG_ACTL_ADDRESS ; 3C0h
  9885 00003BB5 B2C0                <1> 	mov	dl, 0C0h
  9886 00003BB7 EE                  <1> 	out	dx, al
  9887                              <1> 	;mov	dx, VGAREG_ACTL_READ_DATA ; 3C1h
  9888                              <1> 	;mov	dl, 0C1h
  9889 00003BB8 FEC2                <1> 	inc	dl
  9890 00003BBA EC                  <1> 	in	al, dx
  9891 00003BBB AA                  <1> 	stosb	; (20 bytes in loop)
  9892 00003BBC 58                  <1> 	pop	eax
  9893 00003BBD FEC0                <1> 	inc	al  ; i++
  9894 00003BBF FECD                <1> 	dec	ch
  9895 00003BC1 75E9                <1> 	jnz	short bfn_svs_2
  9896                              <1> 
  9897                              <1> 	; inb(VGAREG_ACTL_RESET);
  9898                              <1> 	;mov	dx, VGAREG_ACTL_RESET ; 3DAh
  9899 00003BC3 B2DA                <1> 	mov	dl, 0DAh
  9900 00003BC5 EC                  <1> 	in	al, dx
  9901                              <1> 
  9902                              <1>         ; for(i=0;i<=8;i++) {
  9903 00003BC6 28C0                <1> 	sub	al, al ; 0
  9904                              <1> 	;;mov	dx, VGAREG_GRDC_ADDRESS ; 3CEh
  9905                              <1> 	;mov	dl, 0CEh
  9906 00003BC8 B509                <1> 	mov	ch, 9
  9907                              <1> bfn_svs_3:
  9908                              <1> 	; outb(VGAREG_GRDC_ADDRESS,i)
  9909                              <1> 	;mov	dx, VGAREG_GRDC_ADDRESS ; 3CEh
  9910 00003BCA B2CE                <1> 	mov	dl, 0CEh
  9911 00003BCC EE                  <1> 	out	dx, al
  9912                              <1> 	; inb(VGAREG_ACTL_READ_DATA)
  9913 00003BCD 50                  <1> 	push	eax
  9914                              <1> 	;mov	dx, VGAREG_GRDC_DATA ; 3CFh
  9915                              <1> 	;mov	dl, 0CFh
  9916 00003BCE FEC2                <1> 	inc	dl
  9917 00003BD0 EC                  <1> 	in	al, dx
  9918 00003BD1 AA                  <1> 	stosb	; (9 bytes in loop)
  9919 00003BD2 58                  <1> 	pop	eax
  9920                              <1> 	;dec	dl
  9921 00003BD3 FEC0                <1> 	inc	al  ; i++
  9922 00003BD5 FECD                <1> 	dec	ch
  9923 00003BD7 75F1                <1> 	jnz	short bfn_svs_3
  9924                              <1> 
  9925                              <1> 	; write_word(ES, BX, crtc_addr); BX+= 2;
  9926                              <1> 	; (offset 64)
  9927 00003BD9 66B8D403            <1> 	mov	ax, 3D4h ; VGAREG_VGA_CRTC_ADDRESS
  9928 00003BDD 66AB                <1> 	stosw	; (2 bytes (1 word))
  9929                              <1> 
  9930                              <1>         ; /* XXX: read plane latches */
  9931 00003BDF 31C0                <1> 	xor	eax, eax  ; 0
  9932 00003BE1 AB                  <1>        	stosd	; (4 bytes)
  9933                              <1> 
  9934                              <1> 	; (total 70 bytes are written above as controller hardware state)
  9935                              <1> 
  9936                              <1> bfn_svs_4:		
  9937                              <1> 	; 12/01/2021 (TRDOS 386 v2.0.3)
  9938 00003BE2 F6C102              <1> 	test	cl, 2
  9939 00003BE5 7476                <1> 	jz	short bfn_svs_6
  9940                              <1> 
  9941                              <1> 	; VIDEO BIOS DATA
  9942                              <1> 	; !!! this data is valid for TRDOS 386 v2 kernel only !!!
  9943                              <1> 	; (this is not same with BOCHS/PLEX86 video bios, BIOS data)  
  9944                              <1>   
  9945                              <1>     	; if (CX & 2) {
  9946                              <1>         ;write_byte(ES, BX, read_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_MODE)); BX++;
  9947                              <1>         ;write_word(ES, BX, read_word(BIOSMEM_SEG,BIOSMEM_NB_COLS)); BX += 2;
  9948                              <1>         ;write_word(ES, BX, read_word(BIOSMEM_SEG,BIOSMEM_PAGE_SIZE)); BX += 2;
  9949                              <1>         ;write_word(ES, BX, read_word(BIOSMEM_SEG,BIOSMEM_CRTC_ADDRESS)); BX += 2;
  9950                              <1>         ;write_byte(ES, BX, read_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS)); BX++;
  9951                              <1>         ;write_word(ES, BX, read_word(BIOSMEM_SEG,BIOSMEM_CHAR_HEIGHT)); BX += 2;
  9952                              <1>         ;write_byte(ES, BX, read_byte(BIOSMEM_SEG,BIOSMEM_VIDEO_CTL)); BX++;
  9953                              <1>         ;write_byte(ES, BX, read_byte(BIOSMEM_SEG,BIOSMEM_SWITCHES)); BX++;
  9954                              <1>         ;write_byte(ES, BX, read_byte(BIOSMEM_SEG,BIOSMEM_MODESET_CTL)); BX++;
  9955                              <1>         ;write_word(ES, BX, read_word(BIOSMEM_SEG,BIOSMEM_CURSOR_TYPE)); BX += 2;
  9956                              <1>         ;for(i=0;i<8;i++) {
  9957                              <1>         ;   write_word(ES, BX, read_word(BIOSMEM_SEG, BIOSMEM_CURSOR_POS+2*i));
  9958                              <1>         ;   BX += 2;
  9959                              <1>         ;}
  9960                              <1>         ;write_word(ES, BX, read_word(BIOSMEM_SEG,BIOSMEM_CURRENT_START)); BX += 2;
  9961                              <1>         ;write_byte(ES, BX, read_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_PAGE)); BX++;
  9962                              <1>         ;/* current font */
  9963                              <1>         ;write_word(ES, BX, read_word(0, 0x1f * 4)); BX += 2;
  9964                              <1>         ;write_word(ES, BX, read_word(0, 0x1f * 4 + 2)); BX += 2;
  9965                              <1>         ;write_word(ES, BX, read_word(0, 0x43 * 4)); BX += 2;
  9966                              <1>         ;write_word(ES, BX, read_word(0, 0x43 * 4 + 2)); BX += 2;
  9967                              <1> 
  9968                              <1> 	; !!! save TRDOS 386 v2 kernel spesific video bios data !!!
  9969                              <1> 	; (which is/are used by 'SET_MODE' function and/or it's sub functions)
  9970                              <1> 
  9971 00003BE7 66B8D403            <1> 	mov	ax, 3D4h ; CRTC_ADDR, always 3D4h (color VGA) for TRDOS 386 v2
  9972 00003BEB 66AB                <1> 	stosw
  9973 00003BED A0[BE670000]        <1> 	mov	al, [CRT_MODE] ; Current video mode (0FFh for VESA VBE modes) 
  9974 00003BF2 AA                  <1> 	stosb
  9975 00003BF3 A0[BF670000]        <1> 	mov	al, [CRT_MODE_SET] ; 29h for mode 03h ; TRDOS 386 feature only !
  9976 00003BF8 AA                  <1> 	stosb	
  9977 00003BF9 66A1[D69E0100]      <1>  	mov	ax, [video_mode] ; Current VESA VBE (SVGA, extended VGA) mode 
  9978 00003BFF 66AB                <1> 	stosw			 ; (valid if [CRT_MODE] = 0FFh)	
  9979 00003C01 66A1[1C850100]      <1> 	mov	ax, [CRT_LEN] ; page size (in bytes)
  9980 00003C07 66AB                <1> 	stosw
  9981 00003C09 66A1[A4780100]      <1> 	mov	ax, [CRT_START] ; video page start offset
  9982 00003C0F 66AB                <1>  	stosw
  9983 00003C11 A0[C0670000]        <1> 	mov	al, [CRT_COLS] ; nbcols, characters per row	
  9984 00003C16 AA                  <1> 	stosb
  9985 00003C17 A0[C6670000]        <1> 	mov	al, [VGA_ROWS] ; nbrows, (character) rows per page (not rows-1)
  9986 00003C1C AA                  <1> 	stosb
  9987 00003C1D A0[C2670000]        <1> 	mov	al, [CHAR_HEIGHT] ; character font height (8 or 16 or 14)
  9988 00003C22 AA                  <1> 	stosb
  9989 00003C23 A0[C3670000]        <1> 	mov	al, [VGA_VIDEO_CTL] ; ROM BIOS DATA AREA Offset 87h
  9990 00003C28 AA                  <1> 	stosb
  9991 00003C29 A0[C4670000]        <1> 	mov	al, [VGA_SWITCHES] ; feature bit switches
  9992 00003C2E AA                  <1> 	stosb
  9993 00003C2F A0[C5670000]        <1> 	mov	al, [VGA_MODESET_CTL] ; basic mode set options
  9994 00003C34 AA                  <1> 	stosb
  9995                              <1> 	; followings are only used by TRDOS 386 v2 (IBM PC/AT ROMBIOS) code 
  9996                              <1> 	; (bochs/plex86 does not use and return those)
  9997 00003C35 A0[C1670000]        <1> 	mov	al, [CRT_PALETTE] ; current color palette ; TRDOS 386 feature only !
  9998 00003C3A AA                  <1> 	stosb
  9999 00003C3B A0[B6780100]        <1> 	mov	al, [ACTIVE_PAGE] ; current video page 
 10000 00003C40 AA                  <1> 	stosb
 10001 00003C41 66A1[D7670000]      <1> 	mov	ax, [CURSOR_MODE] ; cursor type
 10002 00003C47 66AB                <1> 	stosw
 10003                              <1> 	;mov	eax, [CURSOR_POSN] ; cursor position for video page 0 and 1 
 10004                              <1> 	;stosd
 10005                              <1> 	;mov	eax, [CURSOR_POSN+4] ; cursor position for video page 2 and 3 
 10006                              <1> 	;stosd
 10007                              <1> 	;mov	eax, [CURSOR_POSN+8] ; cursor position for video page 4 and 5 
 10008                              <1> 	;stosd
 10009                              <1> 	;mov	eax, [CURSOR_POSN+12] ; cursor position for video page 6 and 7 
 10010                              <1> 	;stosd
 10011 00003C49 56                  <1> 	push	esi
 10012 00003C4A B504                <1> 	mov	ch, 4
 10013 00003C4C BE[A6780100]        <1> 	mov	esi, CURSOR_POSN
 10014                              <1> bfn_svs_5:
 10015 00003C51 A5                  <1> 	movsd
 10016 00003C52 FECD                <1> 	dec	ch
 10017 00003C54 75FB                <1> 	jnz	short bfn_svs_5
 10018 00003C56 5E                  <1> 	pop	esi
 10019                              <1> 	; (font addr) protected mode address in kernel's/system memory space 
 10020                              <1> 	; (not accessable/meaningful address value by user)
 10021 00003C57 A1[2E850100]        <1> 	mov	eax, [VGA_INT43H] ; VGA current (default) font address
 10022 00003C5C AB                  <1> 	stosd
 10023                              <1> 	
 10024                              <1> 	; (total 40 bytes are written above as BIOS data state)
 10025                              <1> 
 10026                              <1> bfn_svs_6:
 10027                              <1> 	; 12/01/2021
 10028 00003C5D F6C104              <1> 	test	cl, 4
 10029 00003C60 7422                <1> 	jz	short bfn_svs_8
 10030                              <1> 
 10031                              <1>   	;/* XXX: check this */
 10032                              <1> 		; /* read/write mode dac */
 10033                              <1>         ;write_byte(ES, BX, inb(VGAREG_DAC_STATE)); BX++;
 10034                              <1> 	;	; /* pix address */
 10035                              <1>         ;write_byte(ES, BX, inb(VGAREG_DAC_WRITE_ADDRESS)); BX++;
 10036                              <1>         ;write_byte(ES, BX, inb(VGAREG_PEL_MASK)); BX++;
 10037                              <1>         ;// Set the whole dac always, from 0
 10038                              <1>         ;outb(VGAREG_DAC_WRITE_ADDRESS,0x00);
 10039                              <1>         ;for(i=0;i<256*3;i++) {
 10040                              <1>         ;   write_byte(ES, BX, inb(VGAREG_DAC_DATA)); BX++;
 10041                              <1>         ;}
 10042                              <1>         ;write_byte(ES, BX, 0); BX++; /* color select register */
 10043                              <1> 
 10044                              <1> 	; /* read/write mode dac */
 10045 00003C62 66BAC703            <1>     	mov	dx, 3C7h ; VGAREG_DAC_STATE
 10046 00003C66 EC                  <1> 	in	al, dx
 10047 00003C67 AA                  <1> 	stosb
 10048                              <1> 	; /* pix address */
 10049                              <1>     	;mov	dx, VGAREG_DAC_WRITE_ADDRESS ; 3C8h
 10050                              <1> 	;mov	dl, 0C8h
 10051 00003C68 FEC2                <1> 	inc	dl
 10052 00003C6A EC                  <1> 	in	al, dx
 10053 00003C6B AA                  <1> 	stosb
 10054                              <1>     	;mov	dx, VGAREG_PEL_MASK  ; 3C6h
 10055 00003C6C B2C6                <1> 	mov	dl, 0C6h
 10056 00003C6E EC                  <1> 	in	al, dx
 10057 00003C6F AA                  <1> 	stosb
 10058                              <1> 	;// Set the whole dac always, from 0
 10059 00003C70 30C0                <1> 	xor	al, al ; 0
 10060                              <1> 	;mov	dx, VGAREG_DAC_WRITE_ADDRESS ; 3C8h
 10061 00003C72 B2C8                <1> 	mov	dl, 0C8h
 10062 00003C74 EE                  <1> 	out	dx, al
 10063                              <1> 
 10064 00003C75 51                  <1> 	push	ecx ; 22/01/2021
 10065                              <1> 	;for(i=0;i<256*3;i++) {
 10066                              <1> 	;mov	ecx, 256*3 ; 768 bytes
 10067                              <1> 	; 03/08/2022
 10068 00003C76 29C9                <1> 	sub	ecx, ecx
 10069 00003C78 B503                <1> 	mov	ch, 3
 10070                              <1> 	; ecx = 300h = 768
 10071                              <1> 	;mov	dx, VGAREG_DAC_DATA ; 3C9h
 10072                              <1> 	;mov	dl, 0C9h
 10073 00003C7A FEC2                <1> 	inc	dl ; dx = 3C9h
 10074                              <1> bfn_svs_7:
 10075 00003C7C EC                  <1> 	in	al, dx
 10076 00003C7D AA                  <1> 	stosb
 10077 00003C7E E2FC                <1> 	loop	bfn_svs_7
 10078 00003C80 59                  <1> 	pop	ecx ; 22/01/2021
 10079                              <1> 
 10080                              <1> 	; /* color select register */
 10081 00003C81 28C0                <1> 	sub	al, al ; 0
 10082 00003C83 AA                  <1> 	stosb
 10083                              <1> 
 10084                              <1> 	; (total 772 bytes are written above as DAC state)
 10085                              <1> bfn_svs_8:
 10086 00003C84 C3                  <1> 	retn
 10087                              <1> 
 10088                              <1> vbe_biosfn_save_video_state:
 10089                              <1> 	; 23/01/2021
 10090                              <1> 	; 13/01/2021
 10091                              <1> 	; 12/01/2021 (TRDOS 386 v2.0.3)
 10092                              <1> 	; (vbe.c)
 10093                              <1> 
 10094                              <1> 	; modified registers: eax, edx, edi, ch
 10095                              <1> 	
 10096                              <1> 	; input: edi = state buffer address
 10097                              <1> 	; output: 
 10098                              <1> 	;	 VBE DISPI register contents will be saved
 10099                              <1> 	;	 (18 bytes, 9 words)
 10100                              <1> 
 10101                              <1> 	; outw(VBE_DISPI_IOPORT_INDEX,VBE_DISPI_INDEX_ENABLE);
 10102                              <1> 	; enable = inw(VBE_DISPI_IOPORT_DATA);
 10103                              <1>   	; write_word(ES, BX, enable);
 10104                              <1>  	; BX += 2;
 10105                              <1> 	; if (!(enable & VBE_DISPI_ENABLED)) 
 10106                              <1> 	;	return;
 10107                              <1> 	; for(i = VBE_DISPI_INDEX_XRES;
 10108                              <1> 	;		 i <= VBE_DISPI_INDEX_Y_OFFSET; i++) {
 10109                              <1> 	;    if (i != VBE_DISPI_INDEX_ENABLE) {
 10110                              <1> 	;        outw(VBE_DISPI_IOPORT_INDEX, i);
 10111                              <1> 	;        write_word(ES, BX, inw(VBE_DISPI_IOPORT_DATA));
 10112                              <1>         ;    BX += 2;
 10113                              <1> 	;        }
 10114                              <1> 	; }
 10115                              <1> 
 10116 00003C85 66BACE01            <1> 	mov	dx, 01CEh ; VBE_DISPI_IOPORT_INDEX
 10117                              <1> 	;mov	eax, 04h  ; VBE_DISPI_INDEX_ENABLE
 10118                              <1> 	 ;03/08/2022
 10119 00003C89 66EF                <1> 	out	dx, ax
 10120                              <1> 	;mov	dx, 01CFh ; VBE_DISPI_IOPORT_DATA	
 10121 00003C8B FEC2                <1> 	inc	dl
 10122 00003C8D 66ED                <1> 	in	ax, dx ; enable (status)
 10123 00003C8F 66AB                <1> 	stosw 
 10124 00003C91 6683E001            <1> 	and	ax, 1 ; VBE_DISPI_ENABLED
 10125 00003C95 7505                <1> 	jnz	short vbe_bfn_svs_0
 10126                              <1> 	; 23/01/2021
 10127                              <1> 	; ax = 0
 10128                              <1> 	; VBE_DISPI_DISABLED
 10129                              <1> 	; 13/01/2021
 10130                              <1> 	; clear remain 8 bytes 
 10131                              <1> 	;xor	eax, eax
 10132 00003C97 AB                  <1> 	stosd	; 2
 10133 00003C98 AB                  <1> 	stosd	; 2
 10134 00003C99 AB                  <1> 	stosd	; 2
 10135 00003C9A AB                  <1> 	stosd	; 2
 10136 00003C9B C3                  <1> 	retn
 10137                              <1> vbe_bfn_svs_0:
 10138                              <1> 	; VBE_DISPI_ENABLED
 10139                              <1> 
 10140                              <1> 	;sub	eax, eax
 10141 00003C9C 28C0                <1> 	sub	al, al ; eax = 0
 10142                              <1> 	
 10143                              <1> 	; from VBE_DISPI_INDEX_XRES
 10144                              <1> 	;   to VBE_DISPI_INDEX_BPP	
 10145                              <1> 
 10146 00003C9E B503                <1>  	mov	ch, 3
 10147                              <1> 	; al = 0 ; VBE_DISPI_INDEX_XRES - 1
 10148                              <1> 
 10149 00003CA0 E804000000          <1> 	call	vbe_bfn_svs_1
 10150                              <1> 
 10151                              <1> 	; from VBE_DISPI_INDEX_BANK
 10152                              <1> 	;   to VBE_DISPI_INDEX_Y_OFFSET
 10153                              <1> 
 10154 00003CA5 FEC0                <1> 	inc	al 
 10155                              <1> 	; al = 4 ; VBE_DISPI_INDEX_BANK - 1
 10156                              <1> 
 10157 00003CA7 B505                <1> 	mov	ch, 5
 10158                              <1> vbe_bfn_svs_1:
 10159 00003CA9 FEC0                <1> 	inc	al ; from VBE_DISPI_INDEX_XRES
 10160                              <1> 		   ;   to VBE_DISPI_INDEX_BPP	
 10161                              <1> 	;mov	dx, 01CEh ; VBE_DISPI_IOPORT_INDEX
 10162 00003CAB FECA                <1> 	dec	dl ; 1CEh
 10163 00003CAD 66EF                <1> 	out	dx, ax
 10164 00003CAF 50                  <1> 	push	eax
 10165                              <1> 	;mov	dx, 01CFh ; VBE_DISPI_IOPORT_DATA
 10166 00003CB0 FEC2                <1> 	inc	dl ; 1CFh
 10167 00003CB2 66ED                <1> 	in	ax, dx
 10168 00003CB4 66AB                <1> 	stosw
 10169 00003CB6 58                  <1> 	pop	eax
 10170 00003CB7 FECD                <1> 	dec	ch
 10171 00003CB9 75EE                <1> 	jnz	short vbe_bfn_svs_1		
 10172 00003CBB C3                  <1> 	retn
 10173                              <1> 
 10174                              <1> biosfn_restore_video_state:
 10175                              <1> 	; 22/01/2021
 10176                              <1> 	; 13/01/2021
 10177                              <1> 	; 12/01/2021 (TRDOS 386 v2.0.3)
 10178                              <1> 	; (vgabios.c)
 10179                              <1> 
 10180                              <1> 	; modified registers: eax, edx, esi, edi, ch
 10181                              <1> 
 10182                              <1> 	;mov	esi, VBE3SAVERESTOREBLOCK
 10183                              <1> 
 10184                              <1> 	; input: esi = state buffer address
 10185                              <1> 
 10186 00003CBC F6C101              <1> 	test	cl, 1
 10187 00003CBF 0F84A9000000        <1> 	jz	bfn_rvs_6
 10188                              <1> 
 10189 00003CC5 66817E40D403        <1> 	cmp	word [esi+64], 3D4h ; must be 3D4h
 10190 00003CCB 7402                <1> 	je	short bfn_rvs_0  
 10191                              <1> 			; it is seen as valid buffer
 10192 00003CCD F9                  <1> 	stc
 10193 00003CCE C3                  <1> 	retn
 10194                              <1> 
 10195                              <1> bfn_rvs_0:
 10196 00003CCF 89F7                <1> 	mov	edi, esi ; addr1
 10197 00003CD1 83C605              <1> 	add	esi, 5 ; skip 1st 5 bytes for now
 10198                              <1> 
 10199                              <1> 	; // Reset Attribute Ctl flip-flop
 10200                              <1>         ; inb(VGAREG_ACTL_RESET);
 10201 00003CD4 66BADA03            <1> 	mov	dx, 3DAh ; VGAREG_ACTL_RESET
 10202 00003CD8 EC                  <1> 	in	al, dx
 10203                              <1> 
 10204                              <1> 	; for(i=1;i<=4;i++){
 10205 00003CD9 B001                <1> 	mov	al, 1
 10206                              <1> 	;;mov	dx, VGAREG_SEQU_ADDRESS ; 3C4h
 10207                              <1> 	;mov	dl, 0C4h
 10208 00003CDB B504                <1> 	mov	ch, 4
 10209                              <1> bfn_rvs_1:
 10210                              <1> 	; outb(VGAREG_SEQU_ADDRESS, i);
 10211                              <1> 	;mov	dx, VGAREG_SEQU_ADDRESS ; 3C4h
 10212 00003CDD B2C4                <1> 	mov	dl, 0C4h
 10213 00003CDF EE                  <1> 	out	dx, al
 10214                              <1> 	;mov	dx, VGAREG_SEQU_DATA  ; 3C5h
 10215 00003CE0 FEC2                <1> 	inc	dl  ; dx = 3C5h
 10216                              <1> 	; outb(VGAREG_SEQU_DATA)
 10217 00003CE2 50                  <1> 	push	eax
 10218 00003CE3 AC                  <1> 	lodsb	; (4 bytes in loop)
 10219 00003CE4 EE                  <1> 	out	dx, al
 10220 00003CE5 58                  <1> 	pop	eax
 10221                              <1> 	;mov	dx, VGAREG_SEQU_ADDRESS ; 3C4h
 10222                              <1> 	;dec	dl	
 10223 00003CE6 FEC0                <1> 	inc	al  ; i++
 10224 00003CE8 FECD                <1> 	dec	ch
 10225 00003CEA 75F1                <1> 	jnz	short bfn_rvs_1
 10226                              <1> 
 10227                              <1> 	; outb(VGAREG_SEQU_ADDRESS, 0);
 10228 00003CEC 28C0                <1> 	sub	al, al ; 0
 10229 00003CEE EE                  <1> 	out	dx, al
 10230                              <1> 	; outb(VGAREG_SEQU_DATA)
 10231                              <1> 	;mov	dx, VGAREG_SEQU_DATA ; 3C5h
 10232 00003CEF FEC2                <1> 	inc	dl  ; dx = 3C5h
 10233 00003CF1 AC                  <1> 	lodsb	; (+1 byte)
 10234 00003CF2 EE                  <1> 	out	dx, al
 10235                              <1> 
 10236                              <1> 	; // Disable CRTC write protection
 10237                              <1> 	; outw(crtc_addr,0x0011);
 10238                              <1> 	;mov	dx, VGAREG_VGA_CRTC_ADDRESS ; 3D4h
 10239 00003CF3 B2D4                <1> 	mov	dl, 0D4h
 10240 00003CF5 66B81100            <1> 	mov	ax, 11h
 10241 00003CF9 66EF                <1> 	out	dx, ax
 10242                              <1> 
 10243                              <1> 	; // Set CRTC regs
 10244                              <1>        
 10245                              <1> 	; for(i=0;i<=0x18;i++) {
 10246                              <1>         ;   if (i != 0x11) {
 10247 00003CFB 28C0                <1> 	sub	al, al ; 0
 10248                              <1> 	;;mov	dx, VGAREG_VGA_CRTC_ADDRESS ; 3D4h
 10249                              <1> 	;mov	dl, 0D4h
 10250 00003CFD B519                <1> 	mov	ch, 25
 10251                              <1> bfn_rvs_2:
 10252                              <1>         ; outb(crtc_addr,i);
 10253                              <1> 	;mov	dx, VGAREG_VGA_CRTC_ADDRESS ; 3D4h
 10254 00003CFF B2D4                <1> 	mov	dl, 0D4h
 10255 00003D01 EE                  <1> 	out	dx, al
 10256                              <1> 	;mov	dx, VGAREG_VGA_CRTC_DATA ; 3D5h
 10257 00003D02 FEC2                <1> 	inc	dl  ; dx = 3D5h
 10258                              <1> 	; inb(crtc_addr+1)
 10259 00003D04 50                  <1> 	push	eax
 10260 00003D05 AC                  <1> 	lodsb	; (25 bytes in loop)
 10261 00003D06 EE                  <1> 	out	dx, al
 10262 00003D07 58                  <1> 	pop	eax
 10263                              <1> 	;mov	dx, VGAREG_VGA_CRTC_ADDRESS ; 3D4h
 10264                              <1> 	;dec	dl
 10265 00003D08 FEC0                <1> 	inc	al  ; i++
 10266 00003D0A 3C11                <1> 	cmp	al, 17 ; 11h
 10267 00003D0C 7505                <1> 	jne	short bfn_rvs_3
 10268 00003D0E AC                  <1> 	lodsb
 10269 00003D0F 88C4                <1> 	mov	ah, al ; *
 10270 00003D11 B012                <1> 	mov	al, 18 
 10271                              <1> bfn_rvs_3:
 10272 00003D13 FECD                <1> 	dec	ch
 10273 00003D15 75E8                <1> 	jnz	short bfn_rvs_2
 10274                              <1> 
 10275                              <1> 	; // select crtc base address
 10276                              <1>         ; v = inb(VGAREG_READ_MISC_OUTPUT) & ~0x01;
 10277                              <1> 	;if (crtc_addr = 0x3d4)
 10278                              <1> 	;   v |= 0x01;
 10279                              <1> 	; outb(VGAREG_WRITE_MISC_OUTPUT, v);
 10280                              <1> 
 10281                              <1> 	;;mov	dx, VGAREG_READ_MISC_OUTPUT ; 3CCh
 10282                              <1> 	;mov	dl, 0CCh
 10283                              <1> 	;in	al, dl
 10284                              <1> 	;and	al, 1
 10285                              <1> 	;;mov	dx, VGAREG_WRITE_MISC_OUTPUT ; 3C2h
 10286                              <1> 	;mov	dl, 0C2h
 10287                              <1> 	;or	al, 1
 10288                              <1> 	;out	dx, al
 10289                              <1> 
 10290                              <1> 	; // enable write protection if needed
 10291                              <1> 	;outb(crtc_addr, 0x11);
 10292                              <1>         ;outb(crtc_addr+1, read_byte(ES, BX - 0x18 + 0x11));
 10293                              <1> 	;mov	dx, VGAREG_VGA_CRTC_ADDRESS ; 3D4h
 10294 00003D17 B2D4                <1> 	mov	dl, 0D4h
 10295 00003D19 B011                <1> 	mov	al, 11h
 10296 00003D1B EE                  <1> 	out	dx, al
 10297 00003D1C 88E0                <1> 	mov	al, ah ; *
 10298 00003D1E FEC2                <1> 	inc	dl ; dx = 3D5h
 10299 00003D20 EE                  <1> 	out	dx, al
 10300                              <1> 
 10301                              <1> 	; // Set Attribute Ctl
 10302 00003D21 8A6703              <1> 	mov	ah, [edi+3] ; addr1+3, ah = ar_index
 10303 00003D24 80E420              <1> 	and	ah, 20h  ; (ar_index & 0x20)
 10304                              <1> 
 10305                              <1>         ; inb(VGAREG_ACTL_RESET);
 10306                              <1> 	;mov	dx, 3DAh ; VGAREG_ACTL_RESET
 10307 00003D27 B2DA                <1> 	mov	dl, 0DAh
 10308 00003D29 EC                  <1> 	in	al, dx
 10309                              <1> 
 10310                              <1>         ; for(i=0;i<=0x13;i++) {
 10311 00003D2A 28C0                <1> 	sub	al, al ; 0
 10312 00003D2C B514                <1> 	mov	ch, 20
 10313                              <1> bfn_rvs_4:
 10314                              <1>  	; outb(VGAREG_ACTL_ADDRESS, i | (ar_index & 0x20));
 10315 00003D2E 50                  <1> 	push	eax
 10316 00003D2F 08E0                <1> 	or	al, ah
 10317                              <1> 	;mov	dx, VGAREG_ACTL_ADDRESS ; 3C0h
 10318 00003D31 B2C0                <1> 	mov	dl, 0C0h
 10319 00003D33 EE                  <1> 	out	dx, al
 10320                              <1> 	;mov	dx, VGAREG_ACTL_WRITE_DATA ; 3C0h
 10321                              <1> 	;mov	dl, 0C0h
 10322 00003D34 AC                  <1> 	lodsb	; (20 bytes in loop)
 10323 00003D35 EE                  <1> 	out	dx, al
 10324 00003D36 58                  <1> 	pop	eax
 10325 00003D37 FEC0                <1> 	inc	al  ; i++
 10326 00003D39 FECD                <1> 	dec	ch
 10327 00003D3B 75F1                <1> 	jnz	short bfn_rvs_4
 10328                              <1> 
 10329                              <1> 	; outb(VGAREG_ACTL_ADDRESS, ar_index);
 10330                              <1> 	;mov	dx, VGAREG_ACTL_ADDRESS ; 3C0h
 10331                              <1> 	;mov	dl, 0C0h
 10332 00003D3D 88E0                <1> 	mov	al, ah ; ar_index
 10333 00003D3F EE                  <1> 	out	dx, al
 10334                              <1> 
 10335                              <1> 	; inb(VGAREG_ACTL_RESET);
 10336                              <1> 	;mov	dx, VGAREG_ACTL_RESET ; 3DAh
 10337 00003D40 B2DA                <1> 	mov	dl, 0DAh
 10338 00003D42 EC                  <1> 	in	al, dx
 10339                              <1> 
 10340                              <1>         ; for(i=0;i<=8;i++) {
 10341 00003D43 28C0                <1> 	sub	al, al ; 0
 10342                              <1> 	;;mov	dx, VGAREG_GRDC_ADDRESS ; 3CEh
 10343                              <1> 	;mov	dl, 0CEh
 10344 00003D45 B509                <1> 	mov	ch, 9
 10345                              <1> bfn_rvs_5:
 10346                              <1> 	; outb(VGAREG_GRDC_ADDRESS,i)
 10347                              <1> 	;mov	dx, VGAREG_GRDC_ADDRESS ; 3CEh
 10348 00003D47 B2CE                <1> 	mov	dl, 0CEh
 10349 00003D49 EE                  <1> 	out	dx, al
 10350                              <1> 	; outb(VGAREG_ACTL_READ_DATA)
 10351 00003D4A 50                  <1> 	push	eax
 10352                              <1> 	;mov	dx, VGAREG_GRDC_DATA ; 3CFh
 10353                              <1> 	;mov	dl, 0CFh
 10354 00003D4B FEC2                <1> 	inc	dl
 10355 00003D4D AC                  <1> 	lodsb	; (9 bytes in loop)
 10356 00003D4E EE                  <1> 	out	dx, al
 10357 00003D4F 58                  <1> 	pop	eax
 10358                              <1> 	;dec	dl
 10359 00003D50 FEC0                <1> 	inc	al  ; i++
 10360 00003D52 FECD                <1> 	dec	ch
 10361 00003D54 75F1                <1> 	jnz	short bfn_rvs_5
 10362                              <1> 
 10363                              <1> 	; BX += 2; /* crtc_addr */     ; 3D4h
 10364                              <1>         ; BX += 4; /* plane latches */ ; 0
 10365 00003D56 83C606              <1> 	add	esi, 6	      
 10366 00003D59 56                  <1> 	push	esi ; *	
 10367                              <1> 
 10368                              <1> 	;outb(VGAREG_SEQU_ADDRESS, read_byte(ES, addr1)); addr1++;
 10369                              <1>         ;outb(crtc_addr, read_byte(ES, addr1)); addr1++;
 10370                              <1>         ;outb(VGAREG_GRDC_ADDRESS, read_byte(ES, addr1)); addr1++;
 10371                              <1>         ;addr1++;
 10372                              <1>         ;outb(crtc_addr - 0x4 + 0xa, read_byte(ES, addr1)); addr1++;
 10373                              <1> 
 10374 00003D5A 89FE                <1> 	mov	esi, edi ; start of state buffer
 10375                              <1> 
 10376                              <1> 	;mov	dx, VGAREG_SEQU_ADDRESS ; 3C7h
 10377 00003D5C B2C7                <1> 	mov	dl, 0C7h 
 10378 00003D5E AC                  <1> 	lodsb
 10379 00003D5F EE                  <1> 	out	dx, al
 10380                              <1> 	;mov	dx, VGAREG_VGA_CRTC_ADDRESS ; 3D4h
 10381 00003D60 B2D4                <1> 	mov	dl, 0D4h
 10382 00003D62 AC                  <1> 	lodsb
 10383 00003D63 EE                  <1> 	out	dx, al
 10384                              <1> 	;mov	dx, VGAREG_GRDC_ADDRESS ; 3CEh 
 10385 00003D64 B2CE                <1>         mov	dl, 0CEh
 10386 00003D66 AC                  <1> 	lodsb
 10387 00003D67 EE                  <1> 	out	dx, al
 10388 00003D68 AC                  <1> 	lodsb	; addr1++
 10389                              <1> 	;mov	dx, VGAREG_VGA_WRITE_FEATURE_CTL ; 3DAh
 10390 00003D69 B2DA                <1> 	mov	dl, 0DAh
 10391 00003D6B AC                  <1> 	lodsb
 10392 00003D6C EE                  <1> 	out	dx, al
 10393                              <1> 
 10394 00003D6D 5E                  <1> 	pop	esi ; *
 10395                              <1> 
 10396                              <1> 	; (total 70 bytes are read above as controller hardware state)
 10397                              <1> 
 10398                              <1> bfn_rvs_6:		
 10399                              <1> 	; 13/01/2021
 10400 00003D6E F6C102              <1> 	test	cl, 2
 10401 00003D71 747D                <1> 	jz	short bfn_rvs_9
 10402                              <1> 
 10403                              <1> 	; VIDEO BIOS DATA
 10404                              <1> 	; !!! this data is valid for TRDOS 386 v2 kernel only !!!
 10405                              <1> 	; (this is not same with BOCHS/PLEX86 video bios, BIOS data)  
 10406                              <1>   
 10407                              <1>     	; if (CX & 2) {
 10408                              <1> 	;write_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_MODE, read_byte(ES, BX)); BX++;
 10409                              <1>         ;write_word(BIOSMEM_SEG,BIOSMEM_NB_COLS, read_word(ES, BX)); BX += 2;
 10410                              <1>         ;write_word(BIOSMEM_SEG,BIOSMEM_PAGE_SIZE, read_word(ES, BX)); BX += 2;
 10411                              <1>         ;write_word(BIOSMEM_SEG,BIOSMEM_CRTC_ADDRESS, read_word(ES, BX)); BX += 2;
 10412                              <1>         ;write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, read_byte(ES, BX)); BX++;
 10413                              <1>         ;write_word(BIOSMEM_SEG,BIOSMEM_CHAR_HEIGHT, read_word(ES, BX)); BX += 2;
 10414                              <1>         ;write_byte(BIOSMEM_SEG,BIOSMEM_VIDEO_CTL, read_byte(ES, BX)); BX++;
 10415                              <1>         ;write_byte(BIOSMEM_SEG,BIOSMEM_SWITCHES, read_byte(ES, BX)); BX++;
 10416                              <1>         ;write_byte(BIOSMEM_SEG,BIOSMEM_MODESET_CTL, read_byte(ES, BX)); BX++;
 10417                              <1>         ;write_word(BIOSMEM_SEG,BIOSMEM_CURSOR_TYPE, read_word(ES, BX)); BX += 2;
 10418                              <1>         ;for(i=0;i<8;i++) {
 10419                              <1>         ;   write_word(BIOSMEM_SEG, BIOSMEM_CURSOR_POS+2*i, read_word(ES, BX));
 10420                              <1>         ;   BX += 2;
 10421                              <1>         ;}
 10422                              <1>         ;write_word(BIOSMEM_SEG,BIOSMEM_CURRENT_START, read_word(ES, BX)); BX += 2;
 10423                              <1>         ;write_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_PAGE, read_byte(ES, BX)); BX++;
 10424                              <1>         ;/* current font */
 10425                              <1>         ;write_word(0, 0x1f * 4, read_word(ES, BX)); BX += 2;
 10426                              <1>         ;write_word(0, 0x1f * 4 + 2, read_word(ES, BX)); BX += 2;
 10427                              <1>         ;write_word(0, 0x43 * 4, read_word(ES, BX)); BX += 2;
 10428                              <1>         ;write_word(0, 0x43 * 4 + 2, read_word(ES, BX)); BX += 2;
 10429                              <1> 
 10430                              <1> 	; !!! save TRDOS 386 v2 kernel spesific video bios data !!!
 10431                              <1> 	; (which is/are used by 'SET_MODE' function and/or it's sub functions)
 10432                              <1> 
 10433 00003D73 66AD                <1> 	lodsw	 ; CRTC_ADDR, always 3D4h (color VGA) for TRDOS 386 v2
 10434                              <1> 	; skip 3D4h check if it is already checked
 10435 00003D75 F6C101              <1> 	test	cl, 1
 10436 00003D78 7508                <1> 	jnz	short bfn_rvs_7
 10437 00003D7A 663DD403            <1> 	cmp	ax, 3D4h
 10438 00003D7E 7402                <1> 	je	short bfn_rvs_7
 10439 00003D80 F9                  <1> 	stc
 10440 00003D81 C3                  <1> 	retn
 10441                              <1> bfn_rvs_7:
 10442 00003D82 AC                  <1> 	lodsb
 10443 00003D83 A2[BE670000]        <1> 	mov	[CRT_MODE], al ; Current video mode (0FFh for VESA VBE modes) 
 10444 00003D88 AC                  <1> 	lodsb
 10445 00003D89 A2[BF670000]        <1> 	mov	[CRT_MODE_SET], al ; 29h for mode 03h ; TRDOS 386 feature only !
 10446 00003D8E 66AD                <1> 	lodsw	
 10447 00003D90 66A3[D69E0100]      <1>  	mov	[video_mode], ax ; Current VESA VBE (SVGA, extended VGA) mode 
 10448 00003D96 66AD                <1> 	lodsw		 ; (valid if [CRT_MODE] = 0FFh)	
 10449 00003D98 66A3[1C850100]      <1> 	mov	[CRT_LEN], ax ; page size (in bytes)
 10450 00003D9E 66AD                <1> 	lodsw
 10451 00003DA0 66A3[A4780100]      <1> 	mov	[CRT_START], ax ; video page start offset
 10452 00003DA6 AC                  <1>  	lodsb
 10453 00003DA7 A2[C0670000]        <1> 	mov	[CRT_COLS], al ; nbcols, characters per row
 10454 00003DAC AC                  <1> 	lodsb
 10455 00003DAD A2[C6670000]        <1> 	mov	[VGA_ROWS], al ; nbrows, (character) rows per page (not rows-1)
 10456 00003DB2 AC                  <1> 	lodsb
 10457 00003DB3 A2[C2670000]        <1> 	mov	[CHAR_HEIGHT], al ; character font height (8 or 16 or 14)
 10458 00003DB8 AC                  <1> 	lodsb
 10459 00003DB9 A2[C3670000]        <1> 	mov	[VGA_VIDEO_CTL], al ; ROM BIOS DATA AREA Offset 87h
 10460 00003DBE AC                  <1> 	lodsb
 10461 00003DBF A2[C4670000]        <1> 	mov	[VGA_SWITCHES], al ; feature bit switches
 10462 00003DC4 AC                  <1> 	lodsb
 10463 00003DC5 A2[C5670000]        <1> 	mov	[VGA_MODESET_CTL], al ; basic mode set options
 10464                              <1> 	; followings are only used by TRDOS 386 v2 (IBM PC/AT ROMBIOS) code 
 10465                              <1> 	; (bochs/plex86 does not use and return those)
 10466 00003DCA AC                  <1> 	lodsb
 10467 00003DCB A2[C1670000]        <1> 	mov	[CRT_PALETTE], al ; current color palette ; TRDOS 386 feature only !
 10468 00003DD0 AC                  <1> 	lodsb
 10469 00003DD1 A2[B6780100]        <1> 	mov	[ACTIVE_PAGE], al ; current video page 
 10470 00003DD6 66AD                <1> 	lodsw
 10471 00003DD8 66A3[D7670000]      <1> 	mov	[CURSOR_MODE], ax ; cursor type
 10472                              <1> 	;lodsd
 10473                              <1> 	;mov	[CURSOR_POSN], eax ; cursor position for video page 0 and 1 
 10474                              <1> 	;lodsd
 10475                              <1> 	;mov	[CURSOR_POSN+4], eax ; cursor position for video page 2 and 3 
 10476                              <1> 	;lodsd
 10477                              <1> 	;mov	[CURSOR_POSN+8], eax ; cursor position for video page 4 and 5 
 10478                              <1> 	;lodsd
 10479                              <1> 	;mov	[CURSOR_POSN+12], eax ; cursor position for video page 6 and 7 
 10480 00003DDE B504                <1> 	mov	ch, 4
 10481 00003DE0 BF[A6780100]        <1> 	mov	edi, CURSOR_POSN
 10482                              <1> bfn_rvs_8:
 10483 00003DE5 A5                  <1> 	movsd
 10484 00003DE6 FECD                <1> 	dec	ch
 10485 00003DE8 75FB                <1> 	jnz	short bfn_rvs_8
 10486                              <1> 	; (font addr) protected mode address in kernel's/system memory space 
 10487                              <1> 	; (not accessable/meaningful address value by user)
 10488 00003DEA AD                  <1> 	lodsd
 10489 00003DEB A3[2E850100]        <1> 	mov	[VGA_INT43H], eax ; VGA current (default) font address
 10490                              <1> 
 10491                              <1> 	; (total 40 bytes are read&written above as BIOS data state)
 10492                              <1> bfn_rvs_9:
 10493                              <1> 	; 13/01/2021
 10494 00003DF0 F6C104              <1> 	test	cl, 4
 10495 00003DF3 7421                <1> 	jz	short bfn_rvs_11
 10496                              <1> 
 10497                              <1> 	;BX++;
 10498                              <1>         ;v = read_byte(ES, BX); BX++;
 10499                              <1>         ;outb(VGAREG_PEL_MASK, read_byte(ES, BX)); BX++;
 10500                              <1>         ;// Set the whole dac always, from 0
 10501                              <1>         ;outb(VGAREG_DAC_WRITE_ADDRESS,0x00);
 10502                              <1>         ;for(i=0;i<256*3;i++) {
 10503                              <1>         ;   outb(VGAREG_DAC_DATA, read_byte(ES, BX)); BX++;
 10504                              <1>         ;}
 10505                              <1>         ;BX++;
 10506                              <1>         ;outb(VGAREG_DAC_WRITE_ADDRESS, v);
 10507                              <1> 
 10508                              <1> 	; /* read/write mode dac */
 10509 00003DF5 AC                  <1> 	lodsb	; skip ; VGAREG_DAC_STATE
 10510 00003DF6 AC                  <1> 	lodsb
 10511 00003DF7 88C4                <1> 	mov	ah, al ; * ; v
 10512 00003DF9 AC                  <1> 	lodsb
 10513 00003DFA 66BAC603            <1> 	mov	dx, VGAREG_PEL_MASK  ; 3C6h
 10514 00003DFE EE                  <1> 	out	dx, al
 10515                              <1> 	;// Set the whole dac always, from 0
 10516 00003DFF 30C0                <1> 	xor	al, al ; 0
 10517                              <1> 	;mov	dx, VGAREG_DAC_WRITE_ADDRESS ; 3C8h
 10518 00003E01 B2C8                <1> 	mov	dl, 0C8h
 10519 00003E03 EE                  <1> 	out	dx, al
 10520                              <1> 
 10521 00003E04 51                  <1> 	push	ecx ; 22/01/2021
 10522                              <1> 	;for(i=0;i<256*3;i++) {
 10523                              <1> 	;mov	ecx, 256*3 ; 768 bytes
 10524                              <1> 	; 03/08/2022
 10525 00003E05 29C9                <1> 	sub	ecx, ecx
 10526 00003E07 B503                <1> 	mov	ch, 3
 10527                              <1> 	; ecx = 300h = 768
 10528                              <1> 	;mov	dx, VGAREG_DAC_DATA ; 3C9h
 10529                              <1> 	;mov	dl, 0C9h
 10530 00003E09 FEC2                <1> 	inc	dl ; dx = 3C9h
 10531                              <1> bfn_rvs_10:
 10532 00003E0B AC                  <1> 	lodsb
 10533 00003E0C EE                  <1> 	out	dx, al
 10534 00003E0D E2FC                <1> 	loop	bfn_rvs_10
 10535 00003E0F 59                  <1> 	pop	ecx ; 22/01/2021
 10536                              <1> 
 10537                              <1> 	; /* color select register */
 10538 00003E10 AC                  <1> 	lodsb	 ; skip 
 10539                              <1> 	
 10540 00003E11 88E0                <1> 	mov	al, ah ; * ; v
 10541                              <1> 
 10542                              <1> 	;mov	dx, VGAREG_DAC_WRITE_ADDRESS ; 3C8h
 10543                              <1> 	;mov	dl, 0C8h
 10544 00003E13 FECA                <1> 	dec	dl ; dx  = 3C8h
 10545 00003E15 EE                  <1> 	out	dx, al ; * ; v
 10546                              <1> 	
 10547                              <1> 	; (total 772 bytes are read above as DAC state)
 10548                              <1> bfn_rvs_11:
 10549 00003E16 C3                  <1> 	retn
 10550                              <1> 
 10551                              <1> vbe_biosfn_restore_video_state:
 10552                              <1> 	; 23/01/2021
 10553                              <1> 	; 13/01/2021 (TRDOS 386 v2.0.3)
 10554                              <1> 	; (vbe.c)
 10555                              <1> 
 10556                              <1> 	; modified registers: eax, edx, esi, ch
 10557                              <1> 	
 10558                              <1> 	; input: esi = state buffer address
 10559                              <1> 	; output: 
 10560                              <1> 	;	 VBE DISPI register contents will be restored
 10561                              <1> 	;	 (18 bytes, 9 words)
 10562                              <1> 
 10563                              <1>  	; enable = read_word(ES, BX);
 10564                              <1> 	; BX += 2;
 10565                              <1> 	;
 10566                              <1> 	; if (!(enable & VBE_DISPI_ENABLED)) {
 10567                              <1>         ;   outw(VBE_DISPI_IOPORT_INDEX,VBE_DISPI_INDEX_ENABLE);
 10568                              <1>         ;   outw(VBE_DISPI_IOPORT_DATA, enable);
 10569                              <1> 	; } else {
 10570                              <1>         ;   outw(VBE_DISPI_IOPORT_INDEX, VBE_DISPI_INDEX_XRES);
 10571                              <1>         ;   outw(VBE_DISPI_IOPORT_DATA, read_word(ES, BX));
 10572                              <1>         ;   BX += 2;
 10573                              <1>         ;   outw(VBE_DISPI_IOPORT_INDEX, VBE_DISPI_INDEX_YRES);
 10574                              <1>         ;   outw(VBE_DISPI_IOPORT_DATA, read_word(ES, BX));
 10575                              <1>         ;   BX += 2;
 10576                              <1>         ;   outw(VBE_DISPI_IOPORT_INDEX, VBE_DISPI_INDEX_BPP);
 10577                              <1>         ;   outw(VBE_DISPI_IOPORT_DATA, read_word(ES, BX));
 10578                              <1>         ;   BX += 2;
 10579                              <1>         ;   outw(VBE_DISPI_IOPORT_INDEX,VBE_DISPI_INDEX_ENABLE);
 10580                              <1>         ;   outw(VBE_DISPI_IOPORT_DATA, enable);
 10581                              <1> 	;
 10582                              <1>         ;  for(i = VBE_DISPI_INDEX_BANK; i <= VBE_DISPI_INDEX_Y_OFFSET; i++)
 10583                              <1> 	;    {
 10584                              <1>         ;     outw(VBE_DISPI_IOPORT_INDEX, i);
 10585                              <1>         ;     outw(VBE_DISPI_IOPORT_DATA, read_word(ES, BX));
 10586                              <1>         ;     BX += 2;
 10587                              <1>         ;    }
 10588                              <1>         ; }
 10589                              <1> 
 10590 00003E17 66AD                <1> 	lodsw	; enable (status, enabled=1, disabled=0)
 10591 00003E19 66BACE01            <1> 	mov	dx, 01CEh ; VBE_DISPI_IOPORT_INDEX
 10592                              <1> 	; 23/01/2021
 10593 00003E1D 6683E001            <1> 	and	ax, 1 ; VBE_DISPI_ENABLED
 10594 00003E21 750B                <1> 	jnz	short vbe_bfn_rvs_1
 10595                              <1> 	; ax = 0
 10596                              <1> 	; VBE_DISPI_DISABLED
 10597                              <1> vbe_bfn_rvs_0:
 10598                              <1> 	; enable (disable) dispi
 10599                              <1> 	; dx = 01CEh ; VBE_DISPI_IOPORT_INDEX
 10600                              <1> 	; ah = 0
 10601 00003E23 50                  <1> 	push	eax
 10602 00003E24 B004                <1> 	mov	al, 04h	; VBE_DISPI_INDEX_ENABLE
 10603 00003E26 66EF                <1> 	out	dx, ax
 10604                              <1> 	;mov	dx, 01CFh ; VBE_DISPI_IOPORT_DATA
 10605 00003E28 FEC2                <1> 	inc	dl
 10606 00003E2A 58                  <1> 	pop	eax
 10607 00003E2B 66EF                <1> 	out	dx, ax ; enable (or disable)
 10608 00003E2D C3                  <1> 	retn
 10609                              <1> vbe_bfn_rvs_1:
 10610                              <1> 	; VBE_DISPI_ENABLED
 10611                              <1> 
 10612                              <1> 	; from VBE_DISPI_INDEX_XRES
 10613                              <1> 	;   to VBE_DISPI_INDEX_BPP	
 10614                              <1> 
 10615 00003E2E B503                <1>  	mov	ch, 3
 10616 00003E30 28C0                <1> 	sub	al, al ; 0 ; VBE_DISPI_INDEX_XRES - 1
 10617                              <1> 	; ax = 0
 10618                              <1> 
 10619 00003E32 E80B000000          <1> 	call	vbe_bfn_rvs_2
 10620                              <1> 
 10621                              <1>         ;outw(VBE_DISPI_IOPORT_INDEX,VBE_DISPI_INDEX_ENABLE);
 10622                              <1> 	;outw(VBE_DISPI_IOPORT_DATA, enable);
 10623                              <1> 
 10624                              <1> 	; 23/01/2021
 10625 00003E37 B001                <1> 	mov	al, 1 ; VBE_DISPI_ENABLED
 10626                              <1> 	; ax = 1
 10627 00003E39 E8E5FFFFFF          <1> 	call	vbe_bfn_rvs_0
 10628                              <1> 
 10629                              <1> 	; from VBE_DISPI_INDEX_BANK
 10630                              <1> 	;   to VBE_DISPI_INDEX_Y_OFFSET
 10631                              <1> 
 10632 00003E3E B505                <1> 	mov	ch, 5
 10633                              <1> 	; 23/01/2021
 10634 00003E40 B004                <1> 	mov	al, 4  ; VBE_DISPI_INDEX_BANK - 1
 10635                              <1> 	; ax = 4
 10636                              <1> vbe_bfn_rvs_2:
 10637 00003E42 FEC0                <1> 	inc	al ; from VBE_DISPI_INDEX_XRES
 10638                              <1> 		     ; to VBE_DISPI_INDEX_BPP	
 10639                              <1> 	;mov	dx, 01CEh ; VBE_DISPI_IOPORT_INDEX
 10640                              <1> 	;mov	dl, 0CEh
 10641 00003E44 66EF                <1> 	out	dx, ax
 10642 00003E46 50                  <1> 	push	eax
 10643                              <1> 	;mov	dx, 01CFh ; VBE_DISPI_IOPORT_DATA
 10644 00003E47 FEC2                <1> 	inc	dl ; 1CFh
 10645 00003E49 66AD                <1> 	lodsw
 10646 00003E4B 66EF                <1> 	out	dx, ax
 10647 00003E4D 58                  <1> 	pop	eax
 10648 00003E4E FECA                <1> 	dec	dl ; 1CEh
 10649 00003E50 FECD                <1> 	dec	ch
 10650 00003E52 75EE                <1> 	jnz	short vbe_bfn_rvs_2		
 10651 00003E54 C3                  <1> 	retn
 10652                              <1> 
 10653                              <1> ; ---------------------------------------------------------
 10654                              <1>  
 10655                              <1> dispi_set_enable:
 10656                              <1> 	; 03/08/2022
 10657                              <1> 	; 23/11/2020
 10658                              <1> 	; Input:
 10659                              <1> 	;	ax = VBE_DISPI_ENABLED = 1
 10660                              <1> 	;	     or VBE_DISPI_DISABLED = 0
 10661                              <1> 	;
 10662                              <1> 	; Modified registers: none
 10663                              <1> 	
 10664                              <1> 	;push	edx
 10665                              <1> 	;push	eax
 10666                              <1> 	;mov	dx, 01CEh ; VBE_DISPI_IOPORT_INDEX
 10667                              <1> 	;mov	ax, 04h	  ; VBE_DISPI_INDEX_ENABLE
 10668                              <1> 	;out	dx, ax
 10669                              <1> 	;pop	eax
 10670                              <1> 	;;mov	dx, 01CFh ; VBE_DISPI_IOPORT_DATA
 10671                              <1> 	;;mov	dl, 0CFh
 10672                              <1> 	;inc	dl
 10673                              <1> 	;out	dx, ax
 10674                              <1> 	;pop	edx
 10675                              <1> 	;retn
 10676                              <1> 
 10677                              <1> 	; 25/11/2020
 10678                              <1> 	; Modified registers: edx
 10679                              <1> 	;;push	edx
 10680                              <1> 	;mov	dx, 04h ; VBE_DISPI_INDEX_ENABLE
 10681                              <1> 	; 03/08/2022
 10682 00003E55 28F6                <1> 	sub	dh, dh
 10683 00003E57 B204                <1> 	mov	dl, 04h ; VBE_DISPI_INDEX_ENABLE
 10684                              <1> 
 10685                              <1> 	;;call	dispi_set_parms
 10686                              <1> 	;;pop	edx
 10687                              <1> 	;;retn
 10688                              <1> 	;jmp	short dispi_set_parms
 10689                              <1> 
 10690                              <1> dispi_set_parms:
 10691                              <1> 	; 03/08/2022
 10692                              <1> 	; 25/11/2020
 10693                              <1> 	; Input:
 10694                              <1> 	;	ax = data
 10695                              <1> 	;	dx = vbe dispi register index
 10696                              <1> 	;
 10697                              <1> 	; Modified registers: edx
 10698                              <1> 
 10699 00003E59 50                  <1> 	push	eax
 10700                              <1> 	;mov	ax, dx
 10701                              <1> 	; 03/08/2022
 10702 00003E5A 89D0                <1> 	mov	eax, edx
 10703 00003E5C 66BACE01            <1> 	mov	dx, 01CEh ; VBE_DISPI_IOPORT_INDEX
 10704 00003E60 66EF                <1> 	out	dx, ax
 10705 00003E62 58                  <1> 	pop	eax
 10706                              <1> 	;mov	dx, 01CFh ; VBE_DISPI_IOPORT_DATA
 10707                              <1> 	;mov	dl, 0CFh
 10708 00003E63 FEC2                <1> 	inc	dl
 10709 00003E65 66EF                <1> 	out	dx, ax
 10710 00003E67 C3                  <1> 	retn
 10711                              <1> 
 10712                              <1> dispi_set_bpp:
 10713                              <1> 	; 03/08/2022
 10714                              <1> 	; 25/11/2020
 10715                              <1> 	; Input:
 10716                              <1> 	;	ax = Bits per pixel value
 10717                              <1> 	;	     (8,16,24,32)
 10718                              <1> 	;
 10719                              <1> 	; Modified registers: none
 10720                              <1> 
 10721                              <1> 	;push	edx
 10722                              <1> 	;push	eax
 10723                              <1> 	;mov	dx, 01CEh ; VBE_DISPI_IOPORT_INDEX
 10724                              <1> 	;mov	ax, 03h	  ; VBE_DISPI_INDEX_BPP
 10725                              <1> 	;out	dx, ax
 10726                              <1> 	;pop	eax
 10727                              <1> 	;;mov	dx, 01CFh ; VBE_DISPI_IOPORT_DATA
 10728                              <1> 	;;mov	dl, 0CFh
 10729                              <1> 	;inc	dl
 10730                              <1> 	;out	dx, ax
 10731                              <1> 	;pop	edx
 10732                              <1> 	;retn
 10733                              <1> 
 10734                              <1> 	; 25/11/2020
 10735                              <1> 	; Modified registers: edx
 10736                              <1> 	;;push	edx
 10737                              <1> 	;mov	dx, 03h ; VBE_DISPI_INDEX_BPP
 10738                              <1> 	; 03/08/2022
 10739 00003E68 28F6                <1> 	sub	dh, dh
 10740 00003E6A B203                <1> 	mov	dl, 03h ; VBE_DISPI_INDEX_BPP	
 10741                              <1> 
 10742                              <1> 	;;call	dispi_set_parms
 10743                              <1> 	;;pop	edx
 10744                              <1> 	;;retn
 10745 00003E6C EBEB                <1> 	jmp	short dispi_set_parms
 10746                              <1> 
 10747                              <1> dispi_set_xres:
 10748                              <1> 	; 03/08/2022
 10749                              <1> 	; 25/11/2020
 10750                              <1> 	; Input:
 10751                              <1> 	;	ax = X resolution (screen witdh)
 10752                              <1> 	;	     (320,640,800,1024,1280,1920)
 10753                              <1> 	;
 10754                              <1> 	; Modified registers: none
 10755                              <1> 
 10756                              <1> 	;push	edx
 10757                              <1> 	;push	eax
 10758                              <1> 	;mov	dx, 01CEh ; VBE_DISPI_IOPORT_INDEX
 10759                              <1> 	;mov	ax, 01h	  ; VBE_DISPI_INDEX_XRES
 10760                              <1> 	;out	dx, ax
 10761                              <1> 	;pop	eax
 10762                              <1> 	;;mov	dx, 01CFh ; VBE_DISPI_IOPORT_DATA
 10763                              <1> 	;;mov	dl, 0CFh
 10764                              <1> 	;inc	dl
 10765                              <1> 	;out	dx, ax
 10766                              <1> 	;pop	edx
 10767                              <1> 	;retn
 10768                              <1> 
 10769                              <1> 	; 25/11/2020
 10770                              <1> 	; Modified registers: edx
 10771                              <1> 	;;push	edx
 10772                              <1> 	;mov	dx, 01h ; VBE_DISPI_INDEX_XRES
 10773                              <1> 	; 03/08/2022
 10774 00003E6E 28F6                <1> 	sub	dh, dh
 10775 00003E70 B201                <1> 	mov	dl, 01h ; VBE_DISPI_INDEX_XRES
 10776                              <1> 	;;call	dispi_set_parms
 10777                              <1> 	;;pop	edx
 10778                              <1> 	;;retn
 10779 00003E72 EBE5                <1> 	jmp	short dispi_set_parms
 10780                              <1> 
 10781                              <1> dispi_set_yres:
 10782                              <1> 	; 03/08/2022
 10783                              <1> 	; 25/11/2020
 10784                              <1> 	; Input:
 10785                              <1> 	;	ax = Y resolution (screen height)
 10786                              <1> 	;	     (200,400,600,720,768,1080)
 10787                              <1> 	;
 10788                              <1> 	; Modified registers: none
 10789                              <1> 
 10790                              <1> 	;push	edx
 10791                              <1> 	;push	eax
 10792                              <1> 	;mov	dx, 01CEh ; VBE_DISPI_IOPORT_INDEX
 10793                              <1> 	;mov	ax, 02h	  ; VBE_DISPI_INDEX_YRES
 10794                              <1> 	;out	dx, ax
 10795                              <1> 	;pop	eax
 10796                              <1> 	;;mov	dx, 01CFh ; VBE_DISPI_IOPORT_DATA
 10797                              <1> 	;;mov	dl, 0CFh
 10798                              <1> 	;inc	dl
 10799                              <1> 	;out	dx, ax
 10800                              <1> 	;pop	edx
 10801                              <1> 	;retn
 10802                              <1> 
 10803                              <1> 	; 25/11/2020
 10804                              <1> 	; Modified registers: edx
 10805                              <1> 	;;push	edx
 10806                              <1> 	;mov	dx, 02h ; VBE_DISPI_INDEX_YRES
 10807                              <1> 	; 03/08/2022
 10808 00003E74 28F6                <1> 	sub	dh, dh
 10809 00003E76 B202                <1> 	mov	dl, 02h ; VBE_DISPI_INDEX_YRES
 10810                              <1> 	;;call	dispi_set_parms
 10811                              <1> 	;;pop	edx
 10812                              <1> 	;;retn
 10813 00003E78 EBDF                <1> 	jmp	short dispi_set_parms
 10814                              <1> 
 10815                              <1> dispi_set_bank:
 10816                              <1> 	; 03/08/2022
 10817                              <1> 	; 25/11/2020
 10818                              <1> 	; Input:
 10819                              <1> 	;	ax = video memory bank number
 10820                              <1> 	;
 10821                              <1> 	; Modified registers: none
 10822                              <1> 
 10823                              <1> 	;push	edx
 10824                              <1> 	;push	eax
 10825                              <1> 	;mov	dx, 01CEh ; VBE_DISPI_IOPORT_INDEX
 10826                              <1> 	;mov	ax, 05h	  ; VBE_DISPI_INDEX_BANK
 10827                              <1> 	;out	dx, ax
 10828                              <1> 	;pop	eax
 10829                              <1> 	;;mov	dx, 01CFh ; VBE_DISPI_IOPORT_DATA
 10830                              <1> 	;;mov	dl, 0CFh
 10831                              <1> 	;inc	dl
 10832                              <1> 	;out	dx, ax
 10833                              <1> 	;pop	edx
 10834                              <1> 	;retn
 10835                              <1> 	
 10836                              <1> 	; 25/11/2020
 10837                              <1> 	; Modified registers: edx
 10838                              <1> 	;;push	edx
 10839                              <1> 	;mov	dx, 05h	; VBE_DISPI_INDEX_BANK
 10840                              <1> 	; 03/08/2022
 10841 00003E7A 28F6                <1> 	sub	dh, dh
 10842 00003E7C B205                <1> 	mov	dl, 05h	; VBE_DISPI_INDEX_BANK
 10843                              <1> 	;;call	dispi_set_parms
 10844                              <1> 	;;pop	edx
 10845                              <1> 	;;retn
 10846 00003E7E EBD9                <1> 	jmp	short dispi_set_parms
 10847                              <1> 
 10848                              <1> dispi_get_enable:
 10849                              <1> 	; 03/08/2022
 10850                              <1> 	; 27/11/2020
 10851                              <1> 	; Input:
 10852                              <1> 	;	none
 10853                              <1> 	; Output:
 10854                              <1> 	;	ax = vbe dispi status
 10855                              <1> 	;
 10856                              <1> 	; Modified registers: eax
 10857                              <1> 	
 10858                              <1> 	;push	edx
 10859                              <1> 	;mov	dx, 01CEh ; VBE_DISPI_IOPORT_INDEX
 10860                              <1> 	;mov	ax, 04h	  ; VBE_DISPI_INDEX_ENABLE
 10861                              <1> 	;out	dx, ax
 10862                              <1> 	;;mov	dx, 01CFh ; VBE_DISPI_IOPORT_DATA
 10863                              <1> 	;;mov	dl, 0CFh
 10864                              <1> 	;inc	dl
 10865                              <1> 	;in	ax, dx
 10866                              <1> 	;pop	edx
 10867                              <1> 	;retn
 10868                              <1> 
 10869                              <1> 	; 27/11/2020
 10870                              <1> 	; Modified registers: eax, edx
 10871                              <1> 	;;push	edx
 10872                              <1> 	;mov	ax, 04h ; VBE_DISPI_INDEX_ENABLE
 10873                              <1> 	; 03/08/2022
 10874 00003E80 28E4                <1> 	sub	ah, ah
 10875 00003E82 B004                <1> 	mov	al, 04h ; VBE_DISPI_INDEX_ENABLE
 10876                              <1> 
 10877                              <1> 	;;call	dispi_get_parms
 10878                              <1> 	;;pop	edx
 10879                              <1> 	;;retn
 10880                              <1> 	;jmp	short dispi_get_parms
 10881                              <1> 
 10882                              <1> dispi_get_parms:
 10883                              <1> 	; 25/11/2020
 10884                              <1> 	; Input:
 10885                              <1> 	;	ax = vbe dispi register index
 10886                              <1> 	; output:
 10887                              <1> 	;	ax = data
 10888                              <1> 	;
 10889                              <1> 	; Modified registers: eax, edx
 10890                              <1> 
 10891 00003E84 66BACE01            <1> 	mov	dx, 01CEh ; VBE_DISPI_IOPORT_INDEX
 10892 00003E88 66EF                <1> 	out	dx, ax
 10893                              <1> 	;mov	dx, 01CFh ; VBE_DISPI_IOPORT_DATA
 10894                              <1> 	;mov	dl, 0CFh
 10895 00003E8A FEC2                <1> 	inc	dl
 10896 00003E8C 66ED                <1> 	in	ax, dx
 10897 00003E8E C3                  <1> 	retn
 10898                              <1> 
 10899                              <1> vga_compat_setup:
 10900                              <1> 	; 03/08/2022
 10901                              <1> 	; 26/11/2020
 10902                              <1> 	; 25/11/2020
 10903                              <1> 	; VGA compatibility setup
 10904                              <1> 	; (vbe.c, 02/01/2020, vruppert)
 10905                              <1> 	;
 10906                              <1> 	; Input:
 10907                              <1> 	;	none
 10908                              <1> 	;
 10909                              <1> 	; Modified registers: eax, edx
 10910                              <1> 	
 10911                              <1> 	; 26/11/2020
 10912                              <1>   	;push	eax
 10913                              <1>   	;push	edx
 10914                              <1> 
 10915                              <1>   	; set CRT X resolution
 10916 00003E8F 66BACE01            <1>   	mov	dx, 1CEh ; VBE_DISPI_IOPORT_INDEX
 10917                              <1>   	;mov	ax, 01h  ; VBE_DISPI_INDEX_XRES
 10918                              <1>   	; 03/08/2022
 10919 00003E93 31C0                <1> 	xor	eax, eax
 10920 00003E95 FEC0                <1> 	inc	al
 10921                              <1> 	; eax = 1
 10922 00003E97 66EF                <1> 	out	dx, ax
 10923                              <1>   	;mov	dx, 1CFh ; VBE_DISPI_IOPORT_DATA
 10924 00003E99 FEC2                <1>   	inc	dl
 10925 00003E9B 66ED                <1> 	in	ax, dx
 10926 00003E9D 50                  <1> 	push	eax
 10927 00003E9E 66BAD403            <1> 	mov	dx, 3D4h ; VGAREG_VGA_CRTC_ADDRESS
 10928 00003EA2 66B81100            <1> 	mov	ax, 0011h ; Vertical retrace end register
 10929 00003EA6 66EF                <1>   	out	dx, ax
 10930                              <1>   	;pop	eax
 10931                              <1>   	;push	eax
 10932 00003EA8 8B0424              <1>   	mov	eax, [esp]
 10933                              <1> 	;shr	ax, 3 ; / 8 for pixel to character
 10934                              <1> 	;dec	ax  ; - 1 (EGA or VGA?)
 10935                              <1>   	; 03/08/2022
 10936 00003EAB C1E803              <1> 	shr	eax, 3
 10937 00003EAE 48                  <1>   	dec	eax
 10938 00003EAF 88C4                <1> 	mov	ah, al
 10939 00003EB1 B001                <1>   	mov	al, 01h ; Horizontal display end register
 10940 00003EB3 66EF                <1>   	out	dx, ax
 10941 00003EB5 58                  <1>   	pop	eax
 10942                              <1> 
 10943 00003EB6 E89C000000          <1> 	call	vga_set_virt_width
 10944                              <1> 
 10945                              <1>   	; set CRT Y resolution
 10946                              <1> 	; 03/08/2022
 10947 00003EBB 66BACE01            <1>   	mov	dx, 1CEh ; VBE_DISPI_IOPORT_INDEX
 10948 00003EBF 66B80200            <1>   	mov	ax, 02h  ; VBE_DISPI_INDEX_YRES
 10949 00003EC3 66EF                <1>   	out	dx, ax
 10950                              <1>   	;mov	dx, 1CFh ; VBE_DISPI_IOPORT_DATA
 10951                              <1> 	; 03/08/2022
 10952 00003EC5 FEC2                <1>   	inc	dl
 10953 00003EC7 66ED                <1> 	in	ax, dx
 10954 00003EC9 50                  <1> 	push	eax
 10955 00003ECA 66BAD403            <1> 	mov	dx, 3D4h ; VGAREG_VGA_CRTC_ADDRESS
 10956 00003ECE 88C4                <1>   	mov	ah, al
 10957 00003ED0 B012                <1> 	mov	al, 12h ; Vertical display end register
 10958 00003ED2 66EF                <1>   	out	dx, ax
 10959 00003ED4 58                  <1>   	pop	eax
 10960 00003ED5 B007                <1>   	mov	al, 07h	; Overflow register
 10961 00003ED7 EE                  <1>   	out	dx, al
 10962                              <1>   	;inc	dx
 10963                              <1>   	; 03/08/2022
 10964 00003ED8 FEC2                <1> 	inc	dl
 10965 00003EDA EC                  <1> 	in	al, dx ; read overflow register
 10966 00003EDB 24BD                <1>   	and	al, 0BDh ; clear VDE 9th and 10th bits	
 10967 00003EDD F6C401              <1>   	test	ah, 01h
 10968 00003EE0 7402                <1>   	jz	short bit8_clear
 10969 00003EE2 0C02                <1>   	or	al, 02h ; VDE 9th bit (bit 8) in bit 1
 10970                              <1> bit8_clear:
 10971 00003EE4 F6C402              <1>   	test	ah, 02h
 10972 00003EE7 7402                <1>   	jz	short bit9_clear
 10973 00003EE9 0C40                <1>   	or	al, 40h ; VDE 10th bit (bit 9) in bit 6
 10974                              <1> bit9_clear:
 10975 00003EEB EE                  <1>   	out	dx, al
 10976                              <1> 
 10977                              <1>   	; other settings
 10978                              <1>  	;mov	dx, 3D4h ; VGAREG_VGA_CRTC_ADDRESS
 10979                              <1>   	; 03/08/2022
 10980 00003EEC B2D4                <1> 	mov	dl, 0D4h
 10981 00003EEE 66B80900            <1> 	mov	ax, 0009h ; Maximum scan line register
 10982 00003EF2 66EF                <1>   	out	dx, ax	; Reset
 10983 00003EF4 B017                <1>   	mov	al, 17h ; Mode control register		
 10984 00003EF6 EE                  <1>   	out	dx, al
 10985                              <1>  	;mov	dx, 3D5h ; VGAREG_VGA_CRTC_DATA
 10986 00003EF7 FEC2                <1>   	inc	dl
 10987 00003EF9 EC                  <1> 	in	al, dx	; Read mode control register
 10988 00003EFA 0C03                <1>   	or	al, 03h ; Set SRS and CMS bits
 10989 00003EFC EE                  <1>   	out	dx, al 
 10990                              <1>   	;mov	dx, 3DAh ; VGAREG_ACTL_RESET
 10991                              <1>   	; 03/08/2022
 10992 00003EFD B2DA                <1> 	mov	dl, 0DAh
 10993 00003EFF EC                  <1> 	in	al, dx	 ; clear flip-flop
 10994                              <1>   	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
 10995                              <1>   	; 03/08/2022
 10996 00003F00 B2C0                <1> 	mov	dl, 0C0h
 10997 00003F02 B010                <1> 	mov	al, 10h	; Mode control register
 10998 00003F04 EE                  <1>   	out	dx, al
 10999                              <1> 	;mov	dx, 3C1h ; VGAREG_ACTL_READ_DATA
 11000 00003F05 FEC2                <1> 	inc	dl
 11001 00003F07 EC                  <1> 	in	al, dx
 11002 00003F08 0C01                <1> 	or	al, 01h ; select graphics mode
 11003                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
 11004 00003F0A FECA                <1> 	dec	dl
 11005 00003F0C EE                  <1> 	out	dx, al ; Write to mode control register
 11006 00003F0D B020                <1> 	mov	al, 20h ; Palette RAM <-> display memory
 11007 00003F0F EE                  <1> 	out	dx, al ; Write to attribute addr register
 11008                              <1> 	;mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
 11009                              <1> 	; 03/08/2022
 11010 00003F10 B2CE                <1> 	mov	dl, 0CEh 
 11011 00003F12 66B80605            <1> 	mov	ax, 0506h ; Misc. register, graph, mm 1
 11012 00003F16 66EF                <1> 	out	dx, ax
 11013                              <1> 	;mov	dx, 3C4h ; VGAREG_SEQU_ADDRESS
 11014                              <1> 	; 03/08/2022
 11015 00003F18 B2C4                <1> 	mov	dl, 0C4h 
 11016 00003F1A 66B8020F            <1> 	mov	ax, 0F02h ; Map mask register, all planes
 11017 00003F1E 66EF                <1> 	out	dx, ax
 11018                              <1> 
 11019                              <1>   	; settings for >= 8bpp
 11020                              <1> 
 11021                              <1> 	;mov	dx, 1CEh ; VBE_DISPI_IOPORT_INDEX
 11022                              <1> 	;mov	ax, 03h ; VBE_DISPI_INDEX_BPP
 11023                              <1> 	;out	dx, ax
 11024                              <1> 	;;mov	dx, 1CFh ; VBE_DISPI_IOPORT_DATA
 11025                              <1> 	;inc	dl
 11026                              <1> 	;in	ax, dx
 11027                              <1> 	;cmp	al, 08h  ; < 8 bits per pixel
 11028                              <1> 	;jb	short vga_compat_end
 11029                              <1> 
 11030                              <1> 	;mov	dx, 3D4h ; VGAREG_VGA_CRTC_ADDRESS
 11031                              <1> 	; 03/08/2022
 11032 00003F20 B2D4                <1> 	mov	dl, 0D4h
 11033 00003F22 B014                <1> 	mov	al, 14h  ; Underline location register
 11034 00003F24 EE                  <1> 	out	dx, al
 11035                              <1> 	;mov	dx, 3D5h ; VGAREG_VGA_CRTC_DATA
 11036 00003F25 FEC2                <1> 	inc	dl
 11037 00003F27 EC                  <1> 	in	al, dx	
 11038 00003F28 0C40                <1> 	or	al, 40h	 ; enable double word mode
 11039 00003F2A EE                  <1> 	out	dx, al
 11040                              <1> 	;mov	dx, 3DAh ; VGAREG_ACTL_RESET
 11041                              <1> 	; 03/08/2022
 11042 00003F2B B2DA                <1> 	mov	dl, 0DAh
 11043 00003F2D EC                  <1> 	in	al, dx	 ; clear flip-flop
 11044                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
 11045                              <1> 	; 03/08/2022
 11046 00003F2E B2C0                <1> 	mov	dl, 0C0h
 11047 00003F30 B010                <1> 	mov	al, 10h	 ; Mode control register
 11048 00003F32 EE                  <1> 	out	dx, al
 11049                              <1> 	;mov	dx, 3C1h ; VGAREG_ACTL_READ_DATA
 11050 00003F33 FEC2                <1> 	inc	dl
 11051 00003F35 EC                  <1> 	in	al, dx
 11052 00003F36 0C40                <1> 	or	al, 40h  ; Pixel clock select is 1
 11053                              <1> 	;mov	dx, 3C0h ; VGAREG_ACTL_ADDRESS
 11054 00003F38 FECA                <1> 	dec	dl
 11055 00003F3A EE                  <1> 	out	dx, al	 ; update mode control reggister
 11056 00003F3B B020                <1> 	mov	al, 20h	 ; select display memory as PAS	
 11057 00003F3D EE                  <1> 	out	dx, al
 11058                              <1> 	;mov	dx, 3C4h ; VGAREG_SEQU_ADDRESS
 11059                              <1> 	; 03/08/2022
 11060 00003F3E B2C4                <1> 	mov	dl, 0C4h
 11061 00003F40 B004                <1> 	mov	al, 04h	; Memory mode register
 11062 00003F42 EE                  <1> 	out	dx, al
 11063                              <1> 	;mov	dx, 3C5h ; VGAREG_SEQU_DATA
 11064 00003F43 FEC2                <1> 	inc	dl
 11065 00003F45 EC                  <1> 	in	al, dx
 11066 00003F46 0C08                <1> 	or	al, 08h	; enable chain four
 11067 00003F48 EE                  <1> 	out	dx, al
 11068                              <1> 	;mov	dx, 3CEh ; VGAREG_GRDC_ADDRESS
 11069                              <1> 	; 03/08/2022
 11070 00003F49 B2CE                <1> 	mov	dl, 0CEh
 11071 00003F4B B005                <1> 	mov	al, 05h	 ; Mode register	
 11072 00003F4D EE                  <1> 	out	dx, al
 11073                              <1> 	;mov	dx, 3CFh ; VGAREG_GRDC_DATA
 11074 00003F4E FEC2                <1> 	inc	dl
 11075 00003F50 EC                  <1> 	in	al, dx	
 11076 00003F51 249F                <1> 	and	al, 9Fh	 ; clear shift register 
 11077 00003F53 0C40                <1> 	or	al, 40h  ; set shift register to 2
 11078 00003F55 EE                  <1> 	out	dx, al
 11079                              <1> 
 11080                              <1> vga_compat_end:
 11081                              <1>   	;pop	edx
 11082                              <1>   	;pop	eax
 11083 00003F56 C3                  <1> 	retn
 11084                              <1> 
 11085                              <1> vga_set_virt_width:
 11086                              <1> 	; 03/08/2022
 11087                              <1> 	; 27/11/2020
 11088                              <1> 	; 25/11/2020
 11089                              <1> 	; (vbe.c, 02/01/2020, vruppert)
 11090                              <1> 	;
 11091                              <1> 	; Input:
 11092                              <1> 	;	AX = resolution (screen width)
 11093                              <1> 	;
 11094                              <1> 	; Modified registers: eax, edx
 11095                              <1> 
 11096                              <1>   	;;push	ebx
 11097                              <1>   	;push	edx
 11098                              <1> 	;push	eax
 11099                              <1>   	;mov	ebx, eax
 11100                              <1>   	;call	dispi_get_bpp ; bits per pixel
 11101                              <1> 	;cmp	al, 4
 11102                              <1> 	;ja	short set_width_svga  ; 8, 16, 24, 32 
 11103                              <1> 	;shr	bx, 1
 11104                              <1> ;set_width_svga:
 11105                              <1> 	;shr	bx, 3
 11106                              <1> 	;mov	eax, [esp]
 11107                              <1> 	;shr	ax, 3	; / 8, bytes per row
 11108                              <1> 	; 03/08/2022
 11109 00003F57 C1E803              <1> 	shr	eax, 3
 11110 00003F5A 66BAD403            <1> 	mov	dx, 3D4h ; VGAREG_VGA_CRTC_ADDRESS
 11111                              <1> 	;mov	ah, bl	; 
 11112 00003F5E 88C4                <1> 	mov	ah, al	; width in bytes
 11113 00003F60 B013                <1> 	mov	al, 13h	; offset register
 11114 00003F62 66EF                <1> 	out	dx, ax	; index (3D4h) and data (3D5h)
 11115                              <1> 	;pop	eax
 11116                              <1> 	;pop  	edx
 11117                              <1> 	;;pop	ebx
 11118 00003F64 C3                  <1> 	retn
 11119                              <1> 
 11120                              <1> ; 24/11/2020
 11121                              <1> 
 11122                              <1> struc bmi ; BOCHS/PLEX86 MODE INFO structure/table 
 11123 00000000 ????                <1>  .mode:	  resw 1
 11124 00000002 ????                <1>  .width:  resw 1
 11125 00000004 ????                <1>  .height: resw 1
 11126 00000006 ????                <1>  .depth:  resw 1
 11127                              <1>  .size:	
 11128                              <1> endstruc
 11129                              <1> 
 11130                              <1> ; 24/11/2020
 11131                              <1> struc MODEINFO
 11132 00000000 ????                <1>  .mode:			resw 1  ; 1XXh
 11133 00000002 ????                <1>  .ModeAttributes:	resw 1
 11134 00000004 ??                  <1>  .WinAAttributes:	resb 1
 11135 00000005 ??                  <1>  .WinBAttributes:	resb 1	; = 0
 11136 00000006 ????                <1>  .WinGranularity:	resw 1
 11137 00000008 ????                <1>  .WinSize:		resw 1
 11138 0000000A ????                <1>  .WinASegment:		resw 1
 11139 0000000C ????                <1>  .WinBSegment:		resw 1	; = 0
 11140 0000000E ????????            <1>  .WinFuncPtr:		resd 1	; = 0
 11141 00000012 ????                <1>  .BytesPerScanLine:	resw 1
 11142 00000014 ????                <1>  .XResolution:		resw 1
 11143 00000016 ????                <1>  .YResolution:		resw 1
 11144 00000018 ??                  <1>  .XCharSize:		resb 1
 11145 00000019 ??                  <1>  .YCharSize:		resb 1
 11146 0000001A ??                  <1>  .NumberOfPlanes: 	resb 1
 11147 0000001B ??                  <1>  .BitsPerPixel:		resb 1
 11148 0000001C ??                  <1>  .NumberOfBanks:	resb 1
 11149 0000001D ??                  <1>  .MemoryModel:		resb 1
 11150 0000001E ??                  <1>  .BankSize:		resb 1	; = 0
 11151 0000001F ??                  <1>  .NumberOfImagePages: 	resb 1
 11152 00000020 ??                  <1>  .Reserved_page:	resb 1	; = 0
 11153 00000021 ??                  <1>  .RedMaskSize:		resb 1
 11154 00000022 ??                  <1>  .RedFieldPosition: 	resb 1
 11155 00000023 ??                  <1>  .GreenMaskSize:	resb 1
 11156 00000024 ??                  <1>  .GreenFieldPosition: 	resb 1
 11157 00000025 ??                  <1>  .BlueMaskSize:		resb 1
 11158 00000026 ??                  <1>  .BlueFieldPosition: 	resb 1
 11159 00000027 ??                  <1>  .RsvdMaskSize:		resb 1
 11160 00000028 ??                  <1>  .RsvdFieldPosition: 	resb 1
 11161 00000029 ??                  <1>  .DirectColorModeInfo: 	resb 1
 11162 0000002A ????????            <1>  .PhysBasePtr:		resd 1
 11163 0000002E ????????            <1>  .OffScreenMemOffset: 	resd 1	; = 0
 11164 00000032 ????                <1>  .OffScreenMemSize: 	resw 1	; = 0
 11165 00000034 ????                <1>  .LinBytesPerScanLine: 	resw 1
 11166 00000036 ??                  <1>  .BnkNumberOfPages: 	resb 1
 11167 00000037 ??                  <1>  .LinNumberOfPages: 	resb 1
 11168 00000038 ??                  <1>  .LinRedMaskSize:	resb 1
 11169 00000039 ??                  <1>  .LinRedFieldPosition1: resb 1
 11170 0000003A ??                  <1>  .LinGreenMaskSize1: 	resb 1
 11171 0000003B ??                  <1>  .LinGreenFieldPosition:resb 1
 11172 0000003C ??                  <1>  .LinBlueMaskSize: 	resb 1
 11173 0000003D ??                  <1>  .LinBlueFieldPosition:	resb 1
 11174 0000003E ??                  <1>  .LinRsvdMaskSize: 	resb 1
 11175 0000003F ??                  <1>  .LinRsvdFieldPosition:	resb 1
 11176 00000040 ????????            <1>  .MaxPixelClock:	resd 1	; = 0
 11177                              <1> .size:
 11178                              <1> endstruc
 11179                              <1> 
 11180                              <1> ; 10/12/2020
 11181                              <1> struc LFBINFO
 11182 00000000 ????                <1>  .mode:			resw 1  ; 1XXh
 11183 00000002 ????????            <1>  .LFB_addr:		resd 1
 11184 00000006 ????????            <1>  .LFB_size:		resd 1
 11185 0000000A ????                <1>  .X_res:		resw 1
 11186 0000000C ????                <1>  .Y_res:		resw 1
 11187 0000000E ??                  <1>  .bpp:			resb 1
 11188 0000000F ??                  <1>  .reserved:		resb 1
 11189                              <1> .size:	; 16 bytes
 11190                              <1> endstruc
 11191                              <1> 
 11192                              <1> set_mode_info_list:
 11193                              <1> 	; 14/12/2020
 11194                              <1> 	; 11/12/2020
 11195                              <1> 	; 24/11/2020
 11196                              <1> 	; (vbetables-gen.c)
 11197                              <1> 	; Input:
 11198                              <1> 	;	BX = VBE mode (including bochs special modes) 
 11199                              <1> 	; Output:
 11200                              <1> 	;	;;EAX = MODE_INFO_LIST address
 11201                              <1> 	;	EAX = 0 ; 11/12/2020
 11202                              <1> 	;	ESI = MODE_INFO_LIST address ; 11/12/2020
 11203                              <1> 	;	(if mode is not found, ESI = 0)
 11204                              <1> 	;
 11205                              <1> 	; Modified registers: eax, ebx, ecx, edx, esi, edi 
 11206                              <1> 
 11207 00003F65 BE[4A6B0000]        <1> 	mov	esi, b_vbe_modes ; bochs mode info base table
 11208 00003F6A BF[F29E0100]        <1> 	mov	edi, MODE_INFO_LIST ; mode info list (4F01h)
 11209                              <1> sml_0:
 11210 00003F6F 66AD                <1> 	lodsw	
 11211 00003F71 6639D8              <1> 	cmp	ax, bx ; is mode number same ?
 11212 00003F74 7410                <1> 	je	short sml_1 ; yes
 11213 00003F76 AD                  <1> 	lodsd
 11214 00003F77 66AD                <1> 	lodsw	
 11215 00003F79 81FE[0A6C0000]      <1> 	cmp	esi, end_of_b_vbe_modes
 11216 00003F7F 72EE                <1> 	jb	short sml_0
 11217                              <1> 	; not found
 11218 00003F81 31C0                <1> 	xor	eax, eax ; 0
 11219                              <1> 	; 11/12/2020
 11220 00003F83 31F6                <1> 	xor	esi, esi
 11221 00003F85 C3                  <1> 	retn
 11222                              <1> sml_1:
 11223 00003F86 66AB                <1> 	stosw	; mode
 11224 00003F88 AD                  <1> 	lodsd	; width, height
 11225                              <1> 	; 14/12/2020
 11226 00003F89 89C1                <1> 	mov	ecx, eax
 11227 00003F8B 50                  <1> 	push	eax ; ***
 11228 00003F8C 29C0                <1> 	sub	eax, eax ; clear high word of eax
 11229 00003F8E 66AD                <1> 	lodsw	; depth
 11230 00003F90 50                  <1> 	push	eax ; **
 11231                              <1> 
 11232                              <1> 	;add	al, 7 ; only for 15 bit colors (not used here)
 11233 00003F91 C0E803              <1> 	shr	al, 3 ; / 8
 11234                              <1> 	; 14/12/2020
 11235 00003F94 66F7E1              <1> 	mul	cx  ; pitch = width * ((depth+7)/8)
 11236                              <1> 		; ax = pitch
 11237 00003F97 50                  <1> 	push	eax ; * ; high word of eax = 0
 11238 00003F98 C1E910              <1> 	shr	ecx, 16
 11239                              <1> 	;mul	cx
 11240                              <1> 	;mov	cx, ax
 11241 00003F9B 31D2                <1> 	xor	edx, edx  ; clear high word of edx
 11242 00003F9D F7E1                <1> 	mul	ecx ; height * pitch
 11243 00003F9F 89C1                <1> 	mov	ecx, eax
 11244 00003FA1 B800000001          <1> 	mov	eax, VBE_DISPI_TOTAL_VIDEO_MEMORY_MB * 1024 * 1024
 11245 00003FA6 F7F1                <1> 	div	ecx
 11246                              <1> 		; eax = pages = vram_size / (height*pitch)
 11247                              <1> 	
 11248                              <1> 	;mov	cx, ax
 11249 00003FA8 89C1                <1> 	mov	ecx, eax ; pages 
 11250                              <1> 		
 11251 00003FAA 66B89B00            <1> 	mov	ax, MODE_ATTRIBUTES
 11252 00003FAE 66AB                <1> 	stosw	; ModeAttributes
 11253 00003FB0 B007                <1> 	mov	al, WINA_ATTRIBUTES
 11254 00003FB2 AA                  <1> 	stosb	; WinAAttributes
 11255 00003FB3 30C0                <1> 	xor	al, al ; WinBAttributes = 0
 11256 00003FB5 AA                  <1> 	stosb
 11257 00003FB6 66B84000            <1> 	mov	ax, VBE_DISPI_BANK_SIZE_KB
 11258 00003FBA 66AB                <1> 	stosw	; WinGranularity
 11259 00003FBC 66AB                <1> 	stosw	; WinSize
 11260 00003FBE 66B800A0            <1> 	mov	ax, VGAMEM_GRAPH
 11261 00003FC2 66AB                <1> 	stosw	; WinASegment
 11262 00003FC4 29C0                <1> 	sub	eax, eax
 11263 00003FC6 66AB                <1> 	stosw	; WinBSegment = 0
 11264 00003FC8 AB                  <1> 	stosd	; WinFuncPtr = 0
 11265                              <1> 
 11266 00003FC9 58                  <1> 	pop	eax ; * ; pitch
 11267 00003FCA 89C3                <1> 	mov	ebx, eax  ; high word of ebx = 0 ; 14/12/2020
 11268 00003FCC 66AB                <1> 	stosw	; BytesPerScanLine
 11269                              <1> 
 11270 00003FCE 5A                  <1> 	pop	edx ; ** ; depth (bits per pixel)
 11271 00003FCF 58                  <1> 	pop	eax ; *** width, height
 11272                              <1> 
 11273                              <1>  	; // Mandatory information for VBE 1.2 and above
 11274                              <1> 
 11275 00003FD0 66AB                <1> 	stosw	; XResolution (width)
 11276 00003FD2 C1E810              <1> 	shr	eax, 16
 11277 00003FD5 50                  <1> 	push	eax ; **** height
 11278 00003FD6 66AB                <1> 	stosw	; YResolution (height)
 11279 00003FD8 B008                <1> 	mov	al, 8
 11280 00003FDA AA                  <1>  	stosb	; XCharSize  ; char width
 11281 00003FDB B010                <1> 	mov	al, 16
 11282 00003FDD AA                  <1> 	stosb	; YCharSize  ; char height
 11283 00003FDE B001                <1> 	mov	al, 1
 11284 00003FE0 AA                  <1> 	stosb	; NumberOfPlanes
 11285                              <1> 	;movzx	eax, dl
 11286 00003FE1 88D0                <1> 	mov	al, dl ; eax <= 32
 11287 00003FE3 AA                  <1> 	stosb	; BitsPerPixel
 11288                              <1> 	; Number of banks = (height * pitch + 65535) / 65536
 11289 00003FE4 58                  <1> 	pop	eax ; **** ; height
 11290                              <1> 	; 14/12/2020
 11291 00003FE5 52                  <1> 	push	edx ; ***** ; depth ; edx <= 32
 11292 00003FE6 F7E3                <1> 	mul	ebx  ; pitch (ebx) * height (eax)
 11293                              <1> 	;mov	edx, [esp] ; *****
 11294                              <1> 	;mov	dl, [esp] ; *****
 11295 00003FE8 05FFFF0000          <1> 	add	eax, 65535
 11296 00003FED C1E810              <1> 	shr	eax, 16 ; / 65536 ; <= 127 ; 14/12/2020
 11297 00003FF0 AA                  <1> 	stosb	; NumberOfBanks
 11298                              <1> 	; 14/12/2020
 11299                              <1> 	;cmp	dl, 8 ; 8 bits per pixel
 11300 00003FF1 803C2408            <1> 	cmp	byte [esp], 8
 11301 00003FF5 7704                <1> 	ja	short sml_2
 11302 00003FF7 B004                <1> 	mov	al, VBE_MEMORYMODEL_PACKED_PIXEL
 11303 00003FF9 EB02                <1> 	jmp	short sml_3
 11304                              <1> sml_2:
 11305                              <1> 	; 16, 24, 32 bits per pixel
 11306 00003FFB B006                <1> 	mov	al, VBE_MEMORYMODEL_DIRECT_COLOR
 11307                              <1> sml_3:
 11308 00003FFD AA                  <1> 	stosb
 11309 00003FFE 30C0                <1> 	xor	al, al ; 0
 11310 00004000 AA                  <1> 	stosb	; BankSize = 0
 11311 00004001 49                  <1> 	dec	ecx ; pages - 1
 11312                              <1> 	; NumberOfImagePages = 262 for 320x200x8 mode
 11313                              <1> 	;;mov	ax, 255
 11314                              <1> 	; 14/12/2020
 11315                              <1> 	;mov	al, 255
 11316 00004002 FEC8                <1> 	dec	al ; 255
 11317 00004004 39C1                <1> 	cmp	ecx, eax ; ecx <= 261, eax = 255 
 11318                              <1> 	;cmp	cx, ax
 11319 00004006 7302                <1> 	jnb	short sml_4
 11320 00004008 88C8                <1> 	mov	al, cl	 
 11321                              <1> sml_4:
 11322 0000400A AA                  <1> 	stosb	; NumberOfImagePages (1 byte)
 11323 0000400B 28C0                <1> 	sub	al, al
 11324 0000400D AA                  <1> 	stosb	; Reserved_page = 0
 11325 0000400E 58                  <1> 	pop	eax ; ***** ; depth
 11326 0000400F 88C1                <1> 	mov	cl, al
 11327                              <1> 	; eax < = 32
 11328 00004011 2C08                <1> 	sub	al, 8 ; 8->0, 16->8, 24->16, 32->24
 11329 00004013 BE[0A6C0000]        <1> 	mov	esi, direct_color_fields
 11330 00004018 01C6                <1> 	add	esi, eax
 11331 0000401A 56                  <1> 	push	esi ; ******
 11332 0000401B AD                  <1> 	lodsd	; RedMaskSize (AL), RedFieldPosition (AH)
 11333                              <1> 	     	; GreenMaskSize (16), GreenFieldPosition (24)
 11334 0000401C AB                  <1> 	stosd
 11335 0000401D AD                  <1> 	lodsd	; BlueMaskSize (AL), BlueFieldPosition (AH)
 11336                              <1> 	     	; RsvdMaskSize (16), RsvdFieldPosition (24)
 11337 0000401E AB                  <1> 	stosd
 11338 0000401F 5E                  <1> 	pop	esi ; ******
 11339                              <1> 
 11340 00004020 30C0                <1> 	xor	al, al ; 0
 11341 00004022 80F920              <1> 	cmp	cl, 32
 11342 00004025 7202                <1> 	jb	short sml_5
 11343 00004027 B002                <1> 	mov	al, VBE_DIRECTCOLOR_RESERVED_BITS_AVAILABLE
 11344                              <1> sml_5: 
 11345 00004029 AA                  <1> 	stosb	; DirectColorModeInfo
 11346                              <1> 
 11347                              <1> 	; // Mandatory information for VBE 2.0 and above
 11348                              <1> 
 11349 0000402A B8000000E0          <1> 	mov	eax, VBE_DISPI_LFB_PHYSICAL_ADDRESS
 11350 0000402F AB                  <1> 	stosd	; PhysBasePtr
 11351 00004030 29C0                <1> 	sub	eax, eax
 11352 00004032 AB                  <1> 	stosd	; OffScreenMemOffset = 0
 11353 00004033 66AB                <1> 	stosw	; OffScreenMemSize = 0
 11354                              <1> 
 11355                              <1> 	;// Mandatory information for VBE 3.0 and above
 11356                              <1> 
 11357                              <1> 	; ebx = pitch
 11358 00004035 6689D8              <1> 	mov	ax, bx
 11359                              <1> 	;stosw
 11360                              <1> 
 11361                              <1> 	;xor	al, al
 11362                              <1>      	;stosb	; BnkNumberOfPages = 0
 11363                              <1>      	;stosb	; LinNumberOfPages = 0
 11364                              <1> 
 11365 00004038 AB                  <1> 	stosd	; pitch (word), 0 (byte), 0 (byte)  
 11366                              <1> 
 11367 00004039 AD                  <1> 	lodsd	; LinRedMaskSize (AL), LinRedFieldPosition (AH)
 11368                              <1> 	     	; LinGreenMaskSize (16), LinGreenFieldPosition (24)
 11369 0000403A AB                  <1> 	stosd
 11370 0000403B AD                  <1> 	lodsd	; LinBlueMaskSize (AL), LinBlueFieldPosition (AH)
 11371                              <1> 	     	; LinRsvdMaskSize (16), LinRsvdFieldPosition (24)
 11372 0000403C AB                  <1> 	stosd
 11373                              <1> 
 11374 0000403D 29C0                <1> 	sub	eax, eax
 11375 0000403F AB                  <1> 	stosd	; MaxPixelClock = 0
 11376                              <1> 
 11377                              <1> 	;mov	eax, MODE_INFO_LIST
 11378                              <1> 	; 11/12/2020
 11379 00004040 BE[F29E0100]        <1> 	mov	esi, MODE_INFO_LIST
 11380                              <1> 	
 11381 00004045 C3                  <1> 	retn	
 11382                              <1> 
 11383                              <1> ; end of set_mode_info_list ; edi = set_mode_info_list + 68
 11384                              <1> 
 11385                              <1> pci_get_lfb_addr:
 11386                              <1> 	; 11/12/2020
 11387                              <1> 	; Get linear frame buffer base from PCI
 11388                              <1> 	; (vgabios.c, 02/01/2020, vruppert)
 11389                              <1> 	;
 11390                              <1> 	; Input:
 11391                              <1> 	;	ax = PCI device vendor id
 11392                              <1> 	; Output:
 11393                              <1> 	;	ax  = LFB address (high 16 bit) (zf=0)
 11394                              <1> 	;	eax = 0 -> not found (error) (zf=1)
 11395                              <1> 	;
 11396                              <1> 	; Modified registers: eax
 11397                              <1> 
 11398 00004046 53                  <1> 	push	ebx
 11399 00004047 51                  <1> 	push	ecx
 11400 00004048 52                  <1> 	push	edx
 11401                              <1> 	;
 11402 00004049 89C3                <1> 	mov	ebx, eax
 11403 0000404B 31C9                <1> 	xor	ecx, ecx
 11404 0000404D 28D2                <1> 	sub	dl, dl	; mov dl, 0
 11405 0000404F E842000000          <1> 	call	pci_read_reg
 11406 00004054 6683F8FF            <1> 	cmp	ax, 0FFFFh
 11407 00004058 7417                <1> 	je	short pci_get_lfb_addr_fail
 11408                              <1> pci_get_lfb_addr_next_dev:
 11409 0000405A 28D2                <1> 	sub	dl, dl ; mov dl, 0
 11410 0000405C E835000000          <1> 	call	pci_read_reg
 11411 00004061 6639D8              <1> 	cmp	ax, bx	; check vendor
 11412 00004064 740F                <1> 	je	short pci_get_lfb_addr_found
 11413 00004066 6683C108            <1> 	add	cx, 08h
 11414 0000406A 6681F90002          <1> 	cmp	cx, 200h ; search bus 0 and 1
 11415 0000406F 72E9                <1> 	jb	short pci_get_lfb_addr_next_dev
 11416                              <1> pci_get_lfb_addr_fail:
 11417 00004071 31C0                <1> 	xor	eax, eax ; no LFB
 11418                              <1> 	; zf = 1
 11419 00004073 EB1D                <1> 	jmp	short pci_get_lfb_addr_return
 11420                              <1> pci_get_lfb_addr_found:
 11421 00004075 B210                <1> 	mov	dl, 10h	; I/O space 0
 11422 00004077 E81A000000          <1> 	call	pci_read_reg
 11423 0000407C 66A9F1FF            <1> 	test	ax, 0FFF1h
 11424 00004080 740D                <1> 	jz	short pci_get_lfb_addr_success
 11425 00004082 B214                <1> 	mov	dl, 14h ; I/O space 1
 11426 00004084 E80D000000          <1> 	call	pci_read_reg
 11427 00004089 66A9F1FF            <1> 	test	ax, 0FFF1h
 11428 0000408D 75E2                <1> 	jnz	short pci_get_lfb_addr_fail
 11429                              <1> pci_get_lfb_addr_success:
 11430 0000408F C1E810              <1> 	shr	eax, 16 ; LFB address (hw)
 11431                              <1> 	; zf = 0
 11432                              <1> pci_get_lfb_addr_return:
 11433 00004092 5A                  <1> 	pop	edx
 11434 00004093 59                  <1> 	pop	ecx
 11435 00004094 5B                  <1> 	pop	ebx
 11436 00004095 C3                  <1> 	retn
 11437                              <1> 
 11438                              <1> pci_read_reg:
 11439                              <1> 	; 11/12/2020
 11440                              <1> 	; Read PCI register
 11441                              <1> 	; (vgabios.c, 02/01/2020, vruppert)
 11442                              <1> 	;
 11443                              <1> 	; Input:
 11444                              <1> 	;	cx = device/function
 11445                              <1> 	;	dl = register
 11446                              <1> 	; Output:
 11447                              <1> 	;	eax = value
 11448                              <1> 	;
 11449                              <1> 	; Modified registers: eax, edx
 11450                              <1> 
 11451 00004096 B800008000          <1> 	mov	eax, 00800000h 
 11452 0000409B 6689C8              <1> 	mov	ax, cx
 11453 0000409E C1E008              <1> 	shl	eax, 8
 11454 000040A1 88D0                <1> 	mov	al, dl
 11455 000040A3 66BAF80C            <1> 	mov	dx, 0CF8h
 11456 000040A7 EF                  <1>  	out	dx, eax
 11457 000040A8 80C204              <1> 	add	dl, 4 ; mov dx, 0CFCh
 11458 000040AB ED                  <1> 	in	eax, dx
 11459 000040AC C3                  <1> 	retn
 11460                              <1> 
 11461                              <1> %endif
 11462                              <1> 
 11463                              <1> ; -----------
 11464                              <1> 
 11465                              <1> %if 0
 11466                              <1> 
 11467                              <1> mode_info_find_mode:
 11468                              <1> 	; 25/11/2020
 11469                              <1> 	; Input:
 11470                              <1> 	;	bx = VESA VBE2 video mode (+ bochs extensions)
 11471                              <1> 	; Output:
 11472                              <1> 	;	esi = mode info address (for BX input)
 11473                              <1> 	;	esi = 0 -> not found
 11474                              <1> 	;
 11475                              <1> 	; Modified registers: eax, esi
 11476                              <1> 
 11477                              <1> 	xor	eax, eax
 11478                              <1> 	mov	esi, MODE_INFO_LIST
 11479                              <1> mifm_1:
 11480                              <1> 	mov	ax, [esi]
 11481                              <1> 	cmp	ax, bx
 11482                              <1> 	je	short mifm_2
 11483                              <1> 	add	esi, MODEINFO.size ; add esi, 68
 11484                              <1> 	cmp	esi, VBE_VESA_MODE_END_OF_LIST
 11485                              <1> 	jb	short mifm_1
 11486                              <1> 	; not found
 11487                              <1> 	sub	esi, esi ; 0
 11488                              <1> mifm_2
 11489                              <1> 	retn
 11490                              <1> 
 11491                              <1> dispi_get_bpp:
 11492                              <1> 	; 28/11/2020
 11493                              <1> 	; Input:
 11494                              <1> 	;	none
 11495                              <1> 	; Output:
 11496                              <1> 	;	al = Bits per pixel
 11497                              <1> 	;	     (8,16,24,32)
 11498                              <1> 	;	ah = Bytes per pixel
 11499                              <1> 	;	     (1,2,3,4)	
 11500                              <1> 	;
 11501                              <1> 	; Modified registers: none
 11502                              <1> 
 11503                              <1> 	;push	edx
 11504                              <1> 	;mov	dx, 01CEh ; VBE_DISPI_IOPORT_INDEX
 11505                              <1> 	;mov	ax, 03h	  ; VBE_DISPI_INDEX_BPP
 11506                              <1> 	;out	dx, ax
 11507                              <1> 	;;mov	dx, 01CFh ; VBE_DISPI_IOPORT_DATA
 11508                              <1> 	;;mov	dl, 0CFh
 11509                              <1> 	;inc	dl
 11510                              <1> 	;in	ax, dx
 11511                              <1> 	;mov	ah, al
 11512                              <1> 	;shr	ah, 3 ; / 8
 11513                              <1> 	;;test	al, 7 ; 15 bit graphics mode
 11514                              <1>  	;;jz	short get_bpp_noinc
 11515                              <1> 	;;inc	ah
 11516                              <1> ;;get_bpp_noinc:
 11517                              <1> 	;pop	edx
 11518                              <1> 	;retn
 11519                              <1> 
 11520                              <1> 	; 28/11/2020
 11521                              <1> 	; Modified registers: edx
 11522                              <1> 	;push	edx
 11523                              <1> 	mov	dx, 03h ; VBE_DISPI_INDEX_BPP
 11524                              <1> 	call	dispi_get_parms
 11525                              <1> 	;pop	edx
 11526                              <1> 	;retn
 11527                              <1> 	mov	ah, al
 11528                              <1> 	shr	ah, 3 ; / 8
 11529                              <1> 	;test	al, 7 ; 15 bit graphips mode
 11530                              <1>  	;jz	short get_bpp_noinc
 11531                              <1> 	;inc	ah
 11532                              <1> ;get_bpp_noinc:
 11533                              <1> 	;pop	edx
 11534                              <1> 	retn
 11535                              <1> 
 11536                              <1> restore_vesa_video_state:
 11537                              <1> 	; 02/08/2022 (TRDOS 386 v2.0.5)
 11538                              <1> 	; 14/01/2021
 11539                              <1> 	; 06/12/2020
 11540                              <1> 	; Input:
 11541                              <1> 	;	[vbe3stbufsize] <= 32 ; <= 32*64 bytes
 11542                              <1> 	; Output:
 11543                              <1> 	;	AX = 004Fh (successed)
 11544                              <1> 	;
 11545                              <1> 	;	eax = 0 -> buffer size problem
 11546                              <1> 	;	eax > 0 and ax <> 004Fh -> failed
 11547                              <1> 	;
 11548                              <1> 	; Modified regs: eax, ebx, ecx, edx, esi, edi 
 11549                              <1> 
 11550                              <1> 	;movzx	ecx, word [vbe3stbufsize]  
 11551                              <1> 	;cmp	cx, 32 ; 32 * 64 bytes
 11552                              <1> 	;ja	short r_v_b_s_fail
 11553                              <1> 
 11554                              <1> 	movzx	ecx, byte [vbe3stbufsize]; <=32	
 11555                              <1> 	;shl	cx, 4 ; dword count for movsd
 11556                              <1> 	; 02/08/2022
 11557                              <1> 	shl	ecx, 4 ; <= 32*16 dwords (32*64 bytes)
 11558                              <1> 	mov	edi, VBE3SAVERESTOREBLOCK ; destination
 11559                              <1> 					; (vbe3 pmi buff)
 11560                              <1> 	mov	esi, VBE3VIDEOSTATE ; source (kernel buff)
 11561                              <1> 	rep	movsd
 11562                              <1> 
 11563                              <1> 	mov	ax, 4F04h
 11564                              <1> 	mov	dl, 02h ; restore
 11565                              <1> 	;mov	cx, 0Fh
 11566                              <1> 	mov	cl, 0Fh
 11567                              <1> 	xor 	ebx, ebx ; points to VBE3SAVERESTOREBLOCK
 11568                              <1> 	jmp	short int10h_32bit_pmi
 11569                              <1> 
 11570                              <1> ;s_v_b_s_fail:
 11571                              <1> ;r_v_b_s_fail:
 11572                              <1> ;	xor	eax, eax
 11573                              <1> ;	retn
 11574                              <1> 
 11575                              <1> save_vesa_video_state:
 11576                              <1> 	; 02/08/2022 (TRDOS 386 v2.0.5)
 11577                              <1> 	; 14/01/2021
 11578                              <1> 	; 06/12/2020
 11579                              <1> 	; Input:
 11580                              <1> 	;	[vbe3stbufsize] <= 32 ; <= 32*64 bytes
 11581                              <1> 	; Output:
 11582                              <1> 	;	AX = 004Fh (successed)
 11583                              <1> 	;
 11584                              <1> 	;	eax = 0 -> buffer size problem
 11585                              <1> 	;	eax > 0 and ax <> 004Fh -> failed
 11586                              <1> 	;
 11587                              <1> 	; Modified regs: eax, ebx, ecx, edx, esi, edi 
 11588                              <1> 
 11589                              <1> 	;cmp	word [vbe33stbufsize], 32  
 11590                              <1> 	;			; 32 * 64 bytes
 11591                              <1> 	;ja	short s_v_b_s_fail
 11592                              <1> 
 11593                              <1> 	mov	ax, 4F04h
 11594                              <1> 	mov	dl, 01h ; save
 11595                              <1> 	;mov	cx, 0Fh
 11596                              <1> 	mov	cl, 0Fh
 11597                              <1> 	xor 	ebx, ebx ; points to VBE3SAVERESTOREBLOCK
 11598                              <1> 
 11599                              <1> 	call	int10h_32bit_pmi
 11600                              <1> 
 11601                              <1> 	movzx	ecx, byte [vbe3stbufsize]; <=32	
 11602                              <1> 	;shl	cx, 4 ; dword count for movsd
 11603                              <1> 	; 02/08/2022
 11604                              <1> 	shl	ecx, 4 ; <= 32*16 dwords (32*64 bytes)
 11605                              <1> 	mov	esi, VBE3SAVERESTOREBLOCK ; destination
 11606                              <1> 					; (vbe3 pmi buff)
 11607                              <1> 	mov	edi, VBE3VIDEOSTATE ; source (kernel buff)
 11608                              <1> 	rep	movsd	
 11609                              <1> 	retn
 11610                              <1> 
 11611                              <1> dispi_set_bank_farcall:
 11612                              <1> 	; 03/08/2022
 11613                              <1> 	; 12/04/2021 (32 bit push/pop)
 11614                              <1> 	; 11/12/2020
 11615                              <1> 	; (This may be 'sysvideo' function, later)
 11616                              <1> 	;
 11617                              <1> 	; Input: 
 11618                              <1> 	;	bx = 0000h, set bank number
 11619                              <1> 	;	   = 0100h, get bank number
 11620                              <1> 	;	dx = bank number (if bx = 0)	
 11621                              <1> 	; Output:
 11622                              <1> 	;	dx = bank number
 11623                              <1> 		 	
 11624                              <1> 	cmp	bx, 0100h
 11625                              <1> 	je	short dispi_set_bank_farcall_get
 11626                              <1> 	or	bx, bx
 11627                              <1> 	;jnz	dispi_set_bank_farcall_error
 11628                              <1> 	; 03/08/2022
 11629                              <1> 	jz	short dsbfcall_1
 11630                              <1> 	jmp	dispi_set_bank_farcall_error
 11631                              <1> dsbfcall_1:
 11632                              <1> 	mov	ax, dx
 11633                              <1> 	;push	dx
 11634                              <1> 	;push	ax
 11635                              <1> 	; 12/04/2021
 11636                              <1> 	push	edx
 11637                              <1> 	push	eax
 11638                              <1> 	mov	ax, VBE_DISPI_INDEX_BANK
 11639                              <1> 	mov	dx, 1CEh ; VBE_DISPI_IOPORT_INDEX
 11640                              <1> 	out	dx, ax
 11641                              <1> 	;pop	ax
 11642                              <1> 	; 12/04/2021
 11643                              <1> 	pop	eax
 11644                              <1> 	;;mov	dx, VBE_DISPI_IOPORT_DATA
 11645                              <1> 	;mov	dl, 0CFh
 11646                              <1> 	inc	dl ; 1CFh = VBE_DISPI_IOPORT_DATA
 11647                              <1> 	out	dx, ax
 11648                              <1> 	in	ax, dx
 11649                              <1> 	;pop	dx
 11650                              <1> 	; 12/04/2021
 11651                              <1> 	pop	edx
 11652                              <1> 	cmp	dx, ax
 11653                              <1> 	jne	short dispi_set_bank_farcall_error
 11654                              <1> 	mov	ax, 004Fh
 11655                              <1> 	retn	; retf for real mode far call
 11656                              <1> dispi_set_bank_farcall_get:
 11657                              <1> 	mov	ax, VBE_DISPI_INDEX_BANK
 11658                              <1> 	; 03/08/2022
 11659                              <1> 	mov	dx, 1CEh ; VBE_DISPI_IOPORT_INDEX
 11660                              <1> 	out	dx, ax
 11661                              <1> 	;;mov	dx, VBE_DISPI_IOPORT_DATA
 11662                              <1> 	;mov	dl, 0CFh
 11663                              <1> 	; 03/08/2022
 11664                              <1> 	inc	dl ; 1CFh = VBE_DISPI_IOPORT_DATA
 11665                              <1> 	in	ax, dx
 11666                              <1> 	mov	dx, ax
 11667                              <1> 	retn	; retf for real mode far call
 11668                              <1> dispi_set_bank_farcall_error:
 11669                              <1> 	mov	ax, 014Fh
 11670                              <1> 	retn	; retf for real mode far call
 11671                              <1> 
 11672                              <1> %endif
 11673                              <1> 
 11674                              <1> ; % include 'vidata.s' ; VIDEO DATA
 11675                              <1> 
 11676                              <1> ; /// End Of VIDEO FUNCTIONS ///
  2984                                  
  2985                                  setup_rtc_int:
  2986                                  ; source: http://wiki.osdev.org/RTC
  2987 000040AD FA                      	cli		; disable interrupts
  2988                                  	; default int frequency is 1024 Hz (Lower 4 bits of register A is 0110b or 6)
  2989                                  	; in order to change this ...
  2990                                  	; frequency  = 32768 >> (rate-1) --> 32768 >> 5 = 1024
  2991                                  	; (rate must be above 2 and not over 15)
  2992                                  	; new rate = 15 --> 32768 >> (15-1) = 2 Hz
  2993 000040AE B08A                    	mov	al, 8Ah 
  2994 000040B0 E670                    	out	70h, al ; set index to register A, disable NMI
  2995 000040B2 90                      	nop
  2996 000040B3 E471                    	in	al, 71h ; get initial value of register A
  2997 000040B5 88C4                    	mov 	ah, al
  2998 000040B7 80E4F0                  	and	ah, 0F0h
  2999 000040BA B08A                    	mov	al, 8Ah 
  3000 000040BC E670                    	out	70h, al ; reset index to register A
  3001 000040BE 88E0                    	mov	al, ah
  3002 000040C0 0C0F                    	or	al, 0Fh	; new rate (0Fh -> 15)
  3003 000040C2 E671                    	out	71h, al ; write only our rate to A. Note, rate is the bottom 4 bits. 
  3004                                  	; enable RTC interrupt
  3005 000040C4 B08B                    	mov	al, 8Bh ;
  3006 000040C6 E670                    	out	70h, al ; select register B and disable NMI
  3007 000040C8 90                      	nop
  3008 000040C9 E471                    	in	al, 71h ; read the current value of register B
  3009 000040CB 88C4                    	mov	ah, al  ;
  3010 000040CD B08B                    	mov 	al, 8Bh ;
  3011 000040CF E670                    	out	70h, al ; set the index again (a read will reset the index to register B)	
  3012 000040D1 88E0                    	mov	al, ah  ;
  3013 000040D3 0C40                    	or	al, 40h ;
  3014 000040D5 E671                    	out	71h, al ; write the previous value ORed with 0x40. This turns on bit 6 of register B
  3015 000040D7 FB                      	sti
  3016 000040D8 C3                      	retn
  3017                                  
  3018                                  ; Write memory information
  3019                                  ; 29/01/2016
  3020                                  ; 06/11/2014
  3021                                  ; 14/08/2015 
  3022                                  memory_info:	
  3023 000040D9 A1[8C780100]            	mov	eax, [memory_size] ; in pages
  3024 000040DE 50                      	push	eax
  3025 000040DF C1E00C                  	shl	eax, 12		   ; in bytes
  3026 000040E2 BB0A000000              	mov	ebx, 10
  3027 000040E7 89D9                    	mov	ecx, ebx	   ; 10
  3028 000040E9 BE[A13A0100]            	mov	esi, mem_total_b_str	
  3029 000040EE E8D8000000              	call	bintdstr
  3030 000040F3 58                      	pop	eax
  3031 000040F4 B107                    	mov	cl, 7
  3032 000040F6 BE[C53A0100]            	mov	esi, mem_total_p_str
  3033 000040FB E8CB000000              	call	bintdstr	
  3034                                  	; 14/08/2015
  3035 00004100 E8E3000000              	call	calc_free_mem
  3036                                  	; edx = calculated free pages
  3037                                  	; ecx = 0
  3038 00004105 A1[90780100]            	mov 	eax, [free_pages]
  3039 0000410A 39D0                    	cmp	eax, edx ; calculated free mem value 
  3040                                  		; and initial free mem value are same or not?
  3041 0000410C 751D                    	jne 	short pmim ; print mem info with '?' if not
  3042 0000410E 52                      	push 	edx ; free memory in pages	
  3043                                  	;mov 	eax, edx
  3044 0000410F C1E00C                  	shl	eax, 12 ; convert page count
  3045                                  			; to byte count
  3046 00004112 B10A                    	mov	cl, 10
  3047 00004114 BE[E53A0100]            	mov	esi, free_mem_b_str
  3048 00004119 E8AD000000              	call	bintdstr
  3049 0000411E 58                      	pop	eax
  3050 0000411F B107                    	mov	cl, 7
  3051 00004121 BE[093B0100]            	mov	esi, free_mem_p_str
  3052 00004126 E8A0000000              	call	bintdstr
  3053                                  pmim:
  3054 0000412B BE[8F3A0100]            	mov	esi, msg_memory_info
  3055                                  	;
  3056 00004130 B407                    	mov	ah, 07h ; Black background, 
  3057                                  			; light gray forecolor
  3058                                  print_kmsg: ; 29/01/2016
  3059 00004132 8825[B7780100]          	mov	[ccolor], ah
  3060                                  pkmsg_loop:
  3061 00004138 AC                      	lodsb
  3062 00004139 08C0                    	or	al, al
  3063 0000413B 7410                    	jz	short pkmsg_ok
  3064 0000413D 56                      	push	esi
  3065                                  	; 13/05/2016
  3066 0000413E 0FB61D[B7780100]        	movzx	ebx, byte [ccolor]
  3067                                  			; Video page 0 (bh=0)
  3068 00004145 E842E1FFFF              	call	_write_tty
  3069 0000414A 5E                      	pop	esi
  3070 0000414B EBEB                    	jmp	short pkmsg_loop
  3071                                  pkmsg_ok:
  3072 0000414D C3                      	retn
  3073                                  
  3074                                  ; 19/12/2020
  3075                                  ; temporary
  3076                                  ; Write default liner frame buffer address
  3077                                  ;
  3078                                  default_lfb_info:	
  3079 0000414E 66A1[110F0000]          	mov	ax, [def_LFB_addr] ; high word
  3080                                  	; 24/11/2023 - temporary
  3081 00004154 6609C0                  	or	ax, ax
  3082 00004157 74F4                    	jz	short pkmsg_ok
  3083 00004159 E829000000              	call	wordtohex
  3084 0000415E A3[613B0100]            	mov	dword [lfb_addr_str], eax
  3085 00004163 BE[4A3B0100]            	mov	esi, msg_lfb_addr
  3086 00004168 B40F                    	mov	ah, 0Fh ; Black background, 
  3087                                  			; white forecolor
  3088 0000416A EBC6                    	jmp	short print_kmsg
  3089                                  
  3090                                  ; Convert binary number to hexadecimal string
  3091                                  ; 10/05/2015  
  3092                                  ; dsectpm.s (28/02/2015)
  3093                                  ; Retro UNIX 386 v1 - Kernel v0.2.0.6  
  3094                                  ; 01/12/2014
  3095                                  ; 25/11/2014
  3096                                  ;
  3097                                  bytetohex:
  3098                                  	; INPUT ->
  3099                                  	; 	AL = byte (binary number)
  3100                                  	; OUTPUT ->
  3101                                  	;	AX = hexadecimal string
  3102                                  	;
  3103 0000416C 53                      	push	ebx
  3104 0000416D 31DB                    	xor	ebx, ebx
  3105 0000416F 88C3                    	mov	bl, al
  3106 00004171 C0EB04                  	shr	bl, 4
  3107 00004174 8A9B[BA410000]          	mov	bl, [ebx+hexchrs] 	 	
  3108 0000417A 86D8                    	xchg	bl, al
  3109 0000417C 80E30F                  	and	bl, 0Fh
  3110 0000417F 8AA3[BA410000]          	mov	ah, [ebx+hexchrs] 
  3111 00004185 5B                      	pop	ebx	
  3112 00004186 C3                      	retn
  3113                                  
  3114                                  wordtohex:
  3115                                  	; INPUT ->
  3116                                  	; 	AX = word (binary number)
  3117                                  	; OUTPUT ->
  3118                                  	;	EAX = hexadecimal string
  3119                                  	;
  3120 00004187 53                      	push	ebx
  3121 00004188 31DB                    	xor	ebx, ebx
  3122 0000418A 86E0                    	xchg	ah, al
  3123 0000418C 6650                    	push	ax ; * save ax
  3124 0000418E 88E3                    	mov	bl, ah
  3125 00004190 C0EB04                  	shr	bl, 4
  3126 00004193 8A83[BA410000]          	mov	al, [ebx+hexchrs]
  3127 00004199 88E3                    	mov	bl, ah
  3128 0000419B 80E30F                  	and	bl, 0Fh
  3129 0000419E 8AA3[BA410000]          	mov	ah, [ebx+hexchrs]
  3130 000041A4 C1E010                  	shl	eax, 16 ; ax -> hw of eax
  3131 000041A7 6658                    	pop	ax ; * restore ax 
  3132 000041A9 5B                      	pop	ebx
  3133 000041AA EBC0                    	jmp	short bytetohex
  3134                                  	;mov	bl, al
  3135                                  	;shr	bl, 4
  3136                                  	;mov	bl, [ebx+hexchrs]
  3137                                  	;xchg	bl, al	 	
  3138                                  	;and	bl, 0Fh
  3139                                  	;mov	ah, [ebx+hexchrs] 
  3140                                  	;pop	ebx	
  3141                                  	;retn
  3142                                  
  3143                                  dwordtohex:
  3144                                  	; INPUT ->
  3145                                  	; 	EAX = dword (binary number)
  3146                                  	; OUTPUT ->
  3147                                  	;	EDX:EAX = hexadecimal string
  3148                                  	;
  3149 000041AC 50                      	push	eax
  3150 000041AD C1E810                  	shr	eax, 16
  3151 000041B0 E8D2FFFFFF              	call	wordtohex
  3152 000041B5 89C2                    	mov	edx, eax
  3153 000041B7 58                      	pop	eax
  3154                                  	;call	wordtohex
  3155                                  	;retn
  3156                                  	; 18/04/2021
  3157 000041B8 EBCD                    	jmp	short wordtohex
  3158                                  
  3159                                  ; 10/05/2015
  3160                                  hex_digits:
  3161                                  hexchrs:
  3162 000041BA 303132333435363738-     	db '0123456789ABCDEF'
  3162 000041C3 39414243444546     
  3163                                  ; 19/01/2021 - VESA EDID ready flag (4Fh)
  3164 000041CA 00                      edid:	db 0
  3165                                  
  3166                                  ; Convert binary number to decimal/numeric string
  3167                                  ; 06/11/2014
  3168                                  ; Temporary Code
  3169                                  ;
  3170                                  
  3171                                  bintdstr:
  3172                                  	; EAX = binary number
  3173                                  	; ESI = decimal/numeric string address
  3174                                  	; EBX = divisor (10)
  3175                                  	; ECX = string length (<=10)
  3176 000041CB 01CE                    	add	esi, ecx
  3177                                  btdstr0:
  3178 000041CD 4E                      	dec	esi
  3179 000041CE 31D2                    	xor	edx, edx
  3180 000041D0 F7F3                    	div	ebx
  3181 000041D2 80C230                  	add	dl, 30h
  3182 000041D5 8816                    	mov	[esi], dl
  3183 000041D7 FEC9                    	dec	cl
  3184 000041D9 740C                    	jz	short btdstr2 ; 08/09/2016
  3185 000041DB 09C0                    	or	eax, eax
  3186 000041DD 75EE                    	jnz	short btdstr0
  3187                                  btdstr1:
  3188 000041DF 4E                      	dec	esi
  3189 000041E0 C60620                          mov     byte [esi], 20h ; blank space
  3190 000041E3 FEC9                    	dec	cl
  3191 000041E5 75F8                    	jnz	short btdstr1
  3192                                  btdstr2:
  3193 000041E7 C3                      	retn
  3194                                  
  3195                                  ; Calculate free memory pages on M.A.T.
  3196                                  ; 06/11/2014
  3197                                  ; Temporary Code
  3198                                  ;
  3199                                  
  3200                                  calc_free_mem:
  3201 000041E8 31D2                    	xor	edx, edx
  3202                                  	;xor	ecx, ecx
  3203 000041EA 668B0D[A0780100]        	mov	cx, [mat_size] ; in pages
  3204 000041F1 C1E10A                  	shl	ecx, 10	; 1024 dwords per page
  3205 000041F4 BE00001000              	mov	esi, MEM_ALLOC_TBL
  3206                                  cfm0:
  3207 000041F9 AD                      	lodsd
  3208 000041FA 51                      	push	ecx
  3209 000041FB B920000000              	mov	ecx, 32
  3210                                  cfm1:
  3211 00004200 D1E8                    	shr	eax, 1
  3212 00004202 7301                    	jnc	short cfm2
  3213 00004204 42                      	inc	edx
  3214                                  cfm2:
  3215 00004205 E2F9                    	loop	cfm1
  3216 00004207 59                      	pop	ecx
  3217 00004208 E2EF                    	loop	cfm0
  3218 0000420A C3                      	retn
  3219                                  
  3220                                  %include 'diskio.s'  ; 07/03/2015
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.7 - diskio.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 02/12/2023 (Previous: 11/08/2022 - Kernel v2.0.5)
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 24/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.15 (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> ; Ref: Retro UNIX 386 v1.1 (Kernel v0.2.1.5) 'diskio' modification: 12/07/2022
    19                              <1> 
    20                              <1> ; Retro UNIX 386 v1 Kernel - DISKIO.INC
    21                              <1> ; Last Modification: 22/08/2015
    22                              <1> ; 	(Initialized Disk Parameters Data is in 'DISKDATA.INC') 
    23                              <1> ; 	(Uninitialized Disk Parameters Data is in 'DISKBSS.INC') 
    24                              <1> 
    25                              <1> ; DISK I/O SYSTEM - Erdogan Tan (Retro UNIX 386 v1 project)
    26                              <1> 
    27                              <1> ; ///////// DISK I/O SYSTEM ///////////////
    28                              <1> 
    29                              <1> ; 11/04/2021
    30                              <1> ;; 06/02/2015
    31                              <1> ;diskette_io:
    32                              <1> 	;clc ; 20/07/2020
    33                              <1> 	;pushfd
    34                              <1> 	;push 	cs
    35                              <1> 	;;call 	DISKETTE_IO_1
    36                              <1> 	;;retn
    37                              <1> 	
    38                              <1> ;;;;;; DISKETTE I/O ;;;;;;;;;;;;;;;;;;;; 06/02/2015 ;;;
    39                              <1> ;//////////////////////////////////////////////////////
    40                              <1> 
    41                              <1> ; DISKETTE I/O - Erdogan Tan (Retro UNIX 386 v1 project)
    42                              <1> ; 20/02/2015
    43                              <1> ; 06/02/2015 (unix386.s)
    44                              <1> ; 16/12/2014 - 02/01/2015 (dsectrm2.s)
    45                              <1> ;
    46                              <1> ; Code (DELAY) modifications - AWARD BIOS 1999 (ADISK.EQU, COMMON.MAC)
    47                              <1> ;
    48                              <1> ; ADISK.EQU
    49                              <1> 
    50                              <1> ;----- Wait control constants 
    51                              <1> 
    52                              <1> ;amount of time to wait while RESET is active.
    53                              <1> 
    54                              <1> WAITCPU_RESET_ON	EQU	21		;Reset on must last at least 14us
    55                              <1> 						;at 250 KBS xfer rate.
    56                              <1> 						;see INTEL MCS, 1985, pg. 5-456
    57                              <1> 
    58                              <1> WAITCPU_FOR_STATUS	EQU	100		;allow 30 microseconds for
    59                              <1> 						;status register to become valid
    60                              <1> 						;before re-reading.
    61                              <1> 
    62                              <1> ;After sending a byte to NEC, status register may remain
    63                              <1> ;incorrectly set for 24 us.
    64                              <1> 
    65                              <1> WAITCPU_RQM_LOW		EQU	24		;number of loops to check for
    66                              <1> 						;RQM low.
    67                              <1> 
    68                              <1> ; COMMON.MAC
    69                              <1> ;
    70                              <1> ;	Timing macros
    71                              <1> ;
    72                              <1> 
    73                              <1> %macro 		SIODELAY 0 			; SHORT IODELAY
    74                              <1> 		jmp short $+2
    75                              <1> %endmacro		
    76                              <1> 
    77                              <1> %macro		IODELAY  0			; NORMAL IODELAY
    78                              <1> 		jmp short $+2
    79                              <1> 		jmp short $+2
    80                              <1> %endmacro
    81                              <1> 
    82                              <1> %macro		NEWIODELAY 0
    83                              <1> 		out 0EBh, al
    84                              <1> %endmacro 
    85                              <1> 
    86                              <1> ; (According to) AWARD BIOS 1999 - ATORGS.ASM (dw -> equ, db -> equ)
    87                              <1> ;;; WAIT_FOR_MEM
    88                              <1> ;WAIT_FDU_INT_LO	equ	017798		; 2.5 secs in 30 micro units.
    89                              <1> ;WAIT_FDU_INT_HI	equ	1
    90                              <1> WAIT_FDU_INT_LH		equ	83334		; 27/02/2015 (2.5 seconds waiting)
    91                              <1> ;;; WAIT_FOR_PORT
    92                              <1> ;WAIT_FDU_SEND_LO	equ	16667		; .5 secons in 30 us units.
    93                              <1> ;WAIT_FDU_SEND_HI	equ	0
    94                              <1> WAIT_FDU_SEND_LH	equ 	16667		; 27/02/2015	
    95                              <1> ;Time to wait while waiting for each byte of NEC results = .5
    96                              <1> ;seconds.  .5 seconds = 500,000 micros.  500,000/30 = 16,667.
    97                              <1> ;WAIT_FDU_RESULTS_LO	equ	16667		; .5 seconds in 30 micro units.
    98                              <1> ;WAIT_FDU_RESULTS_HI	equ	0
    99                              <1> WAIT_FDU_RESULTS_LH	equ	16667  ; 27/02/2015
   100                              <1> ;;; WAIT_REFRESH
   101                              <1> ;amount of time to wait for head settle, per unit in parameter
   102                              <1> ;table = 1 ms.
   103                              <1> WAIT_FDU_HEAD_SETTLE	equ	33		; 1 ms in 30 micro units.
   104                              <1> 
   105                              <1> 
   106                              <1> ; //////////////// DISKETTE I/O ////////////////
   107                              <1> 
   108                              <1> ; 11/12/2014 (copy from IBM PC-XT Model 286 BIOS - POSTEQU.INC)
   109                              <1> 
   110                              <1> ;----------------------------------------
   111                              <1> ;	EQUATES USED BY POST AND BIOS	:
   112                              <1> ;----------------------------------------
   113                              <1> 
   114                              <1> ;--------- 8042 KEYBOARD INTERFACE AND DIAGNOSTIC CONTROL REGISTERS ------------
   115                              <1> ;PORT_A		EQU	060H		; 8042 KEYBOARD SCAN CODE/CONTROL PORT
   116                              <1> ;PORT_B		EQU	061H		; PORT B READ/WRITE DIAGNOSTIC REGISTER
   117                              <1> ;REFRESH_BIT	EQU	00010000B	; REFRESH TEST BIT
   118                              <1> 
   119                              <1> ;----------------------------------------
   120                              <1> ;	CMOS EQUATES FOR THIS SYSTEM	:
   121                              <1> ;-------------------------------------------------------------------------------
   122                              <1> ;CMOS_PORT	EQU	070H		; I/O ADDRESS OF CMOS ADDRESS PORT
   123                              <1> ;CMOS_DATA	EQU	071H		; I/O ADDRESS OF CMOS DATA PORT
   124                              <1> ;NMI		EQU	10000000B	; DISABLE NMI INTERRUPTS MASK -
   125                              <1> 					;  HIGH BIT OF CMOS LOCATION ADDRESS
   126                              <1> 
   127                              <1> ;---------- CMOS TABLE LOCATION ADDRESS'S ## -----------------------------------
   128                              <1> CMOS_DISKETTE	EQU	010H		; DISKETTE DRIVE TYPE BYTE	      ;
   129                              <1> ;		EQU	011H		; - RESERVED			      ;C
   130                              <1> CMOS_DISK	EQU	012H		; FIXED DISK TYPE BYTE		      ;H
   131                              <1> ;		EQU	013H		; - RESERVED			      ;E
   132                              <1> CMOS_EQUIP	EQU	014H		; EQUIPMENT WORD LOW BYTE	      ;C
   133                              <1> 
   134                              <1> ;---------- DISKETTE EQUATES ---------------------------------------------------
   135                              <1> INT_FLAG	EQU	10000000B	; INTERRUPT OCCURRENCE FLAG
   136                              <1> DSK_CHG 	EQU	10000000B	; DISKETTE CHANGE FLAG MASK BIT
   137                              <1> DETERMINED	EQU	00010000B	; SET STATE DETERMINED IN STATE BITS
   138                              <1> HOME		EQU	00010000B	; TRACK 0 MASK
   139                              <1> SENSE_DRV_ST	EQU	00000100B	; SENSE DRIVE STATUS COMMAND
   140                              <1> TRK_SLAP	EQU	030H		; CRASH STOP (48 TPI DRIVES)
   141                              <1> QUIET_SEEK	EQU	00AH		; SEEK TO TRACK 10
   142                              <1> ;MAX_DRV 	EQU	2		; MAX NUMBER OF DRIVES
   143                              <1> HD12_SETTLE	EQU	15		; 1.2 M HEAD SETTLE TIME
   144                              <1> HD320_SETTLE	EQU	20		; 320 K HEAD SETTLE TIME
   145                              <1> MOTOR_WAIT	EQU	37		; 2 SECONDS OF COUNTS FOR MOTOR TURN OFF
   146                              <1> 
   147                              <1> ;---------- DISKETTE ERRORS ----------------------------------------------------
   148                              <1> ;TIME_OUT	EQU	080H		; ATTACHMENT FAILED TO RESPOND
   149                              <1> ;BAD_SEEK	EQU	040H		; SEEK OPERATION FAILED
   150                              <1> BAD_NEC 	EQU	020H		; DISKETTE CONTROLLER HAS FAILED
   151                              <1> BAD_CRC 	EQU	010H		; BAD CRC ON DISKETTE READ
   152                              <1> MED_NOT_FND	EQU	00CH		; MEDIA TYPE NOT FOUND
   153                              <1> DMA_BOUNDARY	EQU	009H		; ATTEMPT TO DMA ACROSS 64K BOUNDARY
   154                              <1> BAD_DMA 	EQU	008H		; DMA OVERRUN ON OPERATION
   155                              <1> MEDIA_CHANGE	EQU	006H		; MEDIA REMOVED ON DUAL ATTACH CARD
   156                              <1> RECORD_NOT_FND	EQU	004H		; REQUESTED SECTOR NOT FOUND
   157                              <1> WRITE_PROTECT	EQU	003H		; WRITE ATTEMPTED ON WRITE PROTECT DISK
   158                              <1> BAD_ADDR_MARK	EQU	002H		; ADDRESS MARK NOT FOUND
   159                              <1> BAD_CMD 	EQU	001H		; BAD COMMAND PASSED TO DISKETTE I/O
   160                              <1> 
   161                              <1> ;---------- DISK CHANGE LINE EQUATES -------------------------------------------
   162                              <1> NOCHGLN 	EQU	001H		; NO DISK CHANGE LINE AVAILABLE
   163                              <1> CHGLN		EQU	002H		; DISK CHANGE LINE AVAILABLE
   164                              <1> 
   165                              <1> ;---------- MEDIA/DRIVE STATE INDICATORS ---------------------------------------
   166                              <1> TRK_CAPA	EQU	00000001B	; 80 TRACK CAPABILITY
   167                              <1> FMT_CAPA	EQU	00000010B	; MULTIPLE FORMAT CAPABILITY (1.2M)
   168                              <1> DRV_DET 	EQU	00000100B	; DRIVE DETERMINED
   169                              <1> MED_DET 	EQU	00010000B	; MEDIA DETERMINED BIT
   170                              <1> DBL_STEP	EQU	00100000B	; DOUBLE STEP BIT
   171                              <1> RATE_MSK	EQU	11000000B	; MASK FOR CLEARING ALL BUT RATE
   172                              <1> RATE_500	EQU	00000000B	; 500 KBS DATA RATE
   173                              <1> RATE_300	EQU	01000000B	; 300 KBS DATA RATE
   174                              <1> RATE_250	EQU	10000000B	; 250 KBS DATA RATE
   175                              <1> STRT_MSK	EQU	00001100B	; OPERATION START RATE MASK
   176                              <1> SEND_MSK	EQU	11000000B	; MASK FOR SEND RATE BITS
   177                              <1> 
   178                              <1> ;---------- MEDIA/DRIVE STATE INDICATORS COMPATIBILITY -------------------------
   179                              <1> M3D3U		EQU	00000000B	; 360 MEDIA/DRIVE NOT ESTABLISHED
   180                              <1> M3D1U		EQU	00000001B	; 360 MEDIA,1.2DRIVE NOT ESTABLISHED
   181                              <1> M1D1U		EQU	00000010B	; 1.2 MEDIA/DRIVE NOT ESTABLISHED
   182                              <1> MED_UNK 	EQU	00000111B	; NONE OF THE ABOVE
   183                              <1> 
   184                              <1> ;---------- INTERRUPT EQUATES --------------------------------------------------
   185                              <1> ;EOI		EQU	020H		; END OF INTERRUPT COMMAND TO 8259
   186                              <1> ;INTA00		EQU	020H		; 8259 PORT
   187                              <1> INTA01		EQU	021H		; 8259 PORT
   188                              <1> INTB00		EQU	0A0H		; 2ND 8259
   189                              <1> INTB01		EQU	0A1H		;
   190                              <1> 
   191                              <1> ;-------------------------------------------------------------------------------
   192                              <1> DMA08		EQU	008H		; DMA STATUS REGISTER PORT ADDRESS
   193                              <1> DMA		EQU	000H		; DMA CH.0 ADDRESS REGISTER PORT ADDRESS
   194                              <1> DMA18		EQU	0D0H		; 2ND DMA STATUS PORT ADDRESS
   195                              <1> DMA1		EQU	0C0H		; 2ND DMA CH.0 ADDRESS REGISTER ADDRESS
   196                              <1> ;-------------------------------------------------------------------------------
   197                              <1> ;TIMER		EQU	040H		; 8254 TIMER - BASE ADDRESS
   198                              <1> 
   199                              <1> ;-------------------------------------------------------------------------------
   200                              <1> DMA_PAGE	EQU	081H		; START OF DMA PAGE REGISTERS
   201                              <1> 
   202                              <1> ; 06/02/2015 (unix386.s, protected mode modifications)
   203                              <1> ; (unix386.s <-- dsectrm2.s)
   204                              <1> ; 11/12/2014 (copy from IBM PC-XT Model 286 BIOS - DSEG.INC)
   205                              <1> 
   206                              <1> ; 27/05/2016 - TRDOS 386 (TRDOS v2.0)
   207                              <1> ; 10/12/2014
   208                              <1> ;
   209                              <1> ;int40h:
   210                              <1> ;	pushf
   211                              <1> ;	push 	cs
   212                              <1> ;	;cli
   213                              <1> ;	call 	DISKETTE_IO_1
   214                              <1> ;	retn
   215                              <1> 
   216                              <1> ; DSKETTE ----- 04/21/86 DISKETTE BIOS
   217                              <1> ; (IBM PC XT Model 286 System BIOS Source Code, 04-21-86)
   218                              <1> ;
   219                              <1> 
   220                              <1> ;-- INT13H ---------------------------------------------------------------------
   221                              <1> ; DISKETTE I/O
   222                              <1> ;	THIS INTERFACE PROVIDES ACCESS TO THE 5 1/4 INCH 360 KB,
   223                              <1> ;	1.2 MB, 720 KB AND 1.44 MB DISKETTE DRIVES.
   224                              <1> ; INPUT
   225                              <1> ;	(AH) =  00H RESET DISKETTE SYSTEM
   226                              <1> ;		HARD RESET TO NEC, PREPARE COMMAND, RECALIBRATE REQUIRED
   227                              <1> ;		ON ALL DRIVES
   228                              <1> ;------------------------------------------------------------------------------- 
   229                              <1> ;	(AH)= 01H  READ THE STATUS OF THE SYSTEM INTO (AH)
   230                              <1> ;		@DISKETTE_STATUS FROM LAST OPERATION IS USED
   231                              <1> ;-------------------------------------------------------------------------------
   232                              <1> ;	REGISTERS FOR READ/WRITE/VERIFY/FORMAT
   233                              <1> ;	(DL) - DRIVE NUMBER (0-1 ALLOWED, VALUE CHECKED)
   234                              <1> ;	(DH) - HEAD NUMBER (0-1 ALLOWED, NOT VALUE CHECKED)
   235                              <1> ;	(CH) - TRACK NUMBER (NOT VALUE CHECKED)
   236                              <1> ;		MEDIA	DRIVE	TRACK NUMBER
   237                              <1> ;		320/360	320/360	    0-39
   238                              <1> ;		320/360	1.2M	    0-39
   239                              <1> ;		1.2M	1.2M	    0-79
   240                              <1> ;		720K	720K	    0-79
   241                              <1> ;		1.44M	1.44M	    0-79	
   242                              <1> ;	(CL) - 	SECTOR NUMBER (NOT VALUE CHECKED, NOT USED FOR FORMAT)
   243                              <1> ;		MEDIA	DRIVE	SECTOR NUMBER
   244                              <1> ;		320/360	320/360	     1-8/9
   245                              <1> ;		320/360	1.2M	     1-8/9
   246                              <1> ;		1.2M	1.2M	     1-15
   247                              <1> ;		720K	720K	     1-9
   248                              <1> ;		1.44M	1.44M	     1-18		
   249                              <1> ;	(AL)	NUMBER OF SECTORS (NOT VALUE CHECKED)
   250                              <1> ;		MEDIA	DRIVE	MAX NUMBER OF SECTORS
   251                              <1> ;		320/360	320/360	     8/9
   252                              <1> ;		320/360	1.2M	     8/9
   253                              <1> ;		1.2M	1.2M	     15
   254                              <1> ;		720K	720K	      9
   255                              <1> ;		1.44M	1.44M	     18
   256                              <1> ;
   257                              <1> ;	(ES:BX) - ADDRESS OF BUFFER (NOT REQUIRED FOR VERIFY)
   258                              <1> ;
   259                              <1> ;-------------------------------------------------------------------------------
   260                              <1> ;	(AH)= 02H  READ THE DESIRED SECTORS INTO MEMORY
   261                              <1> ;-------------------------------------------------------------------------------
   262                              <1> ;	(AH)= 03H  WRITE THE DESIRED SECTORS FROM MEMORY
   263                              <1> ;-------------------------------------------------------------------------------
   264                              <1> ;	(AH)= 04H  VERIFY THE DESIRED SECTORS
   265                              <1> ;-------------------------------------------------------------------------------
   266                              <1> ;	(AH)= 05H  FORMAT THE DESIRED TRACK
   267                              <1> ;		(ES,BX) MUST POINT TO THE COLLECTION OF DESIRED ADDRESS FIELDS
   268                              <1> ;		FOR THE	TRACK. EACH FIELD IS COMPOSED OF 4 BYTES, (C,H,R,N),
   269                              <1> ;		WHERE C = TRACK NUMBER, H=HEAD NUMBER, R = SECTOR NUMBER, 
   270                              <1> ;		N= NUMBER OF BYTES PER SECTOR (00=128,01=256,02=512,03=1024),
   271                              <1> ;		THERE MUST BE ONE ENTRY FOR EVERY SECTOR ON THE TRACK.
   272                              <1> ;		THIS INFORMATION IS USED TO FIND THE REQUESTED SECTOR DURING 
   273                              <1> ;		READ/WRITE ACCESS.
   274                              <1> ;		PRIOR TO FORMATTING A DISKETTE, IF THERE EXISTS MORE THAN
   275                              <1> ;		ONE SUPPORTED MEDIA FORMAT TYPE WITHIN THE DRIVE IN QUESTION,
   276                              <1> ;		THEN "SET DASD TYPE" (INT 13H, AH = 17H) OR 'SET MEDIA TYPE'
   277                              <1> ;		(INT 13H, AH =  18H) MUST BE CALLED TO SET THE DISKETTE TYPE
   278                              <1> ;		THAT IS TO BE FORMATTED. IF "SET DASD TYPE" OR "SET MEDIA TYPE"
   279                              <1> ;		IS NOT CALLED, THE FORMAT ROUTINE WILL ASSUME THE 
   280                              <1> ;		MEDIA FORMAT TO BE THE MAXIMUM CAPACITY OF THE DRIVE.
   281                              <1> ;
   282                              <1> ;		THESE PARAMETERS OF DISK BASE MUST BE CHANGED IN ORDER TO
   283                              <1> ;		FORMAT THE FOLLOWING MEDIAS:
   284                              <1> ;		---------------------------------------------
   285                              <1> ;		: MEDIA  :     DRIVE      : PARM 1 : PARM 2 :
   286                              <1> ;		---------------------------------------------
   287                              <1> ;		: 320K	 : 320K/360K/1.2M :  50H   :   8    :
   288                              <1> ;		: 360K	 : 320K/360K/1.2M :  50H   :   9    :
   289                              <1> ;		: 1.2M	 : 1.2M           :  54H   :  15    :
   290                              <1> ;		: 720K	 : 720K/1.44M     :  50H   :   9    :
   291                              <1> ;		: 1.44M	 : 1.44M          :  6CH   :  18    :		  	
   292                              <1> ;		---------------------------------------------
   293                              <1> ;		NOTES: - PARM 1 = GAP LENGTH FOR FORMAT
   294                              <1> ;		       - PARM 2 = EOT (LAST SECTOR ON TRACK)
   295                              <1> ;		       - DISK BASE IS POINTED BY DISK POINTER LOCATED
   296                              <1> ;			 AT ABSOLUTE ADDRESS 0:78.
   297                              <1> ;		       - WHEN FORMAT OPERATIONS ARE COMPLETE, THE PARAMETERS
   298                              <1> ;			 SHOULD BE RESTORED TO THEIR RESPECTIVE INITIAL VALUES.			
   299                              <1> ;-------------------------------------------------------------------------------
   300                              <1> ;	(AH) = 08H READ DRIVE PARAMETERS
   301                              <1> ;	REGISTERS
   302                              <1> ;	  INPUT
   303                              <1> ;	    (DL) - DRIVE NUMBER (0-1 ALLOWED, VALUE CHECKED)
   304                              <1> ;	     ** 27/05/2016 - TRDOS 386 (TRDOS v2.0) **	
   305                              <1> ;            ** EBX = Buffer address for floppy disk parameters table **
   306                              <1> ;	  OUTPUT
   307                              <1> ;	    (ES:DI) POINTS TO DRIVE PARAMETER TABLE
   308                              <1> ; 	    *** TRDOS 386 note: floppy disk parameter table (16 bytes)
   309                              <1> ;	    will be returned to user in EBX, buffer address *** 27/05/2016 ***		
   310                              <1> ;					
   311                              <1> ;	    (CH) - LOW ORDER 8 OF 10 BITS MAXIMUM NUMBER OF TRACKS
   312                              <1> ;	    (CL) - BITS 7 & 6 - HIGH ORDER TWO BITS OF MAXIMUM TRACKS
   313                              <1> ;	           BITS 5 THRU 0 - MAXIMUM SECTORS PER TRACK
   314                              <1> ;	    (DH) - MAXIMUM HEAD NUMBER
   315                              <1> ;	    (DL) - NUMBER OF DISKETTE DRIVES INSTALLED
   316                              <1> ;	    (BH) - 0
   317                              <1> ;	    (BL) - BITS 7 THRU 4 - 0
   318                              <1> ;	           BITS 3 THRU 0 - VALID DRIVE TYPE VALUE IN CMOS
   319                              <1> ;	    (AX) - 0
   320                              <1> ;	 UNDER THE FOLLOWING CIRCUMSTANCES:
   321                              <1> ;	    (1) THE DRIVE NUMBER IS INVALID,
   322                              <1> ;	    (2) THE DRIVE TYPE IS UNKNOWN AND CMOS IS NOT PRESENT, 
   323                              <1> ;	    (3) THE DRIVE TYPE IS UNKNOWN AND CMOS IS BAD,
   324                              <1> ;	    (4) OR THE DRIVE TYPE IS UNKNOWN AND THE CMOS DRIVE TYPE IS INVALID
   325                              <1> ;	    THEN ES,AX,BX,CX,DH,DI=0 ; DL=NUMBER OF DRIVES. 
   326                              <1> ;	    IF NO DRIVES ARE PRESENT THEN: ES,AX,BX,CX,DX,DI=0.
   327                              <1> ;	    @DISKETTE_STATUS = 0 AND CY IS RESET.
   328                              <1> ;-------------------------------------------------------------------------------
   329                              <1> ;	(AH)= 15H  READ DASD TYPE
   330                              <1> ;	OUTPUT REGISTERS
   331                              <1> ;	(AH) - ON RETURN IF CARRY FLAG NOT SET, OTHERWISE ERROR	
   332                              <1> ;		00 - DRIVE NOT PRESENT	
   333                              <1> ;		01 - DISKETTE, NO CHANGE LINE AVAILABLE
   334                              <1> ;		02 - DISKETTE, CHANGE LINE AVAILABLE	
   335                              <1> ;		03 - RESERVED (FIXED DISK)
   336                              <1> ;	(DL) - DRIVE NUMBER (0-1 ALLOWED, VALUE CHECKED)
   337                              <1> ;-------------------------------------------------------------------------------
   338                              <1> ;	(AH)= 16H  DISK CHANGE LINE STATUS
   339                              <1> ;	OUTPUT REGISTERS
   340                              <1> ;	(AH) - 00 - DISK CHANGE LINE NOT ACTIVE	
   341                              <1> ;	       06 - DISK CHANGE LINE ACTIVE & CARRY BIT ON
   342                              <1> ;	(DL) - DRIVE NUMBER (0-1 ALLOWED, VALUE CHECKED)
   343                              <1> ;-------------------------------------------------------------------------------
   344                              <1> ;	(AH)= 17H  SET DASD TYPE FOR FORMAT
   345                              <1> ;	INPUT REGISTERS
   346                              <1> ;	(AL) -	00 - NOT USED	
   347                              <1> ;		01 - DISKETTE 320/360K IN 360K DRIVE	
   348                              <1> ;		02 - DISKETTE 360K IN 1.2M DRIVE
   349                              <1> ;		03 - DISKETTE 1.2M IN 1.2M DRIVE
   350                              <1> ;		04 - DISKETTE 720K IN 720K DRIVE
   351                              <1> ;	(DL) - DRIVE NUMBER (0-1 ALLOWED, VALUE CHECKED:
   352                              <1> ;	       (DO NOT USE WHEN DISKETTE ATTACH CARD USED)
   353                              <1> ;-------------------------------------------------------------------------------
   354                              <1> ;	(AH)= 18H  SET MEDIA TYPE FOR FORMAT
   355                              <1> ;	INPUT REGISTERS
   356                              <1> ;	(CH) - LOW ORDER 8 OF 10 BITS MAXIMUM TRACKS
   357                              <1> ;	(CL) - BITS 7 & 6 - HIGH ORDER TWO BITS OF MAXIMUM TRACKS
   358                              <1> ;	       BITS 5 THRU 0 - MAXIMUM SECTORS PER TRACK
   359                              <1> ;	(DL) - DRIVE NUMBER (0-1 ALLOWED, VALUE CHACKED)
   360                              <1> ;	OUTPUT REGISTERS:
   361                              <1> ;	(ES:DI) - POINTER TO DRIVE PARAMETERS TABLE FOR THIS MEDIA TYPE,
   362                              <1> ;		  UNCHANGED IF (AH) IS NON-ZERO
   363                              <1> ;	(AH) - 00H, CY = 0, TRACK AND SECTORS/TRACK COMBINATION IS SUPPORTED
   364                              <1> ;	     - 01H, CY = 1, FUNCTION IS NOT AVAILABLE
   365                              <1> ;	     - 0CH, CY = 1, TRACK AND SECTORS/TRACK COMBINATION IS NOT SUPPORTED
   366                              <1> ;	     - 80H, CY = 1, TIME OUT (DISKETTE NOT PRESENT)		
   367                              <1> ;-------------------------------------------------------------------------------
   368                              <1> ;	DISK CHANGE STATUS IS ONLY CHECKED WHEN A MEDIA SPECIFIED IS OTHER
   369                              <1> ;	THAN 360 KB DRIVE. IF THE DISK CHANGE LINE IS FOUND TO BE
   370                              <1> ;	ACTIVE THE FOLLOWING ACTIONS TAKE PLACE:
   371                              <1> ;		ATTEMPT TO RESET DISK CHANGE LINE TO INACTIVE STATE. 
   372                              <1> ;		IF ATTEMPT SUCCEEDS SET DASD TYPE FOR FORMAT AND RETURN DISK 
   373                              <1> ;		CHANGE ERROR CODE
   374                              <1> ;		IF ATTEMPT FAILS RETURN TIMEOUT ERROR CODE AND SET DASD TYPE 
   375                              <1> ;		TO A PREDETERMINED STATE INDICATING MEDIA TYPE UNKNOWN.
   376                              <1> ;	IF THE DISK CHANGE LINE IN INACTIVE PERFORM SET DASD TYPE FOR FORMAT.
   377                              <1> ;
   378                              <1> ; DATA VARIABLE -- @DISK_POINTER
   379                              <1> ;	DOUBLE WORD POINTER TO THE CURRENT SET OF DISKETTE PARAMETERS
   380                              <1> ;-------------------------------------------------------------------------------
   381                              <1> ; OUTPUT FOR ALL FUNCTIONS
   382                              <1> ;	AH = STATUS OF OPERATION
   383                              <1> ;		STATUS BITS ARE DEFINED IN THE EQUATES FOR @DISKETTE_STATUS
   384                              <1> ;		VARIABLE IN THE DATA SEGMENT OF THIS MODULE
   385                              <1> ;	CY = 0	SUCCESSFUL OPERATION (AH=0 ON RETURN, EXCEPT FOR READ DASD
   386                              <1> ;		TYPE AH=(15)).
   387                              <1> ;	CY = 1	FAILED OPERATION (AH HAS ERROR REASON)
   388                              <1> ;	FOR READ/WRITE/VERIFY
   389                              <1> ;		DS,BX,DX,CX PRESERVED
   390                              <1> ;	NOTE: IF AN ERROR IS REPORTED BY THE DISKETTE CODE, THE APPROPRIATE 
   391                              <1> ;		ACTION IS TO RESET THE DISKETTE, THEN RETRY THE OPERATION.
   392                              <1> ;		ON READ ACCESSES, NO MOTOR START DELAY IS TAKEN, SO THAT 
   393                              <1> ;		THREE RETRIES ARE REQUIRED ON READS TO ENSURE THAT THE 
   394                              <1> ;		PROBLEM IS NOT DUE TO MOTOR START-UP.
   395                              <1> ;-------------------------------------------------------------------------------
   396                              <1> ;
   397                              <1> ; DISKETTE STATE MACHINE - ABSOLUTE ADDRESS 40:90 (DRIVE A) & 91 (DRIVE B)
   398                              <1> ;
   399                              <1> ;   -----------------------------------------------------------------
   400                              <1> ;   |       |       |       |       |       |       |       |       |
   401                              <1> ;   |   7   |   6   |   5   |   4   |   3   |   2   |   1   |   0   |
   402                              <1> ;   |       |       |       |       |       |       |       |       |
   403                              <1> ;   -----------------------------------------------------------------
   404                              <1> ;	|	|	|	|	|	|	|	|
   405                              <1> ;	|	|	|	|	|	-----------------
   406                              <1> ;	|	|	|	|	|		|
   407                              <1> ;	|	|	|	|    RESERVED		|
   408                              <1> ;	|	|	|	|		  PRESENT STATE
   409                              <1> ;	|	|	|	|	000: 360K IN 360K DRIVE UNESTABLISHED
   410                              <1> ;	|	|	|	|	001: 360K IN 1.2M DRIVE UNESTABLISHED
   411                              <1> ;	|	|	|	|	010: 1.2M IN 1.2M DRIVE UNESTABLISHED
   412                              <1> ;	|	|	|	|	011: 360K IN 360K DRIVE ESTABLISHED
   413                              <1> ;	|	|	|	|	100: 360K IN 1.2M DRIVE ESTABLISHED
   414                              <1> ;	|	|	|	|	101: 1.2M IN 1.2M DRIVE ESTABLISHED
   415                              <1> ;	|	|	|	|	110: RESERVED
   416                              <1> ;	|	|	|	|	111: NONE OF THE ABOVE
   417                              <1> ;	|	|	|	|
   418                              <1> ;	|	|	|	------>	MEDIA/DRIVE ESTABLISHED
   419                              <1> ;	|	|	|
   420                              <1> ;	|	|	-------------->	DOUBLE STEPPING REQUIRED (360K IN 1.2M
   421                              <1> ;	|	|			DRIVE)
   422                              <1> ;	|	|
   423                              <1> ;	------------------------------>	DATA TRANSFER RATE FOR THIS DRIVE:
   424                              <1> ;
   425                              <1> ;						00: 500 KBS
   426                              <1> ;						01: 300 KBS
   427                              <1> ;						10: 250 KBS
   428                              <1> ;						11: RESERVED
   429                              <1> ;
   430                              <1> ;
   431                              <1> ;-------------------------------------------------------------------------------
   432                              <1> ; STATE OPERATION STARTED - ABSOLUTE ADDRESS 40:92 (DRIVE A) & 93 (DRIVE B)
   433                              <1> ;-------------------------------------------------------------------------------
   434                              <1> ; PRESENT CYLINDER NUMBER - ABSOLUTE ADDRESS 40:94 (DRIVE A) & 95 (DRIVE B)
   435                              <1> ;-------------------------------------------------------------------------------
   436                              <1> 
   437                              <1> struc MD
   438 00000000 ??                  <1> 	.SPEC1		resb	1	; SRT=D, HD UNLOAD=0F - 1ST SPECIFY BYTE
   439 00000001 ??                  <1> 	.SPEC2		resb	1	; HD LOAD=1, MODE=DMA - 2ND SPECIFY BYTE
   440 00000002 ??                  <1> 	.OFF_TIM	resb	1	; WAIT TIME AFTER OPERATION TILL MOTOR OFF
   441 00000003 ??                  <1> 	.BYT_SEC	resb	1	; 512 BYTES/SECTOR
   442 00000004 ??                  <1> 	.SEC_TRK	resb	1	; EOT (LAST SECTOR ON TRACK)
   443 00000005 ??                  <1> 	.GAP		resb	1	; GAP LENGTH
   444 00000006 ??                  <1> 	.DTL		resb	1	; DTL
   445 00000007 ??                  <1> 	.GAP3		resb	1	; GAP LENGTH FOR FORMAT
   446 00000008 ??                  <1> 	.FIL_BYT	resb	1	; FILL BYTE FOR FORMAT
   447 00000009 ??                  <1> 	.HD_TIM		resb	1	; HEAD SETTLE TIME (MILLISECONDS)
   448 0000000A ??                  <1> 	.STR_TIM	resb	1	; MOTOR START TIME (1/8 SECONDS)
   449 0000000B ??                  <1> 	.MAX_TRK	resb	1	; MAX. TRACK NUMBER
   450 0000000C ??                  <1> 	.RATE		resb	1	; DATA TRANSFER RATE
   451                              <1> endstruc
   452                              <1> 
   453                              <1> BIT7OFF	EQU	7FH
   454                              <1> BIT7ON	EQU	80H
   455                              <1> 
   456                              <1> ; 30/08/2020 - TRDOS 386 v2
   457                              <1> 
   458                              <1> ;;int13h: ; 16/02/2015
   459                              <1> ;; 16/02/2015 - 21/02/2015
   460                              <1> ; 17/07/2022 - TRDOS 386 v2.0.5
   461                              <1> ;int40h:
   462                              <1> ;; 11/04/2021
   463                              <1> ;diskette_io:
   464                              <1> ;	clc ; 20/07/2020
   465                              <1> ;	pushfd
   466                              <1> ;	push 	cs
   467                              <1> ;	call 	DISKETTE_IO_1
   468                              <1> ;	retn
   469                              <1> 
   470                              <1> 	; 09/08/2022
   471                              <1> 	; 06/08/2022
   472                              <1> 	; 17/07/2022 - TRDOS 386 v2.0.5
   473                              <1> 	; (jump from DISK_IO)
   474                              <1> DISKETTE_IO_1:
   475                              <1> 	;sti ; 17/07/2022		; INTERRUPTS BACK ON
   476                              <1> 	
   477                              <1> 	;push	ebp			; USER REGISTER
   478                              <1> 	;push	edi			; USER REGISTER
   479                              <1> 	;push	edx			; HEAD #, DRIVE # OR USER REGISTER
   480                              <1> 	;push	ebx			; BUFFER OFFSET PARAMETER OR REGISTER
   481                              <1> 	;push	ecx			; TRACK #-SECTOR # OR USER REGISTER
   482                              <1> 	;mov	ebp, esp		; BP     => PARAMETER LIST DEP. ON AH
   483                              <1> 					; [BP]   = SECTOR #
   484                              <1> 					; [BP+1] = TRACK #
   485                              <1> 					; [BP+2] = BUFFER OFFSET
   486                              <1> 					; FOR RETURN OF DRIVE PARAMETERS:
   487                              <1> 					; CL/[BP] = BITS 7&6 HI BITS OF MAX CYL
   488                              <1> 					; 	    BITS 0-5 MAX SECTORS/TRACK
   489                              <1> 					; CH/[BP+1] = LOW 8 BITS OF MAX CYL.
   490                              <1> 					; BL/[BP+2] = BITS 7-4 = 0
   491                              <1> 					;	      BITS 3-0 = VALID CMOS TYPE
   492                              <1> 					; BH/[BP+3] = 0
   493                              <1> 					; DL/[BP+4] = # DRIVES INSTALLED
   494                              <1> 					; DH/[BP+5] = MAX HEAD #
   495                              <1> 					; DI/[BP+6] = OFFSET TO DISK BASE
   496                              <1> 	;push	es ; 06/02/2015	
   497                              <1> 	;push	ds			; BUFFER SEGMENT PARM OR USER REGISTER
   498                              <1> 	;push	esi			; USER REGISTERS
   499                              <1> 	;;call	DDS			; SEGMENT OF BIOS DATA AREA TO DS
   500                              <1> 	;;mov	cx, cs
   501                              <1> 	;;mov	ds, cx
   502                              <1> 	;mov	cx, KDATA
   503                              <1> 	;mov	ds, cx
   504                              <1> 	;mov	es, cx
   505                              <1> 
   506                              <1> 	; 17/07/2022
   507                              <1> 	; Registers are also on stack 
   508                              <1> 	; (with same contents) 
   509                              <1> 	; in following order:
   510                              <1> 	;
   511                              <1> 	;    ebx = esp+20
   512                              <1> 	;    ecx = esp+16
   513                              <1> 	;    edx = esp+12
   514                              <1> 	;    esi = esp+8
   515                              <1> 	;    edi = esp+4
   516                              <1> 	;
   517                              <1> 	; [esp] = caller's return address (from 'DISK_IO')	
   518                              <1> 	;
   519                              <1> 	; cs = KCODE == KDATA
   520                              <1> 	; ds = es = ss = KDATA
   521                              <1> 
   522                              <1> 	; 17/07/2022
   523 0000420B 55                  <1> 	push	ebp
   524 0000420C 89DD                <1> 	mov	ebp, ebx
   525                              <1> 
   526                              <1> 	;cmp	ah, (FNC_TAE-FNC_TAB)/2	; CHECK FOR > LARGEST FUNCTION
   527 0000420E 80FC19              <1> 	cmp	ah, (FNC_TAE-FNC_TAB)/4	; 18/02/2015
   528                              <1> 	;jb	short OK_FUNC		; FUNCTION OK
   529                              <1> 	;mov	ah, 14h			; REPLACE WITH KNOWN INVALID FUNCTION
   530                              <1> 	; 09/08/2022
   531 00004211 730F                <1> 	jnb	short INV_FUNC
   532                              <1> OK_FUNC:
   533 00004213 80FC01              <1> 	cmp	ah, 1			; RESET OR STATUS ?
   534 00004216 760C                <1> 	jbe	short OK_DRV		; IF RESET OR STATUS DRIVE ALWAYS OK
   535 00004218 80FC08              <1> 	cmp	ah, 8			; READ DRIVE PARMS ?
   536 0000421B 7407                <1> 	je	short OK_DRV		; IF SO DRIVE CHECKED LATER
   537 0000421D 80FA01              <1> 	cmp	dl, 1			; DRIVES 0 AND 1 OK
   538 00004220 7602                <1> 	jbe	short OK_DRV		; IF 0 OR 1 THEN JUMP
   539                              <1> INV_FUNC:
   540 00004222 B414                <1> 	mov	ah, 14h			; REPLACE WITH KNOWN INVALID FUNCTION
   541                              <1> OK_DRV:
   542                              <1> 	; 17/07/2022
   543                              <1> 	;xor	ecx, ecx
   544                              <1> 	;;mov	esi, ecx ; 08/02/2015
   545                              <1> 	;mov	edi, ecx ; 08/02/2015
   546                              <1> 	;mov	cl, ah			; CL = FUNCTION
   547                              <1> 	;;xor	ch, ch			; CX = FUNCTION
   548                              <1> 	;;shl	cl, 1			; FUNCTION TIMES 2
   549                              <1> 	;shl	cl, 2 ; 20/02/2015	; FUNCTION TIMES 4 (for 32 bit offset)
   550                              <1> 	;mov	ebx, FNC_TAB		; LOAD START OF FUNCTION TABLE
   551                              <1> 	;add	ebx, ecx		; ADD OFFSET INTO TABLE => ROUTINE
   552                              <1> 
   553                              <1> 	; 17/07/2022	
   554 00004224 29DB                <1> 	sub	ebx, ebx
   555 00004226 88E3                <1> 	mov	bl, ah			; BL = FUNCTION	
   556 00004228 C0E302              <1> 	shl	bl, 2 ; * 4
   557 0000422B 81C3[4A420000]      <1> 	add	ebx, FNC_TAB		; [EBX] = FUNCTION ADDRESS
   558                              <1> 	
   559 00004231 88F4                <1> 	mov	ah, dh			; AX = HEAD #,# OF SECTORS OR DASD TYPE
   560                              <1> 	;xor	dh, dh			; DX = DRIVE #
   561                              <1> 	;mov	si, ax			; SI = HEAD #,# OF SECTORS OR DASD TYPE
   562                              <1> 	;mov	di, dx			; DI = DRIVE #
   563                              <1> 	
   564 00004233 0FB7F0              <1> 	movzx	esi, ax			; ESI = HEAD #,# OF SECTORS OR DASD TYPE
   565 00004236 0FB6FA              <1> 	movzx	edi, dl			; EDI = DRIVE # 
   566                              <1> 
   567                              <1> 	; CH = cylinder number (low 8 bit)
   568                              <1> 	; CL = sector number (and high 2 bits of cylinder number)
   569                              <1> 
   570                              <1> 	; 06/08/2022
   571                              <1> 	; 11/12/2014
   572                              <1>         ;mov	[cfd], dl               ; current floppy drive (for 'GET_PARM')        
   573                              <1> 	; 06/08/2022
   574                              <1> 	; EDI = (current) DRIVE #
   575                              <1> 	;
   576 00004239 8A25[10790100]      <1> 	mov	ah, [DSKETTE_STATUS]	; LOAD STATUS TO AH FOR STATUS FUNCTION
   577 0000423F C605[10790100]00    <1> 	mov	byte [DSKETTE_STATUS], 0 ; INITIALIZE FOR ALL OTHERS
   578                              <1> 
   579                              <1> ;	THROUGHOUT THE DISKETTE BIOS, THE FOLLOWING INFORMATION IS CONTAINED IN
   580                              <1> ;	THE FOLLOWING MEMORY LOCATIONS AND REGISTERS. NOT ALL DISKETTE BIOS
   581                              <1> ;	FUNCTIONS REQUIRE ALL OF THESE PARAMETERS.
   582                              <1> ;
   583                              <1> ;		DI	: DRIVE #
   584                              <1> ;		SI-HI	: HEAD #
   585                              <1> ;		SI-LOW	: # OF SECTORS OR DASD TYPE FOR FORMAT
   586                              <1> ;		ES	: BUFFER SEGMENT
   587                              <1> ;		[BP]	: SECTOR #
   588                              <1> ;		[BP+1]	: TRACK #
   589                              <1> ;		[BP+2]	: BUFFER OFFSET
   590                              <1> ;
   591                              <1> ;	ACROSS CALLS TO SUBROUTINES THE CARRY FLAG (CY=1), WHERE INDICATED IN 
   592                              <1> ;	SUBROUTINE PROLOGUES, REPRESENTS AN EXCEPTION RETURN (NORMALLY AN ERROR 
   593                              <1> ;	CONDITION). IN MOST CASES, WHEN CY = 1, @DSKETTE_STATUS CONTAINS THE 
   594                              <1> ;	SPECIFIC ERROR CODE.
   595                              <1> 
   596                              <1> 	; 17/07/2022
   597                              <1> 	; EBX = pointer to function address
   598                              <1> 	; EBP = buffer address
   599                              <1> 	; EDI = drive number (0 or 1)
   600                              <1> 	; ESI = head number (byte 1) and sector count or disk type (byte 0)
   601                              <1> 	; CH = cylinder number (low 8 bit)
   602                              <1> 	; CL = sector number (and high 2 bits of cylinder number)
   603                              <1> 
   604                              <1> 					; (AH) = @DSKETTE_STATUS
   605 00004246 FF13                <1> 	call	dword [ebx]		; CALL THE REQUESTED FUNCTION
   606                              <1> 	
   607                              <1> 	;pop	esi			; RESTORE ALL REGISTERS
   608                              <1> 	;pop	ds
   609                              <1> 	;pop	es	; 06/02/2015
   610                              <1> 	;pop	ecx
   611                              <1> 	;pop	ebx
   612                              <1> 	;pop	edx
   613                              <1> 	;pop	edi
   614                              <1> 	;mov	ebp, esp
   615                              <1> 	;push	eax
   616                              <1> 	;pushfd
   617                              <1> 	;pop	eax
   618                              <1> 	;;mov	[bp+6], ax
   619                              <1> 	;mov	[ebp+12], eax  ; 18/02/2015, flags
   620                              <1> 	;pop	eax
   621                              <1> 	;pop	ebp
   622                              <1> 	;iretd
   623                              <1> 
   624                              <1> 	; 17/07/2022
   625 00004248 5D                  <1> 	pop	ebp
   626                              <1> 
   627                              <1> 	; 17/07/2022
   628                              <1> 	; Stack order:
   629                              <1> 	;    ebx = esp+20
   630                              <1> 	;    ecx = esp+16
   631                              <1> 	;    edx = esp+12
   632                              <1> 	;    esi = esp+8
   633                              <1> 	;    edi = esp+4
   634                              <1> 	;
   635                              <1> 	; [esp] = caller's return address (from 'DISK_IO')
   636                              <1> 
   637                              <1> 	; CF = disk i/o status (1 = error)
   638                              <1> 	; AH = error code (if > 0 and cf = 1)
   639                              <1> 
   640                              <1> 	; 17/07/2022
   641 00004249 C3                  <1> 	retn	; return to the caller of 'DISK_IO' 
   642                              <1> 
   643                              <1> ;-------------------------------------------------------------------------------
   644                              <1> ; DW --> dd (06/02/2015)
   645 0000424A [AE420000]          <1> FNC_TAB	dd	DSK_RESET		; AH = 00H; RESET
   646 0000424E [19430000]          <1> 	dd	DSK_STATUS		; AH = 01H; STATUS
   647 00004252 [29430000]          <1> 	dd	DSK_READ		; AH = 02H; READ
   648 00004256 [36430000]          <1> 	dd	DSK_WRITE		; AH = 03H; WRITE
   649 0000425A [4A440000]          <1> 	dd	DSK_VERF		; AH = 04H; VERIFY
   650 0000425E [5A440000]          <1> 	dd	DSK_FORMAT		; AH = 05H; FORMAT
   651 00004262 [D8440000]          <1> 	dd	FNC_ERR			; AH = 06H; INVALID
   652 00004266 [D8440000]          <1> 	dd	FNC_ERR			; AH = 07H; INVALID
   653 0000426A [E4440000]          <1> 	dd	DSK_PARMS		; AH = 08H; READ DRIVE PARAMETERS
   654 0000426E [D8440000]          <1> 	dd	FNC_ERR			; AH = 09H; INVALID
   655 00004272 [D8440000]          <1> 	dd	FNC_ERR			; AH = 0AH; INVALID
   656 00004276 [D8440000]          <1> 	dd	FNC_ERR			; AH = 0BH; INVALID
   657 0000427A [D8440000]          <1> 	dd	FNC_ERR			; AH = 0CH; INVALID
   658 0000427E [D8440000]          <1> 	dd	FNC_ERR			; AH = 0DH; INVALID
   659 00004282 [D8440000]          <1> 	dd	FNC_ERR			; AH = 0EH; INVALID
   660 00004286 [D8440000]          <1> 	dd	FNC_ERR			; AH = 0FH; INVALID
   661 0000428A [D8440000]          <1> 	dd	FNC_ERR			; AH = 10H; INVALID
   662 0000428E [D8440000]          <1> 	dd	FNC_ERR			; AH = 11H; INVALID
   663 00004292 [D8440000]          <1> 	dd	FNC_ERR			; AH = 12H; INVALID
   664 00004296 [D8440000]          <1> 	dd	FNC_ERR			; AH = 13H; INVALID
   665 0000429A [D8440000]          <1> 	dd	FNC_ERR			; AH = 14H; INVALID
   666 0000429E [A1450000]          <1> 	dd	DSK_TYPE		; AH = 15H; READ DASD TYPE
   667 000042A2 [C1450000]          <1> 	dd	DSK_CHANGE		; AH = 16H; CHANGE STATUS
   668 000042A6 [F0450000]          <1> 	dd	FORMAT_SET		; AH = 17H; SET DASD TYPE
   669 000042AA [65460000]          <1> 	dd	SET_MEDIA		; AH = 18H; SET MEDIA TYPE	
   670                              <1> FNC_TAE EQU     $                       ; END
   671                              <1> 
   672                              <1> 	; 17/07/2022 - TRDOS 386 v2.0.5
   673                              <1> ;-------------------------------------------------------------------------------
   674                              <1> ; DISK_RESET	(AH = 00H)	
   675                              <1> ;		RESET THE DISKETTE SYSTEM.
   676                              <1> ;
   677                              <1> ; ON EXIT:	@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION
   678                              <1> ;-------------------------------------------------------------------------------
   679                              <1> DSK_RESET:
   680                              <1> 	; 17/07/2022
   681 000042AE 66BAF203            <1> 	mov	dx, 03F2h		; ADAPTER CONTROL PORT
   682 000042B2 FA                  <1> 	cli				; NO INTERRUPTS
   683 000042B3 A0[0E790100]        <1> 	mov	al, [MOTOR_STATUS]	; GET DIGITAL OUTPUT REGISTER REFLECTION
   684 000042B8 243F                <1> 	and	al, 00111111b		; KEEP SELECTED AND MOTOR ON BITS
   685 000042BA C0C004              <1> 	rol	al, 4			; MOTOR VALUE TO HIGH NIBBLE
   686                              <1> 					; DRIVE SELECT TO LOW NIBBLE
   687 000042BD 0C08                <1> 	or	al, 00001000b		; TURN ON INTERRUPT ENABLE
   688 000042BF EE                  <1> 	out	dx, al			; RESET THE ADAPTER
   689 000042C0 C605[0D790100]00    <1> 	mov	byte [SEEK_STATUS], 0	; SET RECALIBRATE REQUIRED ON ALL DRIVES
   690                              <1> 	;jmp	$+2			; WAIT FOR I/O
   691                              <1> 	;jmp	$+2			; WAIT FOR I/O (TO INSURE MINIMUM
   692                              <1> 					;      PULSE WIDTH)
   693                              <1> 	; 19/12/2014
   694                              <1> 	NEWIODELAY
    83 000042C7 E6EB                <2>  out 0EBh, al
   695                              <1> 
   696                              <1> 	; 17/12/2014 
   697                              <1> 	; AWARD BIOS 1999 - RESETDRIVES (ADISK.ASM)
   698 000042C9 B915000000          <1> 	mov	ecx, WAITCPU_RESET_ON	; cx = 21 -- Min. 14 micro seconds !?
   699                              <1> wdw1:
   700                              <1> 	NEWIODELAY   ; 27/02/2015
    83 000042CE E6EB                <2>  out 0EBh, al
   701 000042D0 E2FC                <1> 	loop	wdw1
   702                              <1> 	;
   703 000042D2 0C04                <1> 	or	al, 00000100b		; TURN OFF RESET BIT
   704 000042D4 EE                  <1> 	out	dx, al			; RESET THE ADAPTER
   705                              <1> 	; 16/12/2014
   706                              <1> 	IODELAY
    78 000042D5 EB00                <2>  jmp short $+2
    79 000042D7 EB00                <2>  jmp short $+2
   707                              <1> 	;
   708                              <1> 	;sti				; ENABLE THE INTERRUPTS
   709 000042D9 E8DD0A0000          <1> 	call	WAIT_INT		; WAIT FOR THE INTERRUPT
   710 000042DE 7230                <1> 	jc	short DR_ERR		; IF ERROR, RETURN IT
   711                              <1> 	;mov	cx, 11000000b		; CL = EXPECTED @NEC_STATUS
   712                              <1> 	; 17/07/2022
   713                              <1> 	;xor	ch, ch
   714 000042E0 B1C0                <1> 	mov	cl, 11000000b
   715                              <1> NXT_DRV:
   716                              <1> 	;push	cx			; SAVE FOR CALL
   717                              <1> 	; 11/04/2021
   718 000042E2 51                  <1> 	push	ecx
   719 000042E3 B8[0F430000]        <1> 	mov	eax, DR_POP_ERR 	; LOAD NEC_OUTPUT ERROR ADDRESS
   720 000042E8 50                  <1> 	push	eax			; "
   721 000042E9 B408                <1> 	mov	ah, 08h			; SENSE INTERRUPT STATUS COMMAND
   722 000042EB E8C3090000          <1> 	call	NEC_OUTPUT
   723 000042F0 58                  <1> 	pop	eax			; THROW AWAY ERROR RETURN
   724 000042F1 E8F40A0000          <1> 	call	RESULTS			; READ IN THE RESULTS
   725                              <1> 	;pop	cx			; RESTORE AFTER CALL
   726                              <1> 	; 11/04/2021
   727 000042F6 59                  <1> 	pop	ecx
   728 000042F7 7217                <1> 	jc	short DR_ERR		; ERROR RETURN
   729 000042F9 3A0D[11790100]      <1> 	cmp	cl, [NEC_STATUS]	; TEST FOR DRIVE READY TRANSITION
   730 000042FF 750F                <1> 	jnz	short DR_ERR		; EVERYTHING OK
   731 00004301 FEC1                <1> 	inc	cl			; NEXT EXPECTED @NEC_STATUS
   732 00004303 80F9C3              <1> 	cmp	cl, 11000011b		; ALL POSSIBLE DRIVES CLEARED
   733 00004306 76DA                <1> 	jbe	short NXT_DRV		; FALL THRU IF 11000100B OR >
   734                              <1> 	;
   735 00004308 E800040000          <1> 	call	SEND_SPEC		; SEND SPECIFY COMMAND TO NEC
   736                              <1> RESBAC:
   737                              <1> 	; 06/08/2022
   738 0000430D EB10                <1> 	jmp	short SETUP_END_X
   739                              <1> 	;call	SETUP_END		; VARIOUS CLEANUPS
   740                              <1> 	;;mov	bx, si			; GET SAVED AL TO BL
   741                              <1> 	;; 17/07/2022
   742                              <1> 	;mov	ebx, esi		
   743                              <1> 	;mov	al, bl			; PUT BACK FOR RETURN
   744                              <1> 	;retn		
   745                              <1> 
   746                              <1> DR_POP_ERR:
   747                              <1> 	;pop	cx			; CLEAR STACK
   748                              <1> 	; 11/04/2021
   749 0000430F 59                  <1> 	pop	ecx
   750                              <1> DR_ERR:
   751 00004310 800D[10790100]20    <1> 	or	byte [DSKETTE_STATUS], BAD_NEC ; SET ERROR CODE
   752                              <1> 	;jmp	short RESBAC		; RETURN FROM RESET
   753                              <1> 	; 06/08/2022
   754 00004317 EB06                <1> 	jmp	short SETUP_END_X
   755                              <1> 
   756                              <1> ;-------------------------------------------------------------------------------
   757                              <1> ; DISK_STATUS	(AH = 01H)
   758                              <1> ;	DISKETTE STATUS.
   759                              <1> ;
   760                              <1> ; ON ENTRY:	AH : STATUS OF PREVIOUS OPERATION
   761                              <1> ;
   762                              <1> ; ON EXIT:	AH, @DSKETTE_STATUS, CY REFLECT STATUS OF PREVIOUS OPERATION.
   763                              <1> ;-------------------------------------------------------------------------------
   764                              <1> DSK_STATUS:
   765 00004319 8825[10790100]      <1> 	mov	[DSKETTE_STATUS], ah	; PUT BACK FOR SETUP END
   766                              <1> SETUP_END_X:	; 06/08/2022
   767 0000431F E809010000          <1> 	call	SETUP_END		; VARIOUS CLEANUPS
   768                              <1> 	;mov	bx, si			; GET SAVED AL TO BL
   769                              <1> 	;mov	al, bl			; PUT BACK FOR RETURN
   770                              <1> 	; 06/08/2022
   771 00004324 89F3                <1> 	mov	ebx, esi
   772 00004326 88D8                <1> 	mov	al, bl
   773 00004328 C3                  <1> 	retn		
   774                              <1> 
   775                              <1> ;-------------------------------------------------------------------------------
   776                              <1> ; DISK_READ	(AH = 02H)	
   777                              <1> ;	DISKETTE READ.
   778                              <1> ;
   779                              <1> ; ON ENTRY:	DI	: DRIVE #
   780                              <1> ;		SI-HI	: HEAD #
   781                              <1> ;		SI-LOW	: # OF SECTORS
   782                              <1> ;		ES	: BUFFER SEGMENT
   783                              <1> ;		[BP]	: SECTOR #
   784                              <1> ;		[BP+1]	: TRACK #
   785                              <1> ;		[BP+2]	: BUFFER OFFSET
   786                              <1> ;
   787                              <1> ; ON EXIT:	@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION
   788                              <1> ;-------------------------------------------------------------------------------
   789                              <1> 
   790                              <1> ; 06/02/2015, ES:BX -> EBX (unix386.s)
   791                              <1> 
   792                              <1> DSK_READ:
   793 00004329 8025[0E790100]7F    <1> 	and	byte [MOTOR_STATUS], 01111111b ; INDICATE A READ OPERATION
   794 00004330 66B846E6            <1> 	mov	ax, 0E646h		; AX = NEC COMMAND, DMA COMMAND
   795                              <1> 	;call	RD_WR_VF		; COMMON READ/WRITE/VERIFY
   796                              <1> 	;retn
   797                              <1> 	; 06/08/2022
   798 00004334 EB0B                <1> 	jmp	short RD_WR_VF
   799                              <1> 
   800                              <1> ;-------------------------------------------------------------------------------
   801                              <1> ; DISK_WRITE	(AH = 03H)
   802                              <1> ;	DISKETTE WRITE.
   803                              <1> ;
   804                              <1> ; ON ENTRY:	DI	: DRIVE #
   805                              <1> ;		SI-HI	: HEAD #
   806                              <1> ;		SI-LOW	: # OF SECTORS
   807                              <1> ;		ES	: BUFFER SEGMENT
   808                              <1> ;		[BP]	: SECTOR #
   809                              <1> ;		[BP+1]	: TRACK #
   810                              <1> ;		[BP+2]	: BUFFER OFFSET
   811                              <1> ;
   812                              <1> ; ON EXIT:	@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION
   813                              <1> ;-------------------------------------------------------------------------------
   814                              <1> 
   815                              <1> ; 06/02/2015, ES:BX -> EBX (unix386.s)
   816                              <1> 
   817                              <1> DSK_WRITE:
   818 00004336 66B84AC5            <1> 	mov	ax, 0C54Ah		; AX = NEC COMMAND, DMA COMMAND
   819 0000433A 800D[0E790100]80    <1> 	or	byte [MOTOR_STATUS], 10000000b ; INDICATE WRITE OPERATION
   820                              <1> 	;call	RD_WR_VF		; COMMON READ/WRITE/VERIFY
   821                              <1> 	;retn
   822                              <1> 	; 06/08/2022
   823                              <1> 	;jmp	short RD_WR_VF
   824                              <1> 
   825                              <1> 	; 09/08/2022
   826                              <1> 	; 06/08/2022 - TRDOS 386 Kernel v2.0.5
   827                              <1> ;-------------------------------------------------------------------------------
   828                              <1> ; RD_WR_VF
   829                              <1> ;	COMMON READ, WRITE AND VERIFY: 
   830                              <1> ;	MAIN LOOP FOR STATE RETRIES.
   831                              <1> ;
   832                              <1> ; ON ENTRY:	AH = READ/WRITE/VERIFY NEC PARAMETER
   833                              <1> ;		AL = READ/WRITE/VERIFY DMA PARAMETER
   834                              <1> ;
   835                              <1> ; ON EXIT:	@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION
   836                              <1> ;-------------------------------------------------------------------------------
   837                              <1> RD_WR_VF:
   838                              <1> 	; 02/12/2023
   839                              <1> 	; 11/08/2022
   840                              <1> 	; 09/08/2022
   841                              <1> 	; 07/08/2022
   842                              <1> 	; 06/08/2022
   843                              <1> 	; 11/04/2021 (32 bit push/pop, AX -> EAX)
   844                              <1> 	
   845 00004341 50                  <1> 	push	eax			; SAVE DMA, NEC PARAMETERS
   846                              <1> 	
   847                              <1> 	; 02/12/2023
   848                              <1> 	; (diskette change check for 'dir', 28 seconds)
   849 00004342 A0[09790100]        <1> 	mov	al, [TIMER_LOW+1]
   850 00004347 D0E8                <1> 	shr	al, 1
   851 00004349 A2[6E800100]        <1> 	mov	[P_TIMER], al
   852                              <1> 
   853 0000434E E803040000          <1> 	call	XLAT_NEW		; TRANSLATE STATE TO PRESENT ARCH.
   854 00004353 E86A040000          <1> 	call	SETUP_STATE		; INITIALIZE START AND END RATE
   855 00004358 58                  <1> 	pop	eax			; RESTORE READ/WRITE/VERIFY
   856                              <1> DO_AGAIN:
   857 00004359 50                  <1> 	push	eax			; SAVE READ/WRITE/VERIFY PARAMETER
   858 0000435A E8F8040000          <1> 	call	MED_CHANGE		; MEDIA CHANGE AND RESET IF CHANGED
   859 0000435F 58                  <1> 	pop	eax			; RESTORE READ/WRITE/VERIFY
   860                              <1> 	;jc	short RWV_END		; MEDIA CHANGE ERROR OR TIME-OUT
   861                              <1> 	; 07/08/2022
   862 00004360 7305                <1> 	jnc	short RWV
   863 00004362 E9BC000000          <1> 	jmp	RWV_END
   864                              <1> RWV:
   865 00004367 50                  <1> 	push	eax			; SAVE READ/WRITE/VERIFY PARAMETER
   866 00004368 8AB7[1B790100]      <1> 	mov	dh, [DSK_STATE+edi]	; GET RATE STATE OF THIS DRIVE
   867 0000436E 80E6C0              <1> 	and	dh, RATE_MSK		; KEEP ONLY RATE
   868 00004371 E83E080000          <1> 	call	CMOS_TYPE		; RETURN DRIVE TYPE IN AL (AL)
   869                              <1> 	;;20/02/2015
   870                              <1> 	;;jc	short RWV_ASSUME	; ERROR IN CMOS
   871 00004376 7447                <1> 	jz	short RWV_ASSUME ; 20/02/2015
   872 00004378 3C01                <1> 	cmp	al, 1			; 40 TRACK DRIVE?
   873 0000437A 750D                <1> 	jne	short RWV_1		; NO, BYPASS CMOS VALIDITY CHECK
   874 0000437C F687[1B790100]01    <1> 	test	byte [DSK_STATE+edi], TRK_CAPA ; CHECK FOR 40 TRACK DRIVE
   875 00004383 7411                <1> 	jz	short RWV_2		; YES, CMOS IS CORRECT
   876                              <1> 	;mov	al, 2			; CHANGE TO 1.2M
   877                              <1> 	; 06/08/2022
   878 00004385 FEC0                <1> 	inc	al ; al = 2
   879 00004387 EB0D                <1> 	jmp	short RWV_2
   880                              <1> RWV_1:
   881                              <1> 	; 09/08/2022
   882                              <1> 	;jb	short RWV_2		; NO DRIVE SPECIFIED, CONTINUE
   883 00004389 F687[1B790100]01    <1> 	test    byte [DSK_STATE+edi], TRK_CAPA ; IS IT REALLY 40 TRACK?
   884 00004390 7504                <1> 	jnz	short RWV_2		; NO, 80 TRACK
   885 00004392 B001                <1> 	mov	al, 1			; IT IS 40 TRACK, FIX CMOS VALUE
   886 00004394 EB00                <1> 	jmp	short rwv_3
   887                              <1> RWV_2:
   888                              <1> 	; 09/08/2022
   889                              <1> 	;or	al, al			; TEST FOR NO DRIVE
   890                              <1> 	;jz	short RWV_ASSUME	; ASSUME TYPE, USE MAX TRACK
   891                              <1> rwv_3:
   892 00004396 E855030000          <1> 	call	DR_TYPE_CHECK		; RTN CS:BX = MEDIA/DRIVE PARAM TBL.
   893 0000439B 7222                <1> 	jc	short RWV_ASSUME	; TYPE NOT IN TABLE (BAD CMOS)
   894                              <1> 
   895                              <1> ;-----	SEARCH FOR MEDIA/DRIVE PARAMETER TABLE
   896                              <1> 
   897 0000439D 57                  <1> 	push	edi			; SAVE DRIVE #
   898                              <1> 	; 09/08/2022
   899                              <1> 	;xor	ebx, ebx		; EBX = INDEX TO DR_TYPE TABLE
   900 0000439E BB[98650000]        <1> 	mov	ebx, DR_TYPE
   901                              <1> 	;mov	ecx, DR_CNT		; ECX = LOOP COUNT
   902 000043A3 B106                <1> 	mov	cl, DR_CNT
   903                              <1> RWV_DR_SEARCH:
   904                              <1> 	;mov	ah, [DR_TYPE+ebx]	; GET DRIVE TYPE
   905 000043A5 8A23                <1> 	mov	ah, [ebx]
   906 000043A7 80E47F              <1> 	and	ah, BIT7OFF		; MASK OUT MSB
   907 000043AA 38E0                <1> 	cmp	al, ah			; DRIVE TYPE MATCH?
   908                              <1> 	; 09/08/2022
   909                              <1> 	;cmp	dl, ah
   910 000043AC 7509                <1> 	jne	short RWV_NXT_MD	; NO, CHECK NEXT DRIVE TYPE
   911                              <1> RWV_DR_FND:
   912                              <1> 	;mov	edi, [DR_TYPE+ebx+1] 	; EDI = MEDIA/DRIVE PARAMETER TABLE
   913 000043AE 43                  <1> 	inc	ebx
   914 000043AF 8B3B                <1> 	mov	edi, [ebx]
   915 000043B1 4B                  <1> 	dec	ebx
   916                              <1> RWV_MD_SEARH:
   917 000043B2 3A770C              <1>         cmp	dh, [edi+MD.RATE]       ; MATCH?
   918 000043B5 741D                <1> 	je	short RWV_MD_FND	; YES, GO GET 1ST SPECIFY BYTE
   919                              <1> RWV_NXT_MD:
   920 000043B7 83C305              <1> 	add	ebx, 5			; CHECK NEXT DRIVE TYPE
   921                              <1> 	;loop	RWV_DR_SEARCH
   922 000043BA FEC9                <1> 	dec	cl
   923 000043BC 75E7                <1> 	jnz	short RWV_DR_SEARCH 
   924 000043BE 5F                  <1> 	pop	edi			; RESTORE DRIVE #
   925                              <1> 
   926                              <1> ;-----	ASSUME PRIMARY DRIVE IS INSTALLED AS SHIPPED
   927                              <1> 
   928                              <1> RWV_ASSUME:
   929 000043BF BB[B6650000]        <1> 	mov	ebx, MD_TBL1		; POINT TO 40 TRACK 250 KBS
   930 000043C4 F687[1B790100]01    <1> 	test 	byte [DSK_STATE+edi], TRK_CAPA ; TEST FOR 80 TRACK
   931 000043CB 740A                <1> 	jz	short RWV_MD_FND1	; MUST BE 40 TRACK
   932 000043CD BB[D0650000]        <1> 	mov	ebx, MD_TBL3		; POINT TO 80 TRACK 500 KBS
   933 000043D2 EB03                <1> 	jmp	short RWV_MD_FND1	; GO SPECIFY PARAMTERS
   934                              <1> 
   935                              <1> ;-----	CS:BX POINTS TO MEDIA/DRIVE PARAMETER TABLE
   936                              <1> 	 			
   937                              <1> RWV_MD_FND:
   938 000043D4 89FB                <1> 	mov	ebx, edi		; BX = MEDIA/DRIVE PARAMETER TABLE
   939 000043D6 5F                  <1> 	pop	edi			; RESTORE DRIVE #
   940                              <1> 	
   941                              <1> ;-----	SEND THE SPECIFY COMMAND TO THE CONTROLLER
   942                              <1> 
   943                              <1> RWV_MD_FND1:
   944 000043D7 E85A030000          <1> 	call	SEND_SPEC_MD
   945 000043DC E8E3040000          <1> 	call	CHK_LASTRATE		; ZF=1 ATTEMP RATE IS SAME AS LAST RATE
   946 000043E1 7405                <1> 	jz	short RWV_DBL		; YES,SKIP SEND RATE COMMAND
   947 000043E3 E8BC040000          <1> 	call	SEND_RATE		; SEND DATA RATE TO NEC
   948                              <1> RWV_DBL:
   949 000043E8 53                  <1> 	push	ebx			; SAVE MEDIA/DRIVE PARAM TBL ADDRESS
   950 000043E9 E825070000          <1> 	call	SETUP_DBL		; CHECK FOR DOUBLE STEP
   951 000043EE 5B                  <1> 	pop	ebx			; RESTORE ADDRESS
   952 000043EF 7225                <1> 	jc	short CHK_RET		; ERROR FROM READ ID, POSSIBLE RETRY
   953                              <1> 	;pop	eax			; RESTORE NEC COMMAND
   954                              <1> 	;push	eax			; SAVE NEC COMMAND
   955                              <1> 	; 09/08/2022
   956 000043F1 8B0424              <1> 	mov	eax, [esp]
   957                              <1> 	;push	ebx			; SAVE MEDIA/DRIVE PARAM TBL ADDRESS
   958 000043F4 E8E0040000          <1> 	call	DMA_SETUP		; SET UP THE DMA
   959                              <1> 	;pop	ebx
   960 000043F9 58                  <1> 	pop	eax			; RESTORE NEC COMMAND
   961 000043FA 7231                <1> 	jc	short RWV_BAC		; CHECK FOR DMA BOUNDARY ERROR
   962 000043FC 50                  <1> 	push	eax			; SAVE NEC COMMAND
   963 000043FD 53                  <1> 	push	ebx			; SAVE MEDIA/DRIVE PARAM TBL ADDRESS
   964                              <1> 	; 11/08/2022
   965 000043FE 8B5C2420            <1> 	mov	ebx, [esp+32] ; ECX
   966 00004402 E866050000          <1> 	call	NEC_INIT		; INITIALIZE NEC
   967 00004407 5B                  <1> 	pop	ebx			; RESTORE ADDRESS
   968 00004408 720C                <1> 	jc	short CHK_RET		; ERROR - EXIT
   969 0000440A E88C050000          <1> 	call	RWV_COM			; OP CODE COMMON TO READ/WRITE
   970 0000440F 7205                <1> 	jc	short CHK_RET		; ERROR - EXIT
   971 00004411 E8D2050000          <1> 	call	NEC_TERM		; TERMINATE, GET STATUS, ETC.
   972                              <1> CHK_RET:
   973 00004416 E871060000          <1> 	call	RETRY			; CHECK FOR, SETUP RETRY
   974 0000441B 58                  <1> 	pop	eax			; RESTORE READ/WRITE PARAMETER
   975 0000441C 7305                <1> 	jnc	short RWV_END		; CY = 0 NO RETRY
   976 0000441E E936FFFFFF          <1>         jmp	DO_AGAIN                ; CY = 1 MEANS RETRY
   977                              <1> RWV_END:
   978 00004423 E81C060000          <1> 	call	DSTATE			; ESTABLISH STATE IF SUCCESSFUL
   979 00004428 E8AE060000          <1> 	call	NUM_TRANS		; AL = NUMBER TRANSFERRED
   980                              <1> RWV_BAC:				; BAD DMA ERROR ENTRY
   981                              <1> 	; 06/08/2022
   982                              <1> 	;push	eax			; SAVE NUMBER TRANSFERRED
   983                              <1> 	;call	XLAT_OLD		; TRANSLATE STATE TO COMPATIBLE MODE
   984                              <1> 	;pop	eax			; RESTORE NUMBER TRANSFERRED
   985                              <1> 	;call	SETUP_END		; VARIOUS CLEANUPS
   986                              <1> 	;retn
   987                              <1> 
   988                              <1> ;-------------------------------------------------------------------------------
   989                              <1> ; SETUP_END
   990                              <1> ;	RESTORES @MOTOR_COUNT TO PARAMETER PROVIDED IN TABLE 
   991                              <1> ;	AND LOADS @DSKETTE_STATUS TO AH, AND SETS CY.
   992                              <1> ;
   993                              <1> ; ON EXIT:
   994                              <1> ;	AH, @DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION
   995                              <1> ;-------------------------------------------------------------------------------
   996                              <1> SETUP_END:
   997                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
   998                              <1> 	;mov	dl, 2			; GET THE MOTOR WAIT PARAMETER
   999                              <1> 	;push	ax			; SAVE NUMBER TRANSFERRED
  1000                              <1> 	; 11/04/2021
  1001 0000442D 50                  <1> 	push	eax
  1002                              <1> 	; 06/08/2022
  1003 0000442E B002                <1> 	mov	al, 2			; GET THE MOTOR WAIT PARAMETER		
  1004 00004430 E888070000          <1> 	call	GET_PARM
  1005 00004435 8825[0F790100]      <1> 	mov	[MOTOR_COUNT], ah	; STORE UPON RETURN
  1006                              <1> 	;pop	ax			; RESTORE NUMBER TRANSFERRED
  1007                              <1> 	; 11/04/2021
  1008 0000443B 58                  <1> 	pop	eax
  1009 0000443C 8A25[10790100]      <1> 	mov	ah, [DSKETTE_STATUS]	; GET STATUS OF OPERATION
  1010 00004442 08E4                <1> 	or	ah, ah			; CHECK FOR ERROR
  1011 00004444 7403                <1> 	jz	short NUN_ERR		; NO ERROR
  1012 00004446 30C0                <1> 	xor	al, al			; CLEAR NUMBER RETURNED
  1013                              <1> 	; 06/08/2022
  1014 00004448 F9                  <1> 	stc
  1015                              <1> NUN_ERR: 
  1016                              <1> 	;cmp	ah, 1			; SET THE CARRY FLAG TO INDICATE
  1017                              <1> 	;cmc				; SUCCESS OR FAILURE
  1018 00004449 C3                  <1> 	retn
  1019                              <1> 
  1020                              <1> ;-------------------------------------------------------------------------------
  1021                              <1> ; DISK_VERF	(AH = 04H)
  1022                              <1> ;	DISKETTE VERIFY.
  1023                              <1> ;
  1024                              <1> ; ON ENTRY:	DI	: DRIVE #
  1025                              <1> ;		SI-HI	: HEAD #
  1026                              <1> ;		SI-LOW	: # OF SECTORS
  1027                              <1> ;		ES	: BUFFER SEGMENT
  1028                              <1> ;		[BP]	: SECTOR #
  1029                              <1> ;		[BP+1]	: TRACK #
  1030                              <1> ;		[BP+2]	: BUFFER OFFSET
  1031                              <1> ;
  1032                              <1> ; ON EXIT:	@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION
  1033                              <1> ;-------------------------------------------------------------------------------
  1034                              <1> DSK_VERF:
  1035 0000444A 8025[0E790100]7F    <1> 	and	byte [MOTOR_STATUS], 01111111b ; INDICATE A READ OPERATION
  1036 00004451 66B842E6            <1> 	mov	ax, 0E642h		; AX = NEC COMMAND, DMA COMMAND
  1037                              <1> 	;call	RD_WR_VF		; COMMON READ/WRITE/VERIFY
  1038                              <1> 	;retn
  1039                              <1> 	; 06/08/2022
  1040 00004455 E9E7FEFFFF          <1> 	jmp	RD_WR_VF
  1041                              <1> 
  1042                              <1> ;-------------------------------------------------------------------------------
  1043                              <1> ; DISK_FORMAT	(AH = 05H)
  1044                              <1> ;	DISKETTE FORMAT.
  1045                              <1> ;
  1046                              <1> ; ON ENTRY:	DI	: DRIVE #
  1047                              <1> ;		SI-HI	: HEAD #
  1048                              <1> ;		SI-LOW	: # OF SECTORS
  1049                              <1> ;		ES	: BUFFER SEGMENT
  1050                              <1> ;		[BP]	: SECTOR #
  1051                              <1> ;		[BP+1]	: TRACK #
  1052                              <1> ;		[BP+2]	: BUFFER OFFSET
  1053                              <1> ;		@DISK_POINTER POINTS TO THE PARAMETER TABLE OF THIS DRIVE
  1054                              <1> ;
  1055                              <1> ; ON EXIT:	@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION
  1056                              <1> ;-------------------------------------------------------------------------------
  1057                              <1> DSK_FORMAT:
  1058                              <1> 	; 11/08/2022
  1059                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  1060 0000445A E8F7020000          <1> 	call	XLAT_NEW		; TRANSLATE STATE TO PRESENT ARCH.
  1061 0000445F E89F030000          <1> 	call	FMT_INIT		; ESTABLISH STATE IF UNESTABLISHED
  1062 00004464 800D[0E790100]80    <1> 	or	byte [MOTOR_STATUS], 10000000b ; INDICATE WRITE OPERATION
  1063 0000446B E8E7030000          <1> 	call	MED_CHANGE		; CHECK MEDIA CHANGE AND RESET IF SO
  1064 00004470 7261                <1>         jc      short FM_DON            ; MEDIA CHANGED, SKIP
  1065 00004472 E896020000          <1> 	call	SEND_SPEC		; SEND SPECIFY COMMAND TO NEC
  1066 00004477 E848040000          <1> 	call	CHK_LASTRATE		; ZF=1 ATTEMPT RATE IS SAME AS LAST RATE
  1067 0000447C 7405                <1>         jz      short FM_WR             ; YES, SKIP SPECIFY COMMAND
  1068 0000447E E821040000          <1> 	call	SEND_RATE		; SEND DATA RATE TO CONTROLLER
  1069                              <1> FM_WR:
  1070 00004483 E8C8040000          <1> 	call	FMTDMA_SET		; SET UP THE DMA FOR FORMAT
  1071 00004488 7249                <1>         jc      short FM_DON            ; RETURN WITH ERROR
  1072 0000448A B44D                <1> 	mov	ah, 04Dh		; ESTABLISH THE FORMAT COMMAND
  1073                              <1> 	; 11/08/2022
  1074 0000448C 8B5C2418            <1> 	mov	ebx, [esp+24] ; ECX
  1075 00004490 E8D8040000          <1> 	call	NEC_INIT		; INITIALIZE THE NEC
  1076 00004495 723C                <1> 	jc	short FM_DON            ; ERROR - EXIT
  1077 00004497 B8[D3440000]        <1>         mov     eax, FM_DON             ; LOAD ERROR ADDRESS
  1078 0000449C 50                  <1> 	push	eax			; PUSH NEC_OUT ERROR RETURN
  1079                              <1> 	;mov	dl, 3			; BYTES/SECTOR VALUE TO NEC
  1080                              <1> 	; 06/08/2022
  1081 0000449D B003                <1> 	mov	al, 3
  1082 0000449F E819070000          <1> 	call	GET_PARM
  1083 000044A4 E80A080000          <1> 	call	NEC_OUTPUT
  1084                              <1> 	;mov	dl, 4			; SECTORS/TRACK VALUE TO NEC
  1085                              <1> 	; 06/08/2022
  1086 000044A9 B004                <1> 	mov	al, 4
  1087 000044AB E80D070000          <1> 	call	GET_PARM
  1088 000044B0 E8FE070000          <1> 	call	NEC_OUTPUT
  1089                              <1> 	;mov	dl, 7			; GAP LENGTH VALUE TO NEC
  1090                              <1> 	; 06/08/2022
  1091 000044B5 B007                <1> 	mov	al, 7
  1092 000044B7 E801070000          <1> 	call	GET_PARM
  1093 000044BC E8F2070000          <1> 	call	NEC_OUTPUT
  1094                              <1> 	;mov	dl, 8			; FILLER BYTE TO NEC
  1095                              <1> 	; 06/08/2022
  1096 000044C1 B008                <1> 	mov	al, 8
  1097 000044C3 E8F5060000          <1> 	call	GET_PARM
  1098 000044C8 E8E6070000          <1> 	call	NEC_OUTPUT
  1099 000044CD 58                  <1> 	pop	eax			; THROW AWAY ERROR
  1100 000044CE E815050000          <1> 	call	NEC_TERM		; TERMINATE, RECEIVE STATUS, ETC,
  1101                              <1> FM_DON:
  1102                              <1> 	; 06/08/2022
  1103                              <1> 	;call	XLAT_OLD		; TRANSLATE STATE TO COMPATIBLE MODE
  1104                              <1> 	; 06/08/2022
  1105 000044D3 E947FEFFFF          <1> 	jmp	SETUP_END_X
  1106                              <1> 	;call	SETUP_END		; VARIOUS CLEANUPS
  1107                              <1> 	;; 06/08/2022
  1108                              <1> 	;mov	ebx, esi		; GET SAVED AL TO BL
  1109                              <1> 	;mov	al, bl			; PUT BACK FOR RETURN
  1110                              <1> 	;retn
  1111                              <1> 
  1112                              <1> ;-------------------------------------------------------------------------------
  1113                              <1> ; FNC_ERR
  1114                              <1> ;	INVALID FUNCTION REQUESTED OR INVALID DRIVE: 
  1115                              <1> ;	SET BAD COMMAND IN STATUS.
  1116                              <1> ;
  1117                              <1> ; ON EXIT: 	@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION
  1118                              <1> ;-------------------------------------------------------------------------------
  1119                              <1> FNC_ERR:				; INVALID FUNCTION REQUEST
  1120                              <1> 	;mov	ax, si
  1121                              <1> 	; 06/08/2022
  1122 000044D8 89F0                <1> 	mov	eax, esi		; RESTORE AL
  1123 000044DA B401                <1> 	mov	ah, BAD_CMD		; SET BAD COMMAND ERROR
  1124 000044DC 8825[10790100]      <1> 	mov	[DSKETTE_STATUS], ah	; STORE IN DATA AREA
  1125 000044E2 F9                  <1> 	stc				; SET CARRY INDICATING ERROR
  1126 000044E3 C3                  <1> 	retn
  1127                              <1> 
  1128                              <1> ; 06/08/2022 - TRDOS 386 Kernel v2.0.5
  1129                              <1> ; 30/08/2020
  1130                              <1> ; 29/08/2020
  1131                              <1> ; 01/06/2016
  1132                              <1> ; 28/05/2016
  1133                              <1> ; 27/05/2016 - TRDOS 386 (TRDOS v.2.0)
  1134                              <1> ;-------------------------------------------------------------------------------
  1135                              <1> ; DISK_PARMS	(AH = 08H)	
  1136                              <1> ;	READ DRIVE PARAMETERS.
  1137                              <1> ;
  1138                              <1> ; ON ENTRY:	DI : DRIVE #
  1139                              <1> ;		; 27/05/2016
  1140                              <1> ;		EBX = Buffer Address for floppy disk parameters table (16 bytes)
  1141                              <1> ;
  1142                              <1> ; ON EXIT:	CL/[BP]   = BITS 7 & 6 HI 2 BITS OF MAX CYLINDER
  1143                              <1> ;		            BITS 0-5 MAX SECTORS/TRACK
  1144                              <1> ;		CH/[BP+1] = LOW 8 BITS OF MAX CYLINDER
  1145                              <1> ;		BL/[BP+2] = BITS 7-4 = 0
  1146                              <1> ;		            BITS 3-0 = VALID CMOS DRIVE TYPE
  1147                              <1> ;		BH/[BP+3] = 0
  1148                              <1> ;		DL/[BP+4] = # DRIVES INSTALLED (VALUE CHECKED)
  1149                              <1> ;		DH/[BP+5] = MAX HEAD #
  1150                              <1> ;	     ** 27/05/2016 - TRDOS 386 (TRDOS v2.0) **	
  1151                              <1> ;            ** EBX = Buffer address for floppy disk parameters table **
  1152                              <1> ;		;DI/[BP+6] = OFFSET TO DISK_BASE
  1153                              <1> ;		;ES        = SEGMENT OF DISK_BASE
  1154                              <1> ;
  1155                              <1> ;		AX        = 0
  1156                              <1> ;
  1157                              <1> ;		NOTE : THE ABOVE INFORMATION IS STORED IN THE USERS STACK AT
  1158                              <1> ;		       THE LOCATIONS WHERE THE MAIN ROUTINE WILL POP THEM
  1159                              <1> ;		       INTO THE APPROPRIATE REGISTERS BEFORE RETURNING TO THE
  1160                              <1> ;		       CALLER.
  1161                              <1> ;-------------------------------------------------------------------------------
  1162                              <1> DSK_PARMS:
  1163                              <1> 	; 09/08/2022
  1164                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  1165                              <1> 	;
  1166                              <1> 	; Registers on stack:
  1167                              <1> 	;    ebx = esp+28
  1168                              <1> 	;    ecx = esp+24
  1169                              <1> 	;    edx = esp+20
  1170                              <1> 	;    esi = esp+16
  1171                              <1> 	;    edi = esp+12
  1172                              <1> 	;    return address from DSKETTE_IO_1 = esp+8
  1173                              <1> 	;    ebp = esp+4
  1174                              <1> 	;    return address from DSK_PARMS = esp
  1175                              <1> 	;
  1176                              <1> 	; INPUT:
  1177                              <1> 	;   ebp = buffer address
  1178                              <1> 	;   edi = drive number (0 or 1)
  1179                              <1> 	
  1180                              <1> 	; OUTPUT:
  1181                              <1> 	;   ebx = [esp+28] ((BL = cmos type, BH = 0))
  1182                              <1> 	;   ecx = [esp+24] ((CL = sectors per track, CH = tracks - 1))
  1183                              <1> 	;   edx = [esp+20] ((DL = floppy drive count, DH = heads - 1))
  1184                              <1> 	;   user's buffer = FDPT table
  1185                              <1> 			 
  1186 000044E4 E86D020000          <1> 	call	XLAT_NEW		; TRANSLATE STATE TO PRESENT ARCH,
  1187                              <1>      	
  1188                              <1> 	;;mov	word [bp+2], 0		; DRIVE TYPE = 0
  1189                              <1>      	;;mov	ax, [EQUIP_FLAG]	; LOAD EQUIPMENT FLAG FOR # DISKETTES
  1190                              <1>      	;;and	al, 11000001b		; KEEP DISKETTE DRIVE BITS
  1191                              <1>      	;;mov	dl, 2			; DISKETTE DRIVES = 2
  1192                              <1>      	;;cmp	al, 01000001b		; 2 DRIVES INSTALLED ?
  1193                              <1>      	;;jz	short STO_DL		; IF YES JUMP
  1194                              <1>      	;;dec	dl			; DISKETTE DRIVES = 1
  1195                              <1>      	;;cmp	al, 00000001b		; 1 DRIVE INSTALLED ?
  1196                              <1>      	;;jnz	short NON_DRV		; IF NO JUMP
  1197                              <1> 	
  1198 000044E9 29D2                <1> 	sub	edx, edx
  1199 000044EB 66A1[1C660000]      <1> 	mov     ax, [fd0_type]
  1200 000044F1 6621C0              <1> 	and     ax, ax
  1201 000044F4 747C                <1>         jz      short NON_DRV
  1202 000044F6 FEC2                <1> 	inc     dl
  1203 000044F8 20E4                <1> 	and     ah, ah
  1204 000044FA 7402                <1> 	jz      short STO_DL
  1205 000044FC FEC2                <1> 	inc     dl
  1206                              <1> STO_DL:
  1207                              <1> 	; 30/08/2020
  1208                              <1> 	;cmp	dx, di
  1209                              <1> 	; 06/08/2022
  1210 000044FE 39FA                <1> 	cmp	edx, edi
  1211 00004500 7670                <1> 	jna	short NON_DRV
  1212                              <1> 	;
  1213                              <1> 	;;mov	[bp+4], dl		; STORE NUMBER OF DRIVES
  1214                              <1> 	;mov	[ebp+8], edx ; 20/02/2015	 	
  1215                              <1> 
  1216                              <1> 	; 06/08/2022
  1217 00004502 FEC6                <1> 	inc	dh ; number of heads - 1 
  1218                              <1> 	; dh = 1
  1219                              <1> 	; dl = number of floppy/diskette drives (DL)
  1220 00004504 89542414            <1> 	mov	[esp+20], edx
  1221                              <1> 
  1222                              <1> 	; 11/04/2021
  1223                              <1> 	;cmp	di, 1			; CHECK FOR VALID DRIVE
  1224                              <1> 	;;ja	short NON_DRV1		; DRIVE INVALID
  1225                              <1> 	;ja	NON_DRV1 ; 29/08/2020
  1226                              <1> 	;	
  1227                              <1> 	;;mov	byte [bp+5], 1		; MAXIMUM HEAD NUMBER =	1
  1228                              <1> 	; 06/08/2022
  1229                              <1> 	;mov	byte [ebp+9], 1 ; 20/02/2015	
  1230                              <1> 	
  1231 00004508 E8A7060000          <1> 	call	CMOS_TYPE		; RETURN DRIVE TYPE IN AL
  1232                              <1> 	;;20/02/2015
  1233                              <1> 	;;jc	short CHK_EST		; IF CMOS BAD CHECKSUM ESTABLISHED
  1234                              <1> 	;;or	al, al			; TEST FOR NO DRIVE TYPE
  1235 0000450D 740F                <1> 	jz	short CHK_EST		; JUMP IF SO
  1236 0000450F E8DC010000          <1> 	call	DR_TYPE_CHECK		; RTN CS:BX = MEDIA/DRIVE PARAM TBL
  1237 00004514 7208                <1> 	jc	short CHK_EST		; TYPE NOT IN TABLE (POSSIBLE BAD CMOS)
  1238                              <1> 	;mov	[bp+2], al		; STORE VALID CMOS DRIVE TYPE
  1239                              <1>         ;mov	[ebp+4], al ; 06/02/2015
  1240 00004516 8A4B04              <1> 	mov	cl, [ebx+MD.SEC_TRK]	; GET SECTOR/TRACK
  1241 00004519 8A6B0B              <1>         mov	ch, [ebx+MD.MAX_TRK]	; GET MAX. TRACK NUMBER
  1242 0000451C EB36                <1> 	jmp	short STO_CX		; CMOS GOOD, USE CMOS
  1243                              <1> CHK_EST:
  1244 0000451E 8AA7[1B790100]      <1> 	mov	ah, [DSK_STATE+edi]	; LOAD STATE FOR THIS DRIVE
  1245 00004524 F6C410              <1> 	test	ah, MED_DET		; CHECK FOR ESTABLISHED STATE
  1246 00004527 744D                <1> 	jz	short NON_DRV1		; CMOS BAD/INVALID OR UNESTABLISHED
  1247                              <1> USE_EST:
  1248 00004529 80E4C0              <1> 	and	ah, RATE_MSK		; ISOLATE STATE
  1249 0000452C 80FC80              <1> 	cmp	ah, RATE_250		; RATE 250 ?
  1250 0000452F 755C                <1> 	jne	short USE_EST2		; NO, GO CHECK OTHER RATE
  1251                              <1> 
  1252                              <1> ;-----	DATA RATE IS 250 KBS, TRY 360 KB TABLE FIRST
  1253                              <1> 
  1254 00004531 B001                <1> 	mov	al, 1			; DRIVE TYPE 1 (360KB)
  1255 00004533 E8B8010000          <1> 	call	DR_TYPE_CHECK		; RTN CS:BX = MEDIA/DRIVE PARAM TBL
  1256 00004538 8A4B04              <1>         mov	cl, [ebx+MD.SEC_TRK]	; GET SECTOR/TRACK
  1257 0000453B 8A6B0B              <1>         mov	ch, [ebx+MD.MAX_TRK]	; GET MAX. TRACK NUMBER
  1258 0000453E F687[1B790100]01    <1> 	test	byte [DSK_STATE+edi], TRK_CAPA ; 80 TRACK ?
  1259 00004545 740D                <1> 	jz	short STO_CX		; MUST BE 360KB DRIVE 
  1260                              <1> 
  1261                              <1> ;-----	IT IS 1.44 MB DRIVE
  1262                              <1> 
  1263                              <1> PARM144:
  1264 00004547 B004                <1> 	mov	al, 4			; DRIVE TYPE 4 (1.44MB)
  1265 00004549 E8A2010000          <1> 	call	DR_TYPE_CHECK		; RTN CS:BX = MEDIA/DRIVE PARAM TBL
  1266 0000454E 8A4B04              <1> 	mov	cl, [ebx+MD.SEC_TRK]	; GET SECTOR/TRACK
  1267 00004551 8A6B0B              <1> 	mov	ch, [ebx+MD.MAX_TRK]	; GET MAX. TRACK NUMBER
  1268                              <1> STO_CX:
  1269                              <1> 	;mov	[ebp], ecx		; SAVE POINTER IN STACK FOR RETURN
  1270                              <1> 	; 06/08/2022
  1271 00004554 894C2418            <1> 	mov	[esp+24], ecx ; spt (cl), tracks - 1 (ch)
  1272                              <1> ES_DI:
  1273                              <1> 	;mov	[bp+6], bx		; ADDRESS OF MEDIA/DRIVE PARM TABLE 
  1274                              <1> 	;mov	[ebp+12], ebx ; 06/02/2015
  1275                              <1> 	;mov	ax, cs			; SEGMENT MEDIA/DRIVE PARAMETER TABLE
  1276                              <1> 	;mov	es, ax			; ES IS SEGMENT OF TABLE
  1277                              <1> 	;
  1278                              <1> 	; 28/05/2016
  1279                              <1> 	; 27/05/2016
  1280                              <1> 	; return floppy disk parameters table to user
  1281                              <1> 	; in user's buffer, which is pointed by EBX
  1282                              <1> 	
  1283                              <1> 	; 09/08/2022
  1284                              <1> 	;movzx	eax, al
  1285 00004558 29C9                <1> 	sub	ecx, ecx
  1286 0000455A 88C1                <1> 	mov	cl, al
  1287                              <1> 	;;mov	[ebp+4], eax  ; ebx	; drive type (for floppy drives)
  1288                              <1> 	; 06/08/2022
  1289                              <1> 	;mov	[esp+28], eax ; drive type	
  1290                              <1> 	; 09/08/2022
  1291 0000455C 894C241C            <1> 	mov	[esp+28], ecx ; drive type
  1292                              <1> 
  1293                              <1> 	; 06/08/2022
  1294                              <1> 	;push	edi
  1295                              <1> 	
  1296                              <1> 	;mov	edi, [ebp+4]  		; ebx (input), user's buffer address
  1297                              <1> 	; 06/08/2022
  1298                              <1> 	;mov	edi, ebp ; [esp+28] ; user's buffer address
  1299                              <1> 	;
  1300                              <1> 	;; 29/08/2020
  1301                              <1> 	;or	edi, edi
  1302                              <1> 	;jz	short no_copy_fdpt
  1303                              <1> 	; 06/08/2022
  1304 00004560 09ED                <1> 	or	ebp, ebp ; [esp+28] = ebx ; user's buffer address if > 0
  1305 00004562 740B                <1> 	jz	short DP_OUT
  1306                              <1> 	; 06/08/2022
  1307                              <1> 	;push	edi
  1308 00004564 89EF                <1> 	mov	edi, ebp
  1309                              <1> 	;
  1310                              <1> 	; 06/08/2022
  1311                              <1> 	; 01/06/2016 (Int 33h, disk type return for floppy disks, in BL)
  1312                              <1> 	;mov	[user_buffer], eax	; 01/06/2016 (overwrite ebx return value)
  1313                              <1> 	
  1314                              <1> 	;(Int 33h, Function 08h will replace user's buffer addr with disk type!)
  1315                              <1> 	;
  1316 00004566 89DE                <1> 	mov	esi, ebx 		; floppy disk parameter table (16 bytes)
  1317                              <1> 	;mov	ecx, 16 ; 16 bytes
  1318                              <1>         ; 09/08/2022
  1319                              <1> 	; ecx < 256
  1320                              <1> 	; 06/08/2022
  1321                              <1> 	;sub	ecx, ecx
  1322 00004568 B110                <1> 	mov	cl, 16
  1323 0000456A E822C90000          <1> 	call    transfer_to_user_buffer ; trdosk6.s (16/05/2016)
  1324                              <1> no_copy_fdpt:
  1325                              <1> 	; 06/08/2022
  1326                              <1> 	;pop	edi	
  1327                              <1> DP_OUT:
  1328                              <1> 	; 06/08/2022
  1329                              <1> 	;call	XLAT_OLD		; TRANSLATE STATE TO COMPATIBLE MODE
  1330                              <1> 	;xor	ax, ax			; CLEAR
  1331                              <1> 	; 06/08/2022
  1332 0000456F 31C0                <1> 	xor	eax, eax
  1333                              <1> 	;clc
  1334 00004571 C3                  <1> 	retn
  1335                              <1> 
  1336                              <1> ;-----	NO DRIVE PRESENT HANDLER
  1337                              <1> 
  1338                              <1> NON_DRV:
  1339                              <1> 	;;mov	byte [bp+4], 0		; CLEAR NUMBER OF DRIVES
  1340                              <1> 	;mov	[ebp+8], edx ; 0 ; 20/02/2015
  1341                              <1> 	; 06/08/2022
  1342 00004572 89542414            <1> 	mov	[esp+20], edx ; 0 ; number of floppy drives and heads are 0
  1343                              <1> NON_DRV1:
  1344 00004576 6681FF8000          <1> 	cmp	di, 80h			; CHECK FOR FIXED MEDIA TYPE REQUEST
  1345 0000457B 7206                <1> 	jb	short NON_DRV2		; CONTINUE IF NOT REQUEST FALL THROUGH
  1346                              <1> 
  1347                              <1> ;-----	FIXED DISK REQUEST FALL THROUGH ERROR
  1348                              <1> 	
  1349                              <1> 	; 06/08/2022
  1350                              <1> 	;call	XLAT_OLD		; ELSE TRANSLATE TO COMPATIBLE MODE
  1351                              <1> 	;mov	ax, si			; RESTORE AL
  1352                              <1> 	; 06/08/2022
  1353 0000457D 89F0                <1> 	mov	eax, esi
  1354 0000457F B401                <1> 	mov	ah, BAD_CMD		; SET BAD COMMAND ERROR
  1355 00004581 F9                  <1> 	stc
  1356 00004582 C3                  <1> 	retn
  1357                              <1> 
  1358                              <1> NON_DRV2:
  1359                              <1> 	;xor	ax, ax			; CLEAR PARMS IF NO DRIVES OR CMOS BAD
  1360 00004583 31C0                <1> 	xor	eax, eax	
  1361                              <1> 	;mov	[ebp], ax		; TRACKS, SECTORS/TRACK = 0
  1362                              <1> 	; 06/08/2022
  1363 00004585 89442418            <1> 	mov	[esp+24], eax ; spt and max. track number is 0
  1364                              <1> 
  1365                              <1> 	;;mov	[bp+5], ah		; HEAD = 0
  1366                              <1> 	; 06/08/2022
  1367                              <1> 	;mov	[ebp+9], ah ; 06/02/2015
  1368                              <1> 	; 06/08/2022
  1369                              <1> 	;mov	[esp+21], ah ; 0	
  1370                              <1> 
  1371                              <1> 	;;mov	[bp+6], ax		; OFFSET TO DISK_BASE = 0
  1372                              <1> 	; 06/08/2022
  1373                              <1> 	;mov	[ebp+12], eax
  1374                              <1> 	
  1375                              <1> 	;;mov	es, ax			; ES IS SEGMENT OF TABLE
  1376                              <1> 	;jmp	short DP_OUT
  1377                              <1> 
  1378                              <1> 	; 06/08/2022
  1379                              <1> 	; 30/08/2020
  1380                              <1> 	;call	XLAT_OLD
  1381                              <1> 	;;mov	ah, NOT_RDY ; drive not ready
  1382 00004589 B407                <1> 	mov	ah, INIT_FAIL ; DRIVE PARAMETER ACTIVITY FAILED 
  1383 0000458B F9                  <1> 	stc	; cf -> 1, ah = 'drive not ready' error code
  1384 0000458C C3                  <1> 	retn		
  1385                              <1> 
  1386                              <1> ;-----	DATA RATE IS EITHER 300 KBS OR 500 KBS, TRY 1.2 MB TABLE FIRST
  1387                              <1> 
  1388                              <1> USE_EST2:
  1389 0000458D B002                <1> 	mov	al, 2			; DRIVE TYPE 2 (1.2MB)
  1390 0000458F E85C010000          <1> 	call	DR_TYPE_CHECK		; RTN CS:BX = MEDIA/DRIVE PARAM TBL
  1391 00004594 8A4B04              <1>         mov     cl, [ebx+MD.SEC_TRK]    ; GET SECTOR/TRACK
  1392 00004597 8A6B0B              <1>         mov     ch, [ebx+MD.MAX_TRK]    ; GET MAX. TRACK NUMBER
  1393 0000459A 80FC40              <1> 	cmp	ah, RATE_300		; RATE 300 ?
  1394 0000459D 74B5                <1> 	jz	short STO_CX		; MUST BE 1.2MB DRIVE
  1395 0000459F EBA6                <1> 	jmp	short PARM144		; ELSE, IT IS 1.44MB DRIVE 
  1396                              <1> 
  1397                              <1> ; 30/08/2020
  1398                              <1> 
  1399                              <1> ;-------------------------------------------------------------------------------
  1400                              <1> ; DISK_TYPE (AH = 15H)	
  1401                              <1> ;	THIS ROUTINE RETURNS THE TYPE OF MEDIA INSTALLED.
  1402                              <1> ;
  1403                              <1> ;  ON ENTRY:	DI = DRIVE #
  1404                              <1> ;
  1405                              <1> ;  ON EXIT:	AH = DRIVE TYPE, CY=0
  1406                              <1> ;-------------------------------------------------------------------------------
  1407                              <1> DSK_TYPE:
  1408                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  1409 000045A1 E8B0010000          <1> 	call	XLAT_NEW		; TRANSLATE STATE TO PRESENT ARCH.
  1410 000045A6 8A87[1B790100]      <1> 	mov	al, [DSK_STATE+edi]	; GET PRESENT STATE INFORMATION
  1411 000045AC 08C0                <1> 	or	al, al			; CHECK FOR NO DRIVE
  1412 000045AE 740D                <1> 	jz	short NO_DRV
  1413 000045B0 B401                <1> 	mov	ah, NOCHGLN		; NO CHANGE LINE FOR 40 TRACK DRIVE
  1414 000045B2 A801                <1> 	test	al, TRK_CAPA		; IS THIS DRIVE AN 80 TRACK DRIVE?
  1415 000045B4 7402                <1> 	jz	short DT_BACK		; IF NO JUMP
  1416 000045B6 B402                <1> 	mov	ah, CHGLN		; CHANGE LINE FOR 80 TRACK DRIVE
  1417                              <1> DT_BACK:
  1418                              <1> 	; 06/08/2022
  1419                              <1> 	;;push	ax			; SAVE RETURN VALUE
  1420                              <1> 	; 11/04/2021
  1421                              <1> 	;push	eax
  1422                              <1> 	;call	XLAT_OLD		; TRANSLATE STATE TO COMPATIBLE MODE
  1423                              <1> 	;; 11/04/2021
  1424                              <1> 	;pop	eax
  1425                              <1> 	;; pop	ax
  1426                              <1> 	;clc				; NO ERROR
  1427                              <1> 	;mov	bx, si			; GET SAVED AL TO BL
  1428                              <1> 	; 06/08/2022
  1429 000045B8 89F3                <1> 	mov	ebx, esi
  1430 000045BA 88D8                <1> 	mov	al, bl			; PUT BACK FOR RETURN
  1431 000045BC C3                  <1> 	retn
  1432                              <1> NO_DRV:	
  1433                              <1> 	;xor	ah, ah			; NO DRIVE PRESENT OR UNKNOWN
  1434                              <1> 	;jmp	short DT_BACK
  1435                              <1> 	
  1436                              <1> 	; 06/08/2022
  1437                              <1> 	; 30/08/2020
  1438                              <1> 	;call	XLAT_OLD
  1439 000045BD 29C0                <1> 	sub	eax, eax
  1440 000045BF F9                  <1> 	stc	; cf = 1 -> drive not ready, ah = 0 (disk type = 0)
  1441 000045C0 C3                  <1> 	retn
  1442                              <1> 
  1443                              <1> ;-------------------------------------------------------------------------------
  1444                              <1> ; DISK_CHANGE	(AH = 16H)
  1445                              <1> ;	THIS ROUTINE RETURNS THE STATE OF THE DISK CHANGE LINE.
  1446                              <1> ;
  1447                              <1> ; ON ENTRY:	DI = DRIVE #
  1448                              <1> ;
  1449                              <1> ; ON EXIT:	AH = @DSKETTE_STATUS
  1450                              <1> ;		     00 - DISK CHANGE LINE INACTIVE, CY = 0
  1451                              <1> ;		     06 - DISK CHANGE LINE ACTIVE, CY = 1
  1452                              <1> ;-------------------------------------------------------------------------------
  1453                              <1> DSK_CHANGE:
  1454                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  1455 000045C1 E890010000          <1> 	call	XLAT_NEW		; TRANSLATE STATE TO PRESENT ARCH.
  1456 000045C6 8A87[1B790100]      <1> 	mov	al, [DSK_STATE+edi]	; GET MEDIA STATE INFORMATION
  1457 000045CC 08C0                <1> 	or	al, al			; DRIVE PRESENT ?
  1458 000045CE 7417                <1> 	jz	short DC_NON		; JUMP IF NO DRIVE
  1459 000045D0 A801                <1> 	test	al, TRK_CAPA		; 80 TRACK DRIVE ?
  1460 000045D2 7407                <1> 	jz	short SETIT		; IF SO , CHECK CHANGE LINE
  1461                              <1> DC0:
  1462 000045D4 E86B080000          <1>         call    READ_DSKCHNG            ; GO CHECK STATE OF DISK CHANGE LINE
  1463 000045D9 7407                <1> 	jz	short FINIS		; CHANGE LINE NOT ACTIVE
  1464                              <1> SETIT:	
  1465 000045DB C605[10790100]06    <1> 	mov	byte [DSKETTE_STATUS], MEDIA_CHANGE ; INDICATE MEDIA REMOVED
  1466                              <1> 
  1467                              <1> FINIS:	; 06/08/2022
  1468                              <1> 	;call	XLAT_OLD		; TRANSLATE STATE TO COMPATIBLE MODE
  1469                              <1> 	; 06/08/2022
  1470 000045E2 E938FDFFFF          <1> 	jmp	SETUP_END_X
  1471                              <1> 	;call	SETUP_END		; VARIOUS CLEANUPS
  1472                              <1> 	;; 06/08/2022
  1473                              <1> 	;mov	ebx, esi		; GET SAVED AL TO BL
  1474                              <1> 	;mov	al, bl			; PUT BACK FOR RETURN
  1475                              <1> 	;retn
  1476                              <1> DC_NON:
  1477 000045E7 800D[10790100]80    <1> 	or	byte [DSKETTE_STATUS], TIME_OUT ; SET TIMEOUT, NO DRIVE
  1478 000045EE EBF2                <1> 	jmp	short FINIS
  1479                              <1> 
  1480                              <1> ;-------------------------------------------------------------------------------
  1481                              <1> ; FORMAT_SET	(AH = 17H)
  1482                              <1> ;	THIS ROUTINE IS USED TO ESTABLISH THE TYPE OF MEDIA TO BE USED
  1483                              <1> ;	FOR THE FOLLOWING FORMAT OPERATION.
  1484                              <1> ;
  1485                              <1> ; ON ENTRY:	SI LOW = DASD TYPE FOR FORMAT
  1486                              <1> ;		DI     = DRIVE #
  1487                              <1> ;
  1488                              <1> ; ON EXIT:	@DSKETTE_STATUS REFLECTS STATUS
  1489                              <1> ;		AH = @DSKETTE_STATUS
  1490                              <1> ;		CY = 1 IF ERROR
  1491                              <1> ;-------------------------------------------------------------------------------
  1492                              <1> FORMAT_SET:
  1493 000045F0 E861010000          <1> 	call	XLAT_NEW		; TRANSLATE STATE TO PRESENT ARCH.
  1494                              <1> 	;push	si			; SAVE DASD TYPE
  1495                              <1> 	; 11/04/2021
  1496 000045F5 56                  <1> 	push	esi
  1497                              <1> 	;mov	ax, si			; AH = ? , AL = DASD TYPE
  1498                              <1> 	;xor	ah, ah			; AH = 0 , AL = DASD TYPE
  1499                              <1> 	;mov	si, ax			; SI = DASD TYPE
  1500                              <1> 	; 11/04/2021
  1501 000045F6 89F0                <1> 	mov	eax, esi
  1502 000045F8 0FB6F0              <1> 	movzx	esi, al	
  1503 000045FB 80A7[1B790100]0F    <1> 	and	byte [DSK_STATE+edi], ~(MED_DET+DBL_STEP+RATE_MSK) ; CLEAR STATE
  1504                              <1> 	;dec	si			; CHECK FOR 320/360K MEDIA & DRIVE
  1505                              <1> 	; 11/04/2021
  1506 00004602 4E                  <1> 	dec	esi
  1507 00004603 7509                <1> 	jnz	short NOT_320		; BYPASS IF NOT
  1508 00004605 808F[1B790100]90    <1> 	or	byte [DSK_STATE+edi], MED_DET+RATE_250 ; SET TO 320/360
  1509 0000460C EB45                <1> 	jmp	short S0
  1510                              <1> 
  1511                              <1> NOT_320:
  1512 0000460E E844020000          <1> 	call	MED_CHANGE		; CHECK FOR TIME_OUT
  1513 00004613 803D[10790100]80    <1> 	cmp	byte [DSKETTE_STATUS], TIME_OUT
  1514 0000461A 7437                <1> 	jz	short S0		; IF TIME OUT TELL CALLER
  1515                              <1> S3:
  1516                              <1> 	;dec	si			; CHECK FOR 320/360K IN 1.2M DRIVE
  1517                              <1> 	; 11/04/2021
  1518 0000461C 4E                  <1> 	dec	esi
  1519 0000461D 7509                <1> 	jnz	short NOT_320_12	; BYPASS IF NOT
  1520 0000461F 808F[1B790100]70    <1> 	OR	byte [DSK_STATE+edi], MED_DET+DBL_STEP+RATE_300 ; SET STATE
  1521 00004626 EB2B                <1> 	jmp	short S0
  1522                              <1> 
  1523                              <1> NOT_320_12:
  1524                              <1> 	;dec	si			; CHECK FOR 1.2M MEDIA IN 1.2M DRIVE
  1525                              <1> 	; 11/04/2021
  1526 00004628 4E                  <1> 	dec	esi
  1527 00004629 7509                <1> 	jnz	short NOT_12		; BYPASS IF NOT
  1528 0000462B 808F[1B790100]10    <1> 	or	byte [DSK_STATE+edi], MED_DET+RATE_500 ; SET STATE VARIABLE
  1529 00004632 EB1F                <1> 	jmp	short S0		; RETURN TO CALLER
  1530                              <1> 
  1531                              <1> NOT_12:	
  1532                              <1> 	;dec	si			; CHECK FOR SET DASD TYPE 04
  1533                              <1> 	; 11/04/2021
  1534 00004634 4E                  <1> 	dec	esi
  1535 00004635 7525                <1> 	jnz	short FS_ERR		; BAD COMMAND EXIT IF NOT VALID TYPE
  1536                              <1> 
  1537 00004637 F687[1B790100]04    <1> 	test	byte [DSK_STATE+edi], DRV_DET ; DRIVE DETERMINED ?
  1538 0000463E 740B                <1> 	jz	short ASSUME		; IF STILL NOT DETERMINED ASSUME
  1539 00004640 B050                <1> 	mov	al, MED_DET+RATE_300
  1540 00004642 F687[1B790100]02    <1>         test    byte [DSK_STATE+edi], FMT_CAPA ; MULTIPLE FORMAT CAPABILITY ?
  1541 00004649 7502                <1> 	jnz	short OR_IT_IN		; IF 1.2 M THEN DATA RATE 300
  1542                              <1> 
  1543                              <1> ASSUME:
  1544 0000464B B090                <1> 	mov	al, MED_DET+RATE_250	; SET UP
  1545                              <1> 
  1546                              <1> OR_IT_IN:
  1547 0000464D 0887[1B790100]      <1> 	or	[DSK_STATE+edi], al	; OR IN THE CORRECT STATE
  1548                              <1> S0:
  1549                              <1> 	; 06/08/2022
  1550                              <1> 	;call	XLAT_OLD		; TRANSLATE STATE TO COMPATIBLE MODE
  1551 00004653 E8D5FDFFFF          <1> 	call	SETUP_END		; VARIOUS CLEANUPS
  1552                              <1> 	;pop	BX			; GET SAVED AL TO BL
  1553                              <1> 	; 11/04/2021
  1554 00004658 5B                  <1> 	pop	ebx
  1555 00004659 88D8                <1> 	mov	al, bl			; PUT BACK FOR RETURN
  1556 0000465B C3                  <1> 	retn
  1557                              <1> 
  1558                              <1> FS_ERR:
  1559 0000465C C605[10790100]01    <1> 	mov	byte [DSKETTE_STATUS], BAD_CMD ; UNKNOWN STATE,BAD COMMAND
  1560 00004663 EBEE                <1> 	jmp	short S0
  1561                              <1> 
  1562                              <1> ;-------------------------------------------------------------------------------
  1563                              <1> ; SET_MEDIA	(AH = 18H)
  1564                              <1> ;	THIS ROUTINE SETS THE TYPE OF MEDIA AND DATA RATE 
  1565                              <1> ;	TO BE USED FOR THE FOLLOWING FORMAT OPERATION.
  1566                              <1> ;
  1567                              <1> ; ON ENTRY:
  1568                              <1> ;	[BP]	= SECTOR PER TRACK
  1569                              <1> ;	[BP+1]	= TRACK #
  1570                              <1> ;	DI	= DRIVE #
  1571                              <1> ;
  1572                              <1> ; ON EXIT:
  1573                              <1> ;	@DSKETTE_STATUS REFLECTS STATUS
  1574                              <1> ;	IF NO ERROR:
  1575                              <1> ;		AH = 0
  1576                              <1> ;		CY = 0
  1577                              <1> ;		ES = SEGMENT OF MEDIA/DRIVE PARAMETER TABLE
  1578                              <1> ;		DI/[BP+6] = OFFSET OF MEDIA/DRIVE PARAMETER TABLE
  1579                              <1> ;	IF ERROR:	
  1580                              <1> ;		AH = @DSKETTE_STATUS
  1581                              <1> ;		CY = 1
  1582                              <1> ;-------------------------------------------------------------------------------
  1583                              <1> SET_MEDIA:
  1584                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  1585 00004665 E8EC000000          <1> 	call	XLAT_NEW		; TRANSLATE STATE TO PRESENT ARCH.
  1586 0000466A F687[1B790100]01    <1>         test    byte [DSK_STATE+edi], TRK_CAPA ; CHECK FOR CHANGE LINE AVAILABLE
  1587 00004671 7415                <1> 	jz	short SM_CMOS		; JUMP IF 40 TRACK DRIVE
  1588 00004673 E8DF010000          <1> 	call	MED_CHANGE		; RESET CHANGE LINE
  1589 00004678 803D[10790100]80    <1> 	cmp	byte [DSKETTE_STATUS], TIME_OUT ; IF TIME OUT TELL CALLER
  1590 0000467F 746A                <1> 	je	short SM_RTN
  1591 00004681 C605[10790100]00    <1> 	mov	byte [DSKETTE_STATUS], 0 ; CLEAR STATUS
  1592                              <1> SM_CMOS:
  1593 00004688 E827050000          <1> 	call	CMOS_TYPE		; RETURN DRIVE TYPE IN (AL)
  1594                              <1> 	;;20/02/2015
  1595                              <1> 	;;jc	short MD_NOT_FND	; ERROR IN CMOS
  1596                              <1> 	;;or	al, al			; TEST FOR NO DRIVE
  1597 0000468D 745C                <1> 	jz	short SM_RTN		; RETURN IF SO
  1598 0000468F E85C000000          <1> 	call	DR_TYPE_CHECK		; RTN CS:BX = MEDIA/DRIVE PARAM TBL
  1599 00004694 7233                <1> 	jc	short MD_NOT_FND	; TYPE NOT IN TABLE (BAD CMOS)
  1600 00004696 57                  <1> 	push	edi			; SAVE REG.
  1601 00004697 31DB                <1> 	xor	ebx, ebx		; BX = INDEX TO DR. TYPE TABLE
  1602 00004699 B906000000          <1> 	mov	ecx, DR_CNT		; CX = LOOP COUNT
  1603                              <1> DR_SEARCH:
  1604 0000469E 8AA3[98650000]      <1> 	mov	ah, [DR_TYPE+ebx]	; GET DRIVE TYPE
  1605 000046A4 80E47F              <1> 	and	ah, BIT7OFF		; MASK OUT MSB
  1606 000046A7 38E0                <1> 	cmp	al, ah			; DRIVE TYPE MATCH ?
  1607 000046A9 7518                <1> 	jne	short NXT_MD		; NO, CHECK NEXT DRIVE TYPE
  1608                              <1> DR_FND:
  1609 000046AB 8BBB[99650000]      <1> 	mov	edi, [DR_TYPE+ebx+1] 	; DI = MEDIA/DRIVE PARAM TABLE
  1610                              <1> MD_SEARCH:
  1611 000046B1 8A6704              <1>         mov	ah, [edi+MD.SEC_TRK]    ; GET SECTOR/TRACK
  1612                              <1> 	;cmp	[ebp], ah		; MATCH?
  1613                              <1> 	; 06/08/2022
  1614 000046B4 38642418            <1> 	cmp	[esp+24], ah  ; CL ; spt	
  1615 000046B8 7509                <1> 	jne	short NXT_MD		; NO, CHECK NEXT MEDIA
  1616 000046BA 8A670B              <1>         mov     ah, [edi+MD.MAX_TRK]    ; GET MAX. TRACK #
  1617                              <1> 	;cmp 	[ebp+1], ah		; MATCH?
  1618                              <1> 	; 06/08/2022
  1619 000046BD 38642419            <1> 	cmp	[esp+25], ah  ; CH ; heads - 1
  1620 000046C1 740F                <1> 	je	short MD_FND		; YES, GO GET RATE
  1621                              <1> NXT_MD:
  1622                              <1> 	;add	bx, 3			; CHECK NEXT DRIVE TYPE
  1623 000046C3 83C305              <1>         add	ebx, 5 ; 18/02/2015
  1624 000046C6 E2D6                <1> 	loop	DR_SEARCH
  1625 000046C8 5F                  <1> 	pop	edi			; RESTORE REG.
  1626                              <1> MD_NOT_FND:
  1627 000046C9 C605[10790100]0C    <1> 	mov	byte [DSKETTE_STATUS], MED_NOT_FND ; ERROR, MEDIA TYPE NOT FOUND
  1628 000046D0 EB19                <1> 	jmp	short SM_RTN		; RETURN
  1629                              <1> MD_FND:
  1630 000046D2 8A470C              <1>         mov	al, [edi+MD.RATE]       ; GET RATE
  1631 000046D5 3C40                <1> 	cmp	al, RATE_300		; DOUBLE STEP REQUIRED FOR RATE 300
  1632 000046D7 7502                <1> 	jne	short MD_SET
  1633 000046D9 0C20                <1> 	or	al, DBL_STEP
  1634                              <1> MD_SET:
  1635                              <1> 	;;mov	[bp+6], di		; SAVE TABLE POINTER IN STACK
  1636                              <1> 	; 06/08/2022
  1637                              <1> 	;mov	[ebp+12], edi ; 18/02/2015
  1638                              <1> 	
  1639 000046DB 0C10                <1> 	or	al, MED_DET		; SET MEDIA ESTABLISHED
  1640 000046DD 5F                  <1> 	pop	edi
  1641 000046DE 80A7[1B790100]0F    <1> 	and	byte [DSK_STATE+edi], ~(MED_DET+DBL_STEP+RATE_MSK) ; CLEAR STATE
  1642 000046E5 0887[1B790100]      <1> 	or	[DSK_STATE+edi], al
  1643                              <1> 	;mov	ax, cs			; SEGMENT OF MEDIA/DRIVE PARAMETER TABLE
  1644                              <1> 	;mov	es, ax			; ES IS SEGMENT OF TABLE
  1645                              <1> SM_RTN:
  1646                              <1> 	; 06/08/2022
  1647                              <1> 	;call	XLAT_OLD		; TRANSLATE STATE TO COMPATIBLE MODE
  1648                              <1> 	;call	SETUP_END		; VARIOUS CLEANUPS
  1649                              <1> 	;retn
  1650                              <1> 	; 06/08/2022
  1651 000046EB E93DFDFFFF          <1> 	jmp	SETUP_END
  1652                              <1> 
  1653                              <1> ;----------------------------------------------------------------
  1654                              <1> ; DR_TYPE_CHECK							:
  1655                              <1> ;	CHECK IF THE GIVEN DRIVE TYPE IN REGISTER (AL)		:
  1656                              <1> ;	IS SUPPORTED IN BIOS DRIVE TYPE TABLE			:
  1657                              <1> ; ON ENTRY:							:
  1658                              <1> ;	AL = DRIVE TYPE						:
  1659                              <1> ; ON EXIT:							:
  1660                              <1> ;	CY = 0 	DRIVE TYPE SUPPORTED				:
  1661                              <1> ;	     EBX = OFFSET TO MEDIA/DRIVE PARAMETER TABLE	:
  1662                              <1> ;	CY = 1	DRIVE TYPE NOT SUPPORTED 			:
  1663                              <1> ; REGISTERS ALTERED: EBX, AH ; 11/07/2022 			:
  1664                              <1> ;----------------------------------------------------------------
  1665                              <1> DR_TYPE_CHECK:
  1666                              <1> 	; 09/08/2022 - TRDOS 386 Kernel v2.0.5 
  1667                              <1> 	; 12/07/2022
  1668                              <1> 	; 11/07/2022
  1669                              <1> 	; 08/07/2022 - Retro UNIX 386 v1.1 (Kernel v0.2.1.5)
  1670                              <1> 	; 24/12/2021
  1671                              <1> 	;push	eax ; 11/07/2022
  1672                              <1> 	;push	ecx ; 08/07/2022
  1673                              <1> 	;xor	ebx,ebx			; EBX = INDEX TO DR_TYPE TABLE
  1674 000046F0 BB[98650000]        <1> 	mov	ebx, DR_TYPE
  1675                              <1> 	;;mov	ecx, DR_CNT		; ECX = LOOP COUNT
  1676                              <1> 	;mov	cl, DR_CNT
  1677 000046F5 B406                <1> 	mov	ah, DR_CNT ; 11/07/2022
  1678                              <1> TYPE_CHK:	
  1679                              <1> 	;;mov	ah, [DR_TYPE+ebx]	; GET DRIVE TYPE
  1680                              <1> 	;mov	ah, [ebx]
  1681                              <1> 	;cmp	al, ah			; DRIVE TYPE MATCH?
  1682 000046F7 3A03                <1> 	cmp	al, [ebx] ; 11/07/2022
  1683 000046F9 740E                <1> 	je	short DR_TYPE_VALID	; YES, RETURN WITH CARRY RESET
  1684                              <1> 	; 16/02/2015 (32 bit address modification)
  1685 000046FB 83C305              <1> 	add	ebx, 5			; CHECK NEXT DRIVE TYPE
  1686                              <1> 	;loop	TYPE_CHK
  1687                              <1> 	;dec	cl
  1688 000046FE FECC                <1> 	dec	ah ; 11/07/2022
  1689 00004700 75F5                <1> 	jnz	short TYPE_CHK
  1690                              <1> 	;
  1691 00004702 BB[F7650000]        <1> 	mov	ebx, MD_TBL6		; 1.44MB fd parameter table
  1692                              <1> 					; Default for GET_PARM (11/12/2014)
  1693                              <1> 	;
  1694 00004707 F9                  <1> 	stc				; DRIVE TYPE NOT FOUND IN TABLE
  1695                              <1> 	;jmp	short TYPE_RTN
  1696                              <1> 	; 12/07/2022
  1697 00004708 C3                  <1> 	retn
  1698                              <1> DR_TYPE_VALID:
  1699                              <1> 	;mov	ebx, [DR_TYPE+ebx+1] 	; EBX = MEDIA TABLE
  1700 00004709 43                  <1> 	inc	ebx
  1701 0000470A 8B1B                <1> 	mov	ebx, [ebx]
  1702                              <1> TYPE_RTN:
  1703                              <1> 	;pop	ecx ; 08/07/2022
  1704                              <1> 	; 24/12/2021
  1705                              <1> 	;pop	eax ; 11/07/2022
  1706 0000470C C3                  <1> 	retn	
  1707                              <1> 		
  1708                              <1> ;----------------------------------------------------------------
  1709                              <1> ; SEND_SPEC							:
  1710                              <1> ;	SEND THE SPECIFY COMMAND TO CONTROLLER USING DATA FROM	:
  1711                              <1> ;	THE DRIVE PARAMETER TABLE POINTED BY @DISK_POINTER	:
  1712                              <1> ; ON ENTRY:	@DISK_POINTER = DRIVE PARAMETER TABLE		:
  1713                              <1> ; ON EXIT:	NONE						:	
  1714                              <1> ; REGISTERS ALTERED: CX, DX					:
  1715                              <1> ;----------------------------------------------------------------		
  1716                              <1> SEND_SPEC:
  1717                              <1> 	; 06/08/2022
  1718 0000470D 50                  <1> 	push	eax			; SAVE AX
  1719 0000470E B8[34470000]        <1> 	mov	eax, SPECBAC		; LOAD ERROR ADDRESS
  1720 00004713 50                  <1> 	push	eax			; PUSH NEC_OUT ERROR RETURN
  1721 00004714 B403                <1> 	mov	ah, 03h			; SPECIFY COMMAND
  1722 00004716 E898050000          <1> 	call	NEC_OUTPUT		; OUTPUT THE COMMAND
  1723                              <1> 	;sub	dl, dl			; FIRST SPECIFY BYTE
  1724                              <1> 	; 06/08/2022
  1725 0000471B 28C0                <1> 	sub	al, al ; 0 
  1726 0000471D E89B040000          <1> 	call	GET_PARM		; GET PARAMETER TO AH
  1727 00004722 E88C050000          <1> 	call	NEC_OUTPUT		; OUTPUT THE COMMAND
  1728                              <1> 	;mov	dl, 1			; SECOND SPECIFY BYTE
  1729                              <1> 	; 06/08/2022
  1730 00004727 B001                <1> 	mov	al, 1
  1731 00004729 E88F040000          <1> 	call	GET_PARM		; GET PARAMETER TO AH
  1732 0000472E E880050000          <1> 	call	NEC_OUTPUT		; OUTPUT THE COMMAND
  1733 00004733 58                  <1> 	pop	eax			; POP ERROR RETURN
  1734                              <1> SPECBAC:
  1735 00004734 58                  <1> 	pop	eax			; RESTORE ORIGINAL AX VALUE
  1736 00004735 C3                  <1> 	retn
  1737                              <1> 
  1738                              <1> ;----------------------------------------------------------------
  1739                              <1> ; SEND_SPEC_MD							:
  1740                              <1> ;	SEND THE SPECIFY COMMAND TO CONTROLLER USING DATA FROM	:
  1741                              <1> ;	THE MEDIA/DRIVE PARAMETER TABLE POINTED BY (CS:BX)	:
  1742                              <1> ; ON ENTRY:	CS:BX = MEDIA/DRIVE PARAMETER TABLE		:
  1743                              <1> ; ON EXIT:	NONE						:	
  1744                              <1> ; REGISTERS ALTERED: AX						:
  1745                              <1> ;----------------------------------------------------------------		
  1746                              <1> SEND_SPEC_MD:
  1747 00004736 50                  <1> 	push	eax			; SAVE RATE DATA
  1748 00004737 B8[54470000]        <1> 	mov	eax, SPEC_ESBAC		; LOAD ERROR ADDRESS
  1749 0000473C 50                  <1> 	push	eax			; PUSH NEC_OUT ERROR RETURN
  1750 0000473D B403                <1> 	mov	ah, 03h			; SPECIFY COMMAND
  1751 0000473F E86F050000          <1> 	call	NEC_OUTPUT		; OUTPUT THE COMMAND
  1752 00004744 8A23                <1>         mov     ah, [ebx+MD.SPEC1]      ; GET 1ST SPECIFY BYTE
  1753 00004746 E868050000          <1> 	call	NEC_OUTPUT		; OUTPUT THE COMMAND
  1754 0000474B 8A6301              <1>         mov     ah, [ebx+MD.SPEC2]      ; GET SECOND SPECIFY BYTE
  1755 0000474E E860050000          <1> 	call	NEC_OUTPUT		; OUTPUT THE COMMAND
  1756 00004753 58                  <1> 	pop	eax			; POP ERROR RETURN
  1757                              <1> SPEC_ESBAC:
  1758 00004754 58                  <1> 	pop	eax			; RESTORE ORIGINAL AX VALUE
  1759 00004755 C3                  <1> 	retn
  1760                              <1> 
  1761                              <1> ;-------------------------------------------------------------------------------
  1762                              <1> ; XLAT_NEW  
  1763                              <1> ;	TRANSLATES DISKETTE STATE LOCATIONS FROM COMPATIBLE
  1764                              <1> ;	MODE TO NEW ARCHITECTURE.
  1765                              <1> ;
  1766                              <1> ; ON ENTRY:	DI = DRIVE #
  1767                              <1> ;-------------------------------------------------------------------------------
  1768                              <1> XLAT_NEW:
  1769                              <1> 	; 06/08/2022 - TRDOS 386 Kernel v2.0.5
  1770                              <1> 	; 11/07/2022 - Retro UNIX 386 v1.1 (Kernel v0.2.1.5)
  1771 00004756 83FF01              <1> 	cmp	edi, 1			; VALID DRIVE
  1772 00004759 7709                <1> 	ja	short XN_OUT		; IF INVALID BACK
  1773 0000475B 80BF[1B790100]00    <1> 	cmp	byte [DSK_STATE+edi], 0	; NO DRIVE ?
  1774 00004762 7401                <1> 	jz	short DO_DET		; IF NO DRIVE ATTEMPT DETERMINE
  1775                              <1> 	
  1776                              <1> 	;;mov	cx, di			; CX = DRIVE NUMBER
  1777                              <1> 	;mov	ecx, edi
  1778                              <1> 	;or	cl, cl
  1779                              <1> 	;jz	short XN_0
  1780                              <1> 	;shl	cl, 2			; CL = SHIFT COUNT, A=0, B=4
  1781                              <1> 	;mov	al, [HF_CNTRL]		; DRIVE INFORMATION
  1782                              <1> 	;ror	al, cl			; TO LOW NIBBLE
  1783                              <1> ;XN_0:	
  1784                              <1> 	;and	al, DRV_DET+FMT_CAPA+TRK_CAPA ; KEEP DRIVE BITS
  1785                              <1>         ;and	byte [DSK_STATE+edi], ~(DRV_DET+FMT_CAPA+TRK_CAPA)
  1786                              <1> 	;or	[DSK_STATE+edi], al	; UPDATE DRIVE STATE
  1787                              <1> XN_OUT:
  1788 00004764 C3                  <1> 	retn
  1789                              <1> 
  1790                              <1> DO_DET:
  1791                              <1> 	;call	DRIVE_DET		; TRY TO DETERMINE
  1792                              <1> 	;retn
  1793                              <1> 	;jmp	DRIVE_DET
  1794                              <1> 
  1795                              <1> ;-------------------------------------------------------------------------------
  1796                              <1> ; DRIVE_DET
  1797                              <1> ;	DETERMINES WHETHER DRIVE IS 80 OR 40 TRACKS AND
  1798                              <1> ;	UPDATES STATE INFORMATION ACCORDINGLY.
  1799                              <1> ; ON ENTRY:	DI = DRIVE #
  1800                              <1> ;-------------------------------------------------------------------------------
  1801                              <1> DRIVE_DET:
  1802                              <1> 	; 06/08/2022 - TRDOS 386 Kernel v2.0.5
  1803                              <1> 	; 08/07/2022 - Retro UNIX 386 v1.1 (Kernel v0.2.1.5)
  1804 00004765 E88E040000          <1> 	call	MOTOR_ON		; TURN ON MOTOR IF NOT ALREADY ON
  1805 0000476A E8FA050000          <1> 	call	RECAL			; RECALIBRATE DRIVE
  1806 0000476F 724E                <1> 	jc	short DD_BAC		; ASSUME NO DRIVE PRESENT
  1807 00004771 B530                <1> 	mov	ch, TRK_SLAP		; SEEK TO TRACK 48
  1808 00004773 E872050000          <1> 	call	SEEK
  1809 00004778 7245                <1> 	jc	short DD_BAC		; ERROR NO DRIVE
  1810 0000477A B50B                <1> 	mov	ch, QUIET_SEEK+1	; SEEK TO TRACK 10
  1811                              <1> SK_GIN:
  1812 0000477C FECD                <1> 	dec	ch			; DECREMENT TO NEXT TRACK
  1813                              <1> 	;push	cx			; SAVE TRACK
  1814                              <1> 	; 11/04/2021
  1815 0000477E 51                  <1> 	push	ecx
  1816 0000477F E866050000          <1> 	call	SEEK
  1817 00004784 723A                <1> 	jc	short POP_BAC		; POP AND RETURN
  1818 00004786 B8[C0470000]        <1> 	mov	eax, POP_BAC		; LOAD NEC OUTPUT ERROR ADDRESS
  1819 0000478B 50                  <1> 	push	eax
  1820 0000478C B404                <1> 	mov	ah, SENSE_DRV_ST	; SENSE DRIVE STATUS COMMAND BYTE
  1821 0000478E E820050000          <1> 	call	NEC_OUTPUT		; OUTPUT TO NEC
  1822                              <1> 	;mov	ax, di			; AL = DRIVE
  1823                              <1> 	; 06/08/2022
  1824 00004793 89F8                <1> 	mov	eax, edi
  1825 00004795 88C4                <1> 	mov	ah, al			; AH = DRIVE
  1826 00004797 E817050000          <1> 	call	NEC_OUTPUT		; OUTPUT TO NEC
  1827 0000479C E849060000          <1> 	call	RESULTS			; GO GET STATUS
  1828 000047A1 58                  <1> 	pop	eax			; THROW AWAY ERROR ADDRESS
  1829                              <1> 	;pop	cx			; RESTORE TRACK
  1830                              <1> 	; 11/04/2021
  1831 000047A2 59                  <1> 	pop	ecx
  1832 000047A3 F605[11790100]10    <1> 	test	byte [NEC_STATUS], HOME	; TRACK 0 ?
  1833 000047AA 74D0                <1> 	jz	short SK_GIN		; GO TILL TRACK 0
  1834 000047AC 08ED                <1> 	or	ch, ch			; IS HOME AT TRACK 0
  1835 000047AE 7408                <1> 	jz	short IS_80		; MUST BE 80 TRACK DRIVE
  1836                              <1> 
  1837                              <1> ;	DRIVE IS A 360; SET DRIVE TO DETERMINED;
  1838                              <1> ;	SET MEDIA TO DETERMINED AT RATE 250.
  1839                              <1> 
  1840 000047B0 808F[1B790100]94    <1> 	or	byte [DSK_STATE+edi], DRV_DET+MED_DET+RATE_250
  1841 000047B7 C3                  <1> 	retn				; ALL INFORMATION SET
  1842                              <1> IS_80:
  1843 000047B8 808F[1B790100]01    <1> 	or	byte [DSK_STATE+edi], TRK_CAPA ; SETUP 80 TRACK CAPABILITY
  1844                              <1> DD_BAC:
  1845 000047BF C3                  <1> 	retn
  1846                              <1> POP_BAC:
  1847                              <1> 	;pop	cx			; THROW AWAY
  1848                              <1> 	; 11/04/2021
  1849 000047C0 59                  <1> 	pop	ecx
  1850 000047C1 C3                  <1> 	retn
  1851                              <1> 
  1852                              <1> 
  1853                              <1> 	; 06/08/2022 - TRDOS 386 Kernel v2.0.5
  1854                              <1> 
  1855                              <1> %if 0
  1856                              <1> 
  1857                              <1> ;-------------------------------------------------------------------------------
  1858                              <1> ; XLAT_OLD 
  1859                              <1> ;	TRANSLATES DISKETTE STATE LOCATIONS FROM NEW
  1860                              <1> ;	ARCHITECTURE TO COMPATIBLE MODE.
  1861                              <1> ;
  1862                              <1> ; ON ENTRY:	DI = DRIVE
  1863                              <1> ;-------------------------------------------------------------------------------
  1864                              <1> XLAT_OLD:
  1865                              <1> 	cmp	edi, 1			; VALID DRIVE ?
  1866                              <1> 	ja	short XO_OUT            ; IF INVALID BACK
  1867                              <1>         cmp	byte [DSK_STATE+edi], 0	; NO DRIVE ?
  1868                              <1> 	jz	short XO_OUT		; IF NO DRIVE TRANSLATE DONE
  1869                              <1> 
  1870                              <1> ;-----	TEST FOR SAVED DRIVE INFORMATION ALREADY SET
  1871                              <1> 
  1872                              <1> 	;mov	cx, di			; CX = DRIVE NUMBER
  1873                              <1> 	; 06/08/2022
  1874                              <1> 	mov	ecx, edi
  1875                              <1> 	shl	cl, 2			; CL = SHIFT COUNT, A=0, B=4
  1876                              <1> 	mov	ah, FMT_CAPA		; LOAD MULTIPLE DATA RATE BIT MASK
  1877                              <1> 	ror	ah, cl			; ROTATE BY MASK
  1878                              <1> 	test	[HF_CNTRL], ah		; MULTIPLE-DATA RATE DETERMINED ?
  1879                              <1> 	jnz	short SAVE_SET		; IF SO, NO NEED TO RE-SAVE
  1880                              <1> 
  1881                              <1> ;-----	ERASE DRIVE BITS IN @HF_CNTRL FOR THIS DRIVE
  1882                              <1> 
  1883                              <1> 	mov	ah, DRV_DET+FMT_CAPA+TRK_CAPA ; MASK TO KEEP
  1884                              <1> 	ror	ah, cl			; FIX MASK TO KEEP
  1885                              <1> 	not	ah			; TRANSLATE MASK
  1886                              <1> 	and	[HF_CNTRL], ah		; KEEP BITS FROM OTHER DRIVE INTACT
  1887                              <1> 
  1888                              <1> ;-----	ACCESS CURRENT DRIVE BITS AND STORE IN @HF_CNTRL
  1889                              <1> 
  1890                              <1> 	mov	al, [DSK_STATE+edi]	; ACCESS STATE
  1891                              <1> 	and	al, DRV_DET+FMT_CAPA+TRK_CAPA ; KEEP DRIVE BITS
  1892                              <1> 	ror	al, cl			; FIX FOR THIS DRIVE
  1893                              <1> 	or	[HF_CNTRL], al		; UPDATE SAVED DRIVE STATE
  1894                              <1> 
  1895                              <1> ;-----	TRANSLATE TO COMPATIBILITY MODE
  1896                              <1> 
  1897                              <1> SAVE_SET:
  1898                              <1> 	mov	ah, [DSK_STATE+edi]	; ACCESS STATE
  1899                              <1> 	mov	bh, ah			; TO BH FOR LATER
  1900                              <1> 	and	ah, RATE_MSK		; KEEP ONLY RATE
  1901                              <1> 	cmp	ah, RATE_500		; RATE 500 ?
  1902                              <1> 	jz	short CHK_144		; YES 1.2/1.2 OR 1.44/1.44
  1903                              <1> 	mov	al, M3D1U		; AL = 360 IN 1.2 UNESTABLISHED
  1904                              <1> 	cmp	ah, RATE_300		; RATE 300 ?
  1905                              <1> 	jnz	short CHK_250		; NO, 360/360, 720/720 OR 720/1.44
  1906                              <1> 	test	bh, DBL_STEP		; CHECK FOR DOUBLE STEP
  1907                              <1> 	jnz	short TST_DET		; MUST BE 360 IN 1.2
  1908                              <1> UNKNO:
  1909                              <1> 	mov	al, MED_UNK		; NONE OF THE ABOVE
  1910                              <1> 	jmp	short AL_SET		; PROCESS COMPLETE
  1911                              <1> CHK_144:
  1912                              <1> 	call	CMOS_TYPE		; RETURN DRIVE TYPE IN (AL)
  1913                              <1> 	;;20/02/2015
  1914                              <1> 	;;jc	short UNKNO		; ERROR, SET 'NONE OF ABOVE'
  1915                              <1> 	jz	short UNKNO ;; 20/02/2015
  1916                              <1> 	cmp	al, 2			; 1.2MB DRIVE ?
  1917                              <1> 	jne	short UNKNO		; NO, GO SET 'NONE OF ABOVE'
  1918                              <1> 	mov	al, M1D1U		; AL = 1.2 IN 1.2 UNESTABLISHED
  1919                              <1> 	jmp	short TST_DET
  1920                              <1> CHK_250:
  1921                              <1> 	mov	al, M3D3U		; AL = 360 IN 360 UNESTABLISHED
  1922                              <1> 	cmp	ah, RATE_250		; RATE 250 ?
  1923                              <1> 	jnz	short UNKNO		; IF SO FALL IHRU
  1924                              <1> 	test	bh, TRK_CAPA		; 80 TRACK CAPABILITY ?
  1925                              <1> 	jnz	short UNKNO		; IF SO JUMP, FALL THRU TEST DET
  1926                              <1> TST_DET:
  1927                              <1> 	test	bh, MED_DET		; DETERMINED ?
  1928                              <1> 	jz	short AL_SET		; IF NOT THEN SET
  1929                              <1> 	add	al, 3			; MAKE DETERMINED/ESTABLISHED
  1930                              <1> AL_SET:
  1931                              <1> 	and	byte [DSK_STATE+edi], ~(DRV_DET+FMT_CAPA+TRK_CAPA) ; CLEAR DRIVE
  1932                              <1> 	or	[DSK_STATE+edi], al	; REPLACE WITH COMPATIBLE MODE
  1933                              <1> XO_OUT:
  1934                              <1> 	retn
  1935                              <1> 
  1936                              <1> %endif
  1937                              <1> 
  1938                              <1> ;-------------------------------------------------------------------------------
  1939                              <1> ; SETUP_STATE:	INITIALIZES START AND END RATES.
  1940                              <1> ;-------------------------------------------------------------------------------
  1941                              <1> SETUP_STATE:
  1942 000047C2 F687[1B790100]10    <1> 	test	byte [DSK_STATE+edi], MED_DET ; MEDIA DETERMINED ?
  1943 000047C9 7537                <1> 	jnz	short J1C		; NO STATES IF DETERMINED
  1944 000047CB 66B84000            <1>         mov     ax, (RATE_500*256)+RATE_300 ; AH = START RATE, AL = END RATE
  1945 000047CF F687[1B790100]04    <1> 	test	byte [DSK_STATE+edi], DRV_DET ; DRIVE ?
  1946 000047D6 740D                <1> 	jz	short AX_SET		; DO NOT KNOW DRIVE
  1947 000047D8 F687[1B790100]02    <1> 	test	byte [DSK_STATE+edi], FMT_CAPA ; MULTI-RATE?
  1948 000047DF 7504                <1> 	jnz	short AX_SET		; JUMP IF YES
  1949 000047E1 66B88080            <1>         mov     ax, RATE_250*257	; START A END RATE 250 FOR 360 DRIVE
  1950                              <1> AX_SET:	
  1951 000047E5 80A7[1B790100]1F    <1> 	and	byte [DSK_STATE+edi], ~(RATE_MSK+DBL_STEP) ; TURN OFF THE RATE
  1952 000047EC 08A7[1B790100]      <1> 	or	[DSK_STATE+edi], ah	; RATE FIRST TO TRY
  1953 000047F2 8025[18790100]F3    <1> 	and	byte [LASTRATE], ~STRT_MSK ; ERASE LAST TO TRY RATE BITS
  1954 000047F9 C0C804              <1> 	ror	al, 4			; TO OPERATION LAST RATE LOCATION
  1955 000047FC 0805[18790100]      <1> 	or	[LASTRATE], al		; LAST RATE
  1956                              <1> J1C:	
  1957 00004802 C3                  <1> 	retn
  1958                              <1> 
  1959                              <1> ;-------------------------------------------------------------------------------
  1960                              <1> ;  FMT_INIT: ESTABLISH STATE IF UNESTABLISHED AT FORMAT TIME.
  1961                              <1> ;-------------------------------------------------------------------------------
  1962                              <1> FMT_INIT:
  1963 00004803 F687[1B790100]10    <1> 	test	byte [DSK_STATE+edi], MED_DET ; IS MEDIA ESTABLISHED
  1964 0000480A 7546                <1> 	jnz	short F1_OUT		; IF SO RETURN
  1965 0000480C E8A3030000          <1> 	call	CMOS_TYPE		; RETURN DRIVE TYPE IN AL
  1966                              <1> 	;; 20/02/2015
  1967                              <1> 	;;jc	short CL_DRV		; ERROR IN CMOS ASSUME NO DRIVE
  1968 00004811 7440                <1> 	jz	short CL_DRV ;; 20/02/2015
  1969 00004813 FEC8                <1> 	dec	al			; MAKE ZERO ORIGIN
  1970                              <1> 	;;JS	short CL_DRV		; NO DRIVE IF AL 0
  1971 00004815 8AA7[1B790100]      <1> 	mov	ah, [DSK_STATE+edi]	; AH = CURRENT STATE
  1972 0000481B 80E40F              <1> 	and	ah, ~(MED_DET+DBL_STEP+RATE_MSK) ; CLEAR
  1973 0000481E 08C0                <1> 	or	al, al			; CHECK FOR 360
  1974 00004820 7505                <1> 	jnz	short N_360		; IF 360 WILL BE 0
  1975 00004822 80CC90              <1> 	or	ah, MED_DET+RATE_250	; ESTABLISH MEDIA
  1976 00004825 EB25                <1> 	jmp	short SKP_STATE		; SKIP OTHER STATE PROCESSING
  1977                              <1> N_360:	
  1978 00004827 FEC8                <1> 	dec	al			; 1.2 M DRIVE
  1979 00004829 7505                <1> 	jnz	short N_12		; JUMP IF NOT
  1980                              <1> F1_RATE:
  1981 0000482B 80CC10              <1> 	or	ah, MED_DET+RATE_500	; SET FORMAT RATE
  1982 0000482E EB1C                <1> 	jmp	short SKP_STATE		; SKIP OTHER STATE PROCESSING
  1983                              <1> N_12:	
  1984 00004830 FEC8                <1> 	dec	al			; CHECK FOR TYPE 3
  1985 00004832 750F                <1> 	jnz	short N_720		; JUMP IF NOT
  1986 00004834 F6C404              <1> 	test	ah, DRV_DET		; IS DRIVE DETERMINED
  1987 00004837 7410                <1> 	jz	short ISNT_12		; TREAT AS NON 1.2 DRIVE
  1988 00004839 F6C402              <1> 	test	ah, FMT_CAPA		; IS 1.2M
  1989 0000483C 740B                <1> 	jz	short ISNT_12		; JUMP IF NOT
  1990 0000483E 80CC50              <1> 	or	ah, MED_DET+RATE_300	; RATE 300
  1991 00004841 EB09                <1> 	jmp	short SKP_STATE		; CONTINUE
  1992                              <1> N_720:
  1993 00004843 FEC8                <1> 	dec	al			; CHECK FOR TYPE 4
  1994 00004845 750C                <1> 	jnz	short CL_DRV		; NO DRIVE, CMOS BAD
  1995 00004847 EBE2                <1> 	jmp	SHORT F1_RATE
  1996                              <1> ISNT_12: 
  1997 00004849 80CC90              <1> 	or	ah, MED_DET+RATE_250	; MUST BE RATE 250
  1998                              <1> SKP_STATE:
  1999 0000484C 88A7[1B790100]      <1> 	mov	[DSK_STATE+edi], ah	; STORE AWAY
  2000                              <1> F1_OUT:
  2001 00004852 C3                  <1> 	retn
  2002                              <1> CL_DRV:	
  2003 00004853 30E4                <1> 	xor	ah, ah			; CLEAR STATE
  2004 00004855 EBF5                <1> 	jmp	short SKP_STATE		; SAVE IT
  2005                              <1> 
  2006                              <1> ;-------------------------------------------------------------------------------
  2007                              <1> ; MED_CHANGE	
  2008                              <1> ;	CHECKS FOR MEDIA CHANGE, RESETS MEDIA CHANGE, 
  2009                              <1> ;	CHECKS MEDIA CHANGE AGAIN.
  2010                              <1> ;
  2011                              <1> ; ON EXIT:	CY = 1 MEANS MEDIA CHANGE OR TIMEOUT
  2012                              <1> ;		@DSKETTE_STATUS = ERROR CODE
  2013                              <1> ;-------------------------------------------------------------------------------
  2014                              <1> MED_CHANGE:
  2015                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  2016 00004857 E8E8050000          <1> 	call	READ_DSKCHNG		; READ DISK CHANCE LINE STATE
  2017 0000485C 7445                <1> 	jz	short MC_OUT		; BYPASS HANDLING DISK CHANGE LINE
  2018 0000485E 80A7[1B790100]EF    <1> 	and	byte [DSK_STATE+edi], ~MED_DET ; CLEAR STATE FOR THIS DRIVE
  2019                              <1> 
  2020                              <1> ;	THIS SEQUENCE ENSURES WHENEVER A DISKETTE IS CHANGED THAT
  2021                              <1> ;	ON THE NEXT OPERATION THE REQUIRED MOTOR START UP TIME WILL
  2022                              <1> ;	BE WAITED. (DRIVE MOTOR MAY GO OFF UPON DOOR OPENING).
  2023                              <1> 
  2024                              <1> 	;mov	cx, di			; CL = DRIVE 0
  2025                              <1> 	; 06/08/2022
  2026 00004865 89F9                <1> 	mov	ecx, edi
  2027 00004867 B001                <1> 	mov	al, 1			; MOTOR ON BIT MASK
  2028 00004869 D2E0                <1> 	shl	al, cl			; TO APPROPRIATE POSITION
  2029 0000486B F6D0                <1> 	not	al			; KEEP ALL BUT MOTOR ON
  2030 0000486D FA                  <1> 	cli				; NO INTERRUPTS
  2031 0000486E 2005[0E790100]      <1> 	and	[MOTOR_STATUS], al	; TURN MOTOR OFF INDICATOR
  2032 00004874 FB                  <1> 	sti				; INTERRUPTS ENABLED
  2033 00004875 E87E030000          <1> 	call	MOTOR_ON		; TURN MOTOR ON
  2034                              <1> 
  2035                              <1> ;-----	THIS SEQUENCE OF SEEKS IS USED TO RESET DISKETTE CHANGE SIGNAL
  2036                              <1> 
  2037 0000487A E82FFAFFFF          <1> 	call	DSK_RESET		; RESET NEC
  2038 0000487F B501                <1> 	mov	ch, 1			; MOVE TO CYLINDER 1
  2039 00004881 E864040000          <1> 	call	SEEK			; ISSUE SEEK
  2040 00004886 30ED                <1> 	xor	ch, ch			; MOVE TO CYLINDER 0
  2041 00004888 E85D040000          <1> 	call	SEEK			; ISSUE SEEK
  2042 0000488D C605[10790100]06    <1> 	mov	byte [DSKETTE_STATUS], MEDIA_CHANGE ; STORE IN STATUS
  2043                              <1> OK1:
  2044 00004894 E8AB050000          <1> 	call	READ_DSKCHNG		; CHECK MEDIA CHANGED AGAIN
  2045 00004899 7407                <1> 	jz	short OK2		; IF ACTIVE, NO DISKETTE, TIMEOUT
  2046                              <1> OK4:
  2047 0000489B C605[10790100]80    <1> 	mov	byte [DSKETTE_STATUS], TIME_OUT ; TIMEOUT IF DRIVE EMPTY
  2048                              <1> OK2:		
  2049 000048A2 F9                  <1> 	stc				; MEDIA CHANGED, SET CY
  2050                              <1> MC_OUT:	; 06/08/2022 (cf = 0)
  2051 000048A3 C3                  <1> 	retn
  2052                              <1> ;MC_OUT:
  2053                              <1> 	;clc				; NO MEDIA CHANGED, CLEAR CY
  2054                              <1> 	;retn
  2055                              <1> 
  2056                              <1> ;-------------------------------------------------------------------------------
  2057                              <1> ; SEND_RATE
  2058                              <1> ;	SENDS DATA RATE COMMAND TO NEC
  2059                              <1> ; ON ENTRY:	DI = DRIVE #
  2060                              <1> ; ON EXIT:	NONE
  2061                              <1> ; REGISTERS ALTERED: DX
  2062                              <1> ;-------------------------------------------------------------------------------
  2063                              <1> SEND_RATE:
  2064                              <1> 	;push	ax			; SAVE REG.
  2065                              <1> 	; 11/04/2021
  2066 000048A4 50                  <1> 	push	eax
  2067 000048A5 8025[18790100]3F    <1> 	and	byte [LASTRATE], ~SEND_MSK ; ELSE CLEAR LAST RATE ATTEMPTED
  2068 000048AC 8A87[1B790100]      <1> 	mov	al, [DSK_STATE+edi]	; GET RATE STATE OF THIS DRIVE
  2069 000048B2 24C0                <1> 	and	al, SEND_MSK		; KEEP ONLY RATE BITS
  2070 000048B4 0805[18790100]      <1> 	or	[LASTRATE], al		; SAVE NEW RATE FOR NEXT CHECK
  2071 000048BA C0C002              <1> 	rol	al, 2			; MOVE TO BIT OUTPUT POSITIONS
  2072 000048BD 66BAF703            <1> 	mov	dx, 03F7h		; OUTPUT NEW DATA RATE
  2073 000048C1 EE                  <1> 	out	dx, al
  2074                              <1> 	;pop	ax			; RESTORE REG.
  2075                              <1> 	; 11/04/2021
  2076 000048C2 58                  <1> 	pop	eax
  2077 000048C3 C3                  <1> 	retn
  2078                              <1> 
  2079                              <1> ;-------------------------------------------------------------------------------
  2080                              <1> ; CHK_LASTRATE
  2081                              <1> ;	CHECK PREVIOUS DATE RATE SNT TO THE CONTROLLER.
  2082                              <1> ; ON ENTRY:
  2083                              <1> ;	DI = DRIVE #
  2084                              <1> ; ON EXIT:
  2085                              <1> ;	ZF =  1 DATA RATE IS THE SAME AS THE LAST RATE SENT TO NEC
  2086                              <1> ;	ZF =  0 DATA RATE IS DIFFERENT FROM LAST RATE
  2087                              <1> ; REGISTERS ALTERED: DX
  2088                              <1> ;-------------------------------------------------------------------------------
  2089                              <1> CHK_LASTRATE:
  2090                              <1> 	; 13/07/2022 - TRDOS 386 v2.0.5
  2091                              <1> 	;push	ax			; SAVE REG.
  2092                              <1> 	; 11/04/2021
  2093 000048C4 50                  <1> 	push	eax
  2094                              <1> 	; 13/07/2022 (BugFix)
  2095 000048C5 8A25[18790100]      <1> 	mov	ah, [LASTRATE] 		; GET LAST DATA RATE SELECTED
  2096 000048CB 8A87[1B790100]      <1> 	mov	al, [DSK_STATE+edi]	; GET RATE STATE OF THIS DRIVE
  2097 000048D1 6625C0C0            <1>         and	ax, SEND_MSK*257        ; KEEP ONLY RATE BITS OF BOTH
  2098 000048D5 38E0                <1> 	cmp	al, ah			; COMPARE TO PREVIOUSLY TRIED
  2099                              <1> 					; ZF = 1 RATE IS THE SAME
  2100                              <1> 	;pop	ax			; RESTORE REG.
  2101                              <1> 	; 11/04/2021
  2102 000048D7 58                  <1> 	pop	eax
  2103 000048D8 C3                  <1> 	retn
  2104                              <1> 
  2105                              <1> ;-------------------------------------------------------------------------------
  2106                              <1> ; DMA_SETUP
  2107                              <1> ;	THIS ROUTINE SETS UP THE DMA FOR READ/WRITE/VERIFY OPERATIONS.
  2108                              <1> ;
  2109                              <1> ; ON ENTRY:	AL = DMA COMMAND
  2110                              <1> ;
  2111                              <1> ; ON EXIT:	@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION
  2112                              <1> ;-------------------------------------------------------------------------------
  2113                              <1> 
  2114                              <1> ; SI = Head #, # of Sectors or DASD Type
  2115                              <1> 
  2116                              <1> ; 22/08/2015
  2117                              <1> ; 08/02/2015 - Protected Mode Modification
  2118                              <1> ; 06/02/2015 - 07/02/2015
  2119                              <1> ; NOTE: Buffer address must be in 1st 16MB of Physical Memory (24 bit limit).
  2120                              <1> ; (DMA Addres = Physical Address)
  2121                              <1> ; (Retro UNIX 386 v1 Kernel/System Mode Virtual Address = Physical Address)
  2122                              <1> ;
  2123                              <1> ; 09/08/2022
  2124                              <1> ; 06/08/2022
  2125                              <1> ; 04/02/2016 (clc)
  2126                              <1> ; 20/02/2015 modification (source: AWARD BIOS 1999, DMA_SETUP)
  2127                              <1> ; 16/12/2014 (IODELAY)
  2128                              <1> 
  2129                              <1> DMA_SETUP:
  2130                              <1> 	; 09/08/2022
  2131                              <1> 	; 06/08/2022 - TRDOS 386 Kernel v2.0.5
  2132                              <1> 	;; 20/02/2015
  2133                              <1> 	;;mov	edx, [ebp+4] 		; Buffer address
  2134                              <1> 	; 06/08/2022
  2135                              <1> 	;mov	edx, ebp ; buffer address
  2136                              <1> 	;test	edx, 0FF000000h		; 16 MB limit (22/08/2015, bugfix)
  2137 000048D9 F7C5000000FF        <1> 	test	ebp, 0FF000000h
  2138 000048DF 7566                <1> 	jnz	short dma_bnd_err_stc
  2139                              <1> 	; 09/08/2022
  2140 000048E1 89EA                <1> 	mov	edx, ebp
  2141                              <1> 	;
  2142                              <1> 	;;push	ax			; DMA command
  2143                              <1> 	; 11/04/2021
  2144 000048E3 50                  <1> 	push	eax
  2145                              <1> 	; 06/08/2022
  2146                              <1> 	;push	edx			; *
  2147                              <1> 	;mov	dl, 3			; GET BYTES/SECTOR PARAMETER
  2148                              <1> 	; 06/08/2022
  2149 000048E4 B003                <1> 	mov	al, 3			; GET BYTES/SECTOR PARAMETER
  2150 000048E6 E8D2020000          <1> 	call	GET_PARM		; 
  2151 000048EB 88E1                <1> 	mov	cl, ah 			; SHIFT COUNT (0=128, 1=256, 2=512 ETC)
  2152                              <1> 	;mov	ax, si			; Sector count
  2153                              <1> 	; 06/08/2022
  2154 000048ED 89F0                <1> 	mov	eax, esi
  2155 000048EF 88C4                <1> 	mov	ah, al			; AH = # OF SECTORS
  2156 000048F1 28C0                <1> 	sub	al, al			; AL = 0, AX = # SECTORS * 256
  2157                              <1> 	;shr	ax, 1			; AX = # SECTORS * 128
  2158                              <1> 	; 06/08/2022
  2159 000048F3 D1E8                <1> 	shr	eax, 1
  2160                              <1> 	;shl	ax, cl			; SHIFT BY PARAMETER VALUE
  2161                              <1> 	;dec	ax			; -1 FOR DMA VALUE
  2162                              <1> 	;mov	cx, ax
  2163 000048F5 D3E0                <1> 	shl	eax, cl
  2164 000048F7 48                  <1> 	dec	eax
  2165 000048F8 89C1                <1> 	mov	ecx, eax
  2166                              <1> 	; 06/08/2022
  2167                              <1> 	;pop	edx			; *
  2168                              <1> 	;;pop	ax
  2169                              <1> 	; 11/04/2021
  2170 000048FA 58                  <1> 	pop	eax
  2171 000048FB 3C42                <1> 	cmp	al, 42h
  2172 000048FD 7507                <1>         jne     short NOT_VERF
  2173                              <1> 	; 09/08/2022
  2174 000048FF BA0000FF00          <1> 	mov	edx, 0FF0000h
  2175                              <1> 	; 06/08/2022
  2176                              <1> 	;mov	ebp, 0FF0000h
  2177 00004904 EB08                <1> 	jmp	short J33
  2178                              <1> NOT_VERF:
  2179 00004906 6601CA              <1> 	add	dx, cx			; check for overflow
  2180 00004909 723D                <1> 	jc	short dma_bnd_err
  2181                              <1> 	;
  2182 0000490B 6629CA              <1> 	sub	dx, cx			; Restore start address
  2183                              <1> J33:
  2184 0000490E FA                  <1> 	cli				; DISABLE INTERRUPTS DURING DMA SET-UP
  2185 0000490F E60C                <1> 	out	DMA+12, al		; SET THE FIRST/LA5T F/F
  2186                              <1> 	IODELAY				; WAIT FOR I/O
    78 00004911 EB00                <2>  jmp short $+2
    79 00004913 EB00                <2>  jmp short $+2
  2187 00004915 E60B                <1> 	out	DMA+11, al		; OUTPUT THE MODE BYTE
  2188                              <1> 	;mov	eax, edx		; Buffer address
  2189                              <1> 	; 06/08/2022
  2190                              <1> 	;mov	eax, ebp
  2191                              <1> 	; 09/08/2022
  2192 00004917 89D0                <1> 	mov	eax, edx
  2193 00004919 E604                <1> 	out	DMA+4, al		; OUTPUT LOW ADDRESS
  2194                              <1> 	IODELAY				; WAIT FOR I/O
    78 0000491B EB00                <2>  jmp short $+2
    79 0000491D EB00                <2>  jmp short $+2
  2195 0000491F 88E0                <1> 	mov	al, ah
  2196 00004921 E604                <1> 	out	DMA+4, al		; OUTPUT HIGH ADDRESS
  2197 00004923 C1E810              <1> 	shr	eax, 16
  2198                              <1> 	IODELAY				; I/O WAIT STATE
    78 00004926 EB00                <2>  jmp short $+2
    79 00004928 EB00                <2>  jmp short $+2
  2199 0000492A E681                <1> 	out	081h, al		; OUTPUT HIGHEST BITS TO PAGE REGISTER
  2200                              <1> 	IODELAY
    78 0000492C EB00                <2>  jmp short $+2
    79 0000492E EB00                <2>  jmp short $+2
  2201                              <1> 	;mov	ax, cx			; Byte count - 1
  2202                              <1> 	; 06/08/2022
  2203 00004930 89C8                <1> 	mov	eax, ecx
  2204 00004932 E605                <1> 	out	DMA+5, al		; LOW BYTE OF COUNT
  2205                              <1> 	IODELAY				; WAIT FOR I/O
    78 00004934 EB00                <2>  jmp short $+2
    79 00004936 EB00                <2>  jmp short $+2
  2206 00004938 88E0                <1> 	mov	al, ah
  2207 0000493A E605                <1> 	out	DMA+5, al		; HIGH BYTE OF COUNT
  2208                              <1> 	IODELAY
    78 0000493C EB00                <2>  jmp short $+2
    79 0000493E EB00                <2>  jmp short $+2
  2209 00004940 FB                  <1> 	sti				; RE-ENABLE INTERRUPTS
  2210 00004941 B002                <1> 	mov	al, 2			; MODE FOR 8237
  2211 00004943 E60A                <1> 	out	DMA+10, al		; INITIALIZE THE DISKETTE CHANNEL
  2212                              <1> 
  2213 00004945 F8                  <1> 	clc	; 04/02/2016
  2214 00004946 C3                  <1> 	retn
  2215                              <1> 
  2216                              <1> dma_bnd_err_stc:
  2217 00004947 F9                  <1> 	stc
  2218                              <1> dma_bnd_err:
  2219 00004948 C605[10790100]09    <1> 	mov	byte [DSKETTE_STATUS], DMA_BOUNDARY ; SET ERROR
  2220 0000494F C3                  <1> 	retn				; CY SET BY ABOVE IF ERROR
  2221                              <1> 
  2222                              <1> ;; 16/12/2014
  2223                              <1> ;;	CLI				; DISABLE INTERRUPTS DURING DMA SET-UP
  2224                              <1> ;;	OUT	DMA+12,AL		; SET THE FIRST/LA5T F/F
  2225                              <1> ;;	;jmp	$+2			; WAIT FOR I/O
  2226                              <1> ;;	IODELAY
  2227                              <1> ;; 	OUT	DMA+11,AL		; OUTPUT THE MODE BYTE
  2228                              <1> ;;	;SIODELAY
  2229                              <1> ;;      ;cmp	AL,42H			; DMA VERIFY COMMAND
  2230                              <1> ;;      ;JNE	short NOT_VERF		; NO
  2231                              <1> ;;      ;xor	AX,AX			; START ADDRESS
  2232                              <1> ;;      ;jmp	SHORT J33
  2233                              <1> ;;;NOT_VERF:	
  2234                              <1> ;;	;mov	AX,ES			; GET THE ES VALUE
  2235                              <1> ;;	;ROL	AX,4			; ROTATE LEFT
  2236                              <1> ;;	;mov	CH,AL			; GET HIGHEST NIBBLE OF ES TO CH
  2237                              <1> ;;	;and	AL,11110000B		; ZERO THE LOW NIBBLE FROM SEGMENT
  2238                              <1> ;;	;add	AX,[BP+2]		; TEST FOR CARRY FROM ADDITION
  2239                              <1> ;;	mov	eax,[ebp+4] ; 06/02/2015	
  2240                              <1> ;;	;jnc	short J33
  2241                              <1> ;;	;inc	CH			; CARRY MEANS HIGH 4 BITS MUST BE INC
  2242                              <1> ;;;J33:
  2243                              <1> ;;	push	eax			; SAVE START ADDRESS
  2244                              <1> ;;	OUT	DMA+4,AL		; OUTPUT LOW ADDRESS
  2245                              <1> ;;	;jmp	$+2			; WAIT FOR I/O
  2246                              <1> ;;	IODELAY
  2247                              <1> ;;	mov	AL,AH
  2248                              <1> ;;	OUT	DMA+4,AL		; OUTPUT HIGH ADDRESS
  2249                              <1> ;;	shr	eax, 16	     ; 07/02/2015
  2250                              <1> ;;	;mov	AL,CH			; GET HIGH 4 BITS
  2251                              <1> ;;	;jmp	$+2			; I/O WAIT STATE
  2252                              <1> ;;	IODELAY
  2253                              <1> ;;	;and	AL,00001111B
  2254                              <1> ;;	OUT	081H,AL			; OUTPUT HIGH 4 BITS TO PAGE REGISTER
  2255                              <1> ;;	;SIODELAY
  2256                              <1> ;;
  2257                              <1> ;;;----- DETERMINE COUNT
  2258                              <1> ;;	sub	eax, eax ; 08/02/2015
  2259                              <1> ;;	mov	AX,SI			; AL =  # OF SECTORS
  2260                              <1> ;;	xchg	AL,AH			; AH =  # OF SECTORS
  2261                              <1> ;;	sub	AL,AL			; AL = 0, AX = # SECTORS * 256
  2262                              <1> ;;	SHR	AX,1			; AX = # SECTORS * 128
  2263                              <1> ;;	push	AX			; SAVE # OF SECTORS * 128
  2264                              <1> ;;	mov	DL,3			; GET BYTES/SECTOR PARAMETER
  2265                              <1> ;;	call	GET_PARM		; "
  2266                              <1> ;;	mov	CL,AH			; SHIFT COUNT (0=128, 1=256, 2=512 ETC)
  2267                              <1> ;;	pop	AX			; AX = # SECTORS * 128
  2268                              <1> ;;	SHL	AX,CL			; SHIFT BY PARAMETER VALUE
  2269                              <1> ;;	dec	AX			; -1 FOR DMA VALUE
  2270                              <1> ;;	push	eax  ; 08/02/2015	; SAVE COUNT VALUE
  2271                              <1> ;;	OUT	DMA+5,AL		; LOW BYTE OF COUNT
  2272                              <1> ;;	;jmp	$+2			; WAIT FOR I/O
  2273                              <1> ;;	IODELAY
  2274                              <1> ;;	mov	AL,AH
  2275                              <1> ;;	OUT	DMA+5,AL		; HIGH BYTE OF COUNT
  2276                              <1> ;;	;IODELAY
  2277                              <1> ;;	STI				; RE-ENABLE INTERRUPTS
  2278                              <1> ;;	pop	ecx  ; 08/02/2015 	; RECOVER COUNT VALUE
  2279                              <1> ;;	pop	eax  ; 08/02/2015	; RECOVER ADDRESS VALUE
  2280                              <1> ;;	;add	AX, CX			; ADD, TEST FOR 64K OVERFLOW
  2281                              <1> ;;	add	ecx,eax ; 08/02/2015
  2282                              <1> ;;	mov	AL, 2			; MODE FOR 8237
  2283                              <1> ;;	;jmp	$+2			; WAIT FOR I/O
  2284                              <1> ;;	SIODELAY
  2285                              <1> ;;	OUT	DMA+10,AL		; INITIALIZE THE DISKETTE CHANNEL
  2286                              <1> ;;	;jnc	short NO_BAD		; CHECK FOR ERROR
  2287                              <1> ;;	jc	short dma_bnd_err ; 08/02/2015
  2288                              <1> ;;	and	ecx,0FFF00000h	; 16 MB limit
  2289                              <1> ;;	jz	short NO_BAD
  2290                              <1> ;;dma_bnd_err:
  2291                              <1> ;;	mov	byte [DSKETTE_STATUS],DMA_BOUNDARY ; SET ERROR
  2292                              <1> ;;NO_BAD:
  2293                              <1> ;;	retn				; CY SET BY ABOVE IF ERROR
  2294                              <1> 
  2295                              <1> ;-------------------------------------------------------------------------------
  2296                              <1> ; FMTDMA_SET
  2297                              <1> ;	THIS ROUTINE SETS UP THE DMA CONTROLLER FOR A FORMAT OPERATION.
  2298                              <1> ;
  2299                              <1> ; ON ENTRY:	NOTHING REQUIRED
  2300                              <1> ;
  2301                              <1> ; ON EXIT:	@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION
  2302                              <1> ;-------------------------------------------------------------------------------
  2303                              <1> 
  2304                              <1> FMTDMA_SET:
  2305                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  2306                              <1> 	;; 20/02/2015 modification	
  2307                              <1> 	;;mov	edx, [ebp+4] 		; Buffer address
  2308                              <1> 	; 06/08/2022
  2309                              <1> 	;mov	edx, ebp ; buffer address
  2310                              <1> 	; 06/08/2022
  2311                              <1> 	;test	edx, 0FF000000h		; 16 MB limit
  2312 00004950 F7C5000000FF        <1> 	test	ebp, 0FF000000h
  2313 00004956 75EF                <1> 	jnz	short dma_bnd_err_stc
  2314                              <1> 	;
  2315                              <1> 	;;push	dx			; *
  2316                              <1> 	;; 11/04/2021
  2317                              <1> 	; 06/08/2022
  2318                              <1> 	;push	edx
  2319                              <1> 	;mov	dl, 4			; SECTORS/TRACK VALUE IN PARM TABLE
  2320                              <1> 	; 06/08/2022
  2321 00004958 B004                <1> 	mov	al, 4			; SECTORS/TRACK VALUE IN PARM TABLE				
  2322 0000495A E85E020000          <1> 	call	GET_PARM		; "
  2323 0000495F 88E0                <1> 	mov	al, ah			; AL = SECTORS/TRACK VALUE
  2324 00004961 28E4                <1> 	sub	ah, ah			; AX = SECTORS/TRACK VALUE
  2325                              <1> 	;shl	ax, 2			; AX = SEC/TRK * 4 (OFFSET C,H,R,N)
  2326                              <1> 	; 06/08/2022
  2327 00004963 C1E002              <1> 	shl	eax, 2
  2328                              <1> 	;dec	ax			; -1 FOR DMA VALUE
  2329 00004966 48                  <1> 	dec	eax
  2330                              <1> 	;mov	cx, ax
  2331 00004967 89C1                <1> 	mov	ecx, eax
  2332                              <1> 	;;pop	dx			; *
  2333                              <1> 	;; 11/04/2021
  2334                              <1> 	; 06/08/2022
  2335                              <1> 	;pop	edx
  2336                              <1> 	; 06/08/2022
  2337 00004969 B04A                <1> 	mov	al, 04Ah
  2338                              <1> 	;
  2339 0000496B EB99                <1> 	jmp	short NOT_VERF ; 06/08/2022	
  2340                              <1> 
  2341                              <1> ;; 06/08/2022	
  2342                              <1> ;	add	dx, cx			; check for overflow
  2343                              <1> ;	jc	short dma_bnd_err
  2344                              <1> ;	;
  2345                              <1> ;	sub	dx, cx			; Restore start address
  2346                              <1> ;	;
  2347                              <1> ;	;mov	al, 04Ah		; WILL WRITE TO THE DISKETTE
  2348                              <1> ;	cli				; DISABLE INTERRUPTS DURING DMA SET-UP
  2349                              <1> ;	out	DMA+12, al		; SET THE FIRST/LA5T F/F
  2350                              <1> ;	IODELAY				; WAIT FOR I/O
  2351                              <1> ;	out	DMA+11, al		; OUTPUT THE MODE BYTE
  2352                              <1> ;	mov	eax, edx		; Buffer address
  2353                              <1> ;	out	DMA+4, al		; OUTPUT LOW ADDRESS
  2354                              <1> ;	IODELAY				; WAIT FOR I/O
  2355                              <1> ;	mov	al, ah
  2356                              <1> ;	out	DMA+4, al		; OUTPUT HIGH ADDRESS
  2357                              <1> ;	shr	eax, 16
  2358                              <1> ;	IODELAY				; I/O WAIT STATE
  2359                              <1> ;	out	081h, al		; OUTPUT HIGHEST BITS TO PAGE REGISTER
  2360                              <1> ;	IODELAY
  2361                              <1> ;	;mov	ax, cx			; Byte count - 1
  2362                              <1> ;	; 06/08/2022
  2363                              <1> ;	mov	eax, ecx
  2364                              <1> ;	out	DMA+5, al		; LOW BYTE OF COUNT
  2365                              <1> ;	IODELAY				; WAIT FOR I/O
  2366                              <1> ;	mov	al, ah
  2367                              <1> ;	out	DMA+5, al		; HIGH BYTE OF COUNT
  2368                              <1> ;	IODELAY
  2369                              <1> ;	sti				; RE-ENABLE INTERRUPTS
  2370                              <1> ;	mov	al, 2			; MODE FOR 8237
  2371                              <1> ;	out	DMA+10, al		; INITIALIZE THE DISKETTE CHANNEL
  2372                              <1> ;
  2373                              <1> ;	; 06/08/2022
  2374                              <1> ;	clc
  2375                              <1> ;	retn
  2376                              <1> 
  2377                              <1> ;; 08/02/2015 - Protected Mode Modification
  2378                              <1> ;;	mov	AL,04AH			; WILL WRITE TO THE DISKETTE
  2379                              <1> ;;	CLI				; DISABLE INTERRUPTS DURING DMA SET-UP
  2380                              <1> ;;	OUT	DMA+12,AL		; SET THE FIRST/LA5T F/F
  2381                              <1> ;;	;jmp	$+2			; WAIT FOR I/O
  2382                              <1> ;;	IODELAY
  2383                              <1> ;;	OUT	DMA+11,AL		; OUTPUT THE MODE BYTE
  2384                              <1> ;;	;mov	AX,ES			; GET THE ES VALUE
  2385                              <1> ;;	;ROL	AX,4			; ROTATE LEFT
  2386                              <1> ;;	;mov	CH,AL			; GET HIGHEST NIBBLE OF ES TO CH
  2387                              <1> ;;	;and	AL,11110000B		; ZERO THE LOW NIBBLE FROM SEGMENT
  2388                              <1> ;;	;add	AX,[BP+2]		; TEST FOR CARRY FROM ADDITION
  2389                              <1> ;;	;jnc	short J33A
  2390                              <1> ;;	;inc	CH			; CARRY MEANS HIGH 4 BITS MUST BE INC
  2391                              <1> ;;	mov	eax,[ebp+4] ; 08/02/2015
  2392                              <1> ;;;J33A:
  2393                              <1> ;;	push	eax ; 08/02/2015	; SAVE START ADDRESS
  2394                              <1> ;;	OUT	DMA+4,AL		; OUTPUT LOW ADDRESS
  2395                              <1> ;;	;jmp	$+2			; WAIT FOR I/O
  2396                              <1> ;;	IODELAY
  2397                              <1> ;;	mov	AL,AH
  2398                              <1> ;;	OUT	DMA+4,AL		; OUTPUT HIGH ADDRESS
  2399                              <1> ;;	shr 	eax,16 ; 08/02/2015
  2400                              <1> ;;	;mov	AL,CH			; GET HIGH 4 BITS
  2401                              <1> ;;	;jmp	$+2			; I/O WAIT STATE
  2402                              <1> ;;	IODELAY
  2403                              <1> ;;	;and	AL,00001111B
  2404                              <1> ;;	OUT	081H,AL			; OUTPUT HIGH 4 BITS TO PAGE REGISTER
  2405                              <1> ;;
  2406                              <1> ;;;----- DETERMINE COUNT
  2407                              <1> ;;	sub	eax,eax ; 08/02/2015
  2408                              <1> ;;	mov	DL,4			; SECTORS/TRACK VALUE IN PARM TABLE
  2409                              <1> ;;	call	GET_PARM		; "
  2410                              <1> ;;	xchg	AL,AH			; AL = SECTORS/TRACK VALUE
  2411                              <1> ;;	sub	AH,AH			; AX = SECTORS/TRACK VALUE
  2412                              <1> ;;	SHL	AX,2			; AX = SEC/TRK * 4 (OFFSET C,H,R,N)
  2413                              <1> ;;	dec	AX			; -1 FOR DMA VALUE
  2414                              <1> ;;	push	eax 	; 08/02/2015	; SAVE # OF BYTES TO BE TRANSFERED
  2415                              <1> ;;	OUT	DMA+5,AL		; LOW BYTE OF COUNT
  2416                              <1> ;;	;jmp	$+2			; WAIT FOR I/O
  2417                              <1> ;;	IODELAY
  2418                              <1> ;;	mov	AL,AH
  2419                              <1> ;;	OUT	DMA+5,AL		; HIGH BYTE OF COUNT
  2420                              <1> ;;	STI				; RE-ENABLE INTERRUPTS
  2421                              <1> ;;	pop	ecx	; 08/02/2015	; RECOVER COUNT VALUE
  2422                              <1> ;;	pop	eax	; 08/02/2015	; RECOVER ADDRESS VALUE
  2423                              <1> ;;	;add	AX,CX			; ADD, TEST FOR 64K OVERFLOW
  2424                              <1> ;;	add	ecx,eax ; 08/02/2015
  2425                              <1> ;;	mov	AL,2			; MODE FOR 8237
  2426                              <1> ;;	;jmp	$+2			; WAIT FOR I/O
  2427                              <1> ;;	SIODELAY
  2428                              <1> ;;	OUT	DMA+10,AL		; INITIALIZE THE DISKETTE CHANNEL
  2429                              <1> ;;	;jnc	short FMTDMA_OK		; CHECK FOR ERROR
  2430                              <1> ;;	jc	short fmtdma_bnd_err ; 08/02/2015
  2431                              <1> ;;	and	ecx,0FFF00000h	; 16 MB limit
  2432                              <1> ;;	jz	short FMTDMA_OK
  2433                              <1> ;;	stc	; 20/02/2015
  2434                              <1> ;;fmtdma_bnd_err:
  2435                              <1> ;;	mov	byte [DSKETTE_STATUS],DMA_BOUNDARY ; SET ERROR
  2436                              <1> ;;FMTDMA_OK:
  2437                              <1> ;;	retn				; CY SET BY ABOVE IF ERROR
  2438                              <1> 
  2439                              <1> ;-------------------------------------------------------------------------------
  2440                              <1> ; NEC_INIT	
  2441                              <1> ;	THIS ROUTINE SEEKS TO THE REQUESTED TRACK AND INITIALIZES
  2442                              <1> ;	THE NEC FOR THE READ/WRITE/VERIFY/FORMAT OPERATION.
  2443                              <1> ;
  2444                              <1> ; ON ENTRY:	AH = NEC COMMAND TO BE PERFORMED
  2445                              <1> ;
  2446                              <1> ; ON EXIT:	@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION
  2447                              <1> ;-------------------------------------------------------------------------------
  2448                              <1> NEC_INIT:
  2449                              <1> 	; 11/08/2022
  2450                              <1> 	; EBX = user's ECX register content (on stack)
  2451                              <1> 	; 10/08/2022
  2452                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  2453                              <1> 	;push	ax			; SAVE NEC COMMAND
  2454                              <1> 	; 11/04/2021
  2455 0000496D 50                  <1> 	push	eax
  2456 0000496E E885020000          <1> 	call	MOTOR_ON		; TURN MOTOR ON FOR SPECIFIC DRIVE
  2457                              <1> 
  2458                              <1> ;-----	DO THE SEEK OPERATION
  2459                              <1> 
  2460                              <1> 	;mov	ch, [ebp+1]		; CH = TRACK #
  2461                              <1> 	; 10/08/2022
  2462 00004973 88FD                <1> 	mov	ch, bh ; CH = TRACK #
  2463 00004975 E870030000          <1> 	call	SEEK			; MOVE TO CORRECT TRACK
  2464                              <1> 	;pop	ax			; RECOVER COMMAND
  2465                              <1> 	; 11/04/2021
  2466 0000497A 58                  <1> 	pop	eax
  2467 0000497B 721D                <1> 	jc	short ER_1		; ERROR ON SEEK
  2468 0000497D BB[9A490000]        <1> 	mov	ebx, ER_1		; LOAD ERROR ADDRESS
  2469 00004982 53                  <1> 	push	ebx			; PUSH NEC_OUT ERROR RETURN
  2470                              <1> 
  2471                              <1> ;-----	SEND OUT THE PARAMETERS TO THE CONTROLLER
  2472                              <1> 
  2473 00004983 E82B030000          <1> 	call	NEC_OUTPUT		; OUTPUT THE OPERATION COMMAND
  2474                              <1> 	;mov	ax, si			; AH = HEAD #
  2475                              <1> 	; 06/08/2022
  2476 00004988 89F0                <1> 	mov	eax, esi
  2477 0000498A 89FB                <1> 	mov	ebx, edi		; BL = DRIVE #
  2478 0000498C C0E402              <1> 	sal	ah, 2			; MOVE IT TO BIT 2
  2479 0000498F 80E404              <1> 	and	ah, 00000100b		; ISOLATE THAT BIT
  2480 00004992 08DC                <1> 	or	ah, bl			; OR IN THE DRIVE NUMBER
  2481 00004994 E81A030000          <1> 	call	NEC_OUTPUT		; FALL THRU CY SET IF ERROR
  2482 00004999 5B                  <1> 	pop	ebx			; THROW AWAY ERROR RETURN
  2483                              <1> ER_1:
  2484 0000499A C3                  <1> 	retn
  2485                              <1> 
  2486                              <1> ;-------------------------------------------------------------------------------
  2487                              <1> ; RWV_COM
  2488                              <1> ;	THIS ROUTINE SENDS PARAMETERS TO THE NEC SPECIFIC TO THE 
  2489                              <1> ;	READ/WRITE/VERIFY OPERATIONS.
  2490                              <1> ;
  2491                              <1> ; ON ENTRY:	CS:BX = ADDRESS OF MEDIA/DRIVE PARAMETER TABLE
  2492                              <1> ; ON EXIT:	@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION
  2493                              <1> ;-------------------------------------------------------------------------------
  2494                              <1> RWV_COM:
  2495                              <1> 	; 11/08/2022
  2496                              <1> 	; 10/08/2022
  2497                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  2498 0000499B B8[E7490000]        <1> 	mov	eax, ER_2		; LOAD ERROR ADDRESS
  2499 000049A0 50                  <1> 	push	eax			; PUSH NEC_OUT ERROR RETURN
  2500                              <1> 	;mov	ah, [ebp+1]		; OUTPUT TRACK #
  2501                              <1> 	; 11/08/2022
  2502 000049A1 8A642425            <1> 	mov	ah, [esp+37] ; CH = OUTPUT TRACK #
  2503 000049A5 E809030000          <1> 	call	NEC_OUTPUT
  2504                              <1> 	;mov	ax, si			; OUTPUT HEAD #
  2505                              <1> 	; 06/08/2022
  2506 000049AA 89F0                <1> 	mov	eax, esi
  2507 000049AC E802030000          <1> 	call	NEC_OUTPUT
  2508                              <1> 	;mov	ah, [ebp]		; OUTPUT SECTOR #
  2509                              <1> 	; 11/08/2022
  2510 000049B1 8A642424            <1> 	mov	ah, [esp+36] ; CL = OUTPUT SECTOR #
  2511 000049B5 E8F9020000          <1> 	call	NEC_OUTPUT
  2512                              <1> 	;mov	dl, 3			; BYTES/SECTOR PARAMETER FROM BLOCK
  2513                              <1> 	; 06/08/2022
  2514 000049BA B003                <1> 	mov	al, 3
  2515 000049BC E8FC010000          <1> 	call	GET_PARM 		; ... TO THE NEC
  2516 000049C1 E8ED020000          <1> 	call	NEC_OUTPUT		; OUTPUT TO CONTROLLER
  2517                              <1> 	;mov	dl, 4			; EOT PARAMETER FROM BLOCK
  2518                              <1> 	; 06/08/2022
  2519 000049C6 B004                <1> 	mov	al, 4
  2520 000049C8 E8F0010000          <1> 	call	GET_PARM 		; ... TO THE NEC
  2521 000049CD E8E1020000          <1> 	call	NEC_OUTPUT		; OUTPUT TO CONTROLLER
  2522 000049D2 8A6305              <1> 	mov	ah, [ebx+MD.GAP]        ; GET GAP LENGTH
  2523                              <1> _R15:
  2524 000049D5 E8D9020000          <1> 	call	NEC_OUTPUT
  2525                              <1> 	;mov	dl, 6			; DTL PARAMETER PROM BLOCK
  2526                              <1> 	; 06/08/2022
  2527 000049DA B006                <1> 	mov	al, 6
  2528 000049DC E8DC010000          <1> 	call	GET_PARM		; ... TO THE NEC
  2529 000049E1 E8CD020000          <1> 	call	NEC_OUTPUT		; OUTPUT TO CONTROLLER
  2530 000049E6 58                  <1> 	pop	eax			; THROW AWAY ERROR EXIT
  2531                              <1> ER_2:
  2532 000049E7 C3                  <1> 	retn
  2533                              <1> 
  2534                              <1> ;-------------------------------------------------------------------------------
  2535                              <1> ; NEC_TERM
  2536                              <1> ;	THIS ROUTINE WAITS FOR THE OPERATION THEN ACCEPTS THE STATUS 
  2537                              <1> ;	FROM THE NEC FOR THE READ/WRITE/VERIFY/FORWAT OPERATION.
  2538                              <1> ;
  2539                              <1> ; ON EXIT:	@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION
  2540                              <1> ;-------------------------------------------------------------------------------
  2541                              <1> NEC_TERM:
  2542                              <1> 
  2543                              <1> ;-----	LET THE OPERATION HAPPEN
  2544                              <1> 
  2545 000049E8 56                  <1> 	push	esi			; SAVE HEAD #, # OF SECTORS
  2546 000049E9 E8CD030000          <1> 	call	WAIT_INT		; WAIT FOR THE INTERRUPT
  2547 000049EE 9C                  <1> 	pushf
  2548 000049EF E8F6030000          <1> 	call	RESULTS			; GET THE NEC STATUS
  2549 000049F4 724B                <1> 	jc	short SET_END_POP
  2550 000049F6 9D                  <1> 	popf
  2551 000049F7 723E                <1> 	jc	short SET_END		; LOOK FOR ERROR
  2552                              <1> 
  2553                              <1> ;-----	CHECK THE RESULTS RETURNED BY THE CONTROLLER
  2554                              <1> 
  2555 000049F9 FC                  <1> 	cld				; SET THE CORRECT DIRECTION
  2556 000049FA BE[11790100]        <1> 	mov	esi, NEC_STATUS		; POINT TO STATUS FIELD
  2557 000049FF AC                  <1> 	lodsb				; GET ST0
  2558 00004A00 24C0                <1> 	and	AL, 11000000B		; TEST FOR NORMAL TERMINATION
  2559 00004A02 7433                <1> 	jz	short SET_END
  2560 00004A04 3C40                <1> 	cmp	AL,01000000B		; TEST FOR ABNORMAL TERMINATION
  2561 00004A06 7527                <1> 	jnz	short J18		; NOT ABNORMAL, BAD NEC
  2562                              <1> 
  2563                              <1> ;-----	ABNORMAL TERMINATION, FIND OUT WHY
  2564                              <1> 
  2565 00004A08 AC                  <1> 	lodsb				; GET ST1
  2566 00004A09 D0E0                <1> 	sal	al, 1			; TEST FOR EDT FOUND
  2567 00004A0B B404                <1> 	mov	ah, RECORD_NOT_FND
  2568 00004A0D 7222                <1> 	jc	short J19
  2569 00004A0F C0E002              <1> 	sal	al, 2
  2570 00004A12 B410                <1> 	mov	ah, BAD_CRC
  2571 00004A14 721B                <1> 	jc	short J19
  2572 00004A16 D0E0                <1> 	sal	al, 1			; TEST FOR DMA OVERRUN
  2573 00004A18 B408                <1> 	mov	ah, BAD_DMA
  2574 00004A1A 7215                <1> 	jc	short J19
  2575 00004A1C C0E002              <1> 	sal	al, 2			; TEST FOR RECORD NOT FOUND
  2576 00004A1F B404                <1> 	mov	ah, RECORD_NOT_FND
  2577 00004A21 720E                <1> 	jc	short J19
  2578 00004A23 D0E0                <1> 	sal	al, 1
  2579 00004A25 B403                <1> 	mov	ah, WRITE_PROTECT	; TEST FOR WRITE_PROTECT
  2580 00004A27 7208                <1> 	jc	short J19
  2581 00004A29 D0E0                <1> 	sal	al, 1			; TEST MISSING ADDRESS MARK
  2582 00004A2B B402                <1> 	mov	ah, BAD_ADDR_MARK
  2583 00004A2D 7202                <1> 	jc	short J19
  2584                              <1> 
  2585                              <1> ;----- 	NEC MUST HAVE FAILED
  2586                              <1> J18:
  2587 00004A2F B420                <1> 	mov	ah, BAD_NEC
  2588                              <1> J19:
  2589 00004A31 0825[10790100]      <1> 	or	[DSKETTE_STATUS], ah
  2590                              <1> SET_END:
  2591 00004A37 803D[10790100]01    <1> 	cmp	byte [DSKETTE_STATUS], 1 ; SET ERROR CONDITION
  2592 00004A3E F5                  <1> 	cmc
  2593 00004A3F 5E                  <1> 	pop	esi
  2594 00004A40 C3                  <1> 	retn				; RESTORE HEAD #, # OF SECTORS
  2595                              <1> 
  2596                              <1> SET_END_POP:
  2597 00004A41 9D                  <1> 	popf
  2598 00004A42 EBF3                <1> 	jmp	short SET_END
  2599                              <1> 
  2600                              <1> ;-------------------------------------------------------------------------------
  2601                              <1> ; DSTATE:	ESTABLISH STATE UPON SUCCESSFUL OPERATION.
  2602                              <1> ;-------------------------------------------------------------------------------
  2603                              <1> DSTATE:
  2604 00004A44 803D[10790100]00    <1> 	cmp	byte [DSKETTE_STATUS], 0 ; CHECK FOR ERROR
  2605 00004A4B 753E                <1> 	jnz	short SETBAC		; IF ERROR JUMP
  2606 00004A4D 808F[1B790100]10    <1> 	or	byte [DSK_STATE+edi], MED_DET
  2607                              <1> 					; NO ERROR, MARK MEDIA AS DETERMINED
  2608 00004A54 F687[1B790100]04    <1> 	test	byte [DSK_STATE+edi], DRV_DET ; DRIVE DETERMINED ?
  2609 00004A5B 752E                <1> 	jnz	short SETBAC		; IF DETERMINED NO TRY TO DETERMINE
  2610 00004A5D 8A87[1B790100]      <1> 	mov	al, [DSK_STATE+edi]	; LOAD STATE
  2611 00004A63 24C0                <1> 	and	al, RATE_MSK		; KEEP ONLY RATE
  2612 00004A65 3C80                <1> 	cmp	al, RATE_250		; RATE 250 ?
  2613 00004A67 751B                <1> 	jne	short M_12		; NO, MUST BE 1.2M OR 1.44M DRIVE
  2614                              <1> 
  2615                              <1> ;----- 	CHECK IF IT IS 1.44M
  2616                              <1> 
  2617 00004A69 E846010000          <1> 	call	CMOS_TYPE		; RETURN DRIVE TYPE IN (AL)
  2618                              <1> 	;;20/02/2015
  2619                              <1> 	;;jc	short M_12		; CMOS BAD
  2620 00004A6E 7414                <1> 	jz	short M_12 ;; 20/02/2015
  2621 00004A70 3C04                <1> 	cmp	al, 4			; 1.44MB DRIVE ?
  2622 00004A72 7410                <1> 	je	short M_12		; YES
  2623                              <1> M_720:
  2624 00004A74 80A7[1B790100]FD    <1> 	and	byte [DSK_STATE+edi], ~FMT_CAPA ; TURN OFF FORMAT CAPABILITY
  2625 00004A7B 808F[1B790100]04    <1> 	or	byte [DSK_STATE+edi], DRV_DET ; MARK DRIVE DETERMINED
  2626 00004A82 EB07                <1> 	jmp	short SETBAC		; BACK
  2627                              <1> M_12:	
  2628 00004A84 808F[1B790100]06    <1> 	or	byte [DSK_STATE+edi], DRV_DET+FMT_CAPA 
  2629                              <1> 					; TURN ON DETERMINED & FMT CAPA
  2630                              <1> SETBAC:
  2631 00004A8B C3                  <1> 	retn
  2632                              <1> 
  2633                              <1> ;-------------------------------------------------------------------------------
  2634                              <1> ; RETRY	
  2635                              <1> ;	DETERMINES WHETHER A RETRY IS NECESSARY. 
  2636                              <1> ;	IF RETRY IS REQUIRED THEN STATE INFORMATION IS UPDATED FOR RETRY.
  2637                              <1> ;
  2638                              <1> ; ON EXIT:	CY = 1 FOR RETRY, CY = 0 FOR NO RETRY
  2639                              <1> ;-------------------------------------------------------------------------------
  2640                              <1> RETRY:
  2641                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  2642 00004A8C 803D[10790100]00    <1> 	cmp	byte [DSKETTE_STATUS], 0 ; GET STATUS OF OPERATION
  2643 00004A93 7445                <1> 	jz	short NO_RETRY		; SUCCESSFUL OPERATION
  2644 00004A95 803D[10790100]80    <1> 	cmp	byte [DSKETTE_STATUS], TIME_OUT ; IF TIME OUT NO RETRY
  2645 00004A9C 743C                <1> 	jz	short NO_RETRY
  2646 00004A9E 8AA7[1B790100]      <1> 	mov	ah, [DSK_STATE+edi]	; GET MEDIA STATE OF DRIVE
  2647 00004AA4 F6C410              <1> 	test	ah, MED_DET		; ESTABLISHED/DETERMINED ?
  2648 00004AA7 7531                <1> 	jnz	short NO_RETRY		; IF ESTABLISHED STATE THEN TRUE ERROR
  2649 00004AA9 80E4C0              <1> 	and	ah, RATE_MSK		; ISOLATE RATE
  2650 00004AAC 8A2D[18790100]      <1> 	mov	ch, [LASTRATE]		; GET START OPERATION STATE
  2651 00004AB2 C0C504              <1> 	rol	ch, 4			; TO CORRESPONDING BITS
  2652 00004AB5 80E5C0              <1> 	and	ch, RATE_MSK		; ISOLATE RATE BITS
  2653 00004AB8 38E5                <1> 	cmp	ch, ah			; ALL RATES TRIED
  2654 00004ABA 741E                <1> 	je	short NO_RETRY		; IF YES, THEN TRUE ERROR
  2655                              <1> 
  2656                              <1> ;	SETUP STATE INDICATOR FOR RETRY ATTEMPT TO NEXT RATE
  2657                              <1> ;	 00000000B (500) -> 10000000B	(250)
  2658                              <1> ;	 10000000B (250) -> 01000000B	(300)
  2659                              <1> ;	 01000000B (300) -> 00000000B	(500)
  2660                              <1> 
  2661 00004ABC 80FC01              <1> 	cmp	ah, RATE_500+1		; SET CY FOR RATE 500
  2662 00004ABF D0DC                <1> 	rcr	ah, 1			; TO NEXT STATE
  2663 00004AC1 80E4C0              <1> 	and	ah, RATE_MSK		; KEEP ONLY RATE BITS
  2664 00004AC4 80A7[1B790100]1F    <1> 	and	byte [DSK_STATE+edi], ~(RATE_MSK+DBL_STEP)
  2665                              <1> 					; RATE, DBL STEP OFF
  2666 00004ACB 08A7[1B790100]      <1> 	or	[DSK_STATE+edi], ah	; TURN ON NEW RATE
  2667 00004AD1 C605[10790100]00    <1> 	mov	byte [DSKETTE_STATUS], 0  ; RESET STATUS FOR RETRY
  2668 00004AD8 F9                  <1> 	stc				; SET CARRY FOR RETRY
  2669 00004AD9 C3                  <1> 	retn				; RETRY RETURN
  2670                              <1> 
  2671                              <1> NO_RETRY:
  2672                              <1> 	; 06/08/2022
  2673                              <1> 	;clc				; CLEAR CARRY NO RETRY
  2674 00004ADA C3                  <1> 	retn				; NO RETRY RETURN
  2675                              <1> 
  2676                              <1> ;-------------------------------------------------------------------------------
  2677                              <1> ; NUM_TRANS
  2678                              <1> ;	THIS ROUTINE CALCULATES THE NUMBER OF SECTORS THAT WERE
  2679                              <1> ;	ACTUALLY TRANSFERRED TO/FROM THE DISKETTE.
  2680                              <1> ;
  2681                              <1> ; ON ENTRY:	[BP+1] = TRACK
  2682                              <1> ;		SI-HI  = HEAD
  2683                              <1> ;		[BP]   = START SECTOR
  2684                              <1> ;
  2685                              <1> ; ON EXIT:	AL = NUMBER ACTUALLY TRANSFERRED
  2686                              <1> ;-------------------------------------------------------------------------------
  2687                              <1> NUM_TRANS:
  2688                              <1> 	; 10/08/2022
  2689                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  2690 00004ADB 30C0                <1> 	xor	al, al			; CLEAR FOR ERROR
  2691                              <1> 	;cmp	byte [DSKETTE_STATUS], 0
  2692 00004ADD 3805[10790100]      <1> 	cmp	[DSKETTE_STATUS], al ; 0 ; CHECK FOR ERROR
  2693 00004AE3 752D                <1> 	jnz	short NT_OUT		; IF ERROR 0 TRANSFERRED
  2694                              <1> 	;mov	dl, 4			; SECTORS/TRACK OFFSET TO DL
  2695                              <1> 	; 06/08/2022
  2696 00004AE5 B004                <1> 	mov	al, 4
  2697 00004AE7 E8D1000000          <1> 	call	GET_PARM		; AH = SECTORS/TRACK
  2698 00004AEC 8A1D[16790100]      <1> 	mov	bl, [NEC_STATUS+5]	; GET ENDING SECTOR
  2699                              <1> 	;mov	cx, si			; CH = HEAD # STARTED
  2700                              <1> 	; 06/08/2022
  2701 00004AF2 89F1                <1> 	mov	ecx, esi
  2702 00004AF4 3A2D[15790100]      <1> 	cmp	ch, [NEC_STATUS+4]	; GET HEAD ENDED UP ON
  2703 00004AFA 750E                <1> 	jnz	short DIF_HD		; IF ON SAME HEAD, THEN NO ADJUST
  2704 00004AFC 8A2D[14790100]      <1> 	mov	ch, [NEC_STATUS+3]	; GET TRACK ENDED UP ON
  2705                              <1> 	;cmp	ch, [ebp+1]		; IS IT ASKED FOR TRACK
  2706                              <1> 	; 10/08/2022
  2707 00004B02 3A6C241D            <1> 	cmp	ch, [esp+29] ; CH = TRACK #
  2708 00004B06 7404                <1> 	jz	short SAME_TRK		; IF SAME TRACK NO INCREASE
  2709 00004B08 00E3                <1> 	add	bl, ah			; ADD SECTORS/TRACK
  2710                              <1> DIF_HD:
  2711 00004B0A 00E3                <1> 	add	bl, ah			; ADD SECTORS/TRACK
  2712                              <1> SAME_TRK:
  2713                              <1> 	;sub	bl, [ebp]		; SUBTRACT START FROM END
  2714                              <1> 	; 10/08/2022
  2715 00004B0C 2A5C241C            <1> 	sub	bl, [esp+28] ; CL = SECTOR #	
  2716 00004B10 88D8                <1> 	mov	al, bl			; TO AL
  2717                              <1> NT_OUT:
  2718 00004B12 C3                  <1> 	retn
  2719                              <1> 
  2720                              <1> ;-------------------------------------------------------------------------------
  2721                              <1> ; SETUP_DBL
  2722                              <1> ;	CHECK DOUBLE STEP.
  2723                              <1> ;
  2724                              <1> ; ON ENTRY :	DI = DRIVE
  2725                              <1> ;
  2726                              <1> ; ON EXIT :	CY = 1 MEANS ERROR
  2727                              <1> ;-------------------------------------------------------------------------------
  2728                              <1> SETUP_DBL:
  2729                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  2730 00004B13 8AA7[1B790100]      <1> 	mov	ah, [DSK_STATE+edi]	; ACCESS STATE
  2731 00004B19 F6C410              <1> 	test	ah, MED_DET		; ESTABLISHED STATE ?
  2732 00004B1C 7578                <1> 	jnz	short NO_DBL		; IF ESTABLISHED THEN DOUBLE DONE
  2733                              <1> 
  2734                              <1> ;-----	CHECK FOR TRACK 0 TO SPEED UP ACKNOWLEDGE OF UNFORMATTED DISKETTE
  2735                              <1> 
  2736 00004B1E C605[0D790100]00    <1> 	mov	byte [SEEK_STATUS], 0	; SET RECALIBRATE REQUIRED ON ALL DRIVES
  2737 00004B25 E8CE000000          <1> 	call	MOTOR_ON		; ENSURE MOTOR STAY ON
  2738 00004B2A B500                <1> 	mov	ch, 0			; LOAD TRACK 0
  2739 00004B2C E8B9010000          <1> 	call	SEEK			; SEEK TO TRACK 0
  2740 00004B31 E861000000          <1> 	call	READ_ID			; READ ID FUNCTION
  2741 00004B36 7243                <1> 	jc	short SD_ERR		; IF ERROR NO TRACK 0
  2742                              <1> 
  2743                              <1> ;-----	INITIALIZE START AND MAX TRACKS (TIMES 2 FOR BOTH HEADS)
  2744                              <1> 
  2745 00004B38 66B95004            <1> 	mov	cx, 0450h 		; START, MAX TRACKS
  2746 00004B3C F687[1B790100]01    <1> 	test	byte [DSK_STATE+edi], TRK_CAPA ; TEST FOR 80 TRACK CAPABILITY
  2747 00004B43 7402                <1> 	jz	short CNT_OK		; IF NOT COUNT IS SETUP
  2748 00004B45 B1A0                <1> 	mov	cl, 0A0h		; MAXIMUM TRACK 1.2 MB
  2749                              <1> 
  2750                              <1> ;	ATTEMPT READ ID OF ALL TRACKS, ALL HEADS UNTIL SUCCESS; UPON SUCCESS,
  2751                              <1> ;	MUST SEE IF ASKED FOR TRACK IN SINGLE STEP MODE = TRACK ID READ; IF NOT
  2752                              <1> ;	THEN SET DOUBLE STEP ON.
  2753                              <1> 
  2754                              <1> CNT_OK:
  2755                              <1> 	; 11/04/2021 (32 bit push/pop)
  2756 00004B47 C605[0F790100]FF    <1>         mov     byte [MOTOR_COUNT], 0FFh ; ENSURE MOTOR STAYS ON FOR OPERATION
  2757 00004B4E 51                  <1> 	push	ecx			; SAVE TRACK, COUNT
  2758 00004B4F C605[10790100]00    <1> 	mov	byte [DSKETTE_STATUS], 0 ; CLEAR STATUS, EXPECT ERRORS
  2759                              <1> 	;xor	ax, ax			; CLEAR AX
  2760                              <1> 	; 06/08/2022
  2761 00004B56 31C0                <1> 	xor	eax, eax
  2762 00004B58 D0ED                <1> 	shr	ch, 1			; HALVE TRACK, CY = HEAD
  2763 00004B5A C0D003              <1> 	rcl	al, 3			; AX = HEAD IN CORRECT BIT
  2764 00004B5D 50                  <1> 	push	eax			; SAVE HEAD
  2765 00004B5E E887010000          <1> 	call	SEEK			; SEEK TO TRACK
  2766 00004B63 58                  <1> 	pop	eax			; RESTORE HEAD
  2767                              <1> 	;or	di, ax			; DI = HEAD OR'ED DRIVE
  2768                              <1> 	; 06/08/2022
  2769 00004B64 09C7                <1> 	or	edi, eax
  2770 00004B66 E82C000000          <1> 	call	READ_ID			; READ ID HEAD 0
  2771 00004B6B 9C                  <1> 	pushf				; SAVE RETURN FROM READ_ID
  2772 00004B6C 6681E7FB00          <1> 	and	di, 11111011b		; TURN OFF HEAD 1 BIT
  2773 00004B71 9D                  <1> 	popf				; RESTORE ERROR RETURN
  2774 00004B72 59                  <1> 	pop	ecx			; RESTORE COUNT
  2775 00004B73 7308                <1> 	jnc	short DO_CHK		; IF OK, ASKED = RETURNED TRACK ?
  2776 00004B75 FEC5                <1> 	inc	ch			; INC FOR NEXT TRACK
  2777 00004B77 38CD                <1> 	cmp	ch, cl			; REACHED MAXIMUM YET
  2778 00004B79 75CC                <1> 	jnz	short CNT_OK		; CONTINUE TILL ALL TRIED
  2779                              <1> 
  2780                              <1> ;-----	FALL THRU, READ ID FAILED FOR ALL TRACKS
  2781                              <1> 
  2782                              <1> SD_ERR:	
  2783 00004B7B F9                  <1> 	stc				; SET CARRY FOR ERROR
  2784 00004B7C C3                  <1> 	retn				; SETUP_DBL ERROR EXIT
  2785                              <1> 
  2786                              <1> DO_CHK:
  2787 00004B7D 8A0D[14790100]      <1> 	mov	cl, [NEC_STATUS+3]	; LOAD RETURNED TRACK
  2788 00004B83 888F[1D790100]      <1> 	mov	[DSK_TRK+edi], cl	; STORE TRACK NUMBER
  2789 00004B89 D0ED                <1> 	shr	ch, 1			; HALVE TRACK
  2790 00004B8B 38CD                <1> 	cmp	ch, cl			; IS IT THE SAME AS ASKED FOR TRACK
  2791 00004B8D 7407                <1> 	jz	short NO_DBL		; IF SAME THEN NO DOUBLE STEP
  2792 00004B8F 808F[1B790100]20    <1> 	or	byte [DSK_STATE+edi], DBL_STEP ; TURN ON DOUBLE STEP REQUIRED
  2793                              <1> NO_DBL:
  2794                              <1> 	; 06/08/2022
  2795                              <1> 	;clc				; CLEAR ERROR FLAG
  2796 00004B96 C3                  <1> 	retn
  2797                              <1> 
  2798                              <1> ;-------------------------------------------------------------------------------
  2799                              <1> ; READ_ID
  2800                              <1> ;	READ ID FUNCTION.
  2801                              <1> ;
  2802                              <1> ; ON ENTRY:	DI : BIT 2 = HEAD; BITS 1,0 = DRIVE
  2803                              <1> ;
  2804                              <1> ; ON EXIT: 	DI : BIT 2 IS RESET, BITS 1,0 = DRIVE
  2805                              <1> ;		@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION
  2806                              <1> ;-------------------------------------------------------------------------------
  2807                              <1> READ_ID:
  2808                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  2809 00004B97 B8[B34B0000]        <1> 	mov	eax, ER_3		; MOVE NEC OUTPUT ERROR ADDRESS
  2810 00004B9C 50                  <1> 	push	eax
  2811 00004B9D B44A                <1> 	mov	ah, 4Ah			; READ ID COMMAND
  2812 00004B9F E80F010000          <1> 	call	NEC_OUTPUT		; TO CONTROLLER
  2813                              <1> 	;mov	ax, di			; DRIVE # TO AH, HEAD 0
  2814                              <1> 	; 06/08/2022
  2815 00004BA4 89F8                <1> 	mov	eax, edi
  2816 00004BA6 88C4                <1> 	mov	ah, al
  2817 00004BA8 E806010000          <1> 	call	NEC_OUTPUT		; TO CONTROLLER
  2818 00004BAD E836FEFFFF          <1> 	call	NEC_TERM		; WAIT FOR OPERATION, GET STATUS
  2819 00004BB2 58                  <1> 	pop	eax			; THROW AWAY ERROR ADDRESS
  2820                              <1> ER_3:
  2821 00004BB3 C3                  <1> 	retn
  2822                              <1> 
  2823                              <1> ;-------------------------------------------------------------------------------
  2824                              <1> ; CMOS_TYPE
  2825                              <1> ;	RETURNS DISKETTE TYPE FROM CMOS
  2826                              <1> ;
  2827                              <1> ; ON ENTRY:	DI = DRIVE #
  2828                              <1> ;
  2829                              <1> ; ON EXIT:	AL = TYPE; CY REFLECTS STATUS
  2830                              <1> ;-------------------------------------------------------------------------------
  2831                              <1> 
  2832                              <1> CMOS_TYPE: ; 11/12/2014
  2833 00004BB4 8A87[1C660000]      <1> 	mov	al, [edi+fd0_type]
  2834 00004BBA 20C0                <1> 	and 	al, al ; 18/12/2014
  2835 00004BBC C3                  <1> 	retn
  2836                              <1> 
  2837                              <1> ;CMOS_TYPE:
  2838                              <1> ;	mov	al, CMOS_DIAG		; CMOS DIAGNOSTIC STATUS BYTE ADDRESS
  2839                              <1> ;	call	CMOS_READ		; GET CMOS STATUS
  2840                              <1> ;	test	al, BAD_BAT+BAD_CKSUM	; BATTERY GOOD AND CHECKSUM VALID
  2841                              <1> ;	stc				; SET CY = 1 INDICATING ERROR FOR RETURN
  2842                              <1> ;	jnz	short BAD_CM		; ERROR IF EITHER BIT ON
  2843                              <1> ;	mov	al, CMOS_DISKETTE	; ADDRESS OF DISKETTE BYTE IN CMOS
  2844                              <1> ;	call	CMOS_READ		; GET DISKETTE BYTE
  2845                              <1> ;	or	di, di			; SEE WHICH DRIVE IN QUESTION
  2846                              <1> ;	jnz	short TB		; IF DRIVE 1, DATA IN LOW NIBBLE
  2847                              <1> ;	ror	al, 4			; EXCHANGE NIBBLES IF SECOND DRIVE
  2848                              <1> ;TB:
  2849                              <1> ;	and	al, 0Fh			; KEEP ONLY DRIVE DATA, RESET CY, 0
  2850                              <1> ;BAD_CM:
  2851                              <1> ;	retn				; CY, STATUS OF READ
  2852                              <1> 
  2853                              <1> ;-------------------------------------------------------------------------------
  2854                              <1> ; GET_PARM
  2855                              <1> ;	THIS ROUTINE FETCHES THE INDEXED POINTER FROM THE DISK_BASE
  2856                              <1> ;	BLOCK POINTED TO BY THE DATA VARIABLE @DISK_POINTER. A BYTE FROM
  2857                              <1> ;	THAT TABLE IS THEN MOVED INTO AH, THE INDEX OF THAT BYTE BEING
  2858                              <1> ;	THE PARAMETER IN DL.
  2859                              <1> ;
  2860                              <1> ; ON ENTRY:	DL = INDEX OF BYTE TO BE FETCHED
  2861                              <1> ;
  2862                              <1> ; ON EXIT:	AH = THAT BYTE FROM BLOCK
  2863                              <1> ;		AL, DH DESTROYED
  2864                              <1> ;-------------------------------------------------------------------------------
  2865                              <1> GET_PARM:
  2866                              <1> 	; 09/08/2022
  2867                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  2868                              <1> 	; AL = INDEX
  2869                              <1> 	; EDI = (current) DRIVE #
  2870                              <1> 	;;push	ds
  2871                              <1> 	;push	esi
  2872                              <1>     	;;sub	ax, ax			; DS = 0, BIOS DATA AREA
  2873                              <1>     	;;mov	ds, ax
  2874                              <1> 	;;mov	ax, cs
  2875                              <1> 	;;mov	ds, ax
  2876                              <1> 	; 08/02/2015 (protected mode modifications, bx -> ebx)
  2877                              <1> 	;xchg	edx, ebx		; BL = INDEX
  2878                              <1> 	; 06/08/2022
  2879 00004BBD 53                  <1> 	push	ebx			; SAVE EBX	
  2880                              <1> 	;movzx	ebx, dl			; EBX = INDEX
  2881 00004BBE 0FB6D8              <1> 	movzx	ebx, al ; 06/08/2022
  2882                              <1> 	;;sub	bh, bh			; BX = INDEX
  2883                              <1> 	;and	ebx, 0FFh
  2884                              <1>     	;;lds	si, [DISK_POINTER]	; POINT TO BLOCK
  2885                              <1> 	;
  2886                              <1> 	; 17/12/2014
  2887                              <1> 	;mov	ax, [cfd]		; current (AL) and previous fd (AH)
  2888                              <1> 	; 06/08/2022
  2889 00004BC1 89F8                <1> 	mov	eax, edi		; EDI = DRIVE #
  2890                              <1> 	;cmp	al, ah
  2891 00004BC3 3A05[0D660000]      <1> 	cmp	al, [pfd]	
  2892 00004BC9 7423                <1> 	je	short gpndc
  2893 00004BCB A2[0D660000]        <1> 	mov	[pfd], al		; current drive -> previous drive
  2894 00004BD0 53                  <1> 	push	ebx ; 08/02/2015
  2895                              <1> 	;mov	bl, al 
  2896                              <1> 	;; 11/12/2014
  2897                              <1> 	;mov	al, [ebx+fd0_type]	; Drive type (0,1,2,3,4)
  2898                              <1> 	; 09/08/2022
  2899 00004BD1 8A87[1C660000]      <1> 	mov	al, [edi+fd0_type]	; Drive type (0,1,2,3,4)
  2900                              <1> 	; 18/12/2014
  2901 00004BD7 20C0                <1> 	and	al, al
  2902 00004BD9 7507                <1> 	jnz	short gpdtc
  2903 00004BDB BB[F7650000]        <1> 	mov	ebx, MD_TBL6		; 1.44 MB param. tbl. (default)
  2904 00004BE0 EB05                <1>         jmp     short gpdpu
  2905                              <1> gpdtc:	
  2906 00004BE2 E809FBFFFF          <1> 	call	DR_TYPE_CHECK
  2907                              <1> 	; cf = 1 -> ebx points to 1.44MB fd parameter table (default)
  2908                              <1> gpdpu:
  2909 00004BE7 891D[94650000]      <1> 	mov	[DISK_POINTER], ebx
  2910 00004BED 5B                  <1> 	pop	ebx
  2911                              <1> gpndc:
  2912                              <1> 	;mov	esi, [DISK_POINTER] ; 08/02/2015, si -> esi
  2913                              <1> 	; 06/08/2022
  2914 00004BEE 031D[94650000]      <1> 	add	ebx, [DISK_POINTER]
  2915                              <1> 	;mov	ah, [esi+ebx]		; GET THE WORD
  2916 00004BF4 8A23                <1> 	mov	ah, [ebx]
  2917                              <1> 	;xchg	edx, ebx		; RESTORE BX
  2918                              <1> 	; 06/08/2022
  2919 00004BF6 5B                  <1> 	pop	ebx			; RESTORE EBX
  2920                              <1> 	;pop	esi
  2921                              <1> 	;;pop	ds
  2922 00004BF7 C3                  <1> 	retn
  2923                              <1> 
  2924                              <1> ;-------------------------------------------------------------------------------
  2925                              <1> ; MOTOR_ON
  2926                              <1> ;	TURN MOTOR ON AND WAIT FOR MOTOR START UP TIME. THE @MOTOR_COUNT
  2927                              <1> ;	IS REPLACED WITH A SUFFICIENTLY HIGH NUMBER (0FFH) TO ENSURE
  2928                              <1> ;	THAT THE MOTOR DOES NOT GO OFF DURING THE OPERATION. IF THE
  2929                              <1> ;	MOTOR NEEDED TO BE TURNED ON, THE MULTI-TASKING HOOK FUNCTION
  2930                              <1> ;	(AX=90FDH, INT 15) IS CALLED TELLING THE OPERATING SYSTEM
  2931                              <1> ;	THAT THE BIOS IS ABOUT TO WAIT FOR MOTOR START UP. IF THIS
  2932                              <1> ;	FUNCTION RETURNS WITH CY = 1, IT MEANS THAT THE MINIMUM WAIT
  2933                              <1> ;	HAS BEEN COMPLETED. AT THIS POINT A CHECK IS MADE TO ENSURE
  2934                              <1> ;	THAT THE MOTOR WASN'T TURNED OFF BY THE TIMER. IF THE HOOK DID
  2935                              <1> ;	NOT WAIT, THE WAIT FUNCTION (AH=086H) IS CALLED TO WAIT THE
  2936                              <1> ;	PRESCRIBED AMOUNT OF TIME. IF THE CARRY FLAG IS SET ON RETURN,
  2937                              <1> ;	IT MEANS THAT THE FUNCTION IS IN USE AND DID NOT PERFORM THE
  2938                              <1> ;	WAIT. A TIMER 1 WAIT LOOP WILL THEN DO THE WAIT.
  2939                              <1> ;
  2940                              <1> ; ON ENTRY:	DI = DRIVE #
  2941                              <1> ; ON EXIT:	AX,CX,DX DESTROYED
  2942                              <1> ;-------------------------------------------------------------------------------
  2943                              <1> MOTOR_ON:
  2944                              <1> 	; 06/08/2022 - TRDOS 386 Kernel v2.0.5
  2945 00004BF8 53                  <1> 	push	ebx			; SAVE REG.
  2946 00004BF9 E825000000          <1> 	call	TURN_ON			; TURN ON MOTOR
  2947 00004BFE 7221                <1> 	jc	short MOT_IS_ON		; IF CY=1 NO WAIT
  2948                              <1> 	; 06/08/2022
  2949                              <1> 	;call	XLAT_OLD		; TRANSLATE STATE TO COMPATIBLE MODE
  2950 00004C00 E851FBFFFF          <1> 	call	XLAT_NEW		; TRANSLATE STATE TO PRESENT ARCH,
  2951                              <1> 	;call	TURN_ON 		; CHECK AGAIN IF MOTOR ON
  2952                              <1> 	;jc	short MOT_IS_ON		; IF NO WAIT MEANS IT IS ON
  2953                              <1> M_WAIT:
  2954                              <1> 	;mov	dl, 10			; GET THE MOTOR WAIT PARAMETER
  2955                              <1> 	; 06/08/2022
  2956 00004C05 B00A                <1> 	mov	al, 10
  2957 00004C07 E8B1FFFFFF          <1> 	call	GET_PARM
  2958                              <1> 	;mov	al, ah			; AL = MOTOR WAIT PARAMETER
  2959                              <1> 	;xor	ah, ah			; AX = MOTOR WAIT PARAMETER
  2960                              <1> 	;cmp	al, 8			; SEE IF AT LEAST A SECOND IS SPECIFIED
  2961 00004C0C 80FC08              <1> 	cmp	ah, 8
  2962                              <1> 	;jae	short GP2		; IF YES, CONTINUE
  2963 00004C0F 7702                <1> 	ja	short J13
  2964                              <1> 	;mov	al, 8			; ONE SECOND WAIT FOR MOTOR START UP
  2965 00004C11 B408                <1> 	mov	ah, 8
  2966                              <1> 
  2967                              <1> ;-----	AS CONTAINS NUMBER OF 1/8 SECONDS (125000 MICROSECONDS) TO WAIT
  2968                              <1> GP2:	
  2969                              <1> ;----- 	FOLLOWING LOOPS REQUIRED WHEN RTC WAIT FUNCTION IS ALREADY IN USE
  2970                              <1> J13:					; WAIT FOR 1/8 SECOND PER (AL)
  2971                              <1> 	;mov	ecx, 8286		; COUNT FOR 1/8 SECOND AT 15.085737 US
  2972                              <1> 	; 11/04/2021
  2973 00004C13 B947100000          <1> 	mov	ecx, 4167 ; count of 30 micro seconds * (1/8) 
  2974 00004C18 E8B5D7FFFF          <1> 	call	WAITF			; GO TO FIXED WAIT ROUTINE
  2975                              <1> 	;dec	al			; DECREMENT TIME VALUE
  2976 00004C1D FECC                <1> 	dec	ah
  2977 00004C1F 75F2                <1> 	jnz	short J13		; ARE WE DONE YET
  2978                              <1> MOT_IS_ON:
  2979 00004C21 5B                  <1> 	pop	ebx			; RESTORE REG.
  2980 00004C22 C3                  <1> 	retn
  2981                              <1> 
  2982                              <1> ;-------------------------------------------------------------------------------
  2983                              <1> ; TURN_ON
  2984                              <1> ;	TURN MOTOR ON AND RETURN WAIT STATE.
  2985                              <1> ;
  2986                              <1> ; ON ENTRY:	DI = DRIVE #
  2987                              <1> ;
  2988                              <1> ; ON EXIT:	CY = 0 MEANS WAIT REQUIRED
  2989                              <1> ;		CY = 1 MEANS NO WAIT REQUIRED
  2990                              <1> ;		AX,BX,CX,DX DESTROYED
  2991                              <1> ;-------------------------------------------------------------------------------
  2992                              <1> TURN_ON:
  2993 00004C23 89FB                <1> 	mov	ebx, edi		; BX = DRIVE #
  2994 00004C25 88D9                <1> 	mov	cl, bl			; CL = DRIVE #
  2995 00004C27 C0C304              <1> 	rol	bl, 4			; BL = DRIVE SELECT
  2996 00004C2A FA                  <1> 	cli				; NO INTERRUPTS WHILE DETERMINING STATUS
  2997 00004C2B C605[0F790100]FF    <1> 	mov	byte [MOTOR_COUNT], 0FFh ; ENSURE MOTOR STAYS ON FOR OPERATION
  2998 00004C32 A0[0E790100]        <1> 	mov	al, [MOTOR_STATUS]	; GET DIGITAL OUTPUT REGISTER REFLECTION
  2999 00004C37 2430                <1> 	and	al, 00110000b		; KEEP ONLY DRIVE SELECT BITS
  3000 00004C39 B401                <1> 	mov	ah, 1			; MASK FOR DETERMINING MOTOR BIT
  3001 00004C3B D2E4                <1> 	shl	ah, cl			; AH = MOTOR ON, A=00000001, B=00000010
  3002                              <1> 
  3003                              <1> ;  AL = DRIVE SELECT FROM @MOTOR_STATUS
  3004                              <1> ;  BL = DRIVE SELECT DESIRED
  3005                              <1> ;  AH = MOTOR ON MASK DESIRED
  3006                              <1> 
  3007 00004C3D 38D8                <1> 	cmp	al, bl			; REQUESTED DRIVE ALREADY SELECTED ?
  3008 00004C3F 7508                <1> 	jnz	short TURN_IT_ON	; IF NOT SELECTED JUMP
  3009 00004C41 8425[0E790100]      <1> 	test	ah, [MOTOR_STATUS]	; TEST MOTOR ON BIT
  3010 00004C47 7535                <1> 	jnz	short NO_MOT_WAIT	; JUMP IF MOTOR ON AND SELECTED
  3011                              <1> 
  3012                              <1> TURN_IT_ON:
  3013 00004C49 08DC                <1> 	or	ah, bl			; AH = DRIVE SELECT AND MOTOR ON
  3014 00004C4B 8A3D[0E790100]      <1> 	mov	bh, [MOTOR_STATUS]	; SAVE COPY OF @MOTOR_STATUS BEFORE
  3015 00004C51 80E70F              <1> 	and	bh, 00001111b		; KEEP ONLY MOTOR BITS
  3016 00004C54 8025[0E790100]CF    <1> 	and	byte [MOTOR_STATUS], 11001111b ; CLEAR OUT DRIVE SELECT
  3017 00004C5B 0825[0E790100]      <1> 	or	[MOTOR_STATUS], ah	; OR IN DRIVE SELECTED AND MOTOR ON
  3018 00004C61 A0[0E790100]        <1> 	mov	al, [MOTOR_STATUS]	; GET DIGITAL OUTPUT REGISTER REFLECTION
  3019 00004C66 88C3                <1> 	mov	bl, al			; BL=@MOTOR_STATUS AFTER, BH=BEFORE
  3020 00004C68 80E30F              <1> 	and	bl, 00001111b		; KEEP ONLY MOTOR BITS
  3021 00004C6B FB                  <1> 	sti				; ENABLE INTERRUPTS AGAIN
  3022 00004C6C 243F                <1> 	and	al, 00111111b		; STRIP AWAY UNWANTED BITS
  3023 00004C6E C0C004              <1> 	rol	al, 4			; PUT BITS IN DESIRED POSITIONS
  3024 00004C71 0C0C                <1> 	or	al, 00001100b		; NO RESET, ENABLE DMA/INTERRUPT
  3025 00004C73 66BAF203            <1> 	mov	dx, 03F2h		; SELECT DRIVE AND TURN ON MOTOR
  3026 00004C77 EE                  <1> 	out	dx, al
  3027 00004C78 38FB                <1> 	cmp	bl, bh			; NEW MOTOR TURNED ON ?
  3028                              <1> 	;jz	short NO_MOT_WAIT	; NO WAIT REQUIRED IF JUST SELECT
  3029 00004C7A 7403                <1> 	je	short no_mot_w1 ; 27/02/2015 
  3030 00004C7C F8                  <1> 	clc				; (re)SET CARRY MEANING WAIT
  3031 00004C7D C3                  <1> 	retn
  3032                              <1> 
  3033                              <1> NO_MOT_WAIT:
  3034 00004C7E FB                  <1> 	sti
  3035                              <1> no_mot_w1: ; 27/02/2015
  3036 00004C7F F9                  <1> 	stc				; SET NO WAIT REQUIRED
  3037                              <1> 	;sti				; INTERRUPTS BACK ON
  3038 00004C80 C3                  <1> 	retn
  3039                              <1> 
  3040                              <1> ;-------------------------------------------------------------------------------
  3041                              <1> ; HD_WAIT
  3042                              <1> ;	WAIT FOR HEAD SETTLE TIME.
  3043                              <1> ;
  3044                              <1> ; ON ENTRY:	DI = DRIVE #
  3045                              <1> ;
  3046                              <1> ; ON EXIT:	AX,BX,CX,DX DESTROYED
  3047                              <1> ;-------------------------------------------------------------------------------
  3048                              <1> HD_WAIT:
  3049                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  3050                              <1> 	;mov	dl,9			; GET HEAD SETTLE PARAMETER
  3051                              <1> 	; 06/08/2022
  3052 00004C81 B009                <1> 	mov	al, 9
  3053 00004C83 E835FFFFFF          <1> 	call	GET_PARM
  3054 00004C88 08E4                <1> 	or	ah, ah	; 17/12/2014
  3055 00004C8A 7519                <1> 	jnz	short DO_WAT
  3056 00004C8C F605[0E790100]80    <1>         test    byte [MOTOR_STATUS], 10000000b ; SEE IF A WRITE OPERATION
  3057                              <1> 	;jz	short ISNT_WRITE	; IF NOT, DO NOT ENFORCE ANY VALUES
  3058                              <1> 	;or	ah, ah			; CHECK FOR ANY WAIT?
  3059                              <1> 	;jnz	short DO_WAT		; IF THERE DO NOT ENFORCE
  3060 00004C93 741D                <1> 	jz	short HW_DONE
  3061 00004C95 B40F                <1> 	mov	ah, HD12_SETTLE		; LOAD 1.2M HEAD SETTLE MINIMUM
  3062 00004C97 8A87[1B790100]      <1> 	mov	al, [DSK_STATE+edi]	; LOAD STATE
  3063 00004C9D 24C0                <1> 	and	al, RATE_MSK		; KEEP ONLY RATE
  3064 00004C9F 3C80                <1> 	cmp	al, RATE_250		; 1.2 M DRIVE ?
  3065 00004CA1 7502                <1> 	jnz	short DO_WAT		; DEFAULT HEAD SETTLE LOADED
  3066                              <1> ;GP3:
  3067 00004CA3 B414                <1> 	mov	ah, HD320_SETTLE	; USE 320/360 HEAD SETTLE
  3068                              <1> ;	jmp	short DO_WAT
  3069                              <1> 
  3070                              <1> ;ISNT_WRITE:
  3071                              <1> ;	or	ah, ah			; CHECK FOR NO WAIT
  3072                              <1> ;	jz	short HW_DONE		; IF NOT WRITE AND 0 ITS OK
  3073                              <1> 
  3074                              <1> ;-----	AH CONTAINS NUMBER OF MILLISECONDS TO WAIT
  3075                              <1> DO_WAT:
  3076                              <1> ;	mov	al, ah			; AL = # MILLISECONDS
  3077                              <1> ;	;xor	ah, ah			; AX = # MILLISECONDS
  3078                              <1> J29:					; 	1 MILLISECOND LOOP
  3079                              <1> 	;;mov	cx, WAIT_FDU_HEAD_SETTLE ; 33 ; 1 ms in 30 micro units.
  3080                              <1> 	;mov	ecx, 66			; COUNT AT 15.085737 US PER COUNT
  3081                              <1> 	; 11/04/2021
  3082                              <1> 	;mov	ecx, WAIT_FDU_HEAD_SETTLE ; 33
  3083                              <1> 	; 06/08/2022
  3084 00004CA5 29C9                <1> 	sub	ecx, ecx
  3085 00004CA7 B121                <1> 	mov	cl, WAIT_FDU_HEAD_SETTLE ; 33
  3086 00004CA9 E824D7FFFF          <1> 	call	WAITF			; DELAY FOR 1 MILLISECOND
  3087                              <1> 	;dec	al			; DECREMENT THE COUNT
  3088 00004CAE FECC                <1> 	dec	ah
  3089 00004CB0 75F3                <1> 	jnz	short J29		; DO AL MILLISECOND # OF TIMES
  3090                              <1> HW_DONE:
  3091 00004CB2 C3                  <1> 	retn
  3092                              <1> 
  3093                              <1> ;-------------------------------------------------------------------------------
  3094                              <1> ; NEC_OUTPUT
  3095                              <1> ;	THIS ROUTINE SENDS A BYTE TO THE NEC CONTROLLER AFTER TESTING
  3096                              <1> ;	FOR CORRECT DIRECTION AND CONTROLLER READY THIS ROUTINE WILL
  3097                              <1> ;	TIME OUT IF THE BYTE IS NOT ACCEPTED WITHIN A REASONABLE AMOUNT
  3098                              <1> ;	OF TIME, SETTING THE DISKETTE STATUS ON COMPLETION.
  3099                              <1> ; 
  3100                              <1> ; ON ENTRY: 	AH = BYTE TO BE OUTPUT
  3101                              <1> ;
  3102                              <1> ; ON EXIT:	CY = 0  SUCCESS
  3103                              <1> ;		CY = 1  FAILURE -- DISKETTE STATUS UPDATED
  3104                              <1> ;		        IF A FAILURE HAS OCCURRED, THE RETURN IS MADE ONE LEVEL
  3105                              <1> ;		        HIGHER THAN THE CALLER OF NEC OUTPUT. THIS REMOVES THE
  3106                              <1> ;		        REQUIREMENT OF TESTING AFTER EVERY CALL OF NEC_OUTPUT.
  3107                              <1> ;		AX,CX,DX DESTROYED
  3108                              <1> ;-------------------------------------------------------------------------------
  3109                              <1> 
  3110                              <1> ; 09/12/2014 [Erdogan Tan] 
  3111                              <1> ;	(from 'PS2 Hardware Interface Tech. Ref. May 88', Page 09-05.)
  3112                              <1> ; Diskette Drive Controller Status Register (3F4h)
  3113                              <1> ;	This read only register facilitates the transfer of data between
  3114                              <1> ;	the system microprocessor and the controller.
  3115                              <1> ; Bit 7 - When set to 1, the Data register is ready to transfer data 
  3116                              <1> ;	  with the system micrprocessor.
  3117                              <1> ; Bit 6 - The direction of data transfer. If this bit is set to 0,
  3118                              <1> ;	  the transfer is to the controller.
  3119                              <1> ; Bit 5 - When this bit is set to 1, the controller is in the non-DMA mode.
  3120                              <1> ; Bit 4 - When this bit is set to 1, a Read or Write command is being executed.
  3121                              <1> ; Bit 3 - Reserved.
  3122                              <1> ; Bit 2 - Reserved.
  3123                              <1> ; Bit 1 - When this bit is set to 1, dskette drive 1 is in the seek mode.
  3124                              <1> ; Bit 0 - When this bit is set to 1, dskette drive 1 is in the seek mode.
  3125                              <1> 
  3126                              <1> ; Data Register (3F5h)
  3127                              <1> ; This read/write register passes data, commands and parameters, and provides
  3128                              <1> ; diskette status information.
  3129                              <1>   		
  3130                              <1> NEC_OUTPUT:
  3131                              <1> 	; 09/08/2022
  3132                              <1> 	; 06/08/2022 - TRDOS 386 Kernel v2.0.5
  3133                              <1> 	;
  3134                              <1> 	;push	bx			; SAVE REG.
  3135 00004CB3 66BAF403            <1> 	mov	dx, 03F4h		; STATUS PORT
  3136                              <1> 	;mov	bl,2			; HIGH ORDER COUNTER
  3137                              <1> 	;xor	cx, cx			; COUNT FOR TIME OUT
  3138                              <1> 	; 16/12/2014
  3139                              <1> 	; waiting for (max.) 0.5 seconds
  3140                              <1>         ;;mov	byte [wait_count], 0 ;; 27/02/2015
  3141                              <1> 	;
  3142                              <1> 	; 17/12/2014
  3143                              <1> 	; Modified from AWARD BIOS 1999 - ADISK.ASM - SEND_COMMAND
  3144                              <1> 	;
  3145                              <1> 	;WAIT_FOR_PORT:	Waits for a bit at a port pointed to by DX to
  3146                              <1> 	;		go on.
  3147                              <1> 	;INPUT:
  3148                              <1> 	;	AH=Mask for isolation bits.
  3149                              <1> 	;	AL=pattern to look for.
  3150                              <1> 	;	DX=Port to test for
  3151                              <1> 	;	BH:CX=Number of memory refresh periods to delay.
  3152                              <1> 	;	     (normally 30 microseconds per period.)
  3153                              <1> 	;
  3154                              <1> 	;WFP_SHORT:  
  3155                              <1> 	;	Wait for port if refresh cycle is short (15-80 Us range).
  3156                              <1> 	;
  3157                              <1> 
  3158                              <1> ;	mov	bl, WAIT_FDU_SEND_HI+1	; 0+1
  3159                              <1> ;	mov	cx, WAIT_FDU_SEND_LO	; 16667
  3160 00004CB7 B91B410000          <1> 	mov	ecx, WAIT_FDU_SEND_LH   ; 16667 (27/02/2015)
  3161                              <1> ;
  3162                              <1> ;WFPS_OUTER_LP:
  3163                              <1> ;	;
  3164                              <1> ;WFPS_CHECK_PORT:
  3165                              <1> J23:
  3166 00004CBC EC                  <1> 	in	al, dx			; GET STATUS
  3167 00004CBD 24C0                <1> 	and	al, 11000000b		; KEEP STATUS AND DIRECTION
  3168 00004CBF 3C80                <1> 	cmp	al, 10000000b		; STATUS 1 AND DIRECTION 0 ?
  3169 00004CC1 7418                <1> 	jz	short J27		; STATUS AND DIRECTION OK
  3170                              <1> WFPS_HI:
  3171 00004CC3 E461                <1> 	in	al, PORT_B  ; 061h	; SYS1	; wait for hi to lo
  3172 00004CC5 A810                <1> 	test	al, 010h		; transition on memory
  3173 00004CC7 75FA                <1> 	jnz	short WFPS_HI		; refresh.
  3174                              <1> WFPS_LO:
  3175 00004CC9 E461                <1> 	in	al, PORT_B		; SYS1
  3176 00004CCB A810                <1> 	test	al, 010h
  3177 00004CCD 74FA                <1> 	jz	short WFPS_LO
  3178                              <1> 	;loop	short WFPS_CHECK_PORT
  3179 00004CCF E2EB                <1> 	loop	J23	; 27/02/2015
  3180                              <1> ;	;
  3181                              <1> ;	dec	bl
  3182                              <1> ;	jnz	short WFPS_OUTER_LP
  3183                              <1> ;	jmp	short WFPS_TIMEOUT	; fail
  3184                              <1> ;J23:
  3185                              <1> ;	in	al, dx			; GET STATUS
  3186                              <1> ;	and	al, 11000000b		; KEEP STATUS AND DIRECTION
  3187                              <1> ;	cmp	al, 10000000b		; STATUS 1 AND DIRECTION 0 ?
  3188                              <1> ;	jz	short J27		; STATUS AND DIRECTION OK
  3189                              <1> 	;loop	J23			; CONTINUE TILL CX EXHAUSTED
  3190                              <1> 	;dec	bl			; DECREMENT COUNTER
  3191                              <1> 	;jnz	short J23		; REPEAT TILL DELAY FINISHED, CX = 0
  3192                              <1>    
  3193                              <1> 	;;27/02/2015
  3194                              <1> 	;16/12/2014
  3195                              <1>         ;;cmp	byte [wait_count], 10   ; (10/18.2 seconds)
  3196                              <1> 	;;jb	short J23
  3197                              <1> 
  3198                              <1> ;WFPS_TIMEOUT:
  3199                              <1> 
  3200                              <1> ;-----	FALL THRU TO ERROR RETURN
  3201                              <1> 
  3202 00004CD1 800D[10790100]80    <1> 	or	byte [DSKETTE_STATUS], TIME_OUT
  3203                              <1> 	;pop	bx			; RESTORE REG.
  3204 00004CD8 58                  <1> 	pop	eax ; 08/02/2015	; DISCARD THE RETURN ADDRESS
  3205 00004CD9 F9                  <1> 	stc				; INDICATE ERROR TO CALLER
  3206 00004CDA C3                  <1> 	retn
  3207                              <1> 
  3208                              <1> ;-----	DIRECTION AND STATUS OK; OUTPUT BYTE
  3209                              <1> 
  3210                              <1> J27:	
  3211 00004CDB 88E0                <1> 	mov	al, ah			; GET BYTE TO OUTPUT
  3212                              <1> 	;inc	dx			; DATA PORT = STATUS PORT + 1
  3213                              <1> 	; 06/08/2022
  3214 00004CDD FEC2                <1> 	inc	dl
  3215 00004CDF EE                  <1> 	out	dx, al			; OUTPUT THE BYTE
  3216                              <1> 	;;NEWIODELAY  ;; 27/02/2015
  3217                              <1> 	; 27/02/2015
  3218                              <1> 	;pushf				; SAVE FLAGS
  3219                              <1> 	; 09/08/2022
  3220                              <1> 	; cf = 0, zf = 1
  3221                              <1> 	;mov	ecx, 3			; 30 TO 45 MICROSECONDS WAIT FOR
  3222                              <1> 	; 11/04/2021
  3223                              <1> 	;mov	ecx, 2 
  3224                              <1> 	; 06/08/2022
  3225 00004CE0 29C9                <1> 	sub	ecx, ecx
  3226 00004CE2 B102                <1> 	mov	cl, 2
  3227 00004CE4 E8E9D6FFFF          <1> 	call 	WAITF			; NEC FLAGS UPDATE CYCLE
  3228                              <1> 	; 09/08/2022
  3229                              <1> 	; cf = 0, zf = 1
  3230                              <1> 	;popf				; RESTORE FLAGS FOR EXIT
  3231                              <1> 	;pop	bx			; RESTORE REG
  3232 00004CE9 C3                  <1> 	retn				; CY = 0 FROM TEST INSTRUCTION
  3233                              <1> 
  3234                              <1> ;-------------------------------------------------------------------------------
  3235                              <1> ; SEEK
  3236                              <1> ;	THIS ROUTINE WILL MOVE THE HEAD ON THE NAMED DRIVE TO THE NAMED
  3237                              <1> ;	TRACK. IF THE DRIVE HAS NOT BEEN ACCESSED SINCE THE DRIVE
  3238                              <1> ;	RESET COMMAND WAS ISSUED, THE DRIVE WILL BE RECALIBRATED.
  3239                              <1> ;
  3240                              <1> ; ON ENTRY:	DI = DRIVE #
  3241                              <1> ;		CH = TRACK #
  3242                              <1> ;
  3243                              <1> ; ON EXIT:	@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION.
  3244                              <1> ;		AX,BX,CX DX DESTROYED
  3245                              <1> ;-------------------------------------------------------------------------------
  3246                              <1> SEEK:
  3247 00004CEA 89FB                <1> 	mov	ebx, edi		; BX = DRIVE #
  3248 00004CEC B001                <1> 	mov	al, 1			; ESTABLISH MASK FOR RECALIBRATE TEST
  3249                              <1> 	; 06/08/2022
  3250                              <1> 	;xchg	cl, bl			; SET DRIVE VALUE INTO CL
  3251                              <1> 	;rol	al, cl			; SHIFT MASK BY THE DRIVE VALUE
  3252                              <1> 	;xchg	cl, bl			; RECOVER TRACK VALUE
  3253                              <1> 	; 06/08/2022
  3254 00004CEE 84C3                <1> 	test	bl, al ; test bl, 1
  3255 00004CF0 7402                <1> 	jz	short seek_0
  3256 00004CF2 FEC0                <1> 	inc	al ; shl al, 1
  3257                              <1> seek_0:
  3258 00004CF4 8405[0D790100]      <1> 	test	al, [SEEK_STATUS]	; TEST FOR RECALIBRATE REQUIRED
  3259 00004CFA 7526                <1> 	jnz	short J28A		; JUMP IF RECALIBRATE NOT REQUIRED
  3260                              <1> 
  3261 00004CFC 0805[0D790100]      <1> 	or	[SEEK_STATUS], al	; TURN ON THE NO RECALIBRATE BIT IN FLAG
  3262 00004D02 E862000000          <1> 	call	RECAL			; RECALIBRATE DRIVE
  3263 00004D07 730E                <1> 	jnc	short AFT_RECAL		; RECALIBRATE DONE
  3264                              <1> 
  3265                              <1> ;-----	ISSUE RECALIBRATE FOR 80 TRACK DISKETTES
  3266                              <1> 
  3267 00004D09 C605[10790100]00    <1> 	mov	byte [DSKETTE_STATUS], 0 ; CLEAR OUT INVALID STATUS
  3268 00004D10 E854000000          <1> 	call	RECAL			; RECALIBRATE DRIVE
  3269 00004D15 7251                <1> 	jc	short RB		; IF RECALIBRATE FAILS TWICE THEN ERROR
  3270                              <1> 
  3271                              <1> AFT_RECAL:
  3272 00004D17 C687[1D790100]00    <1>         mov     byte [DSK_TRK+edi], 0	; SAVE NEW CYLINDER AS PRESENT POSITION
  3273 00004D1E 08ED                <1> 	or	ch, ch			; CHECK FOR SEEK TO TRACK 0
  3274 00004D20 743F                <1> 	jz	short DO_WAIT		; HEAD SETTLE, CY = 0 IF JUMP
  3275                              <1> 
  3276                              <1> ;-----	DRIVE IS IN SYNCHRONIZATION WITH CONTROLLER, SEEK TO TRACK
  3277                              <1> 
  3278 00004D22 F687[1B790100]20    <1> J28A:	test	byte [DSK_STATE+edi], DBL_STEP ; CHECK FOR DOUBLE STEP REQUIRED
  3279 00004D29 7402                <1> 	jz	short _R7		; SINGLE STEP REQUIRED BYPASS DOUBLE
  3280 00004D2B D0E5                <1> 	shl	ch, 1			; DOUBLE NUMBER OF STEP TO TAKE
  3281                              <1> 
  3282 00004D2D 3AAF[1D790100]      <1> _R7:	cmp	ch, [DSK_TRK+edi]	; SEE IF ALREADY AT THE DESIRED TRACK
  3283 00004D33 7433                <1> 	je	short RB		; IF YES, DO NOT NEED TO SEEK
  3284                              <1> 
  3285 00004D35 BA[684D0000]        <1> 	mov	edx, NEC_ERR		; LOAD RETURN ADDRESS
  3286 00004D3A 52                  <1> 	push	edx ; (*)		; ON STACK FOR NEC OUTPUT ERROR
  3287 00004D3B 88AF[1D790100]      <1> 	mov	[DSK_TRK+edi], ch	; SAVE NEW CYLINDER AS PRESENT POSITION
  3288 00004D41 B40F                <1> 	mov	ah, 0Fh			; SEEK COMMAND TO NEC
  3289 00004D43 E86BFFFFFF          <1> 	call	NEC_OUTPUT
  3290 00004D48 89FB                <1> 	mov	ebx, edi		; BX = DRIVE #
  3291 00004D4A 88DC                <1> 	mov	ah, bl			; OUTPUT DRIVE NUMBER
  3292 00004D4C E862FFFFFF          <1> 	call	NEC_OUTPUT
  3293 00004D51 8AA7[1D790100]      <1> 	mov	ah, [DSK_TRK+edi]	; GET CYLINDER NUMBER
  3294 00004D57 E857FFFFFF          <1> 	call	NEC_OUTPUT
  3295 00004D5C E827000000          <1> 	call	CHK_STAT_2		; ENDING INTERRUPT AND SENSE STATUS
  3296                              <1> 
  3297                              <1> ;-----	WAIT FOR HEAD SETTLE
  3298                              <1> 
  3299                              <1> DO_WAIT:
  3300 00004D61 9C                  <1> 	pushf				; SAVE STATUS
  3301 00004D62 E81AFFFFFF          <1> 	call	HD_WAIT			; WAIT FOR HEAD SETTLE TIME
  3302 00004D67 9D                  <1> 	popf				; RESTORE STATUS
  3303                              <1> RB:
  3304                              <1> NEC_ERR:
  3305                              <1> 	; 08/02/2015 (code trick here from original IBM PC/AT DISKETTE.ASM)
  3306                              <1> 	; (*) nec_err -> retn (push edx -> pop edx) -> nec_err -> retn
  3307 00004D68 C3                  <1> 	retn				; RETURN TO CALLER
  3308                              <1> 
  3309                              <1> ;-------------------------------------------------------------------------------
  3310                              <1> ; RECAL
  3311                              <1> ;	RECALIBRATE DRIVE
  3312                              <1> ;
  3313                              <1> ; ON ENTRY:	DI = DRIVE #
  3314                              <1> ;
  3315                              <1> ; ON EXIT:	CY REFLECTS STATUS OF OPERATION.
  3316                              <1> ;-------------------------------------------------------------------------------
  3317                              <1> RECAL:
  3318                              <1> 	;push	cx
  3319                              <1> 	; 11/04/2021
  3320 00004D69 51                  <1> 	push	ecx
  3321 00004D6A B8[864D0000]        <1> 	mov	eax, RC_BACK		; LOAD NEC_OUTPUT ERROR
  3322 00004D6F 50                  <1> 	push	eax
  3323 00004D70 B407                <1> 	mov	ah, 07h			; RECALIBRATE COMMAND
  3324 00004D72 E83CFFFFFF          <1> 	call	NEC_OUTPUT
  3325 00004D77 89FB                <1> 	mov	ebx, edi		; BX = DRIVE #
  3326 00004D79 88DC                <1> 	mov	ah, bl
  3327 00004D7B E833FFFFFF          <1> 	call	NEC_OUTPUT		; OUTPUT THE DRIVE NUMBER
  3328 00004D80 E803000000          <1> 	call	CHK_STAT_2		; GET THE INTERRUPT AND SENSE INT STATUS
  3329 00004D85 58                  <1> 	pop	eax			; THROW AWAY ERROR
  3330                              <1> RC_BACK:
  3331                              <1> 	;pop	cx
  3332                              <1> 	; 11/04/2021
  3333 00004D86 59                  <1> 	pop	ecx
  3334 00004D87 C3                  <1> 	retn
  3335                              <1> 
  3336                              <1> ;-------------------------------------------------------------------------------
  3337                              <1> ; CHK_STAT_2
  3338                              <1> ;	THIS ROUTINE HANDLES THE INTERRUPT RECEIVED AFTER RECALIBRATE,
  3339                              <1> ;	OR SEEK TO THE ADAPTER. THE INTERRUPT IS WAITED FOR, THE
  3340                              <1> ;	INTERRUPT STATUS SENSED, AND THE RESULT RETURNED TO THE CALLER.
  3341                              <1> ;
  3342                              <1> ; ON EXIT:	@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION.
  3343                              <1> ;-------------------------------------------------------------------------------
  3344                              <1> CHK_STAT_2:
  3345 00004D88 B8[B04D0000]        <1>         mov     eax, CS_BACK            ; LOAD NEC_OUTPUT ERROR ADDRESS
  3346 00004D8D 50                  <1> 	push	eax
  3347 00004D8E E828000000          <1> 	call	WAIT_INT		; WAIT FOR THE INTERRUPT
  3348 00004D93 721A                <1> 	jc	short J34		; IF ERROR, RETURN IT
  3349 00004D95 B408                <1> 	mov	ah, 08h			; SENSE INTERRUPT STATUS COMMAND
  3350 00004D97 E817FFFFFF          <1> 	call	NEC_OUTPUT
  3351 00004D9C E849000000          <1> 	call	RESULTS			; READ IN THE RESULTS
  3352 00004DA1 720C                <1> 	jc	short J34
  3353 00004DA3 A0[11790100]        <1> 	mov	al, [NEC_STATUS]	; GET THE FIRST STATUS BYTE
  3354 00004DA8 2460                <1> 	and	al, 01100000B		; ISOLATE THE BITS
  3355 00004DAA 3C60                <1> 	cmp	al, 01100000B		; TEST FOR CORRECT VALUE
  3356 00004DAC 7403                <1> 	jz	short J35		; IF ERROR, GO MARK IT
  3357 00004DAE F8                  <1> 	clc				; GOOD RETURN
  3358                              <1> J34:
  3359 00004DAF 58                  <1> 	pop	eax			; THROW AWAY ERROR RETURN
  3360                              <1> CS_BACK:
  3361 00004DB0 C3                  <1> 	retn
  3362                              <1> J35:
  3363 00004DB1 800D[10790100]40    <1> 	or	byte [DSKETTE_STATUS], BAD_SEEK
  3364 00004DB8 F9                  <1> 	stc				; ERROR RETURN CODE
  3365 00004DB9 EBF4                <1> 	jmp	short J34
  3366                              <1> 
  3367                              <1> ;-------------------------------------------------------------------------------
  3368                              <1> ; WAIT_INT
  3369                              <1> ;	THIS ROUTINE WAITS FOR AN INTERRUPT TO OCCUR A TIME OUT ROUTINE
  3370                              <1> ;	TAKES PLACE DURING THE WAIT, SO THAT AN ERROR MAY BE RETURNED
  3371                              <1> ;	IF THE DRIVE IS NOT READY.
  3372                              <1> ;
  3373                              <1> ; ON EXIT: 	@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION.
  3374                              <1> ;-------------------------------------------------------------------------------
  3375                              <1> 
  3376                              <1> ; 17/12/2014
  3377                              <1> ; 2.5 seconds waiting !
  3378                              <1> ;(AWARD BIOS - 1999, WAIT_FDU_INT_LOW, WAIT_FDU_INT_HI)
  3379                              <1> ; amount of time to wait for completion interrupt from NEC.
  3380                              <1> 
  3381                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  3382                              <1> WAIT_INT:
  3383 00004DBB FB                  <1> 	sti				; TURN ON INTERRUPTS, JUST IN CASE
  3384                              <1> 	; 06/08/2022
  3385                              <1> 	;clc				; CLEAR TIMEOUT INDICATOR
  3386                              <1> 	;
  3387                              <1> 	;mov	bl, 10			; CLEAR THE COUNTERS
  3388                              <1> 	;xor	cx, cx			; FOR 2 SECOND WAIT
  3389                              <1> 
  3390                              <1> 	; Modification from AWARD BIOS - 1999 (ATORGS.ASM, WAIT
  3391                              <1> 	;
  3392                              <1> 	;WAIT_FOR_MEM:	
  3393                              <1> 	;	Waits for a bit at a specified memory location pointed
  3394                              <1> 	;	to by ES:[DI] to become set.
  3395                              <1> 	;INPUT:
  3396                              <1> 	;	AH= Mask to test with.
  3397                              <1> 	;	ES:[DI] = memory location to watch.
  3398                              <1> 	;	BH:CX= Number of memory refresh periods to delay.
  3399                              <1> 	;	     (normally 30 microseconds per period.)
  3400                              <1> 
  3401                              <1> 	; waiting for (max.) 2.5 secs in 30 micro units.
  3402                              <1> ;	mov 	cx, WAIT_FDU_INT_LO		; 017798
  3403                              <1> ;;	mov 	bl, WAIT_FDU_INT_HI
  3404                              <1> ;	mov 	bl, WAIT_FDU_INT_HI + 1
  3405                              <1> 	; 27/02/2015
  3406 00004DBC B986450100          <1> 	mov 	ecx, WAIT_FDU_INT_LH	; 83334 (2.5 seconds)		
  3407                              <1> WFMS_CHECK_MEM:
  3408 00004DC1 F605[0D790100]80    <1> 	test	byte [SEEK_STATUS], INT_FLAG
  3409                              <1> 					; TEST FOR INTERRUPT OCCURRING
  3410 00004DC8 7516                <1>         jnz     short J37
  3411                              <1> WFMS_HI:
  3412 00004DCA E461                <1> 	in	al, PORT_B  ; 061h	; SYS1, wait for lo to hi
  3413 00004DCC A810                <1> 	test	al, 010h		; transition on memory
  3414 00004DCE 75FA                <1> 	jnz	short WFMS_HI		; refresh.
  3415                              <1> WFMS_LO:
  3416 00004DD0 E461                <1> 	in	al, PORT_B		; SYS1
  3417 00004DD2 A810                <1> 	test	al, 010h
  3418 00004DD4 74FA                <1> 	jz	short WFMS_LO
  3419 00004DD6 E2E9                <1>         loop	WFMS_CHECK_MEM
  3420                              <1> 
  3421                              <1> ;WFMS_OUTER_LP:
  3422                              <1> ;;	or	bl, bl			; check outer counter
  3423                              <1> ;;	jz	short J36A		; WFMS_TIMEOUT
  3424                              <1> ;	dec	bl
  3425                              <1> ;	jz	short J36A	
  3426                              <1> ;	jmp	short WFMS_CHECK_MEM
  3427                              <1> 
  3428                              <1> 	; 17/12/2014
  3429                              <1> 	; 16/12/2014
  3430                              <1> ;	mov	byte [wait_count], 0	; Reset (INT 08H) counter
  3431                              <1> ;J36:
  3432                              <1> ;	test	byte [SEEK_STATUS], INT_FLAG
  3433                              <1> ;					; TEST FOR INTERRUPT OCCURRING
  3434                              <1> ;	jnz	short J37
  3435                              <1> 
  3436                              <1> 	; 16/12/2014
  3437                              <1> 	;loop	J36			; COUNT DOWN WHILE WAITING
  3438                              <1> 	;dec	bl			; SECOND LEVEL COUNTER
  3439                              <1> 	;jnz	short J36
  3440                              <1> ;       cmp     byte [wait_count], 46   ; (46/18.2 seconds)
  3441                              <1> ;	jb	short J36
  3442                              <1> 
  3443                              <1> ;WFMS_TIMEOUT:
  3444                              <1> ;J36A:
  3445 00004DD8 800D[10790100]80    <1> 	or	byte [DSKETTE_STATUS], TIME_OUT ; NOTHING HAPPENED
  3446 00004DDF F9                  <1> 	stc				; ERROR RETURN
  3447                              <1> J37:
  3448 00004DE0 9C                  <1> 	pushf				; SAVE CURRENT CARRY
  3449 00004DE1 8025[0D790100]7F    <1> 	and	byte [SEEK_STATUS], ~INT_FLAG ; TURN OFF INTERRUPT FLAG
  3450 00004DE8 9D                  <1> 	popf				; RECOVER CARRY
  3451 00004DE9 C3                  <1> 	retn				; GOOD RETURN CODE
  3452                              <1> 
  3453                              <1> ;-------------------------------------------------------------------------------
  3454                              <1> ; RESULTS
  3455                              <1> ;	THIS ROUTINE WILL READ ANYTHING THAT THE NEC CONTROLLER RETURNS 
  3456                              <1> ;	FOLLOWING AN INTERRUPT.
  3457                              <1> ;
  3458                              <1> ; ON EXIT:	@DSKETTE_STATUS, CY REFLECT STATUS OF OPERATION.
  3459                              <1> ;		AX,BX,CX,DX DESTROYED
  3460                              <1> ;-------------------------------------------------------------------------------
  3461                              <1> RESULTS:
  3462                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  3463 00004DEA 57                  <1> 	push	edi
  3464 00004DEB BF[11790100]        <1> 	mov	edi, NEC_STATUS		; POINTER TO DATA AREA
  3465 00004DF0 B307                <1> 	mov	bl, 7			; MAX STATUS BYTES
  3466 00004DF2 66BAF403            <1> 	mov	dx, 03F4h		; STATUS PORT
  3467                              <1> 
  3468                              <1> ;-----	WAIT FOR REQUEST FOR MASTER
  3469                              <1> 
  3470                              <1> _R10: 
  3471                              <1> 	; 16/12/2014
  3472                              <1> 	; wait for (max) 0.5 seconds
  3473                              <1> 	;mov	bh, 2			; HIGH ORDER COUNTER
  3474                              <1> 	;xor	cx, cx			; COUNTER
  3475                              <1> 
  3476                              <1> 	;Time to wait while waiting for each byte of NEC results = .5
  3477                              <1> 	;seconds.  .5 seconds = 500,000 micros.  500,000/30 = 16,667.
  3478                              <1> 	; 27/02/2015
  3479 00004DF6 B91B410000          <1> 	mov 	ecx, WAIT_FDU_RESULTS_LH ; 16667  
  3480                              <1> 	;mov	cx, WAIT_FDU_RESULTS_LO  ; 16667
  3481                              <1> 	;mov	bh, WAIT_FDU_RESULTS_HI+1 ; 0+1
  3482                              <1> 
  3483                              <1> WFPSR_OUTER_LP:
  3484                              <1> 	;
  3485                              <1> WFPSR_CHECK_PORT:
  3486                              <1> J39:					; WAIT FOR MASTER
  3487 00004DFB EC                  <1> 	in	al, dx			; GET STATUS
  3488 00004DFC 24C0                <1> 	and	al, 11000000b		; KEEP ONLY STATUS AND DIRECTION
  3489 00004DFE 3CC0                <1> 	cmp	al, 11000000b		; STATUS 1 AND DIRECTION 1 ?
  3490 00004E00 7418                <1> 	jz	short J42		; STATUS AND DIRECTION OK
  3491                              <1> WFPSR_HI:
  3492 00004E02 E461                <1> 	in	al, PORT_B	; 061h	; SYS1	; wait for hi to lo
  3493 00004E04 A810                <1> 	test	al, 010h		; transition on memory
  3494 00004E06 75FA                <1> 	jnz	short WFPSR_HI		; refresh.
  3495                              <1> WFPSR_LO:
  3496 00004E08 E461                <1> 	in	al, PORT_B		; SYS1
  3497 00004E0A A810                <1> 	test	al, 010h
  3498 00004E0C 74FA                <1> 	jz	SHORT WFPSR_LO
  3499 00004E0E E2EB                <1> 	loop	WFPSR_CHECK_PORT
  3500                              <1> 
  3501                              <1> 	;; 27/02/2015
  3502                              <1> 	;;dec	bh
  3503                              <1> 	;;jnz	short WFPSR_OUTER_LP
  3504                              <1> 	;jmp	short WFPSR_TIMEOUT	; fail
  3505                              <1> 
  3506                              <1> 	;;mov	byte [wait_count], 0
  3507                              <1> ;J39:					; WAIT FOR MASTER
  3508                              <1> ;	in	al, dx			; GET STATUS
  3509                              <1> ;	and	al, 11000000b		; KEEP ONLY STATUS AND DIRECTION
  3510                              <1> ;	cmp	al, 11000000b		; STATUS 1 AND DIRECTION 1 ?
  3511                              <1> ;	jz	short J42		; STATUS AND DIRECTION OK
  3512                              <1> 	;loop	J39			; LOOP TILL TIMEOUT
  3513                              <1> 	;dec	bh			; DECREMENT HIGH ORDER COUNTER
  3514                              <1> 	;jnz	short J39		; REPEAT TILL DELAY DONE
  3515                              <1> 	;
  3516                              <1> 	;;cmp	byte [wait_count], 10  ; (10/18.2 seconds)
  3517                              <1> 	;;jb	short J39	
  3518                              <1> 
  3519                              <1> ;WFPSR_TIMEOUT:
  3520 00004E10 800D[10790100]80    <1> 	or	byte [DSKETTE_STATUS], TIME_OUT
  3521 00004E17 F9                  <1> 	stc				; SET ERROR RETURN
  3522 00004E18 EB28                <1> 	jmp	short POPRES		; POP REGISTERS AND RETURN
  3523                              <1> 
  3524                              <1> ;-----	READ IN THE STATUS
  3525                              <1> 
  3526                              <1> J42:
  3527 00004E1A EB00                <1> 	jmp	$+2			; I/O DELAY
  3528                              <1> 	;inc	dx			; POINT AT DATA PORT
  3529                              <1> 	; 06/08/2022
  3530 00004E1C FEC2                <1> 	inc	dl
  3531 00004E1E EC                  <1> 	in	al, dx			; GET THE DATA
  3532                              <1> 	; 16/12/2014
  3533                              <1> 	NEWIODELAY
    83 00004E1F E6EB                <2>  out 0EBh, al
  3534 00004E21 8807                <1>         mov     [edi], al		; STORE THE BYTE
  3535 00004E23 47                  <1> 	inc	edi			; INCREMENT THE POINTER
  3536                              <1> 
  3537                              <1> 	; 16/12/2014
  3538                              <1> ;	push	cx
  3539                              <1> ;	mov	cx, 30
  3540                              <1> ;wdw2:
  3541                              <1> ;	NEWIODELAY
  3542                              <1> ;	loop	wdw2
  3543                              <1> ;	pop	cx
  3544                              <1> 
  3545                              <1> 	;;mov	ecx, 3			; MINIMUM 24 MICROSECONDS FOR NEC
  3546                              <1> 	; 11/04/2021
  3547                              <1> 	;mov	ecx, 2
  3548                              <1> 	; 06/08/2022
  3549 00004E24 29C9                <1> 	sub	ecx, ecx
  3550 00004E26 B102                <1> 	mov	cl, 2
  3551 00004E28 E8A5D5FFFF          <1> 	call	WAITF			; WAIT 30 TO 45 MICROSECONDS
  3552                              <1> 	;dec	dx			; POINT AT STATUS PORT
  3553                              <1> 	; 06/08/2022
  3554 00004E2D FECA                <1> 	dec	dl
  3555 00004E2F EC                  <1> 	in	al, dx			; GET STATUS
  3556                              <1> 	; 16/12/2014
  3557                              <1> 	NEWIODELAY
    83 00004E30 E6EB                <2>  out 0EBh, al
  3558                              <1> 	;
  3559 00004E32 A810                <1> 	test	al, 00010000b		; TEST FOR NEC STILL BUSY
  3560 00004E34 740C                <1> 	jz	short POPRES		; RESULTS DONE ?
  3561                              <1> 
  3562 00004E36 FECB                <1> 	dec	bl			; DECREMENT THE STATUS COUNTER
  3563 00004E38 75BC                <1>         jnz     short _R10              ; GO BACK FOR MORE
  3564 00004E3A 800D[10790100]20    <1> 	or	byte [DSKETTE_STATUS], BAD_NEC ; TOO MANY STATUS BYTES
  3565 00004E41 F9                  <1> 	stc				; SET ERROR FLAG
  3566                              <1> 
  3567                              <1> ;-----	RESULT OPERATION IS DONE
  3568                              <1> POPRES:
  3569 00004E42 5F                  <1> 	pop	edi
  3570 00004E43 C3                  <1> 	retn				; RETURN WITH CARRY SET
  3571                              <1> 
  3572                              <1> ;-------------------------------------------------------------------------------
  3573                              <1> ; READ_DSKCHNG
  3574                              <1> ;	READS THE STATE OF THE DISK CHANGE LINE.
  3575                              <1> ;
  3576                              <1> ; ON ENTRY:	DI = DRIVE #
  3577                              <1> ;
  3578                              <1> ; ON EXIT:	DI = DRIVE #
  3579                              <1> ;		ZF = 0 : DISK CHANGE LINE INACTIVE
  3580                              <1> ;		ZF = 1 : DISK CHANGE LINE ACTIVE
  3581                              <1> ;		AX,CX,DX DESTROYED
  3582                              <1> ;-------------------------------------------------------------------------------
  3583                              <1> READ_DSKCHNG:
  3584 00004E44 E8AFFDFFFF          <1> 	call	MOTOR_ON		; TURN ON THE MOTOR IF OFF
  3585 00004E49 66BAF703            <1> 	mov	dx, 03F7h		; ADDRESS DIGITAL INPUT REGISTER
  3586 00004E4D EC                  <1> 	in	al, dx			; INPUT DIGITAL INPUT REGISTER
  3587 00004E4E A880                <1> 	test	al, DSK_CHG		; CHECK FOR DISK CHANGE LINE ACTIVE
  3588 00004E50 C3                  <1> 	retn				; RETURN TO CALLER WITH ZERO FLAG SET
  3589                              <1> 
  3590                              <1> fdc_int:  
  3591                              <1> 	  ; 30/07/2015	
  3592                              <1> 	  ; 16/02/2015
  3593                              <1> ;int_0Eh: ; 11/12/2014
  3594                              <1> 
  3595                              <1> ;--- HARDWARE INT 0EH -- ( IRQ LEVEL 6 ) ---------------------------------------
  3596                              <1> ; DISK_INT
  3597                              <1> ;	THIS ROUTINE HANDLES THE DISKETTE INTERRUPT.
  3598                              <1> ;
  3599                              <1> ; ON EXIT:	THE INTERRUPT FLAG IS SET IN @SEEK_STATUS.
  3600                              <1> ;-------------------------------------------------------------------------------
  3601                              <1> DISK_INT_1:
  3602                              <1> 	;push	AX			; SAVE WORK REGISTER
  3603                              <1> 	; 11/04/2021
  3604 00004E51 50                  <1> 	push	eax
  3605 00004E52 1E                  <1> 	push	ds
  3606 00004E53 66B81000            <1> 	mov	ax, KDATA
  3607 00004E57 8ED8                <1> 	mov 	ds, ax
  3608 00004E59 800D[0D790100]80    <1>         or	byte [SEEK_STATUS], INT_FLAG ; TURN ON INTERRUPT OCCURRED
  3609 00004E60 B020                <1> 	mov     al, EOI			; END OF INTERRUPT MARKER
  3610 00004E62 E620                <1> 	out	INTA00, al		; INTERRUPT CONTROL PORT
  3611 00004E64 1F                  <1> 	pop	ds
  3612                              <1> 	;pop	ax			; RECOVER REGISTER
  3613                              <1> 	; 11/04/2021
  3614 00004E65 58                  <1> 	pop	eax
  3615 00004E66 CF                  <1> 	iretd				; RETURN FROM INTERRUPT
  3616                              <1> 
  3617                              <1> ;-------------------------------------------------------------------------------
  3618                              <1> ; DSKETTE_SETUP
  3619                              <1> ;	THIS ROUTINE DOES A PRELIMINARY CHECK TO SEE WHAT TYPE OF
  3620                              <1> ;	DISKETTE DRIVES ARE ATTACH TO THE SYSTEM.
  3621                              <1> ;-------------------------------------------------------------------------------
  3622                              <1> 
  3623                              <1> ; 09/08/2022 - TRDOS 386 Kernel v2.0.5
  3624                              <1> ; 29/05/2016 - TRDOS 386 (TRDOS v2.0)
  3625                              <1> 
  3626                              <1> DSKETTE_SETUP:
  3627                              <1> 	;push	ax			; SAVE REGISTERS
  3628                              <1> 	;push	bx
  3629                              <1> 	;push	cx
  3630 00004E67 52                  <1> 	push	edx
  3631                              <1> 	;push	di
  3632                              <1> 	;;push	ds
  3633                              <1> 	; 14/12/2014
  3634                              <1> 	;mov	word [DISK_POINTER], MD_TBL6
  3635                              <1> 	;mov	[DISK_POINTER+2], cs
  3636                              <1> 	;
  3637                              <1> 	;or	byte [RTC_WAIT_FLAG], 1	; NO RTC WAIT, FORCE USE OF LOOP
  3638 00004E68 31FF                <1> 	xor	edi, edi		; INITIALIZE DRIVE POINTER
  3639                              <1> 	; 09/08/2022
  3640                              <1> 	;mov	esi, eax
  3641 00004E6A 31C0                <1> 	xor	eax, eax ; eax = 0
  3642 00004E6C 66A3[1B790100]      <1> 	mov	[DSK_STATE], ax		; INITIALIZE STATES
  3643 00004E72 8025[18790100]33    <1> 	and	byte [LASTRATE], ~(STRT_MSK+SEND_MSK) ; CLEAR START & SEND
  3644 00004E79 800D[18790100]C0    <1> 	or	byte [LASTRATE], SEND_MSK ; INITIALIZE SENT TO IMPOSSIBLE
  3645 00004E80 A2[0D790100]        <1> 	mov	[SEEK_STATUS], al	; INDICATE RECALIBRATE NEEDED
  3646 00004E85 A2[0F790100]        <1> 	mov	[MOTOR_COUNT], al	; INITIALIZE MOTOR COUNT
  3647 00004E8A A2[0E790100]        <1> 	mov	[MOTOR_STATUS], al	; INITIALIZE DRIVES TO OFF STATE
  3648 00004E8F A2[10790100]        <1> 	mov	[DSKETTE_STATUS], al	; NO ERRORS
  3649                              <1> 	;
  3650                              <1> 	; 28/02/2015
  3651                              <1> 	;mov	word [cfd], 100h 
  3652 00004E94 E815F4FFFF          <1> 	call	DSK_RESET
  3653 00004E99 5A                  <1> 	pop	edx
  3654 00004E9A F8                  <1> 	clc	; 29/05/2016
  3655 00004E9B C3                  <1> 	retn
  3656                              <1> 
  3657                              <1> ;SUP0:
  3658                              <1> ;	call	DRIVE_DET		; DETERMINE DRIVE
  3659                              <1> ;	call	XLAT_OLD		; TRANSLATE STATE TO COMPATIBLE MODE
  3660                              <1> ;	; 02/01/2015
  3661                              <1> ;	;inc	di			; POINT TO NEXT DRIVE
  3662                              <1> ;	;cmp	di, MAX_DRV		; SEE IF DONE
  3663                              <1> ;	;jnz	short SUP0		; REPEAT FOR EACH ORIVE
  3664                              <1> ;       cmp     byte [fd1_type], 0	
  3665                              <1> ;	jna	short sup1
  3666                              <1> ;	or	di, di
  3667                              <1> ;	jnz	short sup1
  3668                              <1> ;	inc	di
  3669                              <1> ;       jmp     short SUP0
  3670                              <1> ;sup1:
  3671                              <1> ;	mov	byte [SEEK_STATUS], 0	; FORCE RECALIBRATE
  3672                              <1> ;	;and	byte [RTC_WAIT_FLAG], 0FEh ; ALLOW FOR RTC WAIT
  3673                              <1> ;	call	SETUP_END		; VARIOUS CLEANUPS
  3674                              <1> ;	;;pop	ds			; RESTORE CALLERS REGISTERS
  3675                              <1> ;	;pop	di
  3676                              <1> ;	pop	edx
  3677                              <1> ;	;pop	cx
  3678                              <1> ;	;pop	bx
  3679                              <1> ;	;pop	ax
  3680                              <1> ;	retn
  3681                              <1> 
  3682                              <1> ;//////////////////////////////////////////////////////
  3683                              <1> ;; END OF DISKETTE I/O ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3684                              <1> 
  3685                              <1> ; 17/04/2021 (TRDOS 386 v2.0.4) 
  3686                              <1> 
  3687                              <1> ; 11/04/2021
  3688                              <1> ;int13h: ; 21/02/2015
  3689                              <1> 	;pushfd
  3690                              <1> 	;push 	cs
  3691                              <1> 	;;call 	DISK_IO
  3692                              <1> 	;;retn
  3693                              <1> 
  3694                              <1> ;;;;;; DISK I/O ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 21/02/2015 ;;;
  3695                              <1> ;/////////////////////////////////////////////////////////////////////
  3696                              <1> 
  3697                              <1> ; DISK I/O - Erdogan Tan (Retro UNIX 386 v1 project)
  3698                              <1> ; 18/02/2016
  3699                              <1> ; 17/02/2016
  3700                              <1> ; 23/02/2015
  3701                              <1> ; 21/02/2015 (unix386.s)
  3702                              <1> ; 22/12/2014 - 14/02/2015 (dsectrm2.s)
  3703                              <1> ;
  3704                              <1> ; Original Source Code:
  3705                              <1> ; DISK ----- 09/25/85 FIXED DISK BIOS
  3706                              <1> ; (IBM PC XT Model 286 System BIOS Source Code, 04-21-86)
  3707                              <1> ;
  3708                              <1> ; Modifications: by reference of AWARD BIOS 1999 (D1A0622) 
  3709                              <1> ;		 Source Code - ATORGS.ASM, AHDSK.ASM
  3710                              <1> ;
  3711                              <1> 
  3712                              <1> ;The wait for controller to be not busy is 10 seconds.
  3713                              <1> ;10,000,000 / 30 = 333,333. 333,333 decimal = 051615h
  3714                              <1> ;;WAIT_HDU_CTLR_BUSY_LO	equ 1615h		
  3715                              <1> ;;WAIT_HDU_CTLR_BUSY_HI	equ 05h
  3716                              <1> WAIT_HDU_CTRL_BUSY_LH	equ 51615h	; 21/02/2015		
  3717                              <1> 
  3718                              <1> ;The wait for controller to issue completion interrupt is 10 seconds.
  3719                              <1> ;10,000,000 / 30 = 333,333.  333,333 decimal = 051615h
  3720                              <1> ;;WAIT_HDU_INT_LO	equ 1615h
  3721                              <1> ;;WAIT_HDU_INT_HI	equ 05h
  3722                              <1> WAIT_HDU_INT_LH		equ 51615h	; 21/02/2015
  3723                              <1> 
  3724                              <1> ;The wait for Data request on read and write longs is
  3725                              <1> ;2000 us. (?)
  3726                              <1> ;;WAIT_HDU_DRQ_LO	equ 1000	; 03E8h
  3727                              <1> ;;WAIT_HDU_DRQ_HI	equ 0
  3728                              <1> WAIT_HDU_DRQ_LH		equ 1000	; 21/02/2015
  3729                              <1> 
  3730                              <1> ; Port 61h (PORT_B)
  3731                              <1> SYS1	equ 61h		; PORT_B  (diskette.inc)
  3732                              <1> 
  3733                              <1> ; 23/12/2014
  3734                              <1> %define CMD_BLOCK       ebp-8  ; 21/02/2015
  3735                              <1> 
  3736                              <1> ;--- INT 13H -------------------------------------------------------------------
  3737                              <1> ;									       :
  3738                              <1> ; FIXED DISK I/O INTERFACE						       :
  3739                              <1> ;									       :
  3740                              <1> ;	THIS INTERFACE PROVIDES ACCESS TO 5 1/4" FIXED DISKS THROUGH           :
  3741                              <1> ;	THE IBM FIXED DISK CONTROLLER.					       :
  3742                              <1> ;									       :
  3743                              <1> ;	THE  BIOS  ROUTINES  ARE  MEANT  TO  BE  ACCESSED  THROUGH	       :
  3744                              <1> ;	SOFTWARE  INTERRUPTS  ONLY.    ANY  ADDRESSES  PRESENT	IN	       :
  3745                              <1> ;	THESE  LISTINGS  ARE  INCLUDED	 ONLY	FOR  COMPLETENESS,	       :
  3746                              <1> ;	NOT  FOR  REFERENCE.  APPLICATIONS   WHICH  REFERENCE  ANY	       :
  3747                              <1> ;	ABSOLUTE  ADDRESSES  WITHIN  THE  CODE	SEGMENTS  OF  BIOS	       :
  3748                              <1> ;	VIOLATE  THE  STRUCTURE  AND  DESIGN  OF  BIOS. 		       :
  3749                              <1> ;									       :
  3750                              <1> ;------------------------------------------------------------------------------:
  3751                              <1> ;									       :
  3752                              <1> ; INPUT  (AH)= HEX COMMAND VALUE					       :
  3753                              <1> ;									       :
  3754                              <1> ;	(AH)= 00H  RESET DISK (DL = 80H,81H) / DISKETTE 		       :
  3755                              <1> ;	(AH)= 01H  READ THE STATUS OF THE LAST DISK OPERATION INTO (AL)        :
  3756                              <1> ;		    NOTE: DL < 80H - DISKETTE				       :
  3757                              <1> ;			  DL > 80H - DISK				       :
  3758                              <1> ;	(AH)= 02H  READ THE DESIRED SECTORS INTO MEMORY 		       :
  3759                              <1> ;	(AH)= 03H  WRITE THE DESIRED SECTORS FROM MEMORY		       :
  3760                              <1> ;	(AH)= 04H  VERIFY THE DESIRED SECTORS				       :
  3761                              <1> ;	(AH)= 05H  FORMAT THE DESIRED TRACK				       :
  3762                              <1> ;	(AH)= 06H  UNUSED						       :
  3763                              <1> ;	(AH)= 07H  UNUSED						       :
  3764                              <1> ;	(AH)= 08H  RETURN THE CURRENT DRIVE PARAMETERS			       :
  3765                              <1> ;	(AH)= 09H  INITIALIZE DRIVE PAIR CHARACTERISTICS		       :
  3766                              <1> ;		    INTERRUPT 41 POINTS TO DATA BLOCK FOR DRIVE 0	       :
  3767                              <1> ;		    INTERRUPT 46 POINTS TO DATA BLOCK FOR DRIVE 1	       :
  3768                              <1> ;	(AH)= 0AH  READ LONG						       :
  3769                              <1> ;	(AH)= 0BH  WRITE LONG  (READ & WRITE LONG ENCOMPASS 512 + 4 BYTES ECC) :
  3770                              <1> ;	(AH)= 0CH  SEEK 						       :
  3771                              <1> ;	(AH)= 0DH  ALTERNATE DISK RESET (SEE DL)			       :
  3772                              <1> ;	(AH)= 0EH  UNUSED						       :
  3773                              <1> ;	(AH)= 0FH  UNUSED						       :
  3774                              <1> ;	(AH)= 10H  TEST DRIVE READY					       :
  3775                              <1> ;	(AH)= 11H  RECALIBRATE						       :
  3776                              <1> ;	(AH)= 12H  UNUSED						       :
  3777                              <1> ;	(AH)= 13H  UNUSED						       :
  3778                              <1> ;	(AH)= 14H  CONTROLLER INTERNAL DIAGNOSTIC			       :
  3779                              <1> ;	(AH)= 15H  READ DASD TYPE					       :
  3780                              <1> ;									       :
  3781                              <1> ;-------------------------------------------------------------------------------
  3782                              <1> ;									       :
  3783                              <1> ;	REGISTERS USED FOR FIXED DISK OPERATIONS			       :
  3784                              <1> ;									       :
  3785                              <1> ;		(DL)	-  DRIVE NUMBER     (80H-81H FOR DISK. VALUE CHECKED)  :
  3786                              <1> ;		(DH)	-  HEAD NUMBER	    (0-15 ALLOWED, NOT VALUE CHECKED)  :
  3787                              <1> ;		(CH)	-  CYLINDER NUMBER  (0-1023, NOT VALUE CHECKED)(SEE CL):
  3788                              <1> ;		(CL)	-  SECTOR NUMBER    (1-17, NOT VALUE CHECKED)	       :
  3789                              <1> ;									       :
  3790                              <1> ;			   NOTE: HIGH 2 BITS OF CYLINDER NUMBER ARE PLACED     :
  3791                              <1> ;				 IN THE HIGH 2 BITS OF THE CL REGISTER	       :
  3792                              <1> ;				 (10 BITS TOTAL)			       :
  3793                              <1> ;									       :
  3794                              <1> ;		(AL)	-  NUMBER OF SECTORS (MAXIMUM POSSIBLE RANGE 1-80H,    :
  3795                              <1> ;					      FOR READ/WRITE LONG 1-79H)       :
  3796                              <1> ;									       :
  3797                              <1> ;		(ES:BX) -  ADDRESS OF BUFFER FOR READS AND WRITES,	       :
  3798                              <1> ;			   (NOT REQUIRED FOR VERIFY)			       :
  3799                              <1> ;									       :
  3800                              <1> ;		FORMAT (AH=5) ES:BX POINTS TO A 512 BYTE BUFFER. THE FIRST     :
  3801                              <1> ;			   2*(SECTORS/TRACK) BYTES CONTAIN F,N FOR EACH SECTOR.:
  3802                              <1> ;			   F = 00H FOR A GOOD SECTOR			       :
  3803                              <1> ;			       80H FOR A BAD SECTOR			       :
  3804                              <1> ;			   N = SECTOR NUMBER				       :
  3805                              <1> ;			   FOR AN INTERLEAVE OF 2 AND 17 SECTORS/TRACK	       :
  3806                              <1> ;			   THE TABLE SHOULD BE: 			       :
  3807                              <1> ;									       :
  3808                              <1> ;		   DB	   00H,01H,00H,0AH,00H,02H,00H,0BH,00H,03H,00H,0CH     :
  3809                              <1> ;		   DB	   00H,04H,00H,0DH,00H,05H,00H,0EH,00H,06H,00H,0FH     :
  3810                              <1> ;		   DB	   00H,07H,00H,10H,00H,08H,00H,11H,00H,09H	       :
  3811                              <1> ;									       :
  3812                              <1> ;-------------------------------------------------------------------------------
  3813                              <1> 
  3814                              <1> ;-------------------------------------------------------------------------------
  3815                              <1> ; OUTPUT								       :
  3816                              <1> ;	AH = STATUS OF CURRENT OPERATION				       :
  3817                              <1> ;	     STATUS BITS ARE DEFINED IN THE EQUATES BELOW		       :
  3818                              <1> ;	CY = 0	SUCCESSFUL OPERATION (AH=0 ON RETURN)			       :
  3819                              <1> ;	CY = 1	FAILED OPERATION (AH HAS ERROR REASON)			       :
  3820                              <1> ;									       :
  3821                              <1> ;	NOTE:	ERROR 11H  INDICATES THAT THE DATA READ HAD A RECOVERABLE      :
  3822                              <1> ;		ERROR WHICH WAS CORRECTED BY THE ECC ALGORITHM.  THE DATA      :
  3823                              <1> ;		IS PROBABLY GOOD,   HOWEVER THE BIOS ROUTINE INDICATES AN      :
  3824                              <1> ;		ERROR TO ALLOW THE CONTROLLING PROGRAM A CHANCE TO DECIDE      :
  3825                              <1> ;		FOR ITSELF.  THE  ERROR  MAY  NOT  RECUR  IF  THE DATA IS      :
  3826                              <1> ;		REWRITTEN.						       :
  3827                              <1> ;									       :
  3828                              <1> ;	IF DRIVE PARAMETERS WERE REQUESTED (DL >= 80H), 		       :
  3829                              <1> ;	   INPUT:							       :
  3830                              <1> ;	     (DL) = DRIVE NUMBER					       :	
  3831                              <1> ;	     ; 27/05/2016 - TRDOS 386 (TRDOS v2.0)						       :	 	
  3832                              <1> ;	     EBX = Buffer address for fixed disk parameters table (32 bytes)   :
  3833                              <1> ;	   OUTPUT:							       :
  3834                              <1> ;	     (DL) = NUMBER OF CONSECUTIVE ACKNOWLEDGING DRIVES ATTACHED (1-2)  :
  3835                              <1> ;		    (CONTROLLER CARD ZERO TALLY ONLY)			       :
  3836                              <1> ;	     (DH) = MAXIMUM USEABLE VALUE FOR HEAD NUMBER		       :
  3837                              <1> ;	     (CH) = MAXIMUM USEABLE VALUE FOR CYLINDER NUMBER		       :
  3838                              <1> ;	     (CL) = MAXIMUM USEABLE VALUE FOR SECTOR NUMBER		       :
  3839                              <1> ;		    AND CYLINDER NUMBER HIGH BITS			       :
  3840                              <1> ;									       :
  3841                              <1> ;	IF READ DASD TYPE WAS REQUESTED,				       :
  3842                              <1> ;									       :
  3843                              <1> ;	AH = 0 - NOT PRESENT						       :
  3844                              <1> ;	     1 - DISKETTE - NO CHANGE LINE AVAILABLE			       :
  3845                              <1> ;	     2 - DISKETTE - CHANGE LINE AVAILABLE			       :
  3846                              <1> ;	     3 - FIXED DISK						       :
  3847                              <1> ;									       :
  3848                              <1> ;	CX,DX = NUMBER OF 512 BYTE BLOCKS WHEN AH = 3			       :
  3849                              <1> ;									       :
  3850                              <1> ;	REGISTERS WILL BE PRESERVED EXCEPT WHEN THEY ARE USED TO RETURN        :
  3851                              <1> ;	INFORMATION.							       :
  3852                              <1> ;									       :
  3853                              <1> ;	NOTE: IF AN ERROR IS REPORTED BY THE DISK CODE, THE APPROPRIATE        :
  3854                              <1> ;		ACTION IS TO RESET THE DISK, THEN RETRY THE OPERATION.	       :
  3855                              <1> ;									       :
  3856                              <1> ;-------------------------------------------------------------------------------
  3857                              <1> 
  3858                              <1> SENSE_FAIL	EQU	0FFH		; NOT IMPLEMENTED
  3859                              <1> NO_ERR		EQU	0E0H		; STATUS ERROR/ERROR REGISTER=0
  3860                              <1> WRITE_FAULT	EQU	0CCH		; WRITE FAULT ON SELECTED DRIVE
  3861                              <1> UNDEF_ERR	EQU	0BBH		; UNDEFINED ERROR OCCURRED
  3862                              <1> NOT_RDY 	EQU	0AAH		; DRIVE NOT READY
  3863                              <1> TIME_OUT	EQU	80H		; ATTACHMENT FAILED TO RESPOND
  3864                              <1> BAD_SEEK	EQU	40H		; SEEK OPERATION FAILED
  3865                              <1> BAD_CNTLR	EQU	20H		; CONTROLLER HAS FAILED
  3866                              <1> DATA_CORRECTED	EQU	11H		; ECC CORRECTED DATA ERROR
  3867                              <1> BAD_ECC 	EQU	10H		; BAD ECC ON DISK READ
  3868                              <1> BAD_TRACK	EQU	0BH		; NOT IMPLEMENTED
  3869                              <1> BAD_SECTOR	EQU	0AH		; BAD SECTOR FLAG DETECTED
  3870                              <1> ;DMA_BOUNDARY	EQU	09H		; DATA EXTENDS TOO FAR
  3871                              <1> INIT_FAIL	EQU	07H		; DRIVE PARAMETER ACTIVITY FAILED
  3872                              <1> BAD_RESET	EQU	05H		; RESET FAILED
  3873                              <1> ;RECORD_NOT_FND	EQU	04H		; REQUESTED SECTOR NOT FOUND
  3874                              <1> ;BAD_ADDR_MARK	EQU	02H		; ADDRESS MARK NOT FOUND
  3875                              <1> ;BAD_CMD 	EQU	01H		; BAD COMMAND PASSED TO DISK I/O
  3876                              <1> 
  3877                              <1> ;--------------------------------------------------------
  3878                              <1> ;							:
  3879                              <1> ; FIXED DISK PARAMETER TABLE				:
  3880                              <1> ;  -  THE TABLE IS COMPOSED OF A BLOCK DEFINED AS:	:
  3881                              <1> ;							:
  3882                              <1> ;  +0	(1 WORD) - MAXIMUM NUMBER OF CYLINDERS		:
  3883                              <1> ;  +2	(1 BYTE) - MAXIMUM NUMBER OF HEADS		:
  3884                              <1> ;  +3	(1 WORD) - NOT USED/SEE PC-XT			:
  3885                              <1> ;  +5	(1 WORD) - STARTING WRITE PRECOMPENSATION CYL	:
  3886                              <1> ;  +7	(1 BYTE) - MAXIMUM ECC DATA BURST LENGTH	:
  3887                              <1> ;  +8	(1 BYTE) - CONTROL BYTE 			:
  3888                              <1> ;		   BIT	  7 DISABLE RETRIES -OR-	:
  3889                              <1> ;		   BIT	  6 DISABLE RETRIES		:
  3890                              <1> ;		   BIT	  3 MORE THAN 8 HEADS		:
  3891                              <1> ;  +9	(3 BYTES)- NOT USED/SEE PC-XT			:
  3892                              <1> ; +12	(1 WORD) - LANDING ZONE 			:
  3893                              <1> ; +14	(1 BYTE) - NUMBER OF SECTORS/TRACK		:
  3894                              <1> ; +15	(1 BYTE) - RESERVED FOR FUTURE USE		:
  3895                              <1> ;							:
  3896                              <1> ;	 - TO DYNAMICALLY DEFINE A SET OF PARAMETERS	:
  3897                              <1> ;	   BUILD A TABLE FOR UP TO 15 TYPES AND PLACE	:
  3898                              <1> ;	   THE CORRESPONDING VECTOR INTO INTERRUPT 41	:
  3899                              <1> ;	   FOR DRIVE 0 AND INTERRUPT 46 FOR DRIVE 1.	:
  3900                              <1> ;							:
  3901                              <1> ;--------------------------------------------------------
  3902                              <1> 
  3903                              <1> ;--------------------------------------------------------
  3904                              <1> ;							:
  3905                              <1> ; HARDWARE SPECIFIC VALUES				:
  3906                              <1> ;							:
  3907                              <1> ;  -  CONTROLLER I/O PORT				:
  3908                              <1> ;							:
  3909                              <1> ;     > WHEN READ FROM: 				:
  3910                              <1> ;	HF_PORT+0 - READ DATA (FROM CONTROLLER TO CPU)	:
  3911                              <1> ;	HF_PORT+1 - GET ERROR REGISTER			:
  3912                              <1> ;	HF_PORT+2 - GET SECTOR COUNT			:
  3913                              <1> ;	HF_PORT+3 - GET SECTOR NUMBER			:
  3914                              <1> ;	HF_PORT+4 - GET CYLINDER LOW			:
  3915                              <1> ;	HF_PORT+5 - GET CYLINDER HIGH (2 BITS)		:
  3916                              <1> ;	HF_PORT+6 - GET SIZE/DRIVE/HEAD 		:
  3917                              <1> ;	HF_PORT+7 - GET STATUS REGISTER 		:
  3918                              <1> ;							:
  3919                              <1> ;     > WHEN WRITTEN TO:				:
  3920                              <1> ;	HF_PORT+0 - WRITE DATA (FROM CPU TO CONTROLLER) :
  3921                              <1> ;	HF_PORT+1 - SET PRECOMPENSATION CYLINDER	:
  3922                              <1> ;	HF_PORT+2 - SET SECTOR COUNT			:
  3923                              <1> ;	HF_PORT+3 - SET SECTOR NUMBER			:
  3924                              <1> ;	HF_PORT+4 - SET CYLINDER LOW			:
  3925                              <1> ;	HF_PORT+5 - SET CYLINDER HIGH (2 BITS)		:
  3926                              <1> ;	HF_PORT+6 - SET SIZE/DRIVE/HEAD 		:
  3927                              <1> ;	HF_PORT+7 - SET COMMAND REGISTER		:
  3928                              <1> ;							:
  3929                              <1> ;--------------------------------------------------------
  3930                              <1> 
  3931                              <1> ;HF_PORT 	EQU	01F0H	; DISK PORT
  3932                              <1> ;HF1_PORT	equ	0170h	
  3933                              <1> ;HF_REG_PORT	EQU	03F6H
  3934                              <1> ;HF1_REG_PORT	equ	0376h
  3935                              <1> 
  3936                              <1> HDC1_BASEPORT	equ	1F0h
  3937                              <1> HDC2_BASEPORT	equ	170h		
  3938                              <1> 
  3939                              <1> align 2
  3940                              <1> 
  3941                              <1> ;-----		STATUS REGISTER
  3942                              <1> 
  3943                              <1> ST_ERROR	EQU	00000001B	;
  3944                              <1> ST_INDEX	EQU	00000010B	;
  3945                              <1> ST_CORRCTD	EQU	00000100B	; ECC CORRECTION SUCCESSFUL
  3946                              <1> ST_DRQ		EQU	00001000B	;
  3947                              <1> ST_SEEK_COMPL	EQU	00010000B	; SEEK COMPLETE
  3948                              <1> ST_WRT_FLT	EQU	00100000B	; WRITE FAULT
  3949                              <1> ST_READY	EQU	01000000B	;
  3950                              <1> ST_BUSY 	EQU	10000000B	;
  3951                              <1> 
  3952                              <1> ;-----		ERROR REGISTER
  3953                              <1> 
  3954                              <1> ERR_DAM 	EQU	00000001B	; DATA ADDRESS MARK NOT FOUND
  3955                              <1> ERR_TRK_0	EQU	00000010B	; TRACK 0 NOT FOUND ON RECAL
  3956                              <1> ERR_ABORT	EQU	00000100B	; ABORTED COMMAND
  3957                              <1> ;		EQU	00001000B	; NOT USED
  3958                              <1> ERR_ID		EQU	00010000B	; ID NOT FOUND
  3959                              <1> ;		EQU	00100000B	; NOT USED
  3960                              <1> ERR_DATA_ECC	EQU	01000000B
  3961                              <1> ERR_BAD_BLOCK	EQU	10000000B
  3962                              <1> 
  3963                              <1> 
  3964                              <1> RECAL_CMD	EQU	00010000B	; DRIVE RECAL	(10H)
  3965                              <1> READ_CMD	EQU	00100000B	;	READ	(20H)
  3966                              <1> WRITE_CMD	EQU	00110000B	;	WRITE	(30H)
  3967                              <1> VERIFY_CMD	EQU	01000000B	;	VERIFY	(40H)
  3968                              <1> FMTTRK_CMD	EQU	01010000B	; FORMAT TRACK	(50H)
  3969                              <1> INIT_CMD	EQU	01100000B	;   INITIALIZE	(60H)
  3970                              <1> SEEK_CMD	EQU	01110000B	;	SEEK	(70H)
  3971                              <1> DIAG_CMD	EQU	10010000B	; DIAGNOSTIC	(90H)
  3972                              <1> SET_PARM_CMD	EQU	10010001B	; DRIVE PARMS	(91H)
  3973                              <1> NO_RETRIES	EQU	00000001B	; CHD MODIFIER	(01H)
  3974                              <1> ECC_MODE	EQU	00000010B	; CMD MODIFIER	(02H)
  3975                              <1> BUFFER_MODE	EQU	00001000B	; CMD MODIFIER	(08H)
  3976                              <1> 
  3977                              <1> ;MAX_FILE	EQU	2
  3978                              <1> ;S_MAX_FILE	EQU	2
  3979                              <1> MAX_FILE	equ	4		; 22/12/2014
  3980                              <1> S_MAX_FILE	equ	4		; 22/12/2014
  3981                              <1> 
  3982                              <1> DELAY_1 	EQU	25H		; DELAY FOR OPERATION COMPLETE
  3983                              <1> DELAY_2 	EQU	0600H		; DELAY FOR READY
  3984                              <1> DELAY_3 	EQU	0100H		; DELAY FOR DATA REQUEST
  3985                              <1> 
  3986                              <1> HF_FAIL 	EQU	08H		; CMOS FLAG IN BYTE 0EH
  3987                              <1> 
  3988                              <1> ;-----		COMMAND BLOCK REFERENCE
  3989                              <1> 
  3990                              <1> ;CMD_BLOCK      EQU     BP-8            ; @CMD_BLOCK REFERENCES BLOCK HEAD IN SS
  3991                              <1> 					;  (BP) POINTS TO COMMAND BLOCK TAIL
  3992                              <1> 					;	AS DEFINED BY THE "ENTER" PARMS
  3993                              <1> ; 19/12/2014
  3994                              <1> ORG_VECTOR	equ	4*13h		; INT 13h vector
  3995                              <1> DISK_VECTOR	equ	4*40h		; INT 40h vector (for floppy disks)
  3996                              <1> ;HDISK_INT	equ	4*76h		; Primary HDC - Hardware interrupt (IRQ14)
  3997                              <1> ;HDISK_INT1	equ	4*76h		; Primary HDC - Hardware interrupt (IRQ14)
  3998                              <1> ;HDISK_INT2	equ	4*77h		; Secondary HDC - Hardware interrupt (IRQ15)
  3999                              <1> ;HF_TBL_VEC	equ	4*41h		; Pointer to 1st fixed disk parameter table
  4000                              <1> ;HF1_TBL_VEC	equ	4*46h		; Pointer to 2nd fixed disk parameter table
  4001                              <1> 
  4002                              <1> align 2
  4003                              <1> 
  4004                              <1> ;----------------------------------------------------------------
  4005                              <1> ; FIXED DISK I/O SETUP						:
  4006                              <1> ;								:
  4007                              <1> ;  -  ESTABLISH TRANSFER VECTORS FOR THE FIXED DISK		:
  4008                              <1> ;  -  PERFORM POWER ON DIAGNOSTICS				:
  4009                              <1> ;     SHOULD AN ERROR OCCUR A "1701" MESSAGE IS DISPLAYED       :
  4010                              <1> ;								:
  4011                              <1> ;----------------------------------------------------------------
  4012                              <1> 
  4013                              <1> ; 09/08/2022
  4014                              <1> ; 06/08/2022 - TRDOS 386 Kernel v2.0.5
  4015                              <1> ; 29/05/2016 - TRDOS 386 (TRDOS v2.0)
  4016                              <1> 
  4017                              <1> DISK_SETUP:
  4018                              <1> 	;CLI
  4019                              <1> 	;;mov	ax, ABS0 		; GET ABSOLUTE SEGMENT
  4020                              <1> 	;xor	ax, ax
  4021                              <1> 	;mov	ds, ax			; SET SEGMENT REGISTER
  4022                              <1> 	;mov	ax, [ORG_VECTOR] 	; GET DISKETTE VECTOR
  4023                              <1> 	;mov	[DISK_VECTOR], ax	;  INTO INT 40H
  4024                              <1> 	;mov	ax, [ORG_VECTOR+2]
  4025                              <1> 	;mov	[DISK_VECTOR+2], ax
  4026                              <1> 	;mov	word [ORG_VECTOR], DISK_IO ; FIXED DISK HANDLER
  4027                              <1> 	;mov	[ORG_VECTOR+2], cs
  4028                              <1> 	; 1st controller (primary master, slave)   - IRQ 14
  4029                              <1> 	;;mov	word [HDISK_INT], HD_INT   ; FIXED DISK INTERRUPT
  4030                              <1> 	;mov	word [HDISK_INT1], HD_INT  ;
  4031                              <1> 	;;mov	[HDISK_INT+2], cs
  4032                              <1> 	;mov	[HDISK_INT1+2], cs
  4033                              <1> 	; 2nd controller (secondary master, slave) - IRQ 15
  4034                              <1> 	;mov	word [HDISK_INT2], HD1_INT ;
  4035                              <1> 	;mov	[HDISK_INT2+2], cs
  4036                              <1> 	;
  4037                              <1> 	;;mov	word [HF_TBL_VEC], HD0_DPT	; PARM TABLE DRIVE 80
  4038                              <1> 	;;mov	word [HF_TBL_VEC+2], DPT_SEGM
  4039                              <1> 	;;mov	word [HF1_TBL_VEC], HD1_DPT	; PARM TABLE DRIVE 81
  4040                              <1> 	;;mov	word [HF1_TBL_VEC+2], DPT_SEGM
  4041                              <1> 	;push	cs
  4042                              <1> 	;pop	ds
  4043                              <1> 	;mov	word [HDPM_TBL_VEC], HD0_DPT	; PARM TABLE DRIVE 80h
  4044                              <1> 	;mov	word [HDPM_TBL_VEC+2], DPT_SEGM
  4045 00004E9C C705[24790100]0000- <1> 	mov 	dword [HDPM_TBL_VEC], (DPT_SEGM*16)+HD0_DPT
  4045 00004EA4 0900                <1>
  4046                              <1> 	;mov	word [HDPS_TBL_VEC], HD1_DPT	; PARM TABLE DRIVE 81h
  4047                              <1> 	;mov	word [HDPS_TBL_VEC+2], DPT_SEGM
  4048 00004EA6 C705[28790100]2000- <1> 	mov 	dword [HDPS_TBL_VEC], (DPT_SEGM*16)+HD1_DPT
  4048 00004EAE 0900                <1>
  4049                              <1> 	;mov	word [HDSM_TBL_VEC], HD2_DPT	; PARM TABLE DRIVE 82h
  4050                              <1> 	;mov	word [HDSM_TBL_VEC+2], DPT_SEGM
  4051 00004EB0 C705[2C790100]4000- <1> 	mov 	dword [HDSM_TBL_VEC], (DPT_SEGM*16)+HD2_DPT
  4051 00004EB8 0900                <1>
  4052                              <1> 	;mov	word [HDSS_TBL_VEC], HD3_DPT	; PARM TABLE DRIVE 83h
  4053                              <1> 	;mov	word [HDSS_TBL_VEC+2], DPT_SEGM
  4054 00004EBA C705[30790100]6000- <1> 	mov 	dword [HDSS_TBL_VEC], (DPT_SEGM*16)+HD3_DPT
  4054 00004EC2 0900                <1>
  4055                              <1> 	;
  4056                              <1> 	;;in	al, INTB01		; TURN ON SECOND INTERRUPT CHIP
  4057                              <1> 	;;;and	al, 0BFh
  4058                              <1> 	;;and	al, 3Fh			; enable IRQ 14 and IRQ 15
  4059                              <1> 	;;;jmp	$+2
  4060                              <1> 	;;IODELAY
  4061                              <1> 	;;out	INTB01, al
  4062                              <1> 	;;IODELAY
  4063                              <1> 	;;in	al, INTA01		; LET INTERRUPTS PASS THRU TO
  4064                              <1> 	;;and	al, 0FBh 		;  SECOND CHIP
  4065                              <1> 	;;;jmp	$+2
  4066                              <1> 	;;IODELAY
  4067                              <1> 	;;out	INTA01, al
  4068                              <1> 	;
  4069                              <1> 	;sti
  4070                              <1> 	;;push	ds			; MOVE ABS0 POINTER TO
  4071                              <1> 	;;pop	es			; EXTRA SEGMENT POINTER
  4072                              <1> 	;;;call	DDS			; ESTABLISH DATA SEGMENT
  4073                              <1> 	;;mov	byte [DISK_STATUS1], 0 	; RESET THE STATUS INDICATOR
  4074                              <1> 	;;mov	byte [HF_NUM], 0	; ZERO NUMBER OF FIXED DISKS
  4075                              <1> 	;;mov	byte [CONTROL_BYTE], 0
  4076                              <1> 	;;mov	byte [PORT_OFF], 0	; ZERO CARD OFFSET
  4077                              <1> 	; 20/12/2014 - private code by Erdogan Tan
  4078                              <1> 		      ; (out of original PC-AT, PC-XT BIOS code)
  4079                              <1> 	;mov	si, hd0_type
  4080 00004EC4 BE[1E660000]        <1> 	mov	esi, hd0_type
  4081                              <1> 	;;mov	cx, 4
  4082                              <1> 	;mov	ecx, 4
  4083                              <1> 	; 06/08/2022
  4084 00004EC9 29C9                <1> 	sub	ecx, ecx
  4085 00004ECB B104                <1> 	mov	cl, 4
  4086                              <1> hde_l:
  4087 00004ECD AC                  <1> 	lodsb
  4088 00004ECE 3C80                <1> 	cmp	al, 80h			; 8?h = existing
  4089 00004ED0 7206                <1> 	jb	short _L4
  4090 00004ED2 FE05[20790100]      <1> 	inc	byte [HF_NUM]		; + 1 hard (fixed) disk drives
  4091                              <1> _L4: ; 26/02/2015
  4092 00004ED8 E2F3                <1> 	loop	hde_l	
  4093                              <1> ;_L4:					; 0 <= [HF_NUM] =< 4
  4094                              <1> ;L4:
  4095                              <1> 	;; 31/12/2014 - cancel controller diagnostics here
  4096                              <1> 	;;;mov 	cx, 3  ; 26/12/2014 (Award BIOS 1999)
  4097                              <1> 	;;mov 	cl, 3
  4098                              <1> 	;;
  4099                              <1> 	;;mov	DL, 80H			; CHECK THE CONTROLLER
  4100                              <1> ;;hdc_dl:
  4101                              <1> 	;;mov	AH, 14H			; USE CONTROLLER DIAGNOSTIC COMMAND
  4102                              <1> 	;;INT	13H			; CALL BIOS WITH DIAGNOSTIC COMMAND
  4103                              <1> 	;;;jc	short CTL_ERRX		; DISPLAY ERROR MESSAGE IF BAD RETURN
  4104                              <1> 	;;;jc	short POD_DONE ;22/12/2014
  4105                              <1> 	;;jnc	short hdc_reset0
  4106                              <1> 	;;loop	hdc_dl
  4107                              <1> 	;;; 27/12/2014
  4108                              <1> 	;;stc
  4109                              <1> 	;;retn
  4110                              <1> 	;
  4111                              <1> ;;hdc_reset0:
  4112                              <1> 	; 18/01/2015
  4113 00004EDA 8A0D[20790100]      <1> 	mov	cl, [HF_NUM]
  4114 00004EE0 20C9                <1> 	and	cl, cl
  4115 00004EE2 740D                <1> 	jz	short POD_DONE
  4116                              <1> 	;
  4117 00004EE4 B27F                <1> 	mov	dl, 7Fh
  4118                              <1> hdc_reset1:
  4119 00004EE6 FEC2                <1> 	inc	dl
  4120                              <1> 	;; 31/12/2015
  4121                              <1> 	;;push	dx
  4122                              <1> 	;;push	cx
  4123                              <1> 	;;push	ds
  4124                              <1> 	;;sub	ax, ax
  4125                              <1> 	;;mov	ds, ax
  4126                              <1> 	;;mov	ax, [TIMER_LOW]		; GET START TIMER COUNTS
  4127                              <1> 	;;pop	ds
  4128                              <1> 	;;mov	bx, ax
  4129                              <1> 	;;add	ax, 6*182		; 60 SECONDS* 18.2
  4130                              <1> 	;;mov	cx, ax
  4131                              <1> 	;;mov	word [wait_count], 0	; 22/12/2014 (reset wait counter)
  4132                              <1> 	;;
  4133                              <1> 	;; 31/12/2014 - cancel HD_RESET_1
  4134                              <1> 	;;call	HD_RESET_1		; SET UP DRIVE 0, (1,2,3)
  4135                              <1> 	;;pop	cx
  4136                              <1> 	;;pop	dx
  4137                              <1> 	;;
  4138                              <1> 	; 18/01/2015
  4139 00004EE8 B40D                <1> 	mov	ah, 0Dh ; ALTERNATE RESET
  4140                              <1> 	;int	13h
  4141 00004EEA E8CC000000          <1> 	call	int13h
  4142 00004EEF E2F5                <1> 	loop	hdc_reset1
  4143                              <1> 	;clc 	; 29/05/2016
  4144                              <1> POD_DONE:
  4145 00004EF1 C3                  <1> 	retn
  4146                              <1> 
  4147                              <1> ;;-----	POD_ERROR
  4148                              <1> 
  4149                              <1> ;;CTL_ERRX:
  4150                              <1> ;	;mov	SI,OFFSET F1782 	; CONTROLLER ERROR
  4151                              <1> ;	;call	SET_FAIL		; DO NOT IPL FROM DISK
  4152                              <1> ;	;call	E_MSG			; DISPLAY ERROR AND SET (BP) ERROR FLAG
  4153                              <1> ;	;jmp	short POD_DONE
  4154                              <1> 
  4155                              <1> ;;HD_RESET_1:
  4156                              <1> ;;	;push	BX			; SAVE TIMER LIMITS
  4157                              <1> ;;	;push	CX
  4158                              <1> ;;RES_1: mov	AH,09H			; SET DRIVE PARAMETERS
  4159                              <1> ;;	INT	13H
  4160                              <1> ;;	jc	short RES_2
  4161                              <1> ;;	mov	AH,11h			; RECALIBRATE DRIVE
  4162                              <1> ;;	INT	13H
  4163                              <1> ;;	jnc	short RES_CK		; DRIVE OK
  4164                              <1> ;;RES_2: ;call	POD_TCHK		; CHECK TIME OUT
  4165                              <1> ;;	cmp	word [wait_count], 6*182 ; waiting time (in timer ticks)
  4166                              <1> ;;					; (30 seconds)		
  4167                              <1> ;;	;cmc
  4168                              <1> ;;	;jnc	short RES_1
  4169                              <1> ;;	jb	short RES_1
  4170                              <1> ;;;RES_FL: ;mov	SI,OFFSET F1781 	; INDICATE DISK 1 FAILURE;
  4171                              <1> ;;	;test	DL,1
  4172                              <1> ;;	;jnz	short RES_E1
  4173                              <1> ;;	;mov	SI,OFFSET F1780 	; INDICATE DISK 0 FAILURE
  4174                              <1> ;;	;call	SET_FAIL		; DO NOT TRY TO IPL DISK 0
  4175                              <1> ;;	;jmp	SHORT RES_E1
  4176                              <1> ;;RES_ER: ; 22/12/2014
  4177                              <1> ;;RES_OK:
  4178                              <1> ;;	;pop	CX			; RESTORE TIMER LIMITS
  4179                              <1> ;;	;pop	BX
  4180                              <1> ;;	retn
  4181                              <1> ;;
  4182                              <1> ;;RES_RS: mov	AH,00H			; RESET THE DRIVE
  4183                              <1> ;;	INT	13H
  4184                              <1> ;;RES_CK: mov	AH,08H			; GET MAX CYLINDER,HEAD,SECTOR
  4185                              <1> ;;	mov	BL,DL			; SAVE DRIVE CODE
  4186                              <1> ;;	INT	13H
  4187                              <1> ;;	jc	short RES_ER
  4188                              <1> ;;	mov	[NEC_STATUS],CX 	; SAVE MAX CYLINDER, SECTOR
  4189                              <1> ;;	mov	DL,BL			; RESTORE DRIVE CODE
  4190                              <1> ;;RES_3: mov	AX,0401H		; VERIFY THE LAST SECTOR
  4191                              <1> ;;	INT	13H
  4192                              <1> ;;	jnc	short RES_OK		; VERIFY OK
  4193                              <1> ;;	cmp	AH,BAD_SECTOR		; OK ALSO IF JUST ID READ
  4194                              <1> ;;	JE	short RES_OK
  4195                              <1> ;;	cmp	AH,DATA_CORRECTED
  4196                              <1> ;;	JE	short RES_OK
  4197                              <1> ;;	cmp	AH,BAD_ECC
  4198                              <1> ;;	JE	short RES_OK
  4199                              <1> ;;	;call	POD_TCHK		; CHECK FOR TIME OUT
  4200                              <1> ;;	cmp	word [wait_count], 6*182 ; waiting time (in timer ticks)
  4201                              <1> ;;					; (60 seconds)		
  4202                              <1> ;;	cmc
  4203                              <1> ;;	jc	short RES_ER		; FAILED
  4204                              <1> ;;	mov	CX,[NEC_STATUS] 	; GET SECTOR ADDRESS, AND CYLINDER
  4205                              <1> ;;	mov	AL,CL			; SEPARATE OUT SECTOR NUMBER
  4206                              <1> ;;	and	AL,3FH
  4207                              <1> ;;	dec	AL			; TRY PREVIOUS ONE
  4208                              <1> ;;	jz	short RES_RS		; WE'VE TRIED ALL SECTORS ON TRACK
  4209                              <1> ;;	and	CL,0C0H 		; KEEP CYLINDER BITS
  4210                              <1> ;;	OR	CL,AL			; MERGE SECTOR WITH CYLINDER BITS
  4211                              <1> ;;	mov	[NEC_STATUS],CX 	; SAVE CYLINDER, NEW SECTOR NUMBER
  4212                              <1> ;;	jmp	short RES_3		; TRY AGAIN
  4213                              <1> ;;;RES_ER: mov	SI,OFFSET F1791 	; INDICATE DISK 1 ERROR
  4214                              <1> ;;	;test	DL,1
  4215                              <1> ;;	;jnz	short RES_E1
  4216                              <1> ;;	;mov	SI,OFFSET F1790 	; INDICATE DISK 0 ERROR
  4217                              <1> ;;;RES_E1:
  4218                              <1> ;;	;call	E_MSG			; DISPLAY ERROR AND SET (BP) ERROR FLAG
  4219                              <1> ;;;RES_OK:
  4220                              <1> ;;	;pop	CX			; RESTORE TIMER LIMITS
  4221                              <1> ;;	;pop	BX
  4222                              <1> ;;	;retn
  4223                              <1> ;
  4224                              <1> ;;SET_FAIL:
  4225                              <1> ;	;mov	AX,X*(CMOS_DIAG+NMI)	; GET CMOS ERROR BYTE
  4226                              <1> ;	;call	CMOS_READ
  4227                              <1> ;	;OR	AL,HF_FAIL		; SET DO NOT IPL FROM DISK FLAG
  4228                              <1> ;	;xchg	AH,AL			; SAVE IT
  4229                              <1> ;	;call	CMOS_WRITE		; PUT IT OUT
  4230                              <1> ;	;retn
  4231                              <1> ;
  4232                              <1> ;;POD_TCHK:				; CHECK FOR 30 SECOND TIME OUT
  4233                              <1> ;	;pop	AX			; SAVE RETURN
  4234                              <1> ;	;pop	CX			; GET TIME OUT LIMITS
  4235                              <1> ;	;pop	BX
  4236                              <1> ;	;push	BX			; AND SAVE THEM AGAIN
  4237                              <1> ;	;push	CX
  4238                              <1> ;	;push	AX
  4239                              <1> ;	;push	ds
  4240                              <1> ;	;xor	ax, ax
  4241                              <1> ;	;mov	ds, ax			; RESTORE RETURN
  4242                              <1> ;	;mov	AX, [TIMER_LOW]		; AX = CURRENT TIME
  4243                              <1> ;	;				; BX = START TIME
  4244                              <1> ;	;				; CX = END TIME
  4245                              <1> ;	;pop	ds
  4246                              <1> ;	;cmp	BX,CX
  4247                              <1> ;	;JB	short TCHK1		; START < END
  4248                              <1> ;	;cmp	BX,AX
  4249                              <1> ;	;JB	short TCHKG		; END < START < CURRENT
  4250                              <1> ;	;jmp	SHORT TCHK2		; END, CURRENT < START
  4251                              <1> ;;TCHK1: cmp	AX,BX
  4252                              <1> ;;	JB	short TCHKNG		; CURRENT < START < END
  4253                              <1> ;;TCHK2: cmp	AX,CX
  4254                              <1> ;;	JB	short TCHKG		; START < CURRENT < END
  4255                              <1> ;;					; OR CURRENT < END < START
  4256                              <1> ;;TCHKNG: STC				; CARRY SET INDICATES TIME OUT
  4257                              <1> ;;	retn
  4258                              <1> ;;TCHKG: CLC				; INDICATE STILL TIME
  4259                              <1> ;;	retn
  4260                              <1> ;;
  4261                              <1> ;;int_13h:
  4262                              <1> 
  4263                              <1> ;----------------------------------------
  4264                              <1> ;	FIXED DISK BIOS ENTRY POINT	:
  4265                              <1> ;----------------------------------------
  4266                              <1> 
  4267                              <1> ; 17/07/2022
  4268                              <1> ; 16/07/2022
  4269                              <1> ; 13/07/2022 - TRDOS 386 v2.0.5
  4270                              <1> ; 15/01/2017
  4271                              <1> ; 14/01/2017
  4272                              <1> ; 07/01/2017
  4273                              <1> ; 02/01/2017
  4274                              <1> ; 01/06/2016
  4275                              <1> ; 16/05/2016, 27/05/2016, 28/05/2016, 29/05/2016
  4276                              <1> ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
  4277                              <1> int33h: ; DISK I/O
  4278                              <1> 	; 29/05/2016
  4279 00004EF2 80642408FE          <1> 	and	byte [esp+8], 11111110b  ; clear carry bit of eflags register
  4280                              <1> 
  4281                              <1> 	; 13/07/2022
  4282 00004EF7 06                  <1> 	push	es
  4283                              <1> 	; 16/05/2016
  4284 00004EF8 1E                  <1> 	push	ds
  4285 00004EF9 53                  <1> 	push	ebx ; user's buffer address (virtual)
  4286                              <1> 	; 13/07/2022
  4287 00004EFA 51                  <1> 	push	ecx
  4288 00004EFB 52                  <1> 	push	edx
  4289 00004EFC 56                  <1> 	push	esi
  4290 00004EFD 57                  <1> 	push	edi
  4291                              <1> 
  4292                              <1> 	;mov	bx, KDATA ; System (Kernel's) data segment
  4293                              <1> 	;mov	ds, bx
  4294                              <1> 	; 13/07/2022
  4295 00004EFE 66BF1000            <1> 	mov	di, KDATA
  4296 00004F02 8EDF                <1> 	mov	ds, di
  4297 00004F04 8EC7                <1> 	mov	es, di
  4298                              <1> 
  4299                              <1> 	;;15/01/2017
  4300                              <1> 	; 14/01/2017
  4301                              <1> 	; 02/01/2017
  4302                              <1> 	;;mov	byte [intflg], 33h  ; disk io interrupt 
  4303                              <1> 	;pop	ebx
  4304                              <1> 
  4305                              <1> 	; 13/07/2022
  4306                              <1> 	;pop	dword [user_buffer] ; 01/06/2016
  4307 00004F06 891D[10850100]      <1> 	mov	[user_buffer], ebx		
  4308                              <1> 
  4309 00004F0C C605[4E7E0100]00    <1> 	mov	byte [scount], 0 ; sector count for transfer
  4310 00004F13 80FC03              <1> 	cmp	ah, 03h ; chs write
  4311 00004F16 773C                <1> 	ja	short int33h_2
  4312 00004F18 7407                <1> 	je	short int33h_0
  4313 00004F1A 80FC02              <1> 	cmp	ah, 02h ; chs read
  4314 00004F1D 7267                <1> 	jb	short int33h_5
  4315 00004F1F EB5A                <1> 	jmp	short int33h_4
  4316                              <1> int33h_0:
  4317                              <1> 	;; 17/07/2022 - 64K r/w buffer limit check ?
  4318                              <1> 	;cmp	al, 80h ; 128	
  4319                              <1> 	;ja	short int33h_8 ; error
  4320                              <1> 	;; 17/07/2022 - zero r/w count check ?
  4321                              <1> 	;or	al, al
  4322                              <1> 	;jz	short int33h_8 ; error
  4323                              <1> 	
  4324                              <1> 	; 17/07/2022 (buffer limit and zero count check)
  4325 00004F21 FEC8                <1> 	dec	al
  4326 00004F23 781A                <1> 	js	short int33h_8 ; error
  4327 00004F25 FEC0                <1> 	inc	al	
  4328                              <1> 
  4329                              <1> 	; transfer user's buffer content to sector buffer
  4330 00004F27 51                  <1> 	push	ecx
  4331 00004F28 0FB6C8              <1> 	movzx	ecx, al
  4332                              <1> int33h_1:
  4333                              <1> 	; 13/07/2022
  4334                              <1> 	;push	esi
  4335                              <1> 	;mov	esi, [user_buffer]
  4336 00004F2B 89DE                <1> 	mov	esi, ebx
  4337                              <1> 	; esi = user's buffer address (virtual, ebx)
  4338                              <1> 	;push	edi
  4339                              <1> 	;push	es
  4340 00004F2D 50                  <1> 	push	eax
  4341                              <1> 	;mov	ax, KDATA
  4342                              <1> 	;mov	es, ax
  4343 00004F2E BF00000700          <1> 	mov	edi, Cluster_Buffer
  4344 00004F33 C1E109              <1> 	shl	ecx, 9 ; * 512
  4345 00004F36 E8A0BF0000          <1> 	call	transfer_from_user_buffer
  4346                              <1> 		; (ecx and eax will be modified)
  4347 00004F3B 58                  <1> 	pop	eax
  4348                              <1> 	; 13/07/2022
  4349                              <1> 	;pop	es
  4350                              <1> 	;pop	edi
  4351                              <1> 	;pop	esi
  4352 00004F3C 59                  <1> 	pop	ecx
  4353 00004F3D 7347                <1> 	jnc	short int33h_5
  4354                              <1> 
  4355                              <1> 	;mov	ebx, [user_buffer] ; 01/06/2016
  4356                              <1> 	;pop	ds
  4357                              <1> 
  4358                              <1> int33h_8:
  4359                              <1> 	; 13/07/2022
  4360 00004F3F B8FF000000          <1> 	mov	eax, 0FFh ; Unknown error !?
  4361                              <1> int33h_9:
  4362 00004F44 5F                  <1> 	pop	edi
  4363 00004F45 5E                  <1> 	pop	esi
  4364 00004F46 5A                  <1> 	pop	edx
  4365 00004F47 59                  <1> 	pop	ecx
  4366 00004F48 5B                  <1> 	pop	ebx
  4367 00004F49 1F                  <1> 	pop	ds
  4368 00004F4A 07                  <1> 	pop	es
  4369                              <1> 
  4370                              <1> 	; 13/07/2022
  4371 00004F4B 7305                <1> 	jnc	short int33h_7
  4372                              <1> 
  4373                              <1> 	;;15/01/2017
  4374                              <1> 	; 02/01/2017
  4375                              <1> 	;cli
  4376                              <1> 	;;mov	byte [ss:intflg], 0 ; 07/01/2017
  4377                              <1> 	;
  4378                              <1> 	; (*) 29/05/2016
  4379                              <1> 	; (*) retf 4 ; skip eflags on stack
  4380                              <1> 
  4381                              <1> 	; 29/05/2016 -set carry flag on stack-
  4382                              <1> 	; [esp] = EIP
  4383                              <1> 	; [esp+4] = CS
  4384                              <1> 	; [esp+8] = E-FLAGS
  4385 00004F4D 804C240801          <1> 	or	byte [esp+8], 1  ; set carry bit of eflags register
  4386                              <1> 	; [esp+12] = ESP (user)
  4387                              <1> 	; [esp+16] = SS (User)
  4388                              <1> 	;
  4389                              <1> 	; 13/07/2022
  4390                              <1> int33h_7:	
  4391 00004F52 FA                  <1> 	cli
  4392                              <1> 	;;15/01/2017
  4393                              <1> 	;;mov	byte [ss:intflg], 0 ; 07/01/2017
  4394                              <1> 	; cf = 0  ; use eflags which is in stack
  4395 00004F53 CF                  <1> 	iretd	
  4396                              <1> 
  4397                              <1> 	; (*) 29/05/2016 - 'retf 4' intruction causes to stack fault
  4398                              <1> 	; (OUTER-PRIVILEGE-LEVEL)
  4399                              <1> 	; INTEL 80386 PROGRAMMER'S REFERENCE MANUAL 1986
  4400                              <1> 	; // RETF instruction:
  4401                              <1> 	;
  4402                              <1> 	; IF OperandMode=32 THEN
  4403                              <1>  	;    Load CS:EIP from stack;
  4404                              <1>  	;    Set CS RPL to CPL;
  4405                              <1>  	;    Increment ESP by 8 plus the immediate offset if it exists;
  4406                              <1>  	;    Load SS:ESP from stack;
  4407                              <1>  	; ELSE (* OperandMode=16 *)
  4408                              <1>  	;    Load CS:IP from stack;
  4409                              <1>  	;    Set CS RPL to CPL;
  4410                              <1>  	;    Increment ESP by 4 plus the immediate offset if it exists;
  4411                              <1> 	;    Load SS:ESP from stack;
  4412                              <1>  	; FI;
  4413                              <1> 	;
  4414                              <1> 	; //
  4415                              <1> 
  4416                              <1> int33h_2:
  4417 00004F54 80FC05              <1> 	cmp	ah, 05h ; format track
  4418 00004F57 7709                <1> 	ja	short int33h_3
  4419 00004F59 722B                <1> 	jb	short int33h_5
  4420 00004F5B 51                  <1> 	push	ecx
  4421                              <1> 	;mov	ecx, 1
  4422                              <1> 	; 17/07/2022
  4423 00004F5C 31C9                <1> 	xor	ecx, ecx
  4424 00004F5E FEC1                <1> 	inc	cl
  4425                              <1> 	; ecx = 1
  4426 00004F60 EBC9                <1> 	jmp	short int33h_1
  4427                              <1> int33h_3:
  4428 00004F62 80FC1C              <1> 	cmp	ah, 1Ch ; LBA write
  4429 00004F65 771F                <1> 	ja	short int33h_5
  4430 00004F67 74B8                <1> 	je	short int33h_0
  4431 00004F69 80FC1B              <1> 	cmp	ah, 1Bh ; LBA read
  4432 00004F6C 740D                <1> 	je	short int33h_4
  4433 00004F6E 80FC08              <1> 	cmp	ah, 08h ; get disk parameters
  4434 00004F71 7513                <1> 	jne	short int33h_5
  4435                              <1> 	; 01/06/2016
  4436 00004F73 8B1D[10850100]      <1> 	mov	ebx, [user_buffer] ; user's buffer address
  4437 00004F79 EB10                <1> 	jmp	short int33h_6
  4438                              <1> int33h_4:
  4439                              <1> 	;; 17/07/2022 - 64K r/w buffer limit check ?
  4440                              <1> 	;cmp	al, 80h ; 128	
  4441                              <1> 	;ja	short int33h_8 ; error
  4442                              <1> 	;; 17/07/2022 - zero r/w count check ?
  4443                              <1> 	;or	al, al
  4444                              <1> 	;jz	short int33h_8 ; error
  4445                              <1> 
  4446                              <1> 	; 17/07/2022 (buffer limit and zero count check)
  4447 00004F7B FEC8                <1> 	dec	al
  4448 00004F7D 78C0                <1> 	js	short int33h_8 ; error
  4449 00004F7F FEC0                <1> 	inc	al
  4450                              <1> 
  4451 00004F81 A2[4E7E0100]        <1> 	mov	byte [scount], al ; <= 128 sectors
  4452                              <1> int33h_5:
  4453 00004F86 BB00000700          <1> 	mov	ebx, Cluster_Buffer ; max. 65536 bytes
  4454                              <1> 				    ; buf. addr: 70000h	
  4455                              <1> 	;mov	byte [ClusterBuffer_Valid], 0
  4456                              <1> int33h_6:
  4457                              <1> 	; 13/07/2022
  4458                              <1> 	;pop	ds
  4459                              <1> 	;pushfd
  4460                              <1> 	;push 	cs
  4461                              <1> 	
  4462 00004F8B E83B000000          <1> 	call 	DISK_IO
  4463                              <1> 	
  4464                              <1> 	;;mov	ebx, [cs:user_buffer] ; 01/06/2016
  4465                              <1> 	;mov	ebx, [user_buffer] ; 13/07/2022 
  4466 00004F90 72B2                <1> 	jc	short int33h_9
  4467                              <1> 	;
  4468                              <1> 	;cmp	byte [cs:scount], 0
  4469                              <1> 	;jna	short int33h_7	
  4470 00004F92 803D[4E7E0100]00    <1> 	cmp	byte [scount], 0 ; 13/07/2022
  4471 00004F99 76A9                <1> 	jna	short int33h_9
  4472                              <1> 
  4473                              <1> 	; 13/07/2022
  4474                              <1> 
  4475                              <1> 	; transfer sector buffer content to user's buffer
  4476                              <1> 	;push	es
  4477                              <1> 	;push	ds
  4478                              <1> 	;push	eax
  4479                              <1> 	;mov	ax, KDATA
  4480                              <1> 	;mov	ds, ax
  4481                              <1> 	;mov	es, ax
  4482                              <1> 	;push	ecx
  4483                              <1> 	;push	esi
  4484                              <1> 	;push	edi
  4485                              <1> 	
  4486                              <1> 	; 13/07/2022
  4487 00004F9B 50                  <1> 	push	eax
  4488 00004F9C 0FB60D[4E7E0100]    <1> 	movzx	ecx, byte [scount]
  4489 00004FA3 C1E109              <1> 	shl	ecx, 9 ; * 512 bytes
  4490                              <1> 	;mov	edi, ebx ; user's buffer address
  4491 00004FA6 8B3D[10850100]      <1> 	mov	edi, [user_buffer] ; 13/07/2022
  4492 00004FAC BE00000700          <1> 	mov	esi, Cluster_Buffer
  4493 00004FB1 E8DBBE0000          <1> 	call	transfer_to_user_buffer 
  4494                              <1> 		; (ecx and eax will be modified)
  4495 00004FB6 58                  <1> 	pop	eax
  4496                              <1> 
  4497                              <1> 	; 13/07/2022
  4498 00004FB7 7286                <1> 	jc	short int33h_8 ; eax = 0FFh
  4499 00004FB9 EB89                <1> 	jmp	short int33h_9 ; cf = 0
  4500                              <1> 
  4501                              <1> 	;pop	edi
  4502                              <1> 	;pop	esi
  4503                              <1> 	;pop	ecx
  4504                              <1> 	;pop	eax
  4505                              <1> 	;pop	ds
  4506                              <1> 	;pop	es
  4507                              <1> 	;jc	short int33h_8
  4508                              <1> ;int33h_7:
  4509                              <1> 	;cli
  4510                              <1> 	;;;15/01/2017
  4511                              <1> 	;;;mov	byte [ss:intflg], 0 ; 07/01/2017
  4512                              <1> 	;; cf = 0  ; use eflags which is in stack
  4513                              <1> 	;iretd	
  4514                              <1> ;int33h_8:
  4515                              <1> 	;mov	eax, 0FFh ; Unknown error !?
  4516                              <1> 	; 13/07/2022
  4517                              <1> 	;xor	eax, eax
  4518                              <1> 	;dec	al  ; eax = 0FFh	
  4519                              <1> 	;jmp	short int33h_9
  4520                              <1> 	 
  4521                              <1> ;int33h_9:
  4522                              <1> 	;; cf = 1
  4523                              <1> 	;
  4524                              <1> 	;; (*) 29/05/2016	
  4525                              <1> 	;; (*) retf 4 ; skip eflags on stack
  4526                              <1> 	;; Note: This 'retf 4' was wrong, -it was causing
  4527                              <1> 	;;       to stack errors in ring 3-
  4528                              <1> 	;;	POP sequence of 'retf 4' is as
  4529                              <1> 	;;       "eip, cs, eflags, esp, ss, +4 bytes" 
  4530                              <1>         ;;       it is not as "eip, cs, +4 bytes, esp, ss" ! 
  4531                              <1> 	;
  4532                              <1> 	;; 29/05/2016 -set carry flag on stack-
  4533                              <1> 	;or	byte [esp+8], 1  ; set carry bit of eflags register
  4534                              <1> 	;;iretd
  4535                              <1> 	;jmp	short int33h_7 ; 07/01/2017
  4536                              <1> 
  4537                              <1> ;; 11/04/2021
  4538                              <1> ;int13h: ; 21/02/2015
  4539                              <1> ;	clc ; 11/04/2021
  4540                              <1> ;	pushfd
  4541                              <1> ;	push 	cs
  4542                              <1> ;	call 	DISK_IO
  4543                              <1> ;	retn
  4544                              <1> 
  4545                              <1> int13h:
  4546                              <1> 	; 13/07/2022 - TRDOS 386 v2.0.5
  4547                              <1> 	; Note: DISK_IO sets registers on stack
  4548                              <1> 	; 	as return parameters. So,
  4549                              <1> 	;	stack order (at the entry of 'DISK_IO')
  4550                              <1> 	;	must be same with 'int33h:' as above.
  4551                              <1> 		
  4552                              <1> 	;push	es ; not necessary
  4553                              <1> 	;push	ds ; not necessary
  4554                              <1> 	;
  4555                              <1> 	; following pushes are necessary
  4556                              <1> 	; for setting registers -return values- in DISK_IO
  4557 00004FBB 53                  <1> 	push	ebx
  4558 00004FBC 51                  <1> 	push	ecx
  4559 00004FBD 52                  <1> 	push	edx
  4560 00004FBE 56                  <1> 	push	esi
  4561 00004FBF 57                  <1> 	push	edi
  4562                              <1> 	;push	ebp
  4563                              <1> 	;mov	ebp, esp
  4564                              <1> 	; edi = ebp+4
  4565                              <1> 	; esi = ebp+8
  4566                              <1> 	; edx = ebp+12
  4567                              <1> 	; ecx = ebp+16
  4568                              <1> 	; ebx = ebp+20
  4569                              <1> 	;
  4570 00004FC0 E806000000          <1> 	call	DISK_IO
  4571                              <1> 	;
  4572 00004FC5 5F                  <1> 	pop	edi
  4573 00004FC6 5E                  <1> 	pop	esi
  4574 00004FC7 5A                  <1> 	pop	edx
  4575 00004FC8 59                  <1> 	pop	ecx
  4576 00004FC9 5B                  <1> 	pop	ebx	
  4577                              <1> 	;
  4578                              <1> 	;pop	ds
  4579                              <1> 	;pop	es
  4580                              <1> 	;
  4581 00004FCA C3                  <1> 	retn
  4582                              <1> 
  4583                              <1> ; 10/08/2022
  4584                              <1> ; 07/08/2022
  4585                              <1> ; 17/07/2022
  4586                              <1> ; 13/07/2022 - TRDOS 386 v2.0.5
  4587                              <1> ; 18/04/2021 - TRDOS 386 v2.0.4
  4588                              <1> ; 11/04/2021 - TRDOS 386 v2.0.3
  4589                              <1> ; 30/08/2020
  4590                              <1> ; 09/12/2017
  4591                              <1> ; 29/05/2016
  4592                              <1> ; 27/05/2016 - TRDOS 386 (TRDOS v2.0)
  4593                              <1> 
  4594                              <1> DISK_IO:
  4595                              <1> 	; 10/08/2022
  4596                              <1> 	; 17/07/2022
  4597                              <1> 	; 13/07/2022
  4598                              <1> 	; Registers are also on stack 
  4599                              <1> 	; (with same contents) 
  4600                              <1> 	; in following order:
  4601                              <1> 	;
  4602                              <1> 	;    ebx = esp+20
  4603                              <1> 	;    ecx = esp+16
  4604                              <1> 	;    edx = esp+12
  4605                              <1> 	;    esi = esp+8
  4606                              <1> 	;    edi = esp+4
  4607                              <1> 
  4608                              <1> 	; cs = KCODE (== KDATA base address)
  4609                              <1> 	; ss = KDATA
  4610                              <1> 	; ds = KDATA
  4611                              <1> 	; es = KDATA
  4612                              <1> 
  4613                              <1> 	; 17/07/2022
  4614 00004FCB FB                  <1> 	sti				; ENABLE INTERRUPTS
  4615                              <1> 
  4616 00004FCC 80FA80              <1> 	cmp	dl, 80h			; TEST FOR FIXED DISK DRIVE
  4617                              <1> 	;jae	short A1		; YES, HANDLE HERE
  4618                              <1> 	;;;int	40h			; DISKETTE HANDLER
  4619                              <1> 	;;call	int40h
  4620                              <1> 	;jb	DISKETTE_IO_1
  4621                              <1> ;RET_2:
  4622                              <1> 	;;retf	2			; BACK TO CALLER
  4623                              <1> 	;retf	4
  4624                              <1> 	; 11/04/2021
  4625 00004FCF 7305                <1> 	jnb	short A1
  4626 00004FD1 E935F2FFFF          <1> 	jmp	DISKETTE_IO_1
  4627                              <1> A1:
  4628                              <1> 	;sti	 ; 17/07/2022		; ENABLE INTERRUPTS
  4629                              <1> 	
  4630                              <1> 	;; 04/01/2015
  4631                              <1> 	;;or	ah, ah
  4632                              <1> 	;;jnz	short A2
  4633                              <1> 	;;int	40h			; RESET NEC WHEN AH=0
  4634                              <1> 	;;sub	ah, ah
  4635                              <1> 	
  4636 00004FD6 80FA83              <1> 	cmp	dl, (80h + S_MAX_FILE - 1)
  4637                              <1> 	;ja	short RET_2
  4638 00004FD9 760A                <1> 	jna	short _A0
  4639                              <1> 	
  4640                              <1> 	; 13/07/2022
  4641                              <1> 	; (here, DS is KDATA segment already) 
  4642                              <1> 	;
  4643                              <1> 	; 29/05/2016
  4644                              <1> 	;push	ds
  4645                              <1> 	; 11/04/2021
  4646                              <1> 	;push	eax
  4647                              <1> 	;mov	ax, KDATA
  4648                              <1> 	;mov	ds, ax
  4649                              <1> 	; 11/04/2021
  4650                              <1> 	;pop	eax
  4651                              <1> 	
  4652 00004FDB B4AA                <1> 	mov     ah, 0AAh        ; Hard disk drive not ready !
  4653                              <1> 				; (Programmer's guide to AMIBIOS, 1992)
  4654 00004FDD 8825[1F790100]      <1> 	mov     byte [DISK_STATUS1], ah
  4655                              <1> 	; 13/07/2022
  4656                              <1> 	;pop	ds
  4657                              <1> 	;jmp	short RET_2
  4658 00004FE3 F9                  <1> 	stc
  4659 00004FE4 C3                  <1> 	retn
  4660                              <1> _A0:
  4661                              <1> 	; 18/01/2015
  4662 00004FE5 08E4                <1> 	or	ah, ah
  4663 00004FE7 742C                <1> 	jz	short A4
  4664 00004FE9 80FC0D              <1> 	cmp	ah, 0Dh	; Alternate reset
  4665 00004FEC 7504                <1> 	jne	short A2
  4666 00004FEE 28E4                <1> 	sub	ah, ah	; Reset
  4667 00004FF0 EB23                <1> 	jmp	short A4
  4668                              <1> A2:
  4669                              <1> 	; 13/07/2022
  4670 00004FF2 80FC08              <1> 	cmp	ah, 08h			; GET PARAMETERS IS A SPECIAL CASE
  4671 00004FF5 7505                <1> 	jne	short A3
  4672 00004FF7 E94B040000          <1>         jmp	GET_PARM_N
  4673                              <1> A3:	
  4674                              <1> 	; 13/07/2022
  4675 00004FFC 80FC15              <1> 	cmp	ah, 15h			; READ DASD TYPE IS ALSO
  4676 00004FFF 7514                <1> 	jne	short A4
  4677 00005001 E9E6030000          <1>         jmp	READ_DASD_TYPE	; Return Drive Type
  4678                              <1> 				; (Programmer's guide to AMIBIOS, 1992)
  4679                              <1> 	; 13/07/2022
  4680                              <1> int33h_bad_cmd:
  4681                              <1> 	; 16/05/2016
  4682                              <1> 	; 30/01/2015
  4683                              <1> 	; 29/05/2016
  4684                              <1> 	;push	ds
  4685                              <1> 	;push	eax
  4686                              <1> 	;mov	ax, KDATA
  4687                              <1> 	;mov	ds, ax
  4688                              <1> 	;pop	eax
  4689                              <1> 
  4690 00005006 B401                <1> 	mov	ah, BAD_CMD
  4691 00005008 8825[1F790100]      <1> 	mov     [DISK_STATUS1], ah ; BAD_CMD  ; COMMAND ERROR
  4692                              <1>         ;jmp	short RET_2
  4693                              <1> 	; 13/07/2022
  4694                              <1> ;RET_2:
  4695                              <1> 	; (*) 29/05/2016
  4696                              <1> 	; (*) retf 4
  4697                              <1> 	;or	byte [esp+8], 1 ; set carry bit of eflags register
  4698                              <1> 	;iretd
  4699                              <1> 	
  4700                              <1> 	; 13/07/2022
  4701 0000500E F9                  <1> 	stc
  4702                              <1> 	; cf = 1, ah = BAD_CMD
  4703 0000500F C3                  <1> 	retn
  4704                              <1> _A4:
  4705                              <1> 	; 13/07/2022
  4706                              <1> 	; 02/02/2015
  4707 00005010 80FC1D              <1> 	cmp	ah, 1Dh			; (Temporary for Retro UNIX 386 v1)
  4708                              <1> 	; 12/01/2015
  4709                              <1> 	;cmc
  4710                              <1> 	;jnc	short A4
  4711                              <1> 	; 13/07/2022
  4712 00005013 73F1                <1> 	jnb	short int33h_bad_cmd	
  4713                              <1> A4:					; SAVE REGISTERS DURING OPERATION
  4714 00005015 C8080000            <1> 	enter	8, 0			; SAVE (BP) AND MAKE ROOM FOR @CMD_BLOCK
  4715                              <1> 	
  4716                              <1> 	; 13/07/2022
  4717                              <1> 	; ENTER 8, 0
  4718                              <1> 	;;push	ebp
  4719                              <1> 	;;mov	ebp, esp
  4720                              <1> 	;;sub	esp, 8
  4721                              <1> 	;
  4722                              <1> 	;push	ebx			;  IN THE STACK, THE COMMAND BLOCK IS:
  4723                              <1> 	;push	ecx			;   @CMD_BLOCK == BYTE PTR [BP]-8
  4724                              <1> 	;push	edx
  4725                              <1> 	;push	esi
  4726                              <1> 	;push	edi
  4727                              <1> 
  4728                              <1> 	; 13/07/2022
  4729                              <1> 	; edi = ebp+8
  4730                              <1> 	; esi = ebp+12
  4731                              <1> 	; edx = ebp+16
  4732                              <1> 	; ecx = ebp+20
  4733                              <1> 	; ebx = ebp+24
  4734                              <1> 
  4735                              <1> 	;;04/01/2015
  4736                              <1> 	;;or	ah, ah			; CHECK FOR RESET
  4737                              <1> 	;;jnz	short A5
  4738                              <1> 	;;mov	dl, 80h			; FORCE DRIVE 80 FOR RESET
  4739                              <1> ;;A5:	
  4740                              <1> 	; 13/07/2022
  4741 00005019 E880000000          <1> 	call	DISK_IO_CONT		; PERFORM THE OPERATION
  4742                              <1> 	;;call	DDS			; ESTABLISH SEGMENT
  4743 0000501E 8A25[1F790100]      <1> 	mov	ah, [DISK_STATUS1]	; GET STATUS FROM OPERATION
  4744                              <1> 	;(*) cmp ah, 1			; SET THE CARRY FLAG TO INDICATE
  4745                              <1> 					; SUCCESS OR FAILURE
  4746                              <1> 	;pop	edi			; RESTORE REGISTERS
  4747                              <1> 	;pop	esi
  4748                              <1> 	;pop	edx
  4749                              <1> 	;pop	ecx
  4750                              <1> 	;pop	ebx
  4751                              <1> 	
  4752 00005024 C9                  <1> 	leave				; ADJUST (SP) AND RESTORE (BP)
  4753                              <1> 	
  4754                              <1> 	;retf	2			; THROW AWAY SAVED FLAGS
  4755                              <1> 	; (*) 29/05/2016
  4756                              <1> 	; (*) retf 4
  4757                              <1> 	
  4758                              <1> 	; 13/07/2022
  4759 00005025 80FC01              <1> 	cmp	ah, 1
  4760                              <1> 	;jc	short _A5 
  4761                              <1> 	;or	byte [esp+8], 1 ; set carry bit of eflags register
  4762                              <1> ;_A5:
  4763                              <1> 	;iretd
  4764                              <1> 	; 10/08/2022
  4765 00005028 F5                  <1> 	cmc
  4766                              <1> 	; 13/07/2022
  4767 00005029 C3                  <1> 	retn
  4768                              <1> 
  4769                              <1> ; 21/02/2015
  4770                              <1> ;       dw --> dd
  4771                              <1> 	; 13/07/2022
  4772                              <1> D1:					; FUNCTION TRANSFER TABLE
  4773 0000502A [7B520000]          <1> 	dd	DISK_RESET		; 00h
  4774 0000502E [DB520000]          <1> 	dd	RETURN_STATUS		; 01h
  4775 00005032 [EE520000]          <1> 	dd	DISK_READ		; 02h
  4776 00005036 [4A530000]          <1> 	dd	DISK_WRITE		; 03h
  4777 0000503A [D4530000]          <1> 	dd	DISK_VERF		; 04h
  4778 0000503E [BE530000]          <1> 	dd	FMT_TRK 		; 05h
  4779 00005042 [D7510000]          <1> 	dd	BAD_COMMAND		; 06h	FORMAT BAD SECTORS
  4780 00005046 [D7510000]          <1> 	dd	BAD_COMMAND		; 07h	FORMAT DRIVE
  4781 0000504A [D7510000]          <1> 	dd	BAD_COMMAND		; 08h	RETURN PARAMETERS
  4782 0000504E [C7540000]          <1> 	dd	INIT_DRV		; 09h
  4783 00005052 [E8520000]          <1> 	dd	RD_LONG 		; 0Ah
  4784 00005056 [44530000]          <1> 	dd	WR_LONG 		; 0Bh
  4785 0000505A [38550000]          <1> 	dd	DISK_SEEK		; 0Ch
  4786 0000505E [7B520000]          <1> 	dd	DISK_RESET		; 0Dh
  4787 00005062 [D7510000]          <1> 	dd	BAD_COMMAND		; 0Eh	READ BUFFER
  4788 00005066 [D7510000]          <1> 	dd	BAD_COMMAND		; 0Fh	WRITE BUFFER
  4789 0000506A [60550000]          <1> 	dd	TST_RDY 		; 10h
  4790 0000506E [84550000]          <1> 	dd	HDISK_RECAL		; 11h
  4791 00005072 [D7510000]          <1> 	dd	BAD_COMMAND		; 12h	MEMORY DIAGNOSTIC
  4792 00005076 [D7510000]          <1> 	dd	BAD_COMMAND		; 13h	DRIVE DIAGNOSTIC
  4793 0000507A [BA550000]          <1> 	dd	CTLR_DIAGNOSTIC 	; 14h	CONTROLLER DIAGNOSTIC
  4794                              <1> 	;; 02/02/2015 (Temporary - Retro UNIX 386 v1 - DISK I/O test)
  4795 0000507E [D7510000]          <1> 	dd	BAD_COMMAND		; 15h
  4796 00005082 [D7510000]          <1> 	dd	BAD_COMMAND		; 16h
  4797 00005086 [D7510000]          <1> 	dd	BAD_COMMAND		; 17h
  4798 0000508A [D7510000]          <1> 	dd	BAD_COMMAND		; 18h
  4799 0000508E [D7510000]          <1> 	dd	BAD_COMMAND		; 19h
  4800 00005092 [D7510000]          <1> 	dd	BAD_COMMAND		; 1Ah
  4801 00005096 [EE520000]          <1> 	dd	DISK_READ		; 1Bh ; LBA read
  4802 0000509A [4A530000]          <1> 	dd	DISK_WRITE		; 1Ch ; LBA write
  4803                              <1> D1L     EQU    $ - D1
  4804                              <1> 
  4805                              <1> 	; 02/12/2023
  4806                              <1> 	; 01/12/2023 - TRDOS 386 v2.0.7 
  4807                              <1> 	; 07/08/2022
  4808                              <1> 	; 17/07/2022 - TRDOS 386 v2.0.5
  4809                              <1> DISK_IO_CONT:
  4810                              <1> 	;;call	DDS			; ESTABLISH SEGMENT
  4811                              <1> 	; 11/04/2021
  4812 0000509E 80FC01              <1> 	cmp	ah, 01h			; RETURN STATUS
  4813 000050A1 7505                <1> 	jne	short SU0
  4814 000050A3 E933020000          <1> 	jmp	RETURN_STATUS
  4815                              <1> SU0:
  4816 000050A8 C605[1F790100]00    <1> 	mov	byte [DISK_STATUS1], 0 	; RESET THE STATUS INDICATOR
  4817                              <1> 	; 13/07/2022
  4818 000050AF 89DE                <1> 	mov	esi, ebx ; 21/02/2015	; SAVE DATA ADDRESS
  4819 000050B1 8A1D[20790100]      <1> 	mov	bl, [HF_NUM]		; GET NUMBER OF DRIVES
  4820 000050B7 80E27F              <1> 	and	dl, 7Fh			; GET DRIVE AS 0 OR 1
  4821                              <1> 					; (get drive number as 0 to 3)
  4822                              <1> 	; 14/02/2015 
  4823 000050BA 38D3                <1> 	cmp	bl, dl
  4824                              <1> 	;jbe	short BAD_COMMAND	; INVALID DRIVE
  4825                              <1> 	; 07/08/2022
  4826 000050BC 7705                <1> 	ja	short SU0X
  4827 000050BE E914010000          <1> 	jmp	BAD_COMMAND
  4828                              <1> SU0X:
  4829                              <1> 	;;03/01/2015
  4830 000050C3 29DB                <1> 	sub	ebx, ebx
  4831 000050C5 88D3                <1> 	mov	bl, dl
  4832 000050C7 883D[34790100]      <1> 	mov	[LBAMode], bh 	; 0
  4833                              <1> 	
  4834                              <1> 	;test	byte [ebx+hd0_type], 1 	; LBA ready ?
  4835                              <1> 	;jz	short su1		; no
  4836                              <1> 	;inc	byte [LBAMode]
  4837                              <1> ;su1:
  4838                              <1> 	; 11/04/2021 (32 bit push/pop)
  4839                              <1> 	; 21/02/2015 (32 bit modification)
  4840                              <1> 	; 04/01/2015
  4841 000050CD 50                  <1> 	push	eax ; ***
  4842                              <1> 	;push	es  ; **
  4843 000050CE 52                  <1> 	push	edx ; *
  4844 000050CF 50                  <1> 	push	eax ; ****
  4845 000050D0 E88C060000          <1> 	call	GET_VEC 		; GET DISK PARAMETERS
  4846                              <1> 	; 02/02/2015
  4847                              <1> 	;mov	ax, [ES:BX+16] ; I/O port base address (1F0h, 170h)
  4848 000050D5 668B4310            <1> 	mov	ax, [ebx+16]
  4849 000050D9 66A3[0E660000]      <1> 	mov	[HF_PORT], ax
  4850                              <1> 	;mov	dx, [ES:BX+18] ; control port address (3F6h, 376h)
  4851 000050DF 668B5312            <1> 	mov	dx, [ebx+18]
  4852 000050E3 668915[10660000]    <1> 	mov	[HF_REG_PORT], dx
  4853                              <1> 	;mov	al, [ES:BX+20] ; head register upper nibble (A0h,B0h,E0h,F0h)
  4854 000050EA 8A4314              <1> 	mov	al, [ebx+20]
  4855                              <1> 	; 23/02/2015
  4856 000050ED A840                <1> 	test	al, 40h	 ; LBA bit (bit 6)
  4857 000050EF 7406                <1> 	jz 	short su1
  4858 000050F1 FE05[34790100]      <1> 	inc	byte [LBAMode] ; 1 
  4859                              <1> su1: 	 
  4860 000050F7 C0E804              <1> 	shr 	al, 4
  4861 000050FA 2401                <1> 	and	al, 1			
  4862 000050FC A2[12660000]        <1> 	mov	[hf_m_s], al 
  4863                              <1> 	;
  4864                              <1> 	; 03/01/2015
  4865                              <1> 	;mov	al, [ES:BX+8]		; GET CONTROL BYTE MODIFIER
  4866 00005101 8A4308              <1> 	mov	al, [ebx+8]
  4867                              <1> 	;mov	dx, [HF_REG_PORT]	; Device Control register
  4868 00005104 EE                  <1> 	out	dx, al			; SET EXTRA HEAD OPTION
  4869                              <1> 					; -here-
  4870                              <1> 					; Control Byte: (= 08h)
  4871                              <1> 					;  bit 0 - 0
  4872                              <1> 					;  bit 1 - nIEN (1 = disable irq)
  4873                              <1> 					;  bit 2 - SRST (software RESET)
  4874                              <1> 					;  bit 3 - use extra heads (8 to 15)
  4875                              <1> 					;          -always set to 1-	
  4876                              <1> 					;  (bits 3 to 7 are reserved
  4877                              <1> 					;          for ATA devices)
  4878 00005105 8A25[21790100]      <1> 	mov	ah, [CONTROL_BYTE]	; SET EXTRA HEAD OPTION IN
  4879 0000510B 80E4C0              <1> 	and	ah, 0C0h 		; CONTROL BYTE
  4880 0000510E 08C4                <1> 	or	ah, al
  4881 00005110 8825[21790100]      <1> 	mov	[CONTROL_BYTE], ah
  4882                              <1> 	
  4883                              <1> 	; 11/04/2021 (32 bit push/pop)
  4884                              <1> 	; 04/01/2015
  4885 00005116 58                  <1> 	pop	eax ; ****
  4886 00005117 5A                  <1> 	pop	edx ; * ; 14/02/2015
  4887 00005118 20E4                <1> 	and	ah, ah	; Reset function ?
  4888 0000511A 7506                <1> 	jnz	short su2
  4889                              <1> 	;pop	es ; **
  4890 0000511C 58                  <1> 	pop	eax ; ***
  4891 0000511D E959010000          <1>         jmp     DISK_RESET
  4892                              <1> su2:
  4893 00005122 803D[34790100]00    <1> 	cmp	byte [LBAMode], 0
  4894 00005129 765E                <1> 	jna	short su3
  4895                              <1> 	;
  4896                              <1> 	; 02/02/2015 (LBA read/write function calls)
  4897 0000512B 80FC1B              <1> 	cmp	ah, 1Bh
  4898 0000512E 720A                <1> 	jb	short lbarw1
  4899 00005130 80FC1C              <1> 	cmp	ah, 1Ch
  4900 00005133 7759                <1> 	ja 	short invldfnc
  4901                              <1> 	;;pop	edx ; * ; 14/02/2015
  4902                              <1> 	;mov	ax, cx ; Lower word of LBA address (bits 0-15)
  4903                              <1> 
  4904                              <1> 	; 01/12/2023 (48 bit LBA rw) 
  4905 00005135 E9AD000000          <1> 	jmp	lba_read_write
  4906                              <1> 
  4907                              <1> lbarw1:
  4908                              <1> 	; convert CHS to LBA
  4909                              <1> 	;
  4910                              <1> 	; LBA calculation - AWARD BIOS - 1999 - AHDSK.ASM
  4911                              <1> 	; LBA = "# of Heads" * Sectors/Track * Cylinder + Head * Sectors/Track
  4912                              <1> 	;	+ Sector - 1
  4913                              <1> 	; 11/04/2021 (32 bit push/pop)
  4914 0000513A 52                  <1> 	push	edx ; * ;; 14/02/2015
  4915                              <1> 	;xor	dh, dh
  4916 0000513B 31D2                <1> 	xor	edx, edx
  4917                              <1> 	;mov	dl, [ES:BX+14]	; sectors per track (logical)
  4918 0000513D 8A530E              <1> 	mov	dl, [ebx+14]
  4919                              <1> 	;xor	ah, ah
  4920 00005140 31C0                <1> 	xor	eax, eax
  4921                              <1> 	;mov	al, [ES:BX+2]	; heads (logical) 	
  4922 00005142 8A4302              <1> 	mov	al, [ebx+2]
  4923 00005145 FEC8                <1> 	dec	al
  4924 00005147 6640                <1> 	inc	ax		; 0 = 256
  4925 00005149 66F7E2              <1> 	mul 	dx
  4926                              <1> 		; AX = # of Heads * Sectors/Track
  4927 0000514C 6689CA              <1> 	mov	dx, cx
  4928                              <1> 	;and	cx, 3Fh	 ; sector  (1 to 63)
  4929 0000514F 83E13F              <1> 	and	ecx, 3Fh
  4930 00005152 86D6                <1> 	xchg	dl, dh
  4931 00005154 C0EE06              <1> 	shr	dh, 6
  4932                              <1> 		; DX = cylinder (0 to 1023)
  4933                              <1> 	;mul 	dx
  4934                              <1> 		; DX:AX = # of Heads" * Sectors/Track * Cylinder
  4935 00005157 F7E2                <1> 	mul	edx
  4936 00005159 FEC9                <1> 	dec	cl ; sector - 1
  4937                              <1> 	;add	ax, cx
  4938                              <1> 	;adc	dx, 0
  4939                              <1> 		; DX:AX = # of Heads" * Sectors/Track * Cylinder + Sector - 1
  4940 0000515B 01C8                <1> 	add	eax, ecx
  4941                              <1> 	; 11/04/2021 (32 bit push/pop)
  4942 0000515D 59                  <1> 	pop	ecx ; * ; ch = head, cl = drive number (zero based)
  4943                              <1> 	;push	dx
  4944                              <1> 	;push	ax
  4945 0000515E 50                  <1> 	push	eax
  4946                              <1> 	; 13/07/2022
  4947 0000515F 29C0                <1> 	sub	eax, eax
  4948                              <1> 	;mov	al, [ES:BX+14]	; sectors per track (logical)	
  4949 00005161 8A430E              <1> 	mov	al, [ebx+14]
  4950 00005164 F6E5                <1> 	mul	ch
  4951                              <1> 		; AX = Head * Sectors/Track
  4952                              <1>         ; 13/07/2022
  4953                              <1> 	;movzx	eax, ax ; 09/12/2017
  4954                              <1> 	;pop	dx
  4955 00005166 5A                  <1> 	pop	edx
  4956                              <1> 	;add	ax, dx
  4957                              <1> 	;pop	dx
  4958                              <1> 	;adc	dx, 0 ; add carry bit
  4959 00005167 01D0                <1> 	add	eax, edx
  4960                              <1> lbarw2:
  4961 00005169 29D2                <1> 	sub	edx, edx ; 21/02/2015
  4962 0000516B 88CA                <1> 	mov	dl, cl ; 21/02/2015
  4963 0000516D C645F800            <1>         mov     byte [CMD_BLOCK], 0 ; Features Register
  4964                              <1> 				; NOTE: Features register (1F1h, 171h)
  4965                              <1> 				; is not used for ATA device R/W functions. 
  4966                              <1> 				; It is old/obsolete 'write precompensation'
  4967                              <1> 				; register and error register
  4968                              <1> 				; for old ATA/IDE devices.
  4969                              <1> 	; 18/01/2014
  4970                              <1> 	;mov	ch, [hf_m_s]	; Drive 0 (master) or 1 (slave)
  4971 00005171 8A0D[12660000]      <1> 	mov	cl, [hf_m_s]
  4972                              <1> 	;shl	ch, 4		; bit 4 (drive bit)
  4973                              <1> 	;or	ch, 0E0h	; bit 5 = 1
  4974                              <1> 				; bit 6 = 1 = LBA mode
  4975                              <1> 				; bit 7 = 1
  4976 00005177 80C90E              <1> 	or	cl, 0Eh ; 1110b
  4977                              <1> 	;and	dh, 0Fh		; LBA byte 4 (bits 24 to 27)
  4978 0000517A 25FFFFFF0F          <1> 	and	eax, 0FFFFFFFh
  4979 0000517F C1E11C              <1> 	shl	ecx, 28 ; 21/02/2015
  4980                              <1> 	;or	dh, ch
  4981 00005182 09C8                <1> 	or	eax, ecx	
  4982                              <1> 	;;mov	[CMD_BLOCK+2], al ; LBA byte 1 (bits 0 to 7)
  4983                              <1> 				  ; (Sector Number Register)
  4984                              <1> 	;;mov	[CMD_BLOCK+3], ah ; LBA byte 2 (bits 8 to 15)
  4985                              <1> 				  ; (Cylinder Low Register)
  4986                              <1> 	;mov	[CMD_BLOCK+2], ax ; LBA byte 1, 2
  4987                              <1> 	;mov	[CMD_BLOCK+4], dl ; LBA byte 3 (bits 16 to 23)
  4988                              <1> 				  ; (Cylinder High Register)
  4989                              <1> 	;;mov	[CMD_BLOCK+5], dh ; LBA byte 4 (bits 24 to 27)
  4990                              <1> 				  ; (Drive/Head Register)
  4991                              <1> 	
  4992                              <1> 	;mov	[CMD_BLOCK+4], dx ; LBA byte 4, LBA & DEV select bits
  4993 00005184 8945FA              <1> 	mov	[CMD_BLOCK+2], eax ; 21/02/2015
  4994                              <1> 	; 14/02/2015
  4995                              <1> 	;mov	dl, cl ; Drive number (INIT_DRV)		
  4996 00005187 EB36                <1> 	jmp	short su4
  4997                              <1> su3:
  4998                              <1> 	; 07/08/2022
  4999                              <1> 	; 13/07/2022
  5000                              <1> 	; 02/02/2015 
  5001                              <1> 	; (1Bh & 1Ch functions are not valid for CHS mode) 
  5002 00005189 80FC14              <1> 	cmp 	ah, 14h
  5003 0000518C 7603                <1> 	jna 	short chsfnc
  5004                              <1> invldfnc:
  5005                              <1>         ; 14/02/2015  
  5006                              <1> 	;pop	es ; **
  5007                              <1> 	; 11/04/2021
  5008 0000518E 58                  <1> 	pop	eax ; *** 
  5009 0000518F EB46                <1>         jmp     short BAD_COMMAND
  5010                              <1> chsfnc:	
  5011                              <1> 	;mov	ax, [ES:BX+5]		; GET WRITE PRE-COMPENSATION CYLINDER
  5012 00005191 668B4305            <1> 	mov	ax, [ebx+5]
  5013                              <1> 	;shr	ax, 2
  5014                              <1> 	; 07/08/2022
  5015 00005195 C1E802              <1> 	shr	eax, 2
  5016 00005198 8845F8              <1> 	mov	[CMD_BLOCK], al
  5017                              <1> 	
  5018                              <1> 	;;mov	al, [ES:BX+8]		; GET CONTROL BYTE MODIFIER
  5019                              <1> 	;;push	edx ; *
  5020                              <1> 	;;mov	dx, [HF_REG_PORT]
  5021                              <1> 	;;out	dx, al			; SET EXTRA HEAD OPTION
  5022                              <1> 	;;pop	edx ; * 
  5023                              <1> 	;;pop	es  ; **
  5024                              <1> 	;;mov	ah, [CONTROL_BYTE]	; SET EXTRA HEAD OPTION IN
  5025                              <1> 	;;and	ah, 0C0h 		; CONTROL BYTE	
  5026                              <1> 	;;or	ah, al
  5027                              <1> 	;;mov	[CONTROL_BYTE], ah
  5028                              <1> 	
  5029 0000519B 88C8                <1> 	mov	al, cl			; GET SECTOR NUMBER
  5030 0000519D 243F                <1> 	and	al, 3Fh
  5031 0000519F 8845FA              <1> 	mov	[CMD_BLOCK+2], al
  5032 000051A2 886DFB              <1> 	mov	[CMD_BLOCK+3], ch 	; GET CYLINDER NUMBER
  5033 000051A5 88C8                <1> 	mov	al, cl
  5034 000051A7 C0E806              <1> 	shr	al, 6
  5035 000051AA 8845FC              <1> 	mov	[CMD_BLOCK+4], al 	; CYLINDER HIGH ORDER 2 BITS
  5036                              <1> 	
  5037                              <1> 	;;05/01/2015
  5038                              <1> 	;;mov	al, dl			; DRIVE NUMBER
  5039 000051AD A0[12660000]        <1> 	mov	al, [hf_m_s]
  5040 000051B2 C0E004              <1> 	shl	al, 4
  5041 000051B5 80E60F              <1> 	and	dh, 0Fh			; HEAD NUMBER
  5042 000051B8 08F0                <1> 	or	al, dh
  5043                              <1> 	;or	al, 80h or 20h
  5044 000051BA 0CA0                <1> 	or	al, 80h+20h		; ECC AND 512 BYTE SECTORS
  5045 000051BC 8845FD              <1> 	mov	[CMD_BLOCK+5], al 	; ECC/SIZE/DRIVE/HEAD
  5046                              <1> su4:
  5047                              <1> 	;pop	es ; **
  5048                              <1>         ;; 14/02/2015
  5049                              <1>         ;;pop	ax
  5050                              <1>         ;;mov	[CMD_BLOCK+1], al	; SECTOR COUNT
  5051                              <1>         ;;push	ax
  5052                              <1>         ;;mov	al, ah			; GET INTO LOW BYTE
  5053                              <1>         ;;xor	ah, ah			; ZERO HIGH BYTE
  5054                              <1>         ;;sal	ax, 1			; *2 FOR TABLE LOOKUP
  5055                              <1>         ; 11/04/2021
  5056 000051BF 58                  <1> 	pop	eax ; *** 
  5057 000051C0 8845F9              <1>         mov     [CMD_BLOCK+1], al
  5058 000051C3 29DB                <1>         sub	ebx, ebx
  5059                              <1> 	;xor	bh, bh
  5060 000051C5 88E3                <1> 	mov     bl, ah
  5061                              <1>         ;sal	bx, 1
  5062                              <1>         ; 17/07/2022
  5063 000051C7 C1E302              <1> 	sal	ebx, 2	; 32 bit offset (21/02/2015)
  5064                              <1> 	;mov	si, ax			; PUT INTO SI FOR BRANCH
  5065                              <1>         ; 13/07/2022
  5066                              <1> 	;cmp	bx, D1L			; TEST WITHIN RANGE
  5067                              <1> 	;jnb	short BAD_COMMAND_POP
  5068 000051CA 83FB74              <1> 	cmp	ebx, D1L		; TEST WITHIN RANGE
  5069 000051CD 7308                <1> 	jnb	short BAD_COMMAND
  5070                              <1>         ;xchg	bx, si
  5071 000051CF 87DE                <1>         xchg	ebx, esi
  5072                              <1> 	;;;pop	ax			; RESTORE AX
  5073                              <1> 	;;;pop	bx			; AND DATA ADDRESS
  5074                              <1> 	
  5075                              <1> 	;;push	cx
  5076                              <1> 	;;push	ax			; ADJUST ES:BX
  5077                              <1> 	;mov	cx, bx			; GET 3 HIGH ORDER NIBBLES OF BX
  5078                              <1> 	;shr	cx, 4
  5079                              <1> 	;mov	ax, es
  5080                              <1> 	;add	ax, cx
  5081                              <1> 	;mov	es, ax
  5082                              <1> 	;and	bx, 000Fh		; ES:BX CHANGED TO ES:000X
  5083                              <1> 	;;pop	ax
  5084                              <1> 	;;pop	cx
  5085                              <1> 	;;jmp	word [CS:SI+D1]
  5086                              <1> 	;jmp	word [SI+D1]
  5087                              <1> 	
  5088 000051D1 FFA6[2A500000]      <1> 	jmp	dword [esi+D1]
  5089                              <1> 
  5090                              <1> 	; 07/08/2022
  5091                              <1> 	; 13/07/2022
  5092                              <1> BAD_COMMAND:
  5093 000051D7 C605[1F790100]01    <1>         mov	byte [DISK_STATUS1], BAD_CMD ; COMMAND ERROR
  5094 000051DE B000                <1> 	mov	al, 0
  5095 000051E0 C3                  <1> 	retn
  5096                              <1> 
  5097                              <1> ; -----------------------------------------------------
  5098                              <1> ; 48 bit LBA read/write
  5099                              <1> ; -----------------------------------------------------
  5100                              <1> 
  5101                              <1> su10:	; 01/12/2023 ; 28 bit LBA r/w
  5102 000051E1 89C8                <1> 	mov	eax, ecx ; LBA address (21/02/2015)
  5103                              <1> 	; 13/07/2022
  5104 000051E3 88D1                <1> 	mov	cl, dl ; 14/02/2015
  5105 000051E5 EB82                <1> 	jmp	short lbarw2
  5106                              <1> 
  5107                              <1> lba_read_write:
  5108                              <1> 	; 02/12/2023
  5109                              <1> 	; 01/12/2023 - TRDOS 386 v2.0.7 (48 bit LBA rw)
  5110 000051E7 81F9FFFFFF0F        <1> 	cmp	ecx, 0FFFFFFFh
  5111 000051ED 7319                <1> 	jnb	short su6
  5112                              <1> 	;movzx	eax, byte [esp] ; ***
  5113 000051EF 31C0                <1> 	xor	eax, eax
  5114 000051F1 8A0424              <1> 	mov	al, [esp] ; *** ; sector count
  5115 000051F4 01C8                <1> 	add	eax, ecx
  5116 000051F6 7309                <1> 	jnc	short su5
  5117 000051F8 C605[1F790100]17    <1> 	mov	byte [DISK_STATUS1], ERR_INV_PARAMETER
  5118 000051FF EB33                <1> 	jmp	short su7
  5119                              <1> su5:	
  5120 00005201 3DFFFFFF0F          <1> 	cmp	eax, 0FFFFFFFh ; 28 bit limit
  5121 00005206 76D9                <1> 	jna	short su10
  5122                              <1> su6:
  5123                              <1> 	; 48 bit LBA r/w
  5124 00005208 A0[12660000]        <1> 	mov	al, [hf_m_s]	; (+!+) ; 02/12/2023
  5125 0000520D C0E004              <1> 	shl	al, 4
  5126                              <1> 	; 02/12/2023
  5127                              <1> 	;add	al, 0E0h
  5128 00005210 0440                <1> 	add	al, 40h
  5129                              <1> 	;;add	al, 0Eh
  5130                              <1> 	;add	al, 04h
  5131                              <1> 	;shl	al, 4
  5132 00005212 668B15[0E660000]    <1> 	mov	dx, [HF_PORT]
  5133 00005219 80C206              <1> 	add	dl, 6	; hd base port + 6
  5134 0000521C EE                  <1> 	out	dx, al
  5135                              <1> 	; 02/12/2023
  5136 0000521D 8845FE              <1> 	mov	[CMD_BLOCK+6], al
  5137 00005220 42                  <1> 	inc	edx	; hd base port + 7
  5138 00005221 EC                  <1> 	in	al, dx
  5139                              <1> 	NEWIODELAY
    83 00005222 E6EB                <2>  out 0EBh, al
  5140                              <1> 	;test	al, 128		; READY ?
  5141 00005224 2480                <1> 	and	al, 128
  5142 00005226 7410                <1> 	jz	short su8
  5143 00005228 EC                  <1> 	in	al, dx
  5144                              <1> 	;test	al, 128
  5145 00005229 2480                <1> 	and	al, 128
  5146 0000522B 740B                <1> 	jz	short su8
  5147 0000522D C605[1F790100]80    <1> 	mov	byte [DISK_STATUS1], TIME_OUT
  5148                              <1> su7:
  5149 00005234 58                  <1> 	pop	eax ; ***
  5150 00005235 B000                <1> 	mov	al, 0
  5151 00005237 C3                  <1> 	retn
  5152                              <1> su8:
  5153                              <1> 	;mov	dx, [HF_PORT]
  5154                              <1> 	;inc	edx
  5155                              <1> 	;inc	edx	; hd base port + 2
  5156 00005238 80EA05              <1> 	sub	dl, 5	; hd base port + 2
  5157                              <1> 	;xor	al, al
  5158 0000523B EE                  <1> 	out	dx, al	; sector count hb (bits 8 to 15) = 0
  5159 0000523C 42                  <1> 	inc	edx	; hd base port + 3
  5160 0000523D 89C8                <1> 	mov	eax, ecx ; LBA disk sector address
  5161 0000523F C1C008              <1> 	rol	eax, 8 
  5162 00005242 EE                  <1> 	out	dx, al	; LBA byte 4 (bits 24 to 31)
  5163 00005243 42                  <1> 	inc	edx	; hd base port + 4
  5164 00005244 30C0                <1> 	xor	al, al
  5165 00005246 EE                  <1> 	out	dx, al	; LBA byte 5 (bits 32 to 39) = 0
  5166 00005247 42                  <1> 	inc	edx	; hd base port + 5
  5167                              <1> 	;sub	al, al
  5168 00005248 EE                  <1> 	out	dx, al	; LBA byte 6 (bits 40 to 47) = 0
  5169                              <1> 
  5170 00005249 8A0424              <1> 	mov	al, [esp] ; ***
  5171                              <1> 	; 02/12/2023
  5172 0000524C 8845F9              <1> 	mov	[CMD_BLOCK+1], al
  5173                              <1> 
  5174 0000524F 80EA03              <1> 	sub	dl, 3	; hd base port + 2
  5175 00005252 EE                  <1> 	out	dx, al	; sector count lb (bits 0 to 7) = 0
  5176 00005253 42                  <1> 	inc	edx	; hd base port + 3
  5177 00005254 89C8                <1> 	mov	eax, ecx ; LBA disk sector address
  5178 00005256 EE                  <1> 	out	dx, al	; LBA byte 1 (bits 0 to 7)
  5179 00005257 42                  <1> 	inc	edx	; hd base port + 4
  5180 00005258 C1E808              <1> 	shr	eax, 8
  5181 0000525B EE                  <1> 	out	dx, al	; LBA byte 2 (bits 8 to 15) = 0
  5182 0000525C 42                  <1> 	inc	edx	; hd base port + 5
  5183 0000525D C1E808              <1> 	shr	eax, 8
  5184 00005260 EE                  <1> 	out	dx, al	; LBA byte 3 (bits 16 to 23) = 0
  5185                              <1> 
  5186 00005261 42                  <1>  	inc     edx	; hd base port + 6
  5187                              <1> 
  5188                              <1> 	; 02/12/2023 (not necessary) (+!+)
  5189                              <1> 	;mov	al, [hf_m_s]
  5190                              <1> 	;shl	al, 4
  5191                              <1> 	;add	al, 40h
  5192                              <1> 	;out	dx, al
  5193                              <1> 
  5194 00005262 58                  <1> 	pop	eax	; ***
  5195                              <1> 
  5196 00005263 42                  <1> 	inc	edx	; dx = hd base port + 7 
  5197                              <1> 			;      command/status port
  5198                              <1> 	;xchg	esi, ebx
  5199                              <1> 	;mov	edi, ebx
  5200 00005264 89F7                <1> 	mov	edi, esi ; sector buffer 
  5201 00005266 80FC1C              <1> 	cmp	ah, 1Ch
  5202 00005269 7508                <1> 	jne	short su_9
  5203 0000526B B034                <1> 	mov	al, 34h ; WRITE SECTOR(S) EXT
  5204 0000526D EE                  <1> 	out	dx, al
  5205 0000526E E9E4000000          <1> 	jmp	CMD_WX
  5206                              <1> su_9:
  5207 00005273 B024                <1> 	mov	al, 24h ; READ SECTOR(S) EXT
  5208 00005275 EE                  <1> 	out	dx, al
  5209 00005276 E980000000          <1> 	jmp	CMD_RX
  5210                              <1> 
  5211                              <1> ; -----------------------------------------------------
  5212                              <1> 
  5213                              <1> ; 09/08/2022
  5214                              <1> ; 07/08/2022
  5215                              <1> ; 17/07/2022
  5216                              <1> ; 16/07/2022 - TRDOS 386 v2.0.5
  5217                              <1> ; 10/07/2022 - Retro UNIX 386 v1.1 (Kernel v0.2.1.5)
  5218                              <1> 
  5219                              <1> ;----------------------------------------
  5220                              <1> ;	RESET THE DISK SYSTEM  (AH=00H) :
  5221                              <1> ;----------------------------------------
  5222                              <1> 
  5223                              <1> ; 18-1-2015 : one controller reset (not other one)
  5224                              <1> 
  5225                              <1> DISK_RESET:
  5226 0000527B FA                  <1> 	cli
  5227 0000527C E4A1                <1> 	in	al, INTB01		; GET THE MASK REGISTER
  5228                              <1> 	;jmp	$+2
  5229                              <1> 	IODELAY
    78 0000527E EB00                <2>  jmp short $+2
    79 00005280 EB00                <2>  jmp short $+2
  5230                              <1> 	;and	al, 0BFh 		; ENABLE FIXED DISK INTERRUPT
  5231 00005282 243F                <1> 	and	al, 3Fh			; 22/12/2014 (IRQ 14 & IRQ 15)
  5232 00005284 E6A1                <1> 	out	INTB01, al
  5233 00005286 FB                  <1> 	sti				; START INTERRUPTS
  5234                              <1> 	; 14/02/2015
  5235                              <1> 	;mov	di, dx
  5236                              <1> 	; 24/12/2021
  5237 00005287 89D7                <1> 	mov	edi, edx	
  5238                              <1> 	; 04/01/2015
  5239                              <1> 	;xor	di,di
  5240                              <1> drst0:
  5241 00005289 B004                <1> 	mov	al, 04h  ; bit 2 - SRST 
  5242                              <1> 	;mov	dx, HF_REG_PORT
  5243 0000528B 668B15[10660000]    <1> 	mov	dx, [HF_REG_PORT]
  5244 00005292 EE                  <1> 	out	dx, al			; RESET
  5245                              <1> ;	mov	cx, 10			; DELAY COUNT
  5246                              <1> ;DRD:	dec	cx
  5247                              <1> ;	jnz	short DRD		; WAIT 4.8 MICRO-SEC
  5248                              <1> 	;mov	cx, 2			; wait for 30 micro seconds	
  5249                              <1>         ;mov	ecx, 2 ; 21/02/2015
  5250                              <1> 	; 10/07/2022
  5251 00005293 29C9                <1> 	sub	ecx, ecx
  5252 00005295 B102                <1> 	mov	cl, 2
  5253 00005297 E836D1FFFF          <1> 	call    WAITF                   ; (Award Bios 1999 - WAIT_REFRESH,
  5254                              <1>                                         ; 40 micro seconds)
  5255 0000529C A0[21790100]        <1> 	mov	al, [CONTROL_BYTE]
  5256 000052A1 240F                <1> 	and	al, 0Fh			; SET HEAD OPTION
  5257 000052A3 EE                  <1> 	out	dx, al			; TURN RESET OFF
  5258 000052A4 E803040000          <1> 	call	NOT_BUSY
  5259 000052A9 7514                <1> 	jnz	short DRERR		; TIME OUT ON RESET
  5260 000052AB 668B15[0E660000]    <1> 	mov	dx, [HF_PORT]
  5261 000052B2 FEC2                <1> 	inc	dl  ; HF_PORT+1
  5262                              <1> 	; 02/01/2015 - Award BIOS 1999 - AHDSK.ASM
  5263                              <1>         ;mov	cl, 10
  5264                              <1>         ;mov	ecx, 10 ; 21/02/2015
  5265                              <1> 	; 17/07/2022
  5266                              <1> 	;xor	ecx, ecx
  5267 000052B4 B10A                <1> 	mov	cl, 10
  5268                              <1> drst1:
  5269 000052B6 EC                  <1> 	in	al, dx			; GET RESET STATUS
  5270 000052B7 3C01                <1> 	cmp	al, 1
  5271                              <1> 	; 04/01/2015
  5272 000052B9 740C                <1> 	jz	short drst2
  5273                              <1> 	;jnz	short DRERR		; BAD RESET STATUS
  5274                              <1>         	; Drive/Head Register - bit 4
  5275                              <1> 	;loop	drst1
  5276                              <1> 	; 17/07/2022
  5277 000052BB FEC9                <1> 	dec	cl
  5278 000052BD 75F7                <1> 	jnz	short drst1
  5279                              <1> DRERR:	
  5280 000052BF C605[1F790100]05    <1> 	mov	byte [DISK_STATUS1], BAD_RESET ; CARD FAILED
  5281 000052C6 C3                  <1> 	retn
  5282                              <1> drst2:
  5283                              <1> 	; 14/02/2015
  5284                              <1> 	;mov	dx, di
  5285                              <1> 	; 07/08/2022
  5286 000052C7 89FA                <1> 	mov	edx, edi
  5287                              <1> ;drst3:
  5288                              <1> ;	; 05/01/2015
  5289                              <1> ;	shl 	di, 1
  5290                              <1> ;	; 04/01/2015
  5291                              <1> ;	mov	ax, [di+hd_cports]
  5292                              <1> ;	cmp	ax, [HF_REG_PORT]
  5293                              <1> ;	je	short drst4
  5294                              <1> ;	mov	[HF_REG_PORT], ax
  5295                              <1> ;	; 03/01/2015
  5296                              <1> ;	mov	ax, [di+hd_ports]
  5297                              <1> ;       mov     [HF_PORT], ax
  5298                              <1> ;	; 05/01/2014
  5299                              <1> ;	shr	di, 1
  5300                              <1> ;	; 04/01/2015
  5301                              <1> ;	jmp	short drst0	; reset other controller
  5302                              <1> ;drst4:
  5303                              <1> ;	; 05/01/2015
  5304                              <1> ;	shr	di, 1
  5305                              <1> ;	mov	al, [di+hd_dregs]
  5306                              <1> ;	and	al, 10h ; bit 4 only
  5307                              <1> ;	shr	al, 4 ; bit 4  -> bit 0
  5308                              <1> ;	mov	[hf_m_s], al ; (0 = master, 1 = slave)
  5309                              <1> 	;
  5310                              <1> ; 09/08/2022
  5311                              <1> ; (('INIT_DRV' prodedure sets [CMD_BLOCKS+5] value))
  5312                              <1> ;
  5313                              <1> ;	mov	al, [hf_m_s] ; 18/01/2015
  5314                              <1> ;	test	al, 1
  5315                              <1> ;	;jnz	short drst6
  5316                              <1> ;       jnz     short drst4
  5317                              <1> ;	and	byte [CMD_BLOCK+5], 0EFh ; SET TO DRIVE 0
  5318                              <1> ;drst5:
  5319                              <1> drst3:
  5320 000052C9 E8F9010000          <1> 	call	INIT_DRV		; SET MAX HEADS
  5321                              <1> 	;mov	dx, di
  5322 000052CE E8B1020000          <1> 	call	HDISK_RECAL		; RECAL TO RESET SEEK SPEED
  5323                              <1> 	; 04/01/2014
  5324                              <1> ;	inc	di
  5325                              <1> ;	mov	dx, di
  5326                              <1> ;	cmp	dl, [HF_NUM]
  5327                              <1> ;	jb	short drst3
  5328                              <1> ;DRE:
  5329 000052D3 C605[1F790100]00    <1> 	mov	byte [DISK_STATUS1], 0 	; IGNORE ANY SET UP ERRORS
  5330 000052DA C3                  <1> 	retn
  5331                              <1> ;drst6:
  5332                              <1> drst4:		; Drive/Head Register - bit 4
  5333                              <1> ;	or	byte [CMD_BLOCK+5], 010h ; SET TO DRIVE 1
  5334                              <1> ;       ;jmp    short drst5
  5335                              <1> ;       jmp     short drst3
  5336                              <1> 
  5337                              <1> ;----------------------------------------
  5338                              <1> ;	DISK STATUS ROUTINE  (AH = 01H) :
  5339                              <1> ;----------------------------------------
  5340                              <1> 
  5341                              <1> RETURN_STATUS:
  5342 000052DB A0[1F790100]        <1> 	mov	al, [DISK_STATUS1]	; OBTAIN PREVIOUS STATUS
  5343 000052E0 C605[1F790100]00    <1> 	mov	byte [DISK_STATUS1], 0	; RESET STATUS
  5344 000052E7 C3                  <1> 	retn
  5345                              <1> 
  5346                              <1> 	; 16/07/2022 - TRDOS 386 v2.0.5
  5347                              <1> 
  5348                              <1> ;----------------------------------------
  5349                              <1> ;	READ LONG	     (AH = 0AH) :
  5350                              <1> ;----------------------------------------
  5351                              <1> 
  5352                              <1> RD_LONG:
  5353                              <1> 	;mov	@CMD_BLOCK+6, READ_CMD OR ECC_MODE
  5354 000052E8 C645FE22            <1> 	mov     byte [CMD_BLOCK+6], READ_CMD + ECC_MODE 
  5355 000052EC EB04                <1> 	jmp	short COMMANDI
  5356                              <1> 
  5357                              <1> 	; 16/07/2022 - TRDOS 386 v2.0.5
  5358                              <1> 
  5359                              <1> ;----------------------------------------
  5360                              <1> ;	DISK READ ROUTINE    (AH = 02H) :
  5361                              <1> ;----------------------------------------
  5362                              <1> 
  5363                              <1> DISK_READ:
  5364 000052EE C645FE20            <1> 	mov	byte [CMD_BLOCK+6], READ_CMD
  5365                              <1>         ;jmp	COMMANDI
  5366                              <1> 
  5367                              <1> 	; 16/07/2022 - TRDOS 386 v2.0.5
  5368                              <1> 
  5369                              <1> ;----------------------------------------
  5370                              <1> ; COMMANDI				:
  5371                              <1> ;	REPEATEDLY INPUTS DATA TILL	:
  5372                              <1> ;	NSECTOR RETURNS ZERO		:
  5373                              <1> ;----------------------------------------
  5374                              <1> COMMANDI:
  5375                              <1> 	; 16/07/2022 
  5376                              <1> 	;	(check 64K boundary is not needed)
  5377                              <1> 	;call	CHECK_DMA		; CHECK 64K BOUNDARY ERROR
  5378                              <1> 	;jc	short CMD_ABORT
  5379                              <1> 
  5380                              <1> 	;mov	di, bx
  5381 000052F2 89DF                <1> 	mov	edi, ebx ; 21/02/2015
  5382 000052F4 E811030000          <1> 	call	COMMAND 		; OUTPUT COMMAND
  5383 000052F9 7548                <1> 	jnz	short CMD_ABORT
  5384                              <1> CMD_RX:	; 01/12/2023 (48 bit LBA read)
  5385                              <1> CMD_I1:
  5386 000052FB E87C030000          <1> 	call	_WAIT			; WAIT FOR DATA REQUEST INTERRUPT
  5387 00005300 7541                <1> 	jnz	short TM_OUT		; TIME OUT
  5388                              <1> cmd_i1x:
  5389                              <1> 	; 18/02/2016
  5390                              <1> 	;;mov	cx, 256			; SECTOR SIZE IN WORDS
  5391                              <1> 	;mov	ecx, 256 ; 21/02/2015	
  5392                              <1> 	; 16/07/2022
  5393 00005302 29C9                <1> 	sub	ecx, ecx
  5394 00005304 FEC5                <1> 	inc	ch  ; ecx = 256
  5395                              <1> 	;mov	dh, HF_PORT
  5396 00005306 668B15[0E660000]    <1> 	mov	dx, [HF_PORT]
  5397 0000530D FA                  <1> 	cli
  5398 0000530E FC                  <1> 	cld
  5399 0000530F F3666D              <1> 	rep	insw			; GET THE SECTOR
  5400 00005312 FB                  <1> 	sti
  5401                              <1> 
  5402 00005313 F645FE02            <1> 	test	byte [CMD_BLOCK+6], ECC_MODE ; CHECK FOR NORMAL INPUT
  5403 00005317 7418                <1> 	jz	short CMD_I3
  5404 00005319 E8B5030000          <1> 	call	WAIT_DRQ		; WAIT FOR DATA REQUEST
  5405 0000531E 7223                <1> 	jc	short TM_OUT
  5406                              <1> 	;mov	dx, HF_PORT
  5407 00005320 668B15[0E660000]    <1> 	mov	dx, [HF_PORT]
  5408                              <1> 	;;mov	cx, 4			; GET ECC BYTES
  5409                              <1> 	;mov 	ecx, 4 ; mov cx, 4
  5410                              <1> 	; 16/07/2022
  5411 00005327 31C9                <1>  	xor	ecx, ecx
  5412 00005329 B104                <1> 	mov	cl, 4
  5413                              <1> CMD_I2:
  5414 0000532B EC                  <1> 	in	al, dx
  5415 0000532C 8807                <1> 	mov 	[edi], al ; 21/02/2015	; GO SLOW FOR BOARD
  5416 0000532E 47                  <1> 	inc	edi
  5417 0000532F E2FA                <1> 	loop	CMD_I2
  5418                              <1> CMD_I3: 
  5419                              <1> 	; wait for 400 ns
  5420 00005331 80C207              <1> 	add 	dl, 7
  5421 00005334 EC                  <1> 	in	al, dx
  5422 00005335 EC                  <1> 	in	al, dx
  5423 00005336 EC                  <1> 	in	al, dx
  5424                              <1> 	;
  5425 00005337 E8E4010000          <1> 	call	CHECK_STATUS
  5426 0000533C 7505                <1> 	jnz	short CMD_ABORT		; ERROR RETURNED
  5427 0000533E FE4DF9              <1> 	dec	byte [CMD_BLOCK+1]	; CHECK FOR MORE
  5428                              <1> 	;jnz	short CMD_I1
  5429 00005341 75BF                <1> 	jnz	short cmd_i1x ; 18/02/2016
  5430                              <1> CMD_ABORT:
  5431                              <1> TM_OUT: 
  5432 00005343 C3                  <1> 	retn
  5433                              <1> 
  5434                              <1> 	; 16/07/2022 - TRDOS 386 v2.0.5
  5435                              <1> 
  5436                              <1> ;----------------------------------------
  5437                              <1> ;	WRITE LONG	     (AH = 0BH) :
  5438                              <1> ;----------------------------------------
  5439                              <1> 
  5440                              <1> WR_LONG:
  5441                              <1> 	;mov	@CMD_BLOCK+6, WRITE_CMD OR ECC_MODE
  5442 00005344 C645FE32            <1> 	mov	byte [CMD_BLOCK+6], WRITE_CMD + ECC_MODE
  5443 00005348 EB04                <1> 	jmp	short COMMANDO
  5444                              <1> 
  5445                              <1> 	; 16/07/2022 - TRDOS 386 v2.0.5
  5446                              <1> 	
  5447                              <1> ;----------------------------------------
  5448                              <1> ;	DISK WRITE ROUTINE   (AH = 03H) :
  5449                              <1> ;----------------------------------------
  5450                              <1> 
  5451                              <1> DISK_WRITE:
  5452 0000534A C645FE30            <1> 	mov	byte [CMD_BLOCK+6], WRITE_CMD
  5453                              <1> 	;jmp	COMMANDO
  5454                              <1> 
  5455                              <1> 	; 16/07/2022 - TRDOS 386 v2.0.5
  5456                              <1> 
  5457                              <1> ;----------------------------------------
  5458                              <1> ; COMMANDO				:
  5459                              <1> ;	REPEATEDLY OUTPUTS DATA TILL	:
  5460                              <1> ;	NSECTOR RETURNS ZERO		:
  5461                              <1> ;----------------------------------------
  5462                              <1> COMMANDO:
  5463                              <1> 	; 16/07/2022 
  5464                              <1> 	;	(check 64K boundary is not needed)
  5465                              <1> 	;call	CHECK_DMA		; CHECK 64K BOUNDARY ERROR
  5466                              <1> 	;jc	short CMD_ABORT
  5467                              <1> CMD_OF: 
  5468 0000534E 89DE                <1> 	mov	esi, ebx ; 21/02/2015
  5469 00005350 E8B5020000          <1> 	call	COMMAND 		; OUTPUT COMMAND
  5470 00005355 75EC                <1> 	jnz	short CMD_ABORT
  5471                              <1> CMD_WX:	; 01/12/2023 (48 bit LBA write)
  5472 00005357 E877030000          <1> 	call	WAIT_DRQ		; WAIT FOR DATA REQUEST
  5473 0000535C 72E5                <1> 	jc	short TM_OUT		; TOO LONG
  5474                              <1> CMD_O1: 
  5475                              <1> 	; 16/07/2022
  5476 0000535E 668B15[0E660000]    <1> 	mov	dx, [HF_PORT]
  5477                              <1> 
  5478                              <1> 	;mov	ecx, 256 ; 21/02/2015
  5479 00005365 31C9                <1> 	xor	ecx, ecx
  5480 00005367 FEC5                <1> 	inc	ch
  5481                              <1> 	; ecx = 256
  5482 00005369 FA                  <1> 	cli
  5483 0000536A FC                  <1> 	cld
  5484                              <1> 	;rep	outsw
  5485                              <1> 	; 01/12/2023 - TRDOS 386 v2.0.7
  5486                              <1> CMD_01_L:	
  5487 0000536B 666F                <1> 	outsw
  5488 0000536D EB00                <1> 	jmp	$+2
  5489 0000536F E2FA                <1> 	loop	CMD_01_L
  5490                              <1> 
  5491 00005371 FB                  <1> 	sti
  5492                              <1> 
  5493 00005372 F645FE02            <1> 	test	byte [CMD_BLOCK+6], ECC_MODE ; CHECK FOR NORMAL OUTPUT
  5494 00005376 7418                <1> 	jz	short CMD_O3
  5495 00005378 E856030000          <1> 	call	WAIT_DRQ		; WAIT FOR DATA REQUEST
  5496 0000537D 72C4                <1> 	jc	short TM_OUT
  5497                              <1> 	;mov	dx, HF_PORT
  5498 0000537F 668B15[0E660000]    <1> 	mov	dx, [HF_PORT]
  5499                              <1> 					; OUTPUT THE ECC BYTES
  5500                              <1> 	;mov	ecx, 4  ; mov cx, 4
  5501                              <1> 	; 16/07/2022
  5502 00005386 29C9                <1> 	sub	ecx, ecx
  5503 00005388 B104                <1> 	mov	cl, 4
  5504                              <1> CMD_O2:
  5505 0000538A 8A06                <1> 	mov	al, [esi]
  5506 0000538C EE                  <1> 	out	dx, al
  5507 0000538D 46                  <1> 	inc	esi
  5508 0000538E E2FA                <1> 	loop	CMD_O2
  5509                              <1> CMD_O3:
  5510 00005390 E8E7020000          <1> 	call	_WAIT			; WAIT FOR SECTOR COMPLETE INTERRUPT
  5511 00005395 75AC                <1> 	jnz	short TM_OUT		; ERROR RETURNED
  5512 00005397 E884010000          <1> 	call	CHECK_STATUS
  5513 0000539C 75A5                <1> 	jnz	short CMD_ABORT
  5514 0000539E F605[19790100]08    <1> 	test	byte [HF_STATUS], ST_DRQ ; CHECK FOR MORE
  5515 000053A5 75B7                <1> 	jnz	short CMD_O1
  5516                              <1> 	;mov	dx, HF_PORT+2		; CHECK RESIDUAL SECTOR COUNT
  5517 000053A7 668B15[0E660000]    <1> 	mov	dx, [HF_PORT]
  5518 000053AE 80C202              <1> 	add	dl, 2
  5519                              <1> 	;inc	dl
  5520                              <1> 	;inc	dl
  5521 000053B1 EC                  <1> 	in	al, dx			;
  5522 000053B2 A8FF                <1> 	test	al, 0FFh 		;
  5523 000053B4 7407                <1> 	jz	short CMD_O4		; COUNT = 0 OK
  5524 000053B6 C605[1F790100]BB    <1> 	mov	byte [DISK_STATUS1], UNDEF_ERR 
  5525                              <1> 					; OPERATION ABORTED - PARTIAL TRANSFER
  5526                              <1> CMD_O4:
  5527 000053BD C3                  <1> 	retn
  5528                              <1> 
  5529                              <1> 	; 16/07/2022 - TRDOS 386 v2.0.5
  5530                              <1> 
  5531                              <1> ;----------------------------------------
  5532                              <1> ;	FORMATTING	     (AH = 05H) :
  5533                              <1> ;----------------------------------------
  5534                              <1> 
  5535                              <1> FMT_TRK:				; FORMAT TRACK (AH = 005H)
  5536 000053BE C645FE50            <1> 	mov	byte [CMD_BLOCK+6], FMTTRK_CMD
  5537                              <1> 	;push	es
  5538                              <1> 	;push	bx
  5539 000053C2 53                  <1> 	push	ebx
  5540 000053C3 E899030000          <1> 	call	GET_VEC 		; GET DISK PARAMETERS ADDRESS
  5541                              <1> 	;mov	al, [ES:BX+14]		; GET SECTORS/TRACK
  5542 000053C8 8A430E              <1> 	mov	al, [ebx+14]
  5543 000053CB 8845F9              <1> 	mov	[CMD_BLOCK+1], al	; SET SECTOR COUNT IN COMMAND
  5544 000053CE 5B                  <1> 	pop	ebx
  5545                              <1> 	;pop	bx
  5546                              <1> 	;pop	es
  5547                              <1> 	;jmp	short CMD_OF		; GO EXECUTE THE COMMAND
  5548                              <1> 	; 01/12/2023
  5549 000053CF E97AFFFFFF          <1> 	jmp	CMD_OF
  5550                              <1> 
  5551                              <1> ;----------------------------------------
  5552                              <1> ;	DISK VERIFY	     (AH = 04H) :
  5553                              <1> ;----------------------------------------
  5554                              <1> 
  5555                              <1> DISK_VERF:
  5556 000053D4 C645FE40            <1> 	mov	byte [CMD_BLOCK+6], VERIFY_CMD
  5557 000053D8 E82D020000          <1> 	call	COMMAND
  5558 000053DD 750C                <1> 	jnz	short VERF_EXIT		; CONTROLLER STILL BUSY
  5559 000053DF E898020000          <1> 	call	_WAIT			; (Original: CALL WAIT)	
  5560 000053E4 7505                <1> 	jnz	short VERF_EXIT		; TIME OUT
  5561 000053E6 E835010000          <1> 	call	CHECK_STATUS
  5562                              <1> VERF_EXIT:
  5563 000053EB C3                  <1> 	retn
  5564                              <1> 
  5565                              <1> ;----------------------------------------
  5566                              <1> ;	READ DASD TYPE	     (AH = 15H) :
  5567                              <1> ;----------------------------------------
  5568                              <1> 
  5569                              <1> RETURN_DRIVE_TYPE:
  5570                              <1> 	; 10/08/2022
  5571                              <1> 	; 13/07/2022
  5572                              <1> 	; (Ref: Programmer's Guide to the AMIBIOS -Page 214-, 1992)
  5573                              <1> 	;
  5574                              <1> 	; INPUT:
  5575                              <1> 	;	DL = Disk number (>= 80h)
  5576                              <1> 	;   TRDOS 386 v2.0.5 Feature:
  5577                              <1> 	;	If AL = 0FFh, return disk size in ECX
  5578                              <1> 	;		otherwise in CX:DX
  5579                              <1> 	; OUTPUT:
  5580                              <1> 	;	AH = 00h - No drive present
  5581                              <1> 	;	   = 03h - Hard disk drive
  5582                              <1> 	;	CF = 0 - No error
  5583                              <1> 	;	   = 1 - Error  	 
  5584                              <1> 	;   TRDOS 386 v2.0.5 Feature:
  5585                              <1> 	;	AL = 00h - LBA not ready !	
  5586                              <1> 	;	   = 01h - LBA ready 
  5587                              <1> 	;		(28 bit or 48 bit LBA r/w depending
  5588                              <1> 	;		on disk size in CX:DX)
  5589                              <1> 	;	CX:DX = Number of 512 byte sectors
  5590                              <1> 	;
  5591                              <1> 	; (Note: High words of ECX and EDX will be zero at return)
  5592                              <1> 	; ((If AL input is 0FFh, disk size will be in ECX only))
  5593                              <1> 
  5594                              <1> READ_DASD_TYPE:
  5595                              <1> READ_D_T:				; GET DRIVE PARAMETERS
  5596                              <1> 	;push	ds			; SAVE REGISTERS
  5597                              <1> 	
  5598                              <1> 	;;push	es
  5599                              <1> 	; 18/04/2021
  5600                              <1> 	;push	ebx
  5601                              <1> 	;;call	DDS			; ESTABLISH ADDRESSING
  5602                              <1> 	;;push	cs
  5603                              <1> 	;;pop	ds
  5604                              <1>         
  5605                              <1> 	; 18/04/2021
  5606                              <1> 	;mov	bx, KDATA
  5607                              <1> 	;mov	ds, bx
  5608                              <1> 	;;mov	es, bx
  5609                              <1> 	;mov	byte [DISK_STATUS1], 0
  5610                              <1> 	;mov	bl, [HF_NUM]		; GET NUMBER OF DRIVES
  5611                              <1> 	;and	dl, 7Fh			; GET DRIVE NUMBER
  5612                              <1> 	;cmp	bl, dl
  5613                              <1> 	;jbe	short RDT_NOT_PRESENT 	; RETURN DRIVE NOT PRESENT
  5614                              <1> 	
  5615                              <1> 	;mov	ax, KDATA
  5616                              <1> 	;mov	ds, ax
  5617                              <1> 	
  5618 000053EC C605[1F790100]00    <1> 	mov	byte [DISK_STATUS1], 0
  5619 000053F3 8A0D[20790100]      <1> 	mov	cl, [HF_NUM]
  5620 000053F9 80E27F              <1> 	and	dl, 7Fh
  5621 000053FC 38D1                <1> 	cmp	cl, dl
  5622 000053FE 7631                <1> 	jbe	short RDT_NOT_PRESENT
  5623                              <1> 
  5624                              <1> 	; 18/04/2021 - TRDOS 386 v2.0.4
  5625                              <1> 	
  5626                              <1> 	;call	GET_VEC 		; GET DISK PARAMETER ADDRESS
  5627                              <1> 	;
  5628                              <1> 	;;mov	al, [ES:BX+2]		; HEADS
  5629                              <1> 	;mov	al, [ebx+2]  ; heads (logical)
  5630                              <1> 	;;;mov	cl, [ES:BX+14]
  5631                              <1> 	;;mov	cl, [ebx+14]
  5632                              <1> 	;; 17/04/2021
  5633                              <1> 	;mov	ah, [ebx+14] ; sectors per track (logical)
  5634                              <1> 	;;imul	cl			; * NUMBER OF SECTORS
  5635                              <1> 	;;mov	cx, [ES:BX]		; MAX NUMBER OF CYLINDERS
  5636                              <1> 	;mov	cx, [ebx]    ; cylinders (logical)
  5637                              <1> 	;; 02/01/2015 
  5638                              <1> 	;; ** leave the last cylinder as reserved for diagnostics **
  5639                              <1> 	;; (Also in Award BIOS - 1999, AHDSK.ASM, FUN15 -> sub ax, 1)
  5640                              <1> 	;dec	cx			; LEAVE ONE FOR DIAGNOSTICS
  5641                              <1> 	;;imul	cx			; NUMBER OF SECTORS	 	
  5642                              <1> 	;; 17/04/2021
  5643                              <1> 	;mul	ah
  5644                              <1> 	;; ax = spt*heads
  5645                              <1> 	;mul	cx	 
  5646                              <1> 	;; dx:ax = number of sectors
  5647                              <1> 	;
  5648                              <1> 	;mov	cx, dx			; HIGH ORDER HALF
  5649                              <1> 	;mov	dx, ax			; LOW ORDER HALF
  5650                              <1> 
  5651                              <1> 	; 18/04/2021
  5652 00005400 B102                <1> 	mov	cl, 2
  5653 00005402 00CA                <1> 	add	dl, cl ; hd0 = 2
  5654                              <1> 
  5655                              <1> 	; 13/07/2022
  5656 00005404 0FB6D2              <1> 	movzx	edx, dl
  5657 00005407 8A9A[3E660000]      <1> 	mov	bl, [edx+drv.status]
  5658 0000540D 80E301              <1> 	and	bl, 1 ; LBA ready bit (bit 0) 
  5659                              <1> 
  5660 00005410 D2E2                <1> 	shl	dl, cl ; * 4
  5661                              <1> 	
  5662                              <1> 	;mov	eax, [edx+drv.size]
  5663                              <1> 	;mov	dx, ax
  5664                              <1> 	;shr	eax, 16
  5665                              <1> 	;mov	cx, ax
  5666                              <1> 
  5667 00005412 8B8A[22660000]      <1> 	mov	ecx, [edx+drv.size]
  5668                              <1> 
  5669                              <1> 	; 13/07/2022
  5670                              <1> 	;cmp	al, 0FFh   ; return disk size in ecx ?
  5671                              <1> 	;je	short RDT1 ; yes
  5672 00005418 FEC0                <1> 	inc	al  ; 0FFh -> 0
  5673 0000541A 740A                <1> 	jz	short RDT1
  5674                              <1> 
  5675 0000541C 6689CA              <1> 	mov	dx, cx
  5676 0000541F C1E910              <1> 	shr	ecx, 16
  5677                              <1> 
  5678                              <1> 	; 13/07/2022
  5679                              <1> 	; ebx = esp+20
  5680                              <1> 	; ecx = esp+16
  5681                              <1> 	; edx = esp+12
  5682                              <1> 	; esi = esp+8
  5683                              <1> 	; edi = esp+4
  5684                              <1> 
  5685                              <1> 	; return disk size in user's registers
  5686 00005422 8954240C            <1> 	mov	[esp+12], edx
  5687                              <1> 	; cx:dx = disk size
  5688                              <1> RDT1:
  5689                              <1> 	;mov	[esp+16], ecx
  5690                              <1> 
  5691                              <1> 	;;sub	al, al
  5692 00005426 29C0                <1> 	sub	eax, eax
  5693 00005428 B403                <1> 	mov	ah, 03h			; INDICATE FIXED DISK
  5694 0000542A 88D8                <1> 	mov	al, bl
  5695                              <1> 	; al = 1 -> LBA r/w ready/applicable
  5696                              <1> 	;    = 0 -> LBA r/w not ready/applicable	 
  5697                              <1> 	; cf = 0
  5698                              <1> RDT2:
  5699 0000542C 894C2410            <1> 	mov	[esp+16], ecx	
  5700                              <1> ;RDT2:
  5701                              <1> 	; 13/07/2022
  5702                              <1> 	; 18/04/2021
  5703                              <1> 	;pop	ebx			; RESTORE REGISTERS
  5704                              <1> 	;;pop	es
  5705                              <1> 	;pop	ds
  5706                              <1> 	; (*) clc			; CLEAR CARRY
  5707                              <1> 	;retf	2
  5708                              <1> 	; (*) 29/05/2016
  5709                              <1> 	; (*) retf 4
  5710                              <1> 	;and	byte [esp+8], 0FEh ; clear carry bit of eflags register
  5711                              <1> 	;iretd
  5712                              <1> 
  5713                              <1> 	; 13/07/2022
  5714                              <1> 	; [DISK_STATUS1] = 0
  5715                              <1> 	; ah = 3
  5716                              <1> 	; al = 0 or 1 (LBA ready)
  5717                              <1> 	; cf = 0	
  5718                              <1> 	
  5719 00005430 C3                  <1> 	retn
  5720                              <1> 
  5721                              <1> RDT_NOT_PRESENT:
  5722                              <1> 	;;sub	ax, ax			; DRIVE NOT PRESENT RETURN
  5723                              <1> 	;; 18/04/2021
  5724                              <1> 	;sub	eax, eax
  5725                              <1> 	;;mov	cx, ax			; ZERO BLOCK COUNT
  5726                              <1> 	;;mov	dx, ax
  5727                              <1> 	;mov	ecx, eax
  5728                              <1> 	;mov	edx, eax
  5729                              <1> 	;jmp	short RDT2
  5730                              <1> 	; 13/07/2022
  5731 00005431 29C9                <1> 	sub	ecx, ecx
  5732 00005433 88C1                <1> 	mov	cl, al ; if AL = 0FFh, disk size will be in ECX
  5733                              <1> 		       ; if not, disk size will be in CX:DX 
  5734 00005435 29C0                <1> 	sub	eax, eax
  5735 00005437 FEC1                <1> 	inc	cl ; 0FFh -> 0
  5736 00005439 80F901              <1> 	cmp	cl, 1
  5737 0000543C 72EE                <1> 	jb	short RDT2 ; ecx = 0
  5738                              <1> 	; 10/08/2022
  5739 0000543E 28C9                <1> 	sub	cl, cl
  5740                              <1> 	; ecx = 0
  5741 00005440 8944240C            <1> 	mov	[esp+12], eax ; edx = 0
  5742 00005444 F9                  <1> 	stc
  5743 00005445 EBE5                <1> 	jmp	short RDT2 ; cf = 1, eax = 0	
  5744                              <1> 
  5745                              <1> ; 10/08/2022
  5746                              <1> ; 07/08/2022
  5747                              <1> ; 13/07/2022 - TRDOS 386 v2.0.5
  5748                              <1> ; 28/05/2016
  5749                              <1> ; 27/05/2016 - TRDOS 386 (TRDOS v2.0)
  5750                              <1> 
  5751                              <1> ;----------------------------------------
  5752                              <1> ;	GET PARAMETERS	     (AH = 08H) :
  5753                              <1> ;----------------------------------------
  5754                              <1> 
  5755                              <1> GET_PARM_N:
  5756                              <1> 	; ebx = user's buffer address for parameters table
  5757                              <1> 	; 10/08/2022
  5758                              <1> 	; 13/07/2022
  5759                              <1> 	; (if ebx = 0, HDPT will not be returned to user)
  5760                              <1> 	;	
  5761                              <1> ;GET_PARM:				; GET DRIVE PARAMETERS
  5762                              <1> 	;push	ds			; SAVE REGISTERS
  5763                              <1> 	;push	es
  5764                              <1> 	
  5765                              <1> 	;push	ebx
  5766 00005447 89DF                <1> 	mov	edi, ebx ; 13/07/2022 	
  5767                              <1> 
  5768                              <1> 	; 13/07/2022
  5769                              <1> 	; ((IBM PC XT-286 ROM BIOS source code remainders))
  5770                              <1> 	;;mov	ax, ABS0 		; ESTABLISH ADDRESSING
  5771                              <1> 	;;mov	ds, ax
  5772                              <1> 	
  5773                              <1> 	;;test	dl, 1			; CHECK FOR DRIVE 1
  5774                              <1> 	;;jz	short G0
  5775                              <1> 	;;les	bx, @HF1_TBL_VEC
  5776                              <1> 	;;jmp	short G1
  5777                              <1> ;;G0:	
  5778                              <1> 	;les	bx, @HF_TBL_VEC
  5779                              <1> ;;G1:
  5780                              <1> 	;;call	DDS			; ESTABLISH SEGMENT
  5781                              <1> 	
  5782                              <1> 	; 13/07/2022
  5783                              <1> 	; 22/12/2014
  5784                              <1> 	;;push	cs
  5785                              <1> 	;;pop	ds
  5786                              <1> 	;mov	bx, KDATA
  5787                              <1> 	;mov	ds, bx
  5788                              <1> 	;mov	es, bx	; 27/05/2016
  5789                              <1> 	;
  5790                              <1> 	; 18/04/2021
  5791 00005449 29C9                <1> 	sub	ecx, ecx
  5792                              <1> 	;
  5793 0000544B 80EA80              <1> 	sub	dl, 80h
  5794 0000544E 80FA04              <1> 	cmp	dl, MAX_FILE		; TEST WITHIN RANGE
  5795 00005451 7344                <1> 	jae	short G2 ; 13/07/2022
  5796                              <1> 	;
  5797                              <1>  	; 21/02/2015
  5798 00005453 31DB                <1> 	xor	ebx, ebx
  5799                              <1> 	; 18/04/2021
  5800                              <1> 	;sub	ecx, ecx
  5801                              <1> 	; 22/12/2014
  5802 00005455 88D3                <1> 	mov	bl, dl
  5803                              <1> 	;xor	bh, bh  
  5804 00005457 C0E302              <1> 	shl	bl, 2			; convert index to offset
  5805                              <1> 	;add	bx, HF_TBL_VEC
  5806 0000545A 81C3[24790100]      <1> 	add	ebx, HF_TBL_VEC
  5807                              <1> 	;mov	ax, [bx+2]
  5808                              <1> 	;mov	es, ax			; dpt segment
  5809                              <1> 	;mov	bx, [bx]		; dpt offset
  5810 00005460 8B1B                <1> 	mov	ebx, [ebx] ; 32 bit offset	
  5811                              <1> 	; 18/04/2021
  5812 00005462 29D2                <1> 	sub	edx, edx
  5813 00005464 8815[1F790100]      <1>  	mov	[DISK_STATUS1], dl ; 0
  5814                              <1> 
  5815                              <1> 	;mov	byte [DISK_STATUS1], 0
  5816                              <1>         ;mov	ax, [ES:BX]		; MAX NUMBER OF CYLINDERS
  5817 0000546A 668B03              <1> 	mov	ax, [ebx]
  5818                              <1> 	;;sub	ax, 2			; ADJUST FOR 0-N
  5819 0000546D 6648                <1> 	dec	ax			; max. cylinder number
  5820 0000546F 88C5                <1> 	mov	ch, al
  5821 00005471 66250003            <1> 	and	ax, 0300h		; HIGH TWO BITS OF CYLINDER
  5822                              <1> 	;shr	ax, 1
  5823                              <1> 	;shr	ax, 1
  5824                              <1> 	; 13/07/2022
  5825                              <1> 	;shr	ax, 2
  5826                              <1> 	; 07/08/2022
  5827 00005475 C1E802              <1> 	shr	eax, 2
  5828                              <1> 	;or	al, [ES:BX+14]		; SECTORS
  5829 00005478 0A430E              <1> 	or	al, [ebx+14]
  5830 0000547B 88C1                <1> 	mov	cl, al
  5831                              <1> 	;mov	dh, [ES:BX+2]		; HEADS
  5832 0000547D 8A7302              <1> 	mov	dh, [ebx+2]
  5833 00005480 FECE                <1> 	dec	dh			; 0-N RANGE
  5834 00005482 8A15[20790100]      <1> 	mov	dl, [HF_NUM]		; DRIVE COUNT
  5835                              <1> 	;;sub	ax, ax
  5836                              <1> 	; 18/04/2021
  5837                              <1> 	;sub	eax, eax
  5838                              <1> 
  5839                              <1> 	; 27/12/2014 
  5840                              <1> 	;mov	di, bx			; HDPT offset
  5841                              <1> 
  5842                              <1> 	; 13/07/2022
  5843                              <1> 	; ebx = esp+20
  5844                              <1> 	; ecx = esp+16
  5845                              <1> 	; edx = esp+12
  5846                              <1> 	; esi = esp+8
  5847                              <1> 	; edi = esp+4
  5848                              <1> 
  5849                              <1> 	; 13/07/2022
  5850                              <1> 	; set return register contents/values
  5851 00005488 894C2410            <1> 	mov	[esp+16], ecx
  5852 0000548C 8954240C            <1> 	mov	[esp+12], edx
  5853                              <1> 
  5854                              <1> 	; is hard disk parameters table requested ?
  5855 00005490 09FF                <1> 	or	edi, edi ; (edi = [ebp+24] = ebx)
  5856 00005492 751B                <1> 	jnz	short G3 ; yes
  5857                              <1> 
  5858 00005494 29C0                <1> 	sub	eax, eax	
  5859                              <1> 
  5860                              <1> 	; [DISK_STATUS1] = 0
  5861                              <1> 	; eax = 0
  5862                              <1> 	; cf = 0
  5863                              <1> 
  5864 00005496 C3                  <1> 	retn
  5865                              <1> 
  5866                              <1> G2:
  5867                              <1> 	;mov	ah, INIT_FAIL
  5868                              <1> 	;mov	byte [DISK_STATUS1], ah ; (INIT_FAIL)
  5869                              <1> 	;				; OPERATION FAILED
  5870                              <1> 	;sub	al, al
  5871                              <1> 	;sub	dx, dx
  5872                              <1> 	;sub	cx, cx
  5873                              <1> 	; 18/04/2021
  5874 00005497 29C0                <1> 	sub	eax, eax
  5875 00005499 B407                <1> 	mov	ah, INIT_FAIL
  5876 0000549B 8825[1F790100]      <1> 	mov     [DISK_STATUS1], ah	; OPERATION FAILED
  5877                              <1> 
  5878                              <1> 	; 13/07/2022
  5879                              <1> 	;sub	edx, edx
  5880                              <1> 	;sub	ecx, ecx
  5881                              <1> 	; ecx = 0
  5882 000054A1 894C240C            <1> 	mov	[esp+12], ecx ; 0 ; edx (heads-1, drive count)
  5883 000054A5 894C2410            <1> 	mov	[esp+16], ecx ; 0 ; ecx (cylinders-1, sectors)
  5884 000054A9 894C2414            <1> 	mov	[esp+20], ecx ; 0 ; ebx (HDPT address)
  5885                              <1> 
  5886 000054AD F9                  <1> 	stc
  5887 000054AE C3                  <1> 	retn
  5888                              <1> 
  5889                              <1> 	; 13/07/2022
  5890                              <1> 	; 29/05/2016 (*)
  5891                              <1> 	;;stc				; SET ERROR FLAG
  5892                              <1> 	;;jmp	short G5
  5893                              <1> 	;jmp	short _G6
  5894                              <1> 
  5895                              <1> G3:	
  5896                              <1> 	; 27/05/2016
  5897                              <1> 	; return fixed disk parameters table to user
  5898                              <1> 	; in user's buffer, which is pointed by EBX
  5899                              <1> 	
  5900                              <1> 	;xchg	edi, [esp]		; ebx (input)-> edi, edi -> [esp]
  5901                              <1> 	; 13/07/2022
  5902                              <1> 	;pop	edi
  5903                              <1> 	; edi = user's buffer address
  5904                              <1> 	;push	esi
  5905 000054AF 89DE                <1> 	mov	esi, ebx		; hard disk parameter table (32 bytes)	
  5906                              <1> 	;mov	ebx, edi		; ebx = user's buffer address
  5907 000054B1 51                  <1> 	push	ecx
  5908                              <1> 	;push	eax
  5909                              <1> 	;mov	ecx, 32 ; 32 bytes
  5910 000054B2 30ED                <1> 	xor	ch, ch
  5911 000054B4 B120                <1> 	mov	cl, 32
  5912                              <1> 	; ecx = 32
  5913 000054B6 E8D6B90000          <1> 	call	transfer_to_user_buffer ; trdosk6.s (16/05/2016)
  5914                              <1> 	;pop	eax
  5915 000054BB 59                  <1> 	pop	ecx
  5916                              <1> 	; 10/08/2022
  5917                              <1> 	;pop	esi
  5918                              <1> 	;pop	edi
  5919 000054BC 7306                <1> 	jnc	short G4
  5920                              <1> 	; 29/05/2016 (*)
  5921 000054BE B8FF000000          <1> 	mov	eax, 0FFh ; unknown error !
  5922                              <1> 	; [DISK_STATUS1] = 0
  5923                              <1> 	; ah = 0, al = 0FFh
  5924                              <1> 	; cf = 1
  5925                              <1> 	
  5926 000054C3 C3                  <1> 	retn
  5927                              <1> ;_G6:
  5928                              <1> 	;or	byte [esp+16], 1 ; set carry bit of eflags register
  5929                              <1> ;G5:
  5930                              <1> 	; 27/05/2016
  5931                              <1> 	;pop	ebx			; RESTORE REGISTERS
  5932                              <1> 	;pop	es
  5933                              <1> 	;pop	ds
  5934                              <1> 	;;retf	2
  5935                              <1> 	; (*) 29/05/2016
  5936                              <1> 	; (*) retf 4
  5937                              <1> 	; (*) or byte [esp+8], 1 ; set carry bit of eflags register
  5938                              <1> 	;iretd
  5939                              <1> 
  5940                              <1> G4:
  5941                              <1> 	; 13/07/2022
  5942 000054C4 31C0                <1> 	xor	eax, eax
  5943                              <1> 
  5944                              <1> 	; [user_buffer] = [ebp+24] = HDPT
  5945                              <1> 	; [DISK_STATUS1] = 0
  5946                              <1> 	; eax = 0
  5947                              <1> 	; cf = 0
  5948                              <1> 
  5949 000054C6 C3                  <1> 	retn
  5950                              <1> 
  5951                              <1> 	; 16/07/2022 - TRDOS 386 v2.0.5
  5952                              <1> 	
  5953                              <1> ;----------------------------------------
  5954                              <1> ;	INITIALIZE DRIVE     (AH = 09H) :
  5955                              <1> ;----------------------------------------
  5956                              <1> 	; 03/01/2015
  5957                              <1> 	; According to ATA-ATAPI specification v2.0 to v5.0
  5958                              <1> 	; logical sector per logical track
  5959                              <1> 	; and logical heads - 1 would be set but
  5960                              <1> 	; it is seen as it will be good
  5961                              <1> 	; if physical parameters will be set here
  5962                              <1> 	; because, number of heads <= 16.
  5963                              <1> 	; (logical heads usually more than 16)
  5964                              <1> 	; NOTE: ATA logical parameters (software C, H, S)
  5965                              <1> 	;	== INT 13h physical parameters
  5966                              <1> 
  5967                              <1> ;INIT_DRV:
  5968                              <1> ;	mov	byte [CMD_BLOCK+6], SET_PARM_CMD
  5969                              <1> ;	call	GET_VEC 		; ES:BX -> PARAMETER BLOCK
  5970                              <1> ;	mov	al, [es:bx+2]		; GET NUMBER OF HEADS
  5971                              <1> ;	dec	al			; CONVERT TO 0-INDEX
  5972                              <1> ;	mov	ah, [CMD_BLOCK+5] 	; GET SDH REGISTER
  5973                              <1> ;	and	ah, 0F0h 		; CHANGE HEAD NUMBER
  5974                              <1> ;	or	ah, al			; TO MAX HEAD
  5975                              <1> ;	mov	[CMD_BLOCK+5], ah
  5976                              <1> ;	mov	al, [es:bx+14]		; MAX SECTOR NUMBER
  5977                              <1> ;	mov	[CMD_BLOCK+1], al
  5978                              <1> ;	sub	ax, ax
  5979                              <1> ;	mov	[CMD_BLOCK+3], al 	; ZERO FLAGS
  5980                              <1> ;	call	COMMAND 		; TELL CONTROLLER
  5981                              <1> ;	jnz	short INIT_EXIT		; CONTROLLER BUSY ERROR
  5982                              <1> ;	call	NOT_BUSY		; WAIT FOR IT TO BE DONE
  5983                              <1> ;	jnz	short INIT_EXIT		; TIME OUT
  5984                              <1> ;	call	CHECK_STATUS
  5985                              <1> ;INIT_EXIT:
  5986                              <1> ;	retn
  5987                              <1> 
  5988                              <1> ; 16/07/2022 - TRDOS 386 v2.0.5
  5989                              <1> 
  5990                              <1> ; 04/01/2015
  5991                              <1> ; 02/01/2015 - Derived from from AWARD BIOS 1999
  5992                              <1> ;				 AHDSK.ASM - INIT_DRIVE
  5993                              <1> INIT_DRV:
  5994                              <1> 	;xor	ah,ah
  5995 000054C7 31C0                <1> 	xor	eax, eax ; 21/02/2015
  5996 000054C9 B00B                <1> 	mov	al, 11 ; Physical heads from translated HDPT
  5997 000054CB 3825[34790100]      <1>         cmp     [LBAMode], ah   ; 0
  5998 000054D1 7702                <1> 	ja	short idrv0
  5999 000054D3 B002                <1> 	mov	al, 2  ; Physical heads from standard HDPT
  6000                              <1> idrv0:
  6001                              <1> 	; DL = drive number (0 based)
  6002 000054D5 E887020000          <1> 	call	GET_VEC
  6003                              <1> 	;push	bx
  6004 000054DA 53                  <1> 	push	ebx ; 21/02/2015
  6005                              <1> 	;add	bx, ax
  6006 000054DB 01C3                <1> 	add	ebx, eax
  6007                              <1> 	;; 05/01/2015
  6008 000054DD 8A25[12660000]      <1> 	mov	ah, [hf_m_s] ; drive number (0= master, 1= slave)
  6009                              <1> 	;;and 	ah, 1 
  6010 000054E3 C0E404              <1> 	shl	ah, 4
  6011 000054E6 80CCA0              <1> 	or	ah, 0A0h  ; Drive/Head register - 10100000b (A0h)	
  6012                              <1> 	;mov	al, [es:bx]
  6013 000054E9 8A03                <1> 	mov	al, [ebx] ; 21/02/2015
  6014 000054EB FEC8                <1> 	dec	al	 ; last head number 
  6015                              <1> 	;and	al, 0Fh
  6016 000054ED 08E0                <1> 	or	al, ah	 ; lower 4 bits for head number
  6017                              <1> 	;
  6018 000054EF C645FE91            <1> 	mov	byte [CMD_BLOCK+6], SET_PARM_CMD
  6019 000054F3 8845FD              <1> 	mov	[CMD_BLOCK+5], al
  6020                              <1> 	;pop	bx
  6021 000054F6 5B                  <1> 	pop	ebx
  6022 000054F7 29C0                <1> 	sub	eax, eax ; 21/02/2015
  6023 000054F9 B004                <1> 	mov	al, 4	; Physical sec per track from translated HDPT
  6024 000054FB 803D[34790100]00    <1> 	cmp	byte [LBAMode], 0
  6025 00005502 7702                <1> 	ja	short idrv1
  6026 00005504 B00E                <1> 	mov	al, 14	; Physical sec per track from standard HDPT
  6027                              <1> idrv1:
  6028                              <1> 	;xor	ah, ah
  6029                              <1> 	;add	bx, ax
  6030 00005506 01C3                <1> 	add	ebx, eax ; 21/02/2015
  6031                              <1> 	;mov	al, [es:bx]
  6032                              <1> 			; sector number
  6033 00005508 8A03                <1> 	mov	al, [ebx]
  6034 0000550A 8845F9              <1> 	mov	[CMD_BLOCK+1], al
  6035 0000550D 28C0                <1> 	sub	al, al
  6036 0000550F 8845FB              <1> 	mov	[CMD_BLOCK+3], al ; ZERO FLAGS
  6037 00005512 E8F3000000          <1> 	call	COMMAND 	  ; TELL CONTROLLER
  6038 00005517 751E                <1> 	jnz	short INIT_EXIT	  ; CONTROLLER BUSY ERROR
  6039 00005519 E88E010000          <1> 	call	NOT_BUSY	  ; WAIT FOR IT TO BE DONE
  6040 0000551E 7517                <1> 	jnz	short INIT_EXIT	  ; TIME OUT
  6041                              <1> 	; 16/07/2022
  6042                              <1> 	;call	CHECK_STATUS
  6043                              <1> 	;jmp	short CHECK_STATUS
  6044                              <1> ;INIT_EXIT:
  6045                              <1> 	;retn
  6046                              <1> 
  6047                              <1> 	; 16/07/2022 - TRDOS 386 v2.0.5
  6048                              <1> 	; 10/07/2022 - Retro UNIX 386 v1.1 (Kernel v0.2.1.5)
  6049                              <1> 
  6050                              <1> ;----------------------------------------
  6051                              <1> ;	CHECK FIXED DISK STATUS 	:
  6052                              <1> ;----------------------------------------
  6053                              <1> CHECK_STATUS:
  6054 00005520 E8D9010000          <1> 	call	CHECK_ST		; CHECK THE STATUS BYTE
  6055                              <1> 	;jnz	short CHECK_S1		; AN ERROR WAS FOUND
  6056                              <1> 	; 10/07/2022
  6057 00005525 7510                <1> 	jnz	short CHECK_S2
  6058 00005527 A801                <1> 	test	al, ST_ERROR		; WERE THERE ANY OTHER ERRORS
  6059 00005529 7405                <1> 	jz	short CHECK_S1		; NO ERROR REPORTED
  6060 0000552B E80E020000          <1> 	call	CHECK_ER		; ERROR REPORTED
  6061                              <1> CHECK_S1:
  6062 00005530 803D[1F790100]00    <1> 	cmp	byte [DISK_STATUS1], 0 	; SET STATUS FOR CALLER
  6063                              <1> CHECK_S2:
  6064                              <1> INIT_EXIT:	; 10/07/2022
  6065 00005537 C3                  <1> 	retn
  6066                              <1> 
  6067                              <1> 	; 16/07/2022 - TRDOS 386 v2.0.5
  6068                              <1> 
  6069                              <1> ;----------------------------------------
  6070                              <1> ;	SEEK		     (AH = 0CH) :
  6071                              <1> ;----------------------------------------
  6072                              <1> 
  6073                              <1> DISK_SEEK:
  6074 00005538 C645FE70            <1>         mov	byte [CMD_BLOCK+6], SEEK_CMD
  6075 0000553C E8C9000000          <1> 	call	COMMAND
  6076 00005541 751C                <1> 	jnz	short DS_EXIT		; CONTROLLER BUSY ERROR
  6077 00005543 E834010000          <1> 	call	_WAIT
  6078 00005548 7515                <1>         jnz	short DS_EXIT		; TIME OUT ON SEEK
  6079 0000554A E8D1FFFFFF          <1> 	call	CHECK_STATUS
  6080 0000554F 803D[1F790100]40    <1>         cmp	byte [DISK_STATUS1], BAD_SEEK
  6081 00005556 7507                <1> 	jne	short DS_EXIT
  6082 00005558 C605[1F790100]00    <1>         mov	byte [DISK_STATUS1], 0
  6083                              <1> DS_EXIT:
  6084 0000555F C3                  <1> 	retn
  6085                              <1> 
  6086                              <1> ;----------------------------------------
  6087                              <1> ;	TEST DISK READY      (AH = 10H) :
  6088                              <1> ;----------------------------------------
  6089                              <1> 
  6090                              <1> TST_RDY:				; WAIT FOR CONTROLLER
  6091 00005560 E847010000          <1> 	call	NOT_BUSY
  6092 00005565 751C                <1> 	jnz	short TR_EX
  6093 00005567 8A45FD              <1> 	mov	al, [CMD_BLOCK+5] 	; SELECT DRIVE
  6094 0000556A 668B15[0E660000]    <1> 	mov	dx, [HF_PORT]
  6095 00005571 80C206              <1> 	add	dl, 6
  6096 00005574 EE                  <1> 	out	dx, al
  6097 00005575 E884010000          <1> 	call	CHECK_ST		; CHECK STATUS ONLY
  6098 0000557A 7507                <1> 	jnz	short TR_EX
  6099 0000557C C605[1F790100]00    <1> 	mov	byte [DISK_STATUS1], 0 	; WIPE OUT DATA CORRECTED ERROR
  6100                              <1> TR_EX:	
  6101 00005583 C3                  <1> 	retn
  6102                              <1> 
  6103                              <1> ;----------------------------------------
  6104                              <1> ;	RECALIBRATE	     (AH = 11H) :
  6105                              <1> ;----------------------------------------
  6106                              <1> 
  6107                              <1> HDISK_RECAL:
  6108 00005584 C645FE10            <1>         mov	byte [CMD_BLOCK+6], RECAL_CMD ; 10h, 16
  6109 00005588 E87D000000          <1> 	call	COMMAND 		; START THE OPERATION
  6110 0000558D 7523                <1> 	jnz	short RECAL_EXIT	; ERROR
  6111 0000558F E8E8000000          <1> 	call	_WAIT			; WAIT FOR COMPLETION
  6112 00005594 7407                <1> 	jz	short RECAL_X 		; TIME OUT ONE OK ?
  6113 00005596 E8E1000000          <1> 	call	_WAIT			; WAIT FOR COMPLETION LONGER
  6114 0000559B 7515                <1> 	jnz	short RECAL_EXIT	; TIME OUT TWO TIMES IS ERROR
  6115                              <1> RECAL_X:
  6116 0000559D E87EFFFFFF          <1> 	call	CHECK_STATUS
  6117 000055A2 803D[1F790100]40    <1> 	cmp	byte [DISK_STATUS1], BAD_SEEK ; SEEK NOT COMPLETE
  6118 000055A9 7507                <1> 	jne	short RECAL_EXIT	; IS OK
  6119 000055AB C605[1F790100]00    <1> 	mov	byte [DISK_STATUS1], 0
  6120                              <1> RECAL_EXIT:
  6121 000055B2 803D[1F790100]00    <1>         cmp	byte [DISK_STATUS1], 0
  6122 000055B9 C3                  <1> 	retn
  6123                              <1> 
  6124                              <1> ;----------------------------------------
  6125                              <1> ;      CONTROLLER DIAGNOSTIC (AH = 14H) :
  6126                              <1> ;----------------------------------------
  6127                              <1> 
  6128                              <1> CTLR_DIAGNOSTIC:
  6129                              <1> 	; 07/08/2022 - TRDOS 386 v2.0.5
  6130 000055BA FA                  <1> 	cli				; DISABLE INTERRUPTS WHILE CHANGING MASK
  6131 000055BB E4A1                <1> 	in	al, INTB01		; TURN ON SECOND INTERRUPT CHIP
  6132                              <1> 	;and	al, 0BFH
  6133 000055BD 243F                <1> 	and	al, 3Fh			; enable IRQ 14 & IRQ 15
  6134                              <1> 	;jmp	$+2
  6135                              <1> 	IODELAY
    78 000055BF EB00                <2>  jmp short $+2
    79 000055C1 EB00                <2>  jmp short $+2
  6136 000055C3 E6A1                <1> 	out	INTB01, al
  6137                              <1> 	IODELAY
    78 000055C5 EB00                <2>  jmp short $+2
    79 000055C7 EB00                <2>  jmp short $+2
  6138 000055C9 E421                <1> 	in	al, INTA01		; LET INTERRUPTS PASS THRU TO
  6139 000055CB 24FB                <1> 	and	al, 0FBh 		;  SECOND CHIP
  6140                              <1> 	;jmp	$+2
  6141                              <1> 	IODELAY
    78 000055CD EB00                <2>  jmp short $+2
    79 000055CF EB00                <2>  jmp short $+2
  6142 000055D1 E621                <1> 	out	INTA01, al
  6143 000055D3 FB                  <1> 	sti
  6144 000055D4 E8D3000000          <1> 	call	NOT_BUSY		; WAIT FOR CARD
  6145 000055D9 7526                <1> 	jnz	short CD_ERR		; BAD CARD
  6146                              <1> 	;mov	dx, PORT+7
  6147 000055DB 668B15[0E660000]    <1> 	mov	dx, [HF_PORT]
  6148 000055E2 80C207              <1> 	add	dl, 7
  6149 000055E5 B090                <1> 	mov	al, DIAG_CMD		; START DIAGNOSE
  6150 000055E7 EE                  <1> 	out	dx, al
  6151 000055E8 E8BF000000          <1> 	call	NOT_BUSY		; WAIT FOR IT TO COMPLETE
  6152 000055ED B480                <1> 	mov	ah, TIME_OUT
  6153 000055EF 7512                <1> 	jnz	short CD_EXIT 		; TIME OUT ON DIAGNOSTIC
  6154                              <1> 	;mov	dx, HF_PORT+1		; GET ERROR REGISTER
  6155 000055F1 668B15[0E660000]    <1> 	mov	dx, [HF_PORT]
  6156 000055F8 FEC2                <1> 	inc	dl
  6157 000055FA EC                  <1> 	in	al, dx
  6158                              <1> 	; 07/08/2022
  6159                              <1> 	;mov	[HF_ERROR], al		; SAVE IT
  6160 000055FB B400                <1> 	mov	ah, 0
  6161 000055FD 3C01                <1> 	cmp	al, 1			; CHECK FOR ALL OK
  6162 000055FF 7402                <1> 	je	short CD_EXIT
  6163                              <1> CD_ERR:
  6164 00005601 B420                <1> 	mov	ah, BAD_CNTLR
  6165                              <1> CD_EXIT:
  6166 00005603 8825[1F790100]      <1> 	mov	[DISK_STATUS1], ah
  6167 00005609 C3                  <1> 	retn
  6168                              <1> 
  6169                              <1> 	; 16/07/2022 - TRDOS 386 v2.0.5
  6170                              <1> 	; 10/07/2022 - Retro UNIX 386 v1.1 (Kernel v0.2.1.5)
  6171                              <1> 
  6172                              <1> ;--------------------------------------------------------
  6173                              <1> ; COMMAND						:
  6174                              <1> ;	THIS ROUTINE OUTPUTS THE COMMAND BLOCK		:
  6175                              <1> ; OUTPUT						:
  6176                              <1> ;	BL = STATUS					:
  6177                              <1> ;	BH = ERROR REGISTER				:
  6178                              <1> ;--------------------------------------------------------
  6179                              <1> 
  6180                              <1> COMMAND:
  6181                              <1> 	;push	ebx ; 10/07/2022	; WAIT FOR SEEK COMPLETE AND READY
  6182                              <1> 	;;mov	ecx, DELAY_2		; SET INITIAL DELAY BEFORE TEST
  6183                              <1> COMMAND1:
  6184                              <1> 	;;push	ecx			; SAVE LOOP COUNT
  6185 0000560A E851FFFFFF          <1> 	call	TST_RDY 		; CHECK DRIVE READY
  6186                              <1> 	;;pop	ecx
  6187                              <1> 	;pop	ebx ; 10/07/2022
  6188 0000560F 7418                <1> 	jz	short COMMAND2		; DRIVE IS READY
  6189 00005611 803D[1F790100]80    <1>         cmp	byte [DISK_STATUS1], TIME_OUT ; TST_RDY TIMED OUT--GIVE UP
  6190                              <1> 	;jz	short CMD_TIMEOUT
  6191                              <1> 	;;loop	COMMAND1		; KEEP TRYING FOR A WHILE
  6192                              <1> 	;jmp	short COMMAND4		; ITS NOT GOING TO GET READY
  6193 00005618 7507                <1> 	jne	short COMMAND4
  6194                              <1> CMD_TIMEOUT:
  6195 0000561A C605[1F790100]20    <1> 	mov	byte [DISK_STATUS1], BAD_CNTLR
  6196                              <1> COMMAND4:
  6197                              <1> 	;;pop	ebx ; 10/07/2022
  6198 00005621 803D[1F790100]00    <1>         cmp	byte [DISK_STATUS1], 0	; SET CONDITION CODE FOR CALLER
  6199 00005628 C3                  <1> 	retn
  6200                              <1> COMMAND2:
  6201                              <1> 	;;pop	ebx ; 10/07/2022
  6202                              <1> 	;push	edi ; 10/07/2022
  6203 00005629 C605[1A790100]00    <1> 	mov	byte [HF_INT_FLAG], 0	; RESET INTERRUPT FLAG
  6204 00005630 FA                  <1> 	cli				; INHIBIT INTERRUPTS WHILE CHANGING MASK
  6205 00005631 E4A1                <1> 	in	al, INTB01		; TURN ON SECOND INTERRUPT CHIP
  6206                              <1> 	;and	al, 0BFh
  6207 00005633 243F                <1> 	and	al, 3Fh			; Enable IRQ 14 & 15
  6208                              <1> 	;jmp	$+2
  6209                              <1> 	IODELAY
    78 00005635 EB00                <2>  jmp short $+2
    79 00005637 EB00                <2>  jmp short $+2
  6210 00005639 E6A1                <1> 	out	INTB01, al
  6211 0000563B E421                <1> 	in	al, INTA01		; LET INTERRUPTS PASS THRU TO
  6212 0000563D 24FB                <1> 	and	al, 0FBh 		; SECOND CHIP
  6213                              <1> 	;jmp	$+2
  6214                              <1> 	IODELAY
    78 0000563F EB00                <2>  jmp short $+2
    79 00005641 EB00                <2>  jmp short $+2
  6215 00005643 E621                <1> 	out	INTA01, al
  6216 00005645 FB                  <1> 	sti
  6217                              <1> 	;xor	edi, edi		; INDEX THE COMMAND TABLE
  6218                              <1> 	; 10/07/2022
  6219 00005646 31C9                <1> 	xor	ecx, ecx
  6220                              <1> 	;mov	dx, HF_PORT+1		; DISK ADDRESS
  6221 00005648 668B15[0E660000]    <1> 	mov	dx, [HF_PORT]
  6222 0000564F FEC2                <1> 	inc	dl
  6223 00005651 F605[21790100]C0    <1> 	test	byte [CONTROL_BYTE], 0C0h ; CHECK FOR RETRY SUPPRESSION
  6224 00005658 7411                <1> 	jz	short COMMAND3
  6225 0000565A 8A45FE              <1> 	mov	al, [CMD_BLOCK+6] 	; YES-GET OPERATION CODE
  6226 0000565D 24F0                <1> 	and	al, 0F0h 		; GET RID OF MODIFIERS
  6227 0000565F 3C20                <1> 	cmp	al, 20h			; 20H-40H IS READ, WRITE, VERIFY
  6228 00005661 7208                <1> 	jb	short COMMAND3
  6229 00005663 3C40                <1> 	cmp	al, 40h
  6230 00005665 7704                <1> 	ja	short COMMAND3
  6231 00005667 804DFE01            <1> 	or	byte [CMD_BLOCK+6], NO_RETRIES 
  6232                              <1> 					; VALID OPERATION FOR RETRY SUPPRESS
  6233                              <1> COMMAND3:
  6234                              <1> 	;mov	al, [CMD_BLOCK+edi]	; GET THE COMMAND STRING BYTE
  6235                              <1> 	; 10/07/2022
  6236 0000566B 8A440DF8            <1> 	mov	al, [CMD_BLOCK+ecx]
  6237 0000566F EE                  <1> 	out	dx, al			; GIVE IT TO CONTROLLER
  6238                              <1> 	IODELAY
    78 00005670 EB00                <2>  jmp short $+2
    79 00005672 EB00                <2>  jmp short $+2
  6239                              <1> 	;inc	edi			; NEXT BYTE IN COMMAND BLOCK
  6240                              <1> 	; 10/07/2022
  6241 00005674 41                  <1> 	inc	ecx
  6242                              <1> 	;inc	dx			; NEXT DISK ADAPTER REGISTER
  6243 00005675 42                  <1> 	inc	edx   ; 10/07/2022	
  6244                              <1> 	;cmp	di, 7 ; 01/01/2015	; ALL DONE?
  6245                              <1> 	;jne	short COMMAND3		; NO--GO DO NEXT ONE
  6246 00005676 80F907              <1> 	cmp	cl, 7 ; 10/07/2022
  6247 00005679 72F0                <1> 	jb	short COMMAND3
  6248                              <1> 	;pop	edi ; 10/07/2022
  6249 0000567B C3                  <1> 	retn				; ZERO FLAG IS SET
  6250                              <1> 
  6251                              <1> ;CMD_TIMEOUT:
  6252                              <1> ;	mov	byte [DISK_STATUS1], BAD_CNTLR
  6253                              <1> ;COMMAND4:
  6254                              <1> ;	pop	ebx
  6255                              <1> ;	cmp	byte [DISK_STATUS1], 0 	; SET CONDITION CODE FOR CALLER
  6256                              <1> ;	retn
  6257                              <1> 
  6258                              <1> 	; 16/07/2022 - TRDOS 386 v2.0.5
  6259                              <1> 	; 10/07/2022 - Retro UNIX 386 v1.1 (Kernel v0.2.1.5)
  6260                              <1> 
  6261                              <1> ;----------------------------------------
  6262                              <1> ;	WAIT FOR INTERRUPT		:
  6263                              <1> ;----------------------------------------
  6264                              <1> ;WAIT:
  6265                              <1> _WAIT:
  6266 0000567C FB                  <1> 	sti				; MAKE SURE INTERRUPTS ARE ON
  6267                              <1> 	;sub	cx, cx			; SET INITIAL DELAY BEFORE TEST
  6268                              <1> 	;clc
  6269                              <1> 	;mov	ax, 9000h		; DEVICE WAIT INTERRUPT
  6270                              <1> 	;int	15h
  6271                              <1> 	;jc	short WT2		; DEVICE TIMED OUT
  6272                              <1> 	;mov	bl, DELAY_1		; SET DELAY COUNT
  6273                              <1> 
  6274                              <1> 	;mov	bl, WAIT_HDU_INT_HI
  6275                              <1> 	;; 21/02/2015
  6276                              <1> 	;;mov	bl, WAIT_HDU_INT_HI + 1
  6277                              <1> 	;;mov	cx, WAIT_HDU_INT_LO
  6278 0000567D B915160500          <1> 	mov	ecx, WAIT_HDU_INT_LH
  6279                              <1> 					; (AWARD BIOS -> WAIT_FOR_MEM)
  6280                              <1> ;-----	WAIT LOOP
  6281                              <1> 
  6282                              <1> WT1:	
  6283                              <1> 	;test	byte [HF_INT_FLAG], 80h	; TEST FOR INTERRUPT
  6284 00005682 F605[1A790100]C0    <1> 	test 	byte [HF_INT_FLAG], 0C0h
  6285                              <1> 	;loopz	WT1
  6286 00005689 7512                <1> 	jnz	short WT3		; INTERRUPT--LETS GO
  6287                              <1> 	;dec	bl
  6288                              <1> 	;jnz	short WT1		; KEEP TRYING FOR A WHILE
  6289                              <1> 
  6290                              <1> WT1_hi:
  6291 0000568B E461                <1> 	in	al, SYS1 ; 61h (PORT_B)	; wait for lo to hi
  6292 0000568D A810                <1> 	test	al, 10h			; transition on memory
  6293 0000568F 75FA                <1> 	jnz	short WT1_hi		; refresh.
  6294                              <1> WT1_lo:
  6295 00005691 E461                <1> 	in	al, SYS1 		; 061h (PORT_B)	
  6296 00005693 A810                <1> 	test	al, 10h			
  6297 00005695 74FA                <1> 	jz	short WT1_lo
  6298 00005697 E2E9                <1> 	loop	WT1
  6299                              <1> 	;;or	bl, bl
  6300                              <1> 	;;jz	short WT2	
  6301                              <1> 	;;dec	bl
  6302                              <1> 	;;jmp	short WT1
  6303                              <1> 	;dec	bl
  6304                              <1> 	;jnz	short WT1	
  6305                              <1> WT2:	
  6306                              <1> 	; 10/07/2022
  6307                              <1> 	;mov	byte [DISK_STATUS1], TIME_OUT ; REPORT TIME OUT ERROR
  6308 00005699 B080                <1> 	mov	al, TIME_OUT
  6309 0000569B EB07                <1> 	jmp	short WT4
  6310                              <1> WT3:
  6311                              <1> 	;mov	byte [DISK_STATUS1], 0
  6312                              <1> 	;mov	byte [HF_INT_FLAG], 0
  6313 0000569D 28C0                <1> 	sub	al, al ; 0
  6314 0000569F A2[1A790100]        <1> 	mov	byte [HF_INT_FLAG], al
  6315                              <1> WT4:
  6316                              <1> NB2:	
  6317 000056A4 A2[1F790100]        <1> 	mov	byte [DISK_STATUS1], al
  6318                              <1> 
  6319                              <1> 	;cmp	byte [DISK_STATUS1], 0 	; SET CONDITION CODE FOR CALLER
  6320 000056A9 20C0                <1> 	and	al, al
  6321                              <1> 	; zf = 0 -> time out, zf = 1 -> ok
  6322 000056AB C3                  <1> 	retn
  6323                              <1> 
  6324                              <1> 	; 16/07/2022 - TRDOS 386 v2.0.5
  6325                              <1> 	; 10/07/2022 - Retro UNIX 386 v1.1 (Kernel v0.2.1.5)
  6326                              <1> 
  6327                              <1> ;----------------------------------------
  6328                              <1> ;	WAIT FOR CONTROLLER NOT BUSY	:
  6329                              <1> ;----------------------------------------
  6330                              <1> NOT_BUSY:
  6331 000056AC FB                  <1> 	sti				; MAKE SURE INTERRUPTS ARE ON
  6332                              <1> 	;push	ebx
  6333                              <1> 	;sub	cx, cx			; SET INITIAL DELAY BEFORE TEST
  6334 000056AD 668B15[0E660000]    <1> 	mov	dx, [HF_PORT]
  6335 000056B4 80C207              <1> 	add	dl, 7			; Status port (HF_PORT+7)
  6336                              <1> 	;mov	bl, DELAY_1
  6337                              <1> 					; wait for 10 seconds
  6338                              <1> 	;mov 	cx, WAIT_HDU_INT_LO	; 1615h
  6339                              <1> 	;;mov 	bl, WAIT_HDU_INT_HI	;   05h
  6340                              <1> 	;mov	bl, WAIT_HDU_INT_HI + 1
  6341 000056B7 B915160500          <1> 	mov	ecx, WAIT_HDU_INT_LH  ; 21/02/2015
  6342                              <1> 	;
  6343                              <1> 	;;mov	byte [wait_count], 0    ; Reset wait counter
  6344                              <1> NB1:	
  6345 000056BC EC                  <1> 	in	al, dx			; CHECK STATUS
  6346                              <1> 	;test	al, ST_BUSY
  6347 000056BD 2480                <1> 	and	al, ST_BUSY
  6348                              <1> 	;loopnz NB1
  6349 000056BF 74E3                <1> 	jz	short NB2 ; al = 0	; NOT BUSY--LETS GO
  6350                              <1> 	;dec	bl			
  6351                              <1> 	;jnz	short NB1		; KEEP TRYING FOR A WHILE
  6352                              <1> 
  6353                              <1> NB1_hi: 
  6354 000056C1 E461                <1> 	in	al, SYS1		; wait for hi to lo
  6355 000056C3 A810                <1> 	test	al, 010h		; transition on memory
  6356 000056C5 75FA                <1> 	jnz	short NB1_hi		; refresh.
  6357                              <1> NB1_lo: 
  6358 000056C7 E461                <1> 	in	al, SYS1
  6359 000056C9 A810                <1> 	test	al, 010h
  6360 000056CB 74FA                <1> 	jz	short NB1_lo
  6361 000056CD E2ED                <1> 	loop	NB1
  6362                              <1> 	;dec	bl
  6363                              <1> 	;jnz	short NB1
  6364                              <1> 	;
  6365                              <1> 	;;cmp	byte [wait_count], 182  ; 10 seconds (182 timer ticks)
  6366                              <1> 	;;jb	short NB1
  6367                              <1> 	;
  6368                              <1> 	;mov	byte [DISK_STATUS1], TIME_OUT ; REPORT TIME OUT ERROR
  6369                              <1> 	;jmp	short NB3
  6370 000056CF B080                <1> 	mov	al, TIME_OUT
  6371                              <1> ;NB2:	
  6372 000056D1 EBD1                <1> 	jmp	short NB2 ; 10/07/2022
  6373                              <1> 
  6374                              <1> ;	;mov	byte [DISK_STATUS1], 0
  6375                              <1> ;;NB3:	
  6376                              <1> ;	;pop	ebx
  6377                              <1> ;	mov	[DISK_STATUS1], al	;;; will be set after return
  6378                              <1> ;	;cmp	byte [DISK_STATUS1], 0 	; SET CONDITION CODE FOR CALLER
  6379                              <1> ;	or	al, al			; (zf = 0 --> timeout)
  6380                              <1> ;	retn
  6381                              <1> 
  6382                              <1> ;----------------------------------------
  6383                              <1> ;	WAIT FOR DATA REQUEST		:
  6384                              <1> ;----------------------------------------
  6385                              <1> WAIT_DRQ:
  6386                              <1> 	;mov	cx, DELAY_3
  6387                              <1> 	;mov	dx, HF_PORT+7
  6388 000056D3 668B15[0E660000]    <1> 	mov	dx, [HF_PORT]
  6389 000056DA 80C207              <1> 	add	dl, 7
  6390                              <1> 	;;mov	bl, WAIT_HDU_DRQ_HI	; 0
  6391                              <1> 	;mov	cx, WAIT_HDU_DRQ_LO	; 1000 (30 milli seconds)
  6392                              <1> 					; (but it is written as 2000
  6393                              <1> 					; micro seconds in ATORGS.ASM file
  6394                              <1> 					; of Award Bios - 1999, D1A0622)
  6395 000056DD B9E8030000          <1> 	mov 	ecx, WAIT_HDU_DRQ_LH ; 21/02/2015 
  6396                              <1> WQ_1:
  6397 000056E2 EC                  <1> 	in	al, dx			; GET STATUS
  6398 000056E3 A808                <1> 	test	al, ST_DRQ		; WAIT FOR DRQ
  6399 000056E5 7516                <1> 	jnz	short WQ_OK
  6400                              <1> 	;loop	WQ_1			; KEEP TRYING FOR A SHORT WHILE
  6401                              <1> WQ_hi:	
  6402 000056E7 E461                <1> 	in	al, SYS1		; wait for hi to lo
  6403 000056E9 A810                <1> 	test	al, 010h		; transition on memory
  6404 000056EB 75FA                <1> 	jnz	short WQ_hi		; refresh.
  6405                              <1> WQ_lo:  
  6406 000056ED E461                <1> 	in	al, SYS1
  6407 000056EF A810                <1> 	test	al, 010h
  6408 000056F1 74FA                <1> 	jz	short WQ_lo
  6409 000056F3 E2ED                <1> 	loop	WQ_1
  6410                              <1> 
  6411 000056F5 C605[1F790100]80    <1> 	mov	byte [DISK_STATUS1], TIME_OUT ; ERROR
  6412 000056FC F9                  <1> 	stc
  6413                              <1> WQ_OK:
  6414 000056FD C3                  <1> 	retn
  6415                              <1> ;WQ_OK:
  6416                              <1> 	;clc
  6417                              <1> 	;ret
  6418                              <1> 
  6419                              <1> 	; 16/07/2022 - TRDOS 386 v2.0.5
  6420                              <1> 
  6421                              <1> ;----------------------------------------
  6422                              <1> ;	CHECK FIXED DISK STATUS BYTE	:
  6423                              <1> ;----------------------------------------
  6424                              <1> CHECK_ST:
  6425                              <1> 	;mov	dx, HF_PORT+7		; GET THE STATUS
  6426 000056FE 668B15[0E660000]    <1> 	mov	dx, [HF_PORT]
  6427 00005705 80C207              <1> 	add	dl, 7
  6428                              <1> 	
  6429                              <1> 	; 17/02/2016
  6430                              <1> 	;(http://wiki.osdev.org/ATA_PIO_Mode)
  6431                              <1> 	;"delay 400ns to allow drive to set new values of BSY and DRQ"
  6432 00005708 EC                  <1> 	in	al, dx
  6433                              <1> 	;in	al, dx ; 100ns
  6434                              <1> 	;in	al, dx ; 100ns
  6435                              <1>  	;in	al, dx ; 100ns
  6436                              <1> 	NEWIODELAY ; 18/02/2016 (AWARD BIOS - 1999, 'CKST' in AHSDK.ASM)
    83 00005709 E6EB                <2>  out 0EBh, al
  6437                              <1> 	;
  6438                              <1> 
  6439                              <1> 	; 16/07/2022
  6440 0000570B A2[19790100]        <1> 	mov	[HF_STATUS], al
  6441                              <1> 	;mov	ah, 0
  6442 00005710 28E4                <1> 	sub	ah, ah ; 0
  6443 00005712 A880                <1> 	test	al, ST_BUSY		; IF STILL BUSY
  6444 00005714 751A                <1> 	jnz	short CKST_EXIT		; REPORT OK
  6445 00005716 B4CC                <1> 	mov	ah, WRITE_FAULT
  6446 00005718 A820                <1> 	test 	al, ST_WRT_FLT		; CHECK FOR WRITE FAULT
  6447 0000571A 7514                <1> 	jnz	short CKST_EXIT
  6448 0000571C B4AA                <1> 	mov	ah, NOT_RDY
  6449 0000571E A840                <1> 	test	al, ST_READY		; CHECK FOR NOT READY
  6450 00005720 740E                <1> 	jz	short CKST_EXIT
  6451 00005722 B440                <1> 	mov	ah, BAD_SEEK
  6452 00005724 A810                <1> 	test	al, ST_SEEK_COMPL	; CHECK FOR SEEK NOT COMPLETE
  6453 00005726 7408                <1> 	jz	short CKST_EXIT
  6454 00005728 B411                <1> 	mov	ah, DATA_CORRECTED
  6455 0000572A A804                <1> 	test	al, ST_CORRCTD		; CHECK FOR CORRECTED ECC
  6456 0000572C 7502                <1> 	jnz	short CKST_EXIT
  6457                              <1> 	;mov	ah, 0
  6458 0000572E 30E4                <1> 	xor	ah, ah ; 0
  6459                              <1> CKST_EXIT:
  6460 00005730 8825[1F790100]      <1> 	mov	[DISK_STATUS1], ah	; SET ERROR FLAG
  6461 00005736 80FC11              <1> 	cmp	ah, DATA_CORRECTED	; KEEP GOING WITH DATA CORRECTED
  6462 00005739 7402                <1> 	je	short CKST_EX1
  6463                              <1> 	;cmp	ah, 0
  6464 0000573B 20E4                <1> 	and	ah, ah
  6465                              <1> CKST_EX1:
  6466 0000573D C3                  <1> 	retn
  6467                              <1> 
  6468                              <1> 	; 16/07/2022 - TRDOS 386 v2.0.5
  6469                              <1> 
  6470                              <1> ;----------------------------------------
  6471                              <1> ;	CHECK FIXED DISK ERROR REGISTER :
  6472                              <1> ;----------------------------------------
  6473                              <1> CHECK_ER:
  6474                              <1> 	;mov	dx, HF_PORT+1		; GET THE ERROR REGISTER
  6475 0000573E 668B15[0E660000]    <1> 	mov	dx, [HF_PORT]		;
  6476 00005745 FEC2                <1> 	inc	dl
  6477 00005747 EC                  <1> 	in	al, dx
  6478                              <1> 	; 16/07/2022
  6479                              <1> 	;mov	[HF_ERROR], al
  6480                              <1> 	;push	ebx  ; 21/02/2015
  6481 00005748 29C9                <1> 	sub	ecx, ecx
  6482                              <1> 	;mov	ecx, 8			; TEST ALL 8 BITS
  6483 0000574A B108                <1> 	mov	cl, 8
  6484                              <1> CK1:	
  6485 0000574C D0E0                <1> 	shl	al, 1			; MOVE NEXT ERROR BIT TO CARRY
  6486 0000574E 7202                <1> 	jc	short CK2		; FOUND THE ERROR
  6487 00005750 E2FA                <1> 	loop	CK1			; KEEP TRYING
  6488                              <1> CK2:
  6489                              <1> 	;mov	ebx, ERR_TBL		; COMPUTE ADDRESS OF
  6490                              <1> 	;add	ebx, ecx		; ERROR CODE
  6491 00005752 81C1[04660000]      <1> 	add	ecx, ERR_TBL ; 16/07/2022	
  6492                              <1> 
  6493                              <1> 	;;;mov	ah, byte [cs:bx]	; GET ERROR CODE
  6494                              <1> 	;;mov	ah, [bx]
  6495                              <1> 	;mov	ah, [ebx] ; 21/02/2015
  6496 00005758 8A21                <1> 	mov	ah, [ecx]	
  6497                              <1> CKEX:
  6498 0000575A 8825[1F790100]      <1> 	mov	[DISK_STATUS1], ah	; SAVE ERROR CODE
  6499                              <1> 	; 16/07/2022
  6500                              <1> 	;pop	ebx
  6501                              <1> 	;;cmp	ah, 0
  6502                              <1> 	;and	ah, ah
  6503 00005760 C3                  <1> 	retn
  6504                              <1> 
  6505                              <1> ;--------------------------------------------------------
  6506                              <1> ; CHECK_DMA						:
  6507                              <1> ;  -CHECK ES:BX AND # SECTORS TO MAKE SURE THAT IT WILL :
  6508                              <1> ;   FIT WITHOUT SEGMENT OVERFLOW.			:
  6509                              <1> ;  -ES:BX HAS BEEN REVISED TO THE FORMAT SSSS:000X	:
  6510                              <1> ;  -OK IF # SECTORS < 80H (7FH IF LONG READ OR WRITE)	:
  6511                              <1> ;  -OK IF # SECTORS = 80H (7FH) AND BX <= 00H (04H)	:
  6512                              <1> ;  -ERROR OTHERWISE					:
  6513                              <1> ;--------------------------------------------------------
  6514                              <1> 
  6515                              <1> 	; 16/07/2022 - TRDOS 386 v2.0.5
  6516                              <1> 	; (not needed for hard disks and 32 bit OS)
  6517                              <1> 
  6518                              <1> ;CHECK_DMA:
  6519                              <1> ;	; 11/04/2021 (32 bit push/pop)
  6520                              <1> ;	push	eax			; SAVE REGISTERS
  6521                              <1> ;	mov	ax, 8000h		; AH = MAX # SECTORS
  6522                              <1> ;					; AL = MAX OFFSET
  6523                              <1> ;	test	byte [CMD_BLOCK+6], ECC_MODE
  6524                              <1> ;	jz	short CKD1
  6525                              <1> ;	mov	ah, 7F04h		; ECC IS 4 MORE BYTES
  6526                              <1> ;CKD1:	
  6527                              <1> ;	cmp	ah, [CMD_BLOCK+1] 	; NUMBER OF SECTORS
  6528                              <1> ;	ja	short CKDOK		; IT WILL FIT
  6529                              <1> ;	jb	short CKDERR		; TOO MANY
  6530                              <1> ;	cmp	al, bl			; CHECK OFFSET ON MAX SECTORS
  6531                              <1> ;	;jb	short CKDERR		; ERROR
  6532                              <1> ;	jnb	short CKDOK ; 16/07/2022
  6533                              <1> ;;CKDOK:	
  6534                              <1> ;	;clc				; CLEAR CARRY
  6535                              <1> ;	;pop	eax
  6536                              <1> ;	;retn				; NORMAL RETURN
  6537                              <1> ;CKDERR:
  6538                              <1> ;	;stc				; INDICATE ERROR
  6539                              <1> ;	mov	byte [DISK_STATUS1], DMA_BOUNDARY
  6540                              <1> ;CKDOK:
  6541                              <1> ;	pop	eax
  6542                              <1> ;	retn
  6543                              <1> 
  6544                              <1> ;----------------------------------------
  6545                              <1> ;	SET UP EBX-> DISK PARMS		:
  6546                              <1> ;----------------------------------------
  6547                              <1> 					
  6548                              <1> ; INPUT -> DL = 0 based drive number
  6549                              <1> ; OUTPUT -> EBX = disk parameter table address
  6550                              <1> 
  6551                              <1> GET_VEC:
  6552                              <1> 	;sub	ax, ax			; GET DISK PARAMETER ADDRESS
  6553                              <1> 	;mov	es, ax
  6554                              <1> 	;test	dl, 1
  6555                              <1> 	;jz	short GV_0
  6556                              <1> ;	les	bx, [HF1_TBL_VEC] 	; ES:BX -> DRIVE PARAMETERS
  6557                              <1> ;	jmp	short GV_EXIT
  6558                              <1> ;GV_0:
  6559                              <1> ;	les 	bx,[HF_TBL_VEC]		; ES:BX -> DRIVE PARAMETERS
  6560                              <1> ;
  6561 00005761 31DB                <1> 	xor	ebx, ebx
  6562 00005763 88D3                <1> 	mov	bl, dl
  6563                              <1> 	;02/01/2015
  6564                              <1> 	;xor	bh, bh
  6565                              <1> 	;shl	bl, 1			; port address offset
  6566                              <1> 	;mov	ax, [bx+hd_ports]	; Base port address (1F0h, 170h)
  6567                              <1> 	;shl	bl, 1			; dpt pointer offset
  6568 00005765 C0E302              <1> 	shl	bl, 2
  6569                              <1> 	;add	bx, HF_TBL_VEC		; Disk parameter table pointer
  6570 00005768 81C3[24790100]      <1> 	add	ebx, HF_TBL_VEC ; 21/02/2015
  6571                              <1> 	;push	word [bx+2]		; dpt segment
  6572                              <1> 	;pop	es
  6573                              <1> 	;mov	bx, [bx]		; dpt offset
  6574 0000576E 8B1B                <1> 	mov	ebx, [ebx]		
  6575                              <1> ;GV_EXIT:
  6576 00005770 C3                  <1> 	retn
  6577                              <1> 
  6578                              <1> hdc1_int: ; 21/02/2015
  6579                              <1> ;--- HARDWARE INT 76H -- ( IRQ LEVEL 14 ) -----------------------
  6580                              <1> ;								:
  6581                              <1> ;	FIXED DISK INTERRUPT ROUTINE				:
  6582                              <1> ;								:
  6583                              <1> ;----------------------------------------------------------------
  6584                              <1> 
  6585                              <1> ; 22/12/2014
  6586                              <1> ; IBM PC-XT Model 286 System BIOS Source Code - DISK.ASM (HD_INT)
  6587                              <1> ;	 '11/15/85'
  6588                              <1> ; AWARD BIOS 1999 (D1A0622) 
  6589                              <1> ;	Source Code - ATORGS.ASM (INT_HDISK, INT_HDISK1)
  6590                              <1> 
  6591                              <1> ;int_76h:
  6592                              <1> HD_INT:
  6593                              <1> 	; 11/04/2021 (32 bit push/pop)
  6594 00005771 50                  <1> 	push	eax
  6595 00005772 1E                  <1> 	push	ds
  6596                              <1> 	;call	DDS
  6597                              <1> 	; 21/02/2015 (32 bit, 386 pm modification)
  6598 00005773 66B81000            <1> 	mov	ax, KDATA
  6599 00005777 8ED8                <1> 	mov 	ds, ax
  6600                              <1> 	;
  6601                              <1> 	;;mov	@HF_INT_FLAG,0FFH	; ALL DONE
  6602                              <1>         ;mov	byte [CS:HF_INT_FLAG], 0FFh
  6603 00005779 C605[1A790100]FF    <1> 	mov	byte [HF_INT_FLAG], 0FFh
  6604                              <1> 	;
  6605 00005780 52                  <1> 	push	edx
  6606 00005781 66BAF701            <1> 	mov	dx, HDC1_BASEPORT+7	; Status Register (1F7h)
  6607                              <1> 					; Clear Controller
  6608                              <1> Clear_IRQ1415:				; (Award BIOS - 1999)
  6609 00005785 EC                  <1> 	in	al, dx			;
  6610 00005786 5A                  <1> 	pop	edx
  6611                              <1> 	NEWIODELAY
    83 00005787 E6EB                <2>  out 0EBh, al
  6612                              <1> 	;
  6613 00005789 B020                <1> 	mov	al, EOI			; NON-SPECIFIC END OF INTERRUPT
  6614 0000578B E6A0                <1> 	out	INTB00, al		; FOR CONTROLLER #2
  6615                              <1> 	;jmp	$+2			; WAIT
  6616                              <1> 	NEWIODELAY
    83 0000578D E6EB                <2>  out 0EBh, al
  6617 0000578F E620                <1> 	out	INTA00, al		; FOR CONTROLLER #1
  6618 00005791 1F                  <1> 	pop	ds
  6619                              <1> 	;sti				; RE-ENABLE INTERRUPTS
  6620                              <1> 	;mov	ax, 9100h		; DEVICE POST
  6621                              <1> 	;int	15h			;  INTERRUPT
  6622                              <1> irq15_iret: ; 25/02/2015
  6623 00005792 58                  <1> 	pop	eax
  6624 00005793 CF                  <1> 	iretd				; RETURN FROM INTERRUPT
  6625                              <1> 
  6626                              <1> hdc2_int: ; 21/02/2015
  6627                              <1> ;--- HARDWARE INT 77H -- ( IRQ LEVEL 15 ) -----------------------
  6628                              <1> ;								:
  6629                              <1> ;	FIXED DISK INTERRUPT ROUTINE				:
  6630                              <1> ;								:
  6631                              <1> ;----------------------------------------------------------------
  6632                              <1> 
  6633                              <1> ;int_77h:
  6634                              <1> HD1_INT:
  6635                              <1> 	; 11/04/2021 (32 bit push/pop)
  6636 00005794 50                  <1> 	push	eax
  6637                              <1> 	; Check if that is a spurious IRQ (from slave PIC)
  6638                              <1> 	; 25/02/2015 (source: http://wiki.osdev.org/8259_PIC)
  6639 00005795 B00B                <1> 	mov	al, 0Bh  ; In-Service Register
  6640 00005797 E6A0                <1> 	out	0A0h, al
  6641 00005799 EB00                <1>         jmp short $+2
  6642 0000579B EB00                <1> 	jmp short $+2
  6643 0000579D E4A0                <1> 	in	al, 0A0h
  6644 0000579F 2480                <1> 	and 	al, 80h ; bit 7 (is it real IRQ 15 or fake?)
  6645 000057A1 74EF                <1> 	jz	short irq15_iret ; Fake (spurious) IRQ, do not send EOI)
  6646                              <1> 	;
  6647 000057A3 1E                  <1> 	push	ds
  6648                              <1> 	;call	DDS
  6649                              <1> 	; 21/02/2015 (32 bit, 386 pm modification)
  6650 000057A4 66B81000            <1> 	mov	ax, KDATA
  6651 000057A8 8ED8                <1> 	mov 	ds, ax
  6652                              <1> 	;
  6653                              <1> 	;;mov	@HF_INT_FLAG,0FFH	; ALL DONE
  6654                              <1>         ;or	byte [CS:HF_INT_FLAG],0C0h 
  6655 000057AA 800D[1A790100]C0    <1> 	or	byte [HF_INT_FLAG], 0C0h
  6656                              <1> 	;
  6657 000057B1 52                  <1> 	push	edx
  6658 000057B2 66BA7701            <1> 	mov	dx, HDC2_BASEPORT+7	; Status Register (177h)
  6659                              <1> 					; Clear Controller (Award BIOS 1999)
  6660 000057B6 EBCD                <1> 	jmp	short Clear_IRQ1415
  6661                              <1> 
  6662                              <1> ;%include 'diskdata.inc' ; 11/03/2015
  6663                              <1> ;%include 'diskbss.inc' ; 11/03/2015
  6664                              <1> 
  6665                              <1> ;////////////////////////////////////////////////////////////////////
  6666                              <1> ;; END OF DISK I/O SYTEM ///
  3221                                  %include 'memory.s'  ; 09/03/2015
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.7 - memory.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 02/12/2023  (Previous: 29/08/2023)
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 24/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.15 (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> ; 14/12/2020
    61                              <1> ; (Linear Frame Buffer - video memory mark : AVL bit 1, outside M.A.T.)
    62                              <1> PDE_EXTERNAL	equ 400h	; Page directory entry for external memory blocks
    63                              <1> PTE_EXTERNAL	equ 400h	; Allocated kernel pages for Linear Frame Buffer
    64                              <1> 				; (Out of memory allocation table)	
    65                              <1> 
    66                              <1> ;
    67                              <1> ;; Retro Unix 386 v1 - paging method/principles
    68                              <1> ;;
    69                              <1> ;; 10/10/2014
    70                              <1> ;; RETRO UNIX 386 v1 - PAGING METHOD/PRINCIPLES
    71                              <1> ;;
    72                              <1> ;; KERNEL PAGE MAP: 1 to 1 physical memory page map
    73                              <1> ;;	(virtual address = physical address)
    74                              <1> ;; KERNEL PAGE TABLES:
    75                              <1> ;;	Kernel page directory and all page tables are
    76                              <1> ;;	on memory as initialized, as equal to physical memory
    77                              <1> ;;	layout. Kernel pages can/must not be swapped out/in.
    78                              <1> ;;
    79                              <1> ;;	what for: User pages may be swapped out, when accessing
    80                              <1> ;;	a page in kernel/system mode, if it would be swapped out,
    81                              <1> ;;	kernel would have to swap it in! But it is also may be
    82                              <1> ;;	in use by a user process. (In system/kernel mode
    83                              <1> ;;	kernel can access all memory pages even if they are
    84                              <1> ;;	reserved/allocated for user processes. Swap out/in would
    85                              <1> ;;	cause conflicts.) 
    86                              <1> ;;	
    87                              <1> ;;	As result of these conditions,
    88                              <1> ;;	all kernel pages must be initialized as equal to 
    89                              <1> ;;	physical layout for preventing page faults. 
    90                              <1> ;;	Also, calling "allocate page" procedure after
    91                              <1> ;;	a page fault can cause another page fault (double fault)
    92                              <1> ;;	if all kernel page tables would not be initialized.
    93                              <1> ;;
    94                              <1> ;;	[first_page] = Beginning of users space, as offset to 
    95                              <1> ;;	memory allocation table. (double word aligned)
    96                              <1> ;;
    97                              <1> ;;	[next_page] = first/next free space to be searched
    98                              <1> ;;	as offset to memory allocation table. (dw aligned)
    99                              <1> ;;
   100                              <1> ;;	[last_page] = End of memory (users space), as offset
   101                              <1> ;;	to memory allocation table. (double word aligned)
   102                              <1> ;;
   103                              <1> ;; USER PAGE TABLES:
   104                              <1> ;;	Demand paging (& 'copy on write' allocation method) ...
   105                              <1> ;;		'ready only' marked copies of the 
   106                              <1> ;;		parent process's page table entries (for
   107                              <1> ;;		same physical memory).
   108                              <1> ;;		(A page will be copied to a new page after
   109                              <1> ;;		 if it causes R/W page fault.)
   110                              <1> ;;
   111                              <1> ;;	Every user process has own (different)
   112                              <1> ;;	page directory and page tables.	
   113                              <1> ;;
   114                              <1> ;;	Code starts at virtual address 0, always.
   115                              <1> ;;	(Initial value of EIP is 0 in user mode.)
   116                              <1> ;;	(Programs can be written/developed as simple
   117                              <1> ;;	 flat memory programs.)
   118                              <1> ;;
   119                              <1> ;; MEMORY ALLOCATION STRATEGY:
   120                              <1> ;;	Memory page will be allocated by kernel only 
   121                              <1> ;;		(in kernel/system mode only).
   122                              <1> ;;	* After a
   123                              <1> ;;	  - 'not present' page fault
   124                              <1> ;;	  - 'writing attempt on read only page' page fault 	 	
   125                              <1> ;;	* For loading (opening, reading) a file or disk/drive
   126                              <1> ;;	* As responce to 'allocate additional memory blocks' 
   127                              <1> ;;	  request by running process.
   128                              <1> ;;	* While creating a process, allocating a new buffer,
   129                              <1> ;;	  new page tables etc.
   130                              <1> ;;
   131                              <1> ;;	At first,
   132                              <1> ;;	- 'allocate page' procedure will be called;
   133                              <1> ;,	   if it will return with a valid (>0) physical address
   134                              <1> ;;	   (that means the relevant M.A.T. bit has been RESET)	
   135                              <1> ;;	   relevant memory page/block will be cleared (zeroed).
   136                              <1> ;;	- 'allocate page' will be called for allocating page
   137                              <1> ;;	   directory, page table and running space (data/code).
   138                              <1> ;;	- every successful 'allocate page' call will decrease
   139                              <1> ;;	  'free_pages' count (pointer).
   140                              <1> ;;	- 'out of (insufficient) memory error' will be returned
   141                              <1> ;;	  if 'free_pages' points to a ZERO.
   142                              <1> ;;	- swapping out and swapping in (if it is not a new page)
   143                              <1> ;;	  procedures will be called as responce to 'out of memory'
   144                              <1> ;;	  error except errors caused by attribute conflicts.
   145                              <1> ;;	 (swapper functions)	 
   146                              <1> ;;					
   147                              <1> ;;	At second,
   148                              <1> ;;	- page directory entry will be updated then page table
   149                              <1> ;;	  entry will be updated.		
   150                              <1> ;;
   151                              <1> ;; MEMORY ALLOCATION TABLE FORMAT:
   152                              <1> ;;	- M.A.T. has a size according to available memory as
   153                              <1> ;;	  follows:
   154                              <1> ;;		  - 1 (allocation) bit per 1 page (4096 bytes)
   155                              <1> ;;		  - a bit with value of 0 means allocated page
   156                              <1> ;;		  - a bit with value of 1 means a free page
   157                              <1> ;,	- 'free_pages' pointer holds count of free pages
   158                              <1> ;;	  depending on M.A.T.
   159                              <1> ;;		(NOTE: Free page count will not be checked
   160                              <1> ;;		again -on M.A.T.- after initialization. 
   161                              <1> ;;		Kernel will trust on initial count.)
   162                              <1> ;,	- 'free_pages' count will be decreased by allocation
   163                              <1> ;;	  and it will be increased by deallocation procedures.
   164                              <1> ;;	
   165                              <1> ;;	- Available memory will be calculated during
   166                              <1> ;;	  the kernel's initialization stage (in real mode).
   167                              <1> ;;	  Memory allocation table and kernel page tables 
   168                              <1> ;;	  will be formatted/sized as result of available
   169                              <1> ;;	  memory calculation before paging is enabled.
   170                              <1> ;;
   171                              <1> ;; For 4GB Available/Present Memory: (max. possible memory size)
   172                              <1> ;;	- Memory Allocation Table size will be 128 KB.
   173                              <1> ;;	- Memory allocation for kernel page directory size 
   174                              <1> ;;	  is always 4 KB. (in addition to total allocation size
   175                              <1> ;;	  for page tables)
   176                              <1> ;;	- Memory allocation for kernel page tables (1024 tables)
   177                              <1> ;;	  is 4 MB (1024*4*1024 bytes).
   178                              <1> ;;	- User (available) space will be started 
   179                              <1> ;;	  at 6th MB of the memory (after 1MB+4MB).
   180                              <1> ;;	- The first 640 KB is for kernel's itself plus
   181                              <1> ;;	  memory allocation table and kernel's page directory
   182                              <1> ;;	  (D0000h-EFFFFh may be used as kernel space...)	
   183                              <1> ;;	- B0000h to B7FFFh address space (32 KB) will be used
   184                              <1> ;; 	  for buffers.
   185                              <1> ;;	- ROMBIOS, VIDEO BUFFER and VIDEO ROM space are reserved.
   186                              <1> ;,	  (A0000h-AFFFFh, C0000h-CFFFFh, F0000h-FFFFFh)
   187                              <1> ;;	- Kernel page tables start at 100000h (2nd MB)
   188                              <1> ;;
   189                              <1> ;; For 1GB Available Memory:
   190                              <1> ;;	- Memory Allocation Table size will be 32 KB.
   191                              <1> ;;	- Memory allocation for kernel page directory size 
   192                              <1> ;;	  is always 4 KB. (in addition to total allocation size
   193                              <1> ;;	  for page tables)
   194                              <1> ;;	- Memory allocation for kernel page tables (256 tables)
   195                              <1> ;;	  is 1 MB (256*4*1024 bytes).
   196                              <1> ;;	- User (available) space will be started 
   197                              <1> ;;	  at 3th MB of the memory (after 1MB+1MB).
   198                              <1> ;;	- The first 640 KB is for kernel's itself plus
   199                              <1> ;;	  memory allocation table and kernel's page directory
   200                              <1> ;;	  (D0000h-EFFFFh may be used as kernel space...)	
   201                              <1> ;;	- B0000h to B7FFFh address space (32 KB) will be used
   202                              <1> ;; 	  for buffers.
   203                              <1> ;;	- ROMBIOS, VIDEO BUFFER and VIDEO ROM space are reserved.
   204                              <1> ;,	  (A0000h-AFFFFh, C0000h-CFFFFh, F0000h-FFFFFh)
   205                              <1> ;;	- Kernel page tables start at 100000h (2nd MB).	
   206                              <1> ;;
   207                              <1> ;;
   208                              <1> 
   209                              <1> 
   210                              <1> ;;************************************************************************************
   211                              <1> ;; 
   212                              <1> ;; RETRO UNIX 386 v1 - Paging (Method for Copy On Write paging principle)
   213                              <1> ;; DEMAND PAGING - PARENT&CHILD PAGE TABLE DUPLICATION PRINCIPLES (23/04/2015)
   214                              <1> 
   215                              <1> ;; Main factor: "sys fork" system call 
   216                              <1> ;;	
   217                              <1> ;; 		FORK
   218                              <1> ;;                      |----> parent - duplicated PTEs, read only pages
   219                              <1> ;;  writable pages ---->|
   220                              <1> ;;                      |----> child - duplicated PTEs, read only pages
   221                              <1> ;; 
   222                              <1> ;; AVL bit (0) of Page Table Entry is used as duplication sign 
   223                              <1> ;; 
   224                              <1> ;; AVL Bit 0 [PTE Bit 9] = 'Duplicated PTE belongs to child' sign/flag (if it is set)
   225                              <1> ;; Note: Dirty bit (PTE bit 6) may be used instead of AVL bit 0 (PTE bit 9)
   226                              <1> ;;       -while R/W bit is 0-. 
   227                              <1> ;; 
   228                              <1> ;; Duplicate page tables with writable pages (the 1st sys fork in the process):
   229                              <1> ;; # Parent's Page Table Entries are updated to point same pages as read only, 
   230                              <1> ;;   as duplicated PTE bit  -AVL bit 0, PTE bit 9- are reset/clear.
   231                              <1> ;; # Then Parent's Page Table is copied to Child's Page Table.
   232                              <1> ;; # Child's Page Table Entries are updated as duplicated child bit
   233                              <1> ;;   -AVL bit 0, PTE bit 9- is set.	  
   234                              <1> ;; 
   235                              <1> ;; Duplicate page tables with read only pages (several sys fork system calls):
   236                              <1> ;; # Parent's read only pages are copied to new child pages. 
   237                              <1> ;;   Parent's PTE attributes are not changed.
   238                              <1> ;;   (Because, there is another parent-child fork before this fork! We must not
   239                              <1> ;;    destroy/mix previous fork result).
   240                              <1> ;; # Child's Page Table Entries (which are corresponding to Parent's 
   241                              <1> ;;   read only pages) are set as writable (while duplicated PTE bit is clear). 
   242                              <1> ;; # Parent's PTEs with writable page attribute are updated to point same pages 
   243                              <1> ;;   as read only, (while) duplicated PTE bit is reset (clear).
   244                              <1> ;; # Parent's Page Table Entries (with writable page attribute) are duplicated 
   245                              <1> ;;   as Child's Page Table Entries without copying actual page.
   246                              <1> ;; # Child 's Page Table Entries (which are corresponding to Parent's writable 
   247                              <1> ;;   pages) are updated as duplicated PTE bit (AVL bit 0, PTE bit 9- is set.
   248                              <1> ;; 
   249                              <1> ;; !? WHAT FOR (duplication after duplication):
   250                              <1> ;; In UNIX method for sys fork (a typical 'fork' application in /etc/init)
   251                              <1> ;; program/executable code continues from specified location as child process, 
   252                              <1> ;; returns back previous code location as parent process, every child after 
   253                              <1> ;; every sys fork uses last image of code and data just prior the fork.
   254                              <1> ;; Even if the parent code changes data, the child will not see the changed data 
   255                              <1> ;; after the fork. In Retro UNIX 8086 v1, parent's process segment (32KB)
   256                              <1> ;; was copied to child's process segment (all of code and data) according to
   257                              <1> ;; original UNIX v1 which copies all of parent process code and data -core- 
   258                              <1> ;; to child space -core- but swaps that core image -of child- on to disk.
   259                              <1> ;; If I (Erdogan Tan) would use a method of to copy parent's core
   260                              <1> ;; (complete running image of parent process) to the child process; 
   261                              <1> ;; for big sizes, i would force Retro UNIX 386 v1 to spend many memory pages 
   262                              <1> ;; and times only for a sys fork. (It would excessive reservation for sys fork,
   263                              <1> ;; because sys fork usually is prior to sys exec; sys exec always establishes
   264                              <1> ;; a new/fresh core -running space-, by clearing all code/data content). 
   265                              <1> ;; 'Read Only' page flag ensures page fault handler is needed only for a few write
   266                              <1> ;; attempts between sys fork and sys exec, not more... (I say so by thinking 
   267                              <1> ;; of "/etc/init" content, specially.) sys exec will clear page tables and
   268                              <1> ;; new/fresh pages will be used to load and run new executable/program.
   269                              <1> ;; That is what for i have preferred "copy on write", "duplication" method
   270                              <1> ;; for sharing same read only pages between parent and child processes.
   271                              <1> ;; That is a pitty i have to use new private flag (AVL bit 0, "duplicated PTE 
   272                              <1> ;; belongs to child" sign) for cooperation on duplicated pages between a parent 
   273                              <1> ;; and it's child processes; otherwise parent process would destroy data belongs
   274                              <1> ;; to its child or vice versa; or some pages would remain unclaimed 
   275                              <1> ;; -deallocation problem-.
   276                              <1> ;; Note: to prevent conflicts, read only pages must not be swapped out... 
   277                              <1> ;; 
   278                              <1> ;; WHEN PARENT TRIES TO WRITE IT'S READ ONLY (DUPLICATED) PAGE:
   279                              <1> ;; # Page fault handler will do those:
   280                              <1> ;;   - 'Duplicated PTE' flag (PTE bit 9) is checked (on the failed PTE).
   281                              <1> ;;   - If it is reset/clear, there is a child uses same page.
   282                              <1> ;;   - Parent's read only page -previous page- is copied to a new writable page. 
   283                              <1> ;;   - Parent's PTE is updated as writable page, as unique page (AVL=0)
   284                              <1> ;;   - (Page fault handler whill check this PTE later, if child process causes to
   285                              <1> ;;     page fault due to write attempt on read only page. Of course, the previous 
   286                              <1> ;;     read only page will be converted to writable and unique page which belongs
   287                              <1> ;;     to child process.)	
   288                              <1> ;; WHEN CHILD TRIES TO WRITE IT'S READ ONLY (DUPLICATED) PAGE:
   289                              <1> ;; # Page fault handler will do those:
   290                              <1> ;;   - 'Duplicated PTE' flag (PTE bit 9) is checked (on the failed PTE).
   291                              <1> ;;   - If it is set, there is a parent uses -or was using- same page.
   292                              <1> ;;   - Same PTE address within parent's page table is checked if it has same page
   293                              <1> ;;     address or not. 
   294                              <1> ;;   - If parent's PTE has same address, child will continue with a new writable page.
   295                              <1> ;;     Parent's PTE will point to same (previous) page as writable, unique (AVL=0).	
   296                              <1> ;;   - If parent's PTE has different address, child will continue with it's 
   297                              <1> ;;     own/same page but read only flag (0) will be changed to writable flag (1) and
   298                              <1> ;;     'duplicated PTE (belongs to child)' flag/sign will be cleared/reset. 	  	
   299                              <1> ;; 
   300                              <1> ;; NOTE: When a child process is terminated, read only flags of parent's page tables
   301                              <1> ;;       will be set as writable (and unique) in case of child process was using 
   302                              <1> ;;       same pages with duplicated child PTE sign... Depending on sys fork and 
   303                              <1> ;;       duplication method details, it is not possible multiple child processes
   304                              <1> ;;       were using same page with duplicated PTEs.
   305                              <1> ;; 
   306                              <1> ;;************************************************************************************   
   307                              <1> 
   308                              <1> ;; 08/10/2014
   309                              <1> ;; 11/09/2014 - Retro UNIX 386 v1 PAGING (further) draft
   310                              <1> ;;		by Erdogan Tan (Based on KolibriOS 'memory.inc')
   311                              <1> 
   312                              <1> ;; 'allocate_page' code is derived and modified from KolibriOS
   313                              <1> ;; 'alloc_page' procedure in 'memory.inc' 
   314                              <1> ;; (25/08/2014, Revision: 5057) file 
   315                              <1> ;; by KolibriOS Team (2004-2012)
   316                              <1> 
   317                              <1> allocate_page:
   318                              <1> 	; 17/04/2021 - TRDOS 386 v2.0.4
   319                              <1> 	;	 (temporary modifications)
   320                              <1> 	; 01/07/2015
   321                              <1> 	; 05/05/2015
   322                              <1> 	; 30/04/2015
   323                              <1> 	; 16/10/2014
   324                              <1> 	; 08/10/2014
   325                              <1> 	; 09/09/2014 (Retro UNIX 386 v1 - beginning)
   326                              <1> 	;
   327                              <1> 	; INPUT -> none
   328                              <1> 	;
   329                              <1> 	; OUTPUT ->
   330                              <1> 	;	EAX = PHYSICAL (real/flat) ADDRESS OF THE ALLOCATED PAGE
   331                              <1> 	;	(corresponding MEMORY ALLOCATION TABLE bit is RESET)
   332                              <1> 	;
   333                              <1> 	;	CF = 1 and EAX = 0 
   334                              <1> 	; 		   if there is not a free page to be allocated	
   335                              <1> 	;
   336                              <1> 	; Modified Registers -> none (except EAX)
   337                              <1> 	;
   338 000057B8 A1[90780100]        <1> 	mov	eax, [free_pages]
   339 000057BD 21C0                <1> 	and	eax, eax
   340 000057BF 7438                <1> 	jz	short out_of_memory
   341                              <1> 	;
   342 000057C1 53                  <1> 	push	ebx
   343 000057C2 51                  <1> 	push	ecx
   344                              <1> 	;
   345 000057C3 BB00001000          <1> 	mov	ebx, MEM_ALLOC_TBL   ; Memory Allocation Table offset
   346 000057C8 89D9                <1> 	mov	ecx, ebx
   347                              <1>  				     ; NOTE: 32 (first_page) is initial
   348                              <1> 				     ; value of [next_page].
   349                              <1> 				     ; It points to the first available
   350                              <1> 				     ; page block for users (ring 3) ...	
   351                              <1> 				     ; (MAT offset 32 = 1024/32)	
   352                              <1> 				     ; (at the of the first 4 MB)		
   353 000057CA 031D[94780100]      <1> 	add	ebx, [next_page] ; Free page searching starts from here
   354                              <1> 				 ; next_free_page >> 5
   355 000057D0 030D[98780100]      <1> 	add	ecx, [last_page] ; Free page searching ends here
   356                              <1> 				 ; (total_pages - 1) >> 5
   357                              <1> al_p_scan:
   358 000057D6 39CB                <1> 	cmp	ebx, ecx
   359 000057D8 770A                <1> 	ja	short al_p_notfound
   360                              <1> 	;
   361                              <1> 	; 01/07/2015
   362                              <1> 	; AMD64 Architecture Programmers Manual
   363                              <1> 	; Volume 3:
   364                              <1> 	; General-Purpose and System Instructions
   365                              <1> 	;
   366                              <1> 	; BSF - Bit Scan Forward
   367                              <1> 	;
   368                              <1> 	;   Searches the value in a register or a memory location
   369                              <1> 	;   (second operand) for the least-significant set bit. 
   370                              <1> 	;   If a set bit is found, the instruction clears the zero flag (ZF)
   371                              <1> 	;   and stores the index of the least-significant set bit in a destination
   372                              <1> 	;   register (first operand). If the second operand contains 0, 
   373                              <1> 	;   the instruction sets ZF to 1 and does not change the contents of the 
   374                              <1> 	;   destination register. The bit index is an unsigned offset from bit 0 
   375                              <1> 	;   of the searched value
   376                              <1> 	;
   377 000057DA 0FBC03              <1> 	bsf	eax, [ebx] ; Scans source operand for first bit set (1).
   378                              <1> 			   ; Clear ZF if a bit is found set (1) and 
   379                              <1> 			   ; loads the destination with an index to
   380                              <1> 			   ; first set bit. (0 -> 31) 
   381                              <1> 			   ; Sets ZF to 1 if no bits are found set.
   382 000057DD 751C                <1> 	jnz	short al_p_found ; ZF = 0 -> a free page has been found
   383                              <1> 			 ;
   384                              <1> 			 ; NOTE: a Memory Allocation Table bit 
   385                              <1> 			 ;	 with value of 1 means 
   386                              <1> 			 ;	 the corresponding page is free 
   387                              <1> 			 ;	 (Retro UNIX 386 v1 feature only!)
   388 000057DF 83C304              <1> 	add	ebx, 4
   389                              <1> 			 ; We return back for searching next page block
   390                              <1> 			 ; NOTE: [free_pages] is not ZERO; so, 
   391                              <1> 			 ;	 we always will find at least 1 free page here.
   392 000057E2 EBF2                <1>         jmp     short al_p_scan
   393                              <1> 	;
   394                              <1> al_p_notfound:
   395 000057E4 81E900001000        <1> 	sub	ecx, MEM_ALLOC_TBL
   396 000057EA 890D[94780100]      <1> 	mov	[next_page], ecx ; next/first free page = last page 
   397                              <1> 				 ; (deallocate_page procedure will change it)
   398 000057F0 31C0                <1> 	xor	eax, eax
   399 000057F2 A3[90780100]        <1> 	mov	[free_pages], eax ; 0
   400 000057F7 59                  <1> 	pop	ecx
   401 000057F8 5B                  <1> 	pop	ebx
   402                              <1> 	;
   403                              <1> ; 17/04/2021
   404                              <1> ; ('swap_out' procedure call is disabled as temporary)
   405                              <1> 
   406                              <1> out_of_memory:
   407                              <1> ;	call	swap_out
   408                              <1> ;	jnc	short al_p_ok  ; [free_pages] = 0, re-allocation by swap_out
   409                              <1> ;	;
   410                              <1> ;	sub 	eax, eax ; 0
   411 000057F9 F9                  <1> 	stc
   412 000057FA C3                  <1> 	retn
   413                              <1> 
   414                              <1> al_p_found:
   415 000057FB 89D9                <1> 	mov	ecx, ebx
   416 000057FD 81E900001000        <1> 	sub	ecx, MEM_ALLOC_TBL
   417 00005803 890D[94780100]      <1> 	mov	[next_page], ecx ; Set first free page searching start
   418                              <1> 				 ; address/offset (to the next)
   419 00005809 FF0D[90780100]      <1>         dec     dword [free_pages] ; 1 page has been allocated (X = X-1) 
   420                              <1> 	;
   421 0000580F 0FB303              <1> 	btr	[ebx], eax	 ; The destination bit indexed by the source value
   422                              <1> 				 ; is copied into the Carry Flag and then cleared
   423                              <1> 				 ; in the destination.
   424                              <1> 				 ;
   425                              <1> 				 ; Reset the bit which is corresponding to the 
   426                              <1> 				 ; (just) allocated page.
   427                              <1> 	; 01/07/2015 (4*8 = 32, 1 allocation byte = 8 pages)	
   428 00005812 C1E103              <1> 	shl	ecx, 3		 ; (page block offset * 32) + page index
   429 00005815 01C8                <1> 	add	eax, ecx	 ; = page number
   430 00005817 C1E00C              <1> 	shl	eax, 12		 ; physical address of the page (flat/real value)
   431                              <1> 	; EAX = physical address of memory page
   432                              <1> 	;
   433                              <1> 	; NOTE: The relevant page directory and page table entry will be updated
   434                              <1> 	;       according to this EAX value...
   435 0000581A 59                  <1> 	pop	ecx
   436 0000581B 5B                  <1> 	pop	ebx
   437                              <1> al_p_ok:
   438 0000581C C3                  <1> 	retn
   439                              <1> 
   440                              <1> make_page_dir:
   441                              <1> 	; 18/04/2015
   442                              <1> 	; 12/04/2015
   443                              <1> 	; 23/10/2014
   444                              <1> 	; 16/10/2014
   445                              <1> 	; 09/10/2014 ; (Retro UNIX 386 v1 - beginning)
   446                              <1> 	;
   447                              <1> 	; INPUT ->
   448                              <1> 	;	none
   449                              <1> 	; OUTPUT ->
   450                              <1> 	;	(EAX = 0)
   451                              <1> 	;	cf = 1 -> insufficient (out of) memory error
   452                              <1> 	;	cf = 0 ->
   453                              <1> 	;	u.pgdir = page directory (physical) address of the current
   454                              <1> 	;		  process/user.
   455                              <1> 	;
   456                              <1> 	; Modified Registers -> EAX
   457                              <1> 	;
   458 0000581D E896FFFFFF          <1> 	call	allocate_page
   459 00005822 7216                <1> 	jc	short mkpd_error
   460                              <1> 	;
   461 00005824 A3[78900100]        <1> 	mov	[u.pgdir], eax    ; Page dir address for current user/process
   462                              <1> 				  ; (Physical address)
   463                              <1> clear_page:
   464                              <1> 	; 18/04/2015
   465                              <1> 	; 09/10/2014 ; (Retro UNIX 386 v1 - beginning)
   466                              <1> 	;
   467                              <1> 	; INPUT ->
   468                              <1> 	;	EAX = physical address of the page
   469                              <1> 	; OUTPUT ->
   470                              <1> 	;	all bytes of the page will be cleared
   471                              <1> 	;
   472                              <1> 	; Modified Registers -> none
   473                              <1> 	;
   474 00005829 57                  <1> 	push	edi
   475 0000582A 51                  <1> 	push	ecx
   476 0000582B 50                  <1> 	push	eax
   477 0000582C B900040000          <1> 	mov	ecx, PAGE_SIZE / 4
   478 00005831 89C7                <1> 	mov	edi, eax
   479 00005833 31C0                <1> 	xor	eax, eax
   480 00005835 F3AB                <1> 	rep	stosd
   481 00005837 58                  <1> 	pop	eax
   482 00005838 59                  <1> 	pop	ecx
   483 00005839 5F                  <1> 	pop	edi
   484                              <1> mkpd_error:
   485                              <1> mkpt_error:
   486 0000583A C3                  <1> 	retn
   487                              <1> 
   488                              <1> make_page_table:
   489                              <1> 	; 23/06/2015
   490                              <1> 	; 18/04/2015
   491                              <1> 	; 12/04/2015
   492                              <1> 	; 16/10/2014
   493                              <1> 	; 09/10/2014 ; (Retro UNIX 386 v1 - beginning)
   494                              <1> 	;
   495                              <1> 	; INPUT ->
   496                              <1> 	;	EBX = virtual (linear) address
   497                              <1> 	;	ECX = page table attributes (lower 12 bits)
   498                              <1> 	;	      (higher 20 bits must be ZERO)
   499                              <1> 	;	      (bit 0 must be 1)	 
   500                              <1> 	;	u.pgdir = page directory (physical) address
   501                              <1> 	; OUTPUT ->
   502                              <1> 	;	EDX = Page directory entry address
   503                              <1> 	;	EAX = Page table address
   504                              <1> 	;	cf = 1 -> insufficient (out of) memory error
   505                              <1> 	;	cf = 0 -> page table address in the PDE (EDX)
   506                              <1> 	;
   507                              <1> 	; Modified Registers -> EAX, EDX
   508                              <1> 	;
   509 0000583B E878FFFFFF          <1> 	call	allocate_page
   510 00005840 72F8                <1> 	jc	short mkpt_error
   511 00005842 E811000000          <1> 	call	set_pde	
   512 00005847 EBE0                <1> 	jmp	short clear_page
   513                              <1> 
   514                              <1> make_page:
   515                              <1> 	; 24/07/2015
   516                              <1> 	; 23/06/2015 ; (Retro UNIX 386 v1 - beginning)
   517                              <1> 	;
   518                              <1> 	; INPUT ->
   519                              <1> 	;	EBX = virtual (linear) address
   520                              <1> 	;	ECX = page attributes (lower 12 bits)
   521                              <1> 	;	      (higher 20 bits must be ZERO)
   522                              <1> 	;	      (bit 0 must be 1)	 
   523                              <1> 	;	u.pgdir = page directory (physical) address
   524                              <1> 	; OUTPUT ->
   525                              <1> 	;	EBX = Virtual address
   526                              <1> 	;	(EDX = PTE value)
   527                              <1> 	;	EAX = Physical address
   528                              <1> 	;	cf = 1 -> insufficient (out of) memory error
   529                              <1> 	;
   530                              <1> 	; Modified Registers -> EAX, EDX
   531                              <1> 	;
   532 00005849 E86AFFFFFF          <1> 	call	allocate_page
   533 0000584E 7207                <1> 	jc	short mkp_err
   534 00005850 E821000000          <1> 	call	set_pte	
   535 00005855 73D2                <1> 	jnc	short clear_page ; 18/04/2015
   536                              <1> mkp_err:
   537 00005857 C3                  <1> 	retn
   538                              <1> 
   539                              <1> 
   540                              <1> set_pde:	; Set page directory entry (PDE)
   541                              <1> 	; 20/07/2015
   542                              <1> 	; 18/04/2015
   543                              <1> 	; 12/04/2015
   544                              <1> 	; 23/10/2014
   545                              <1> 	; 10/10/2014 ; (Retro UNIX 386 v1 - beginning)
   546                              <1> 	;
   547                              <1> 	; INPUT ->
   548                              <1> 	;	EAX = physical address
   549                              <1> 	;	      (use present value if EAX = 0)
   550                              <1> 	;	EBX = virtual (linear) address
   551                              <1> 	;	ECX = page table attributes (lower 12 bits)
   552                              <1> 	;	      (higher 20 bits must be ZERO)
   553                              <1> 	;	      (bit 0 must be 1)	 
   554                              <1> 	;	u.pgdir = page directory (physical) address
   555                              <1> 	; OUTPUT ->
   556                              <1> 	;	EDX = PDE address
   557                              <1> 	;	EAX = page table address (physical)
   558                              <1> 	;	;(CF=1 -> Invalid page address)
   559                              <1> 	;
   560                              <1> 	; Modified Registers -> EDX
   561                              <1> 	;
   562 00005858 89DA                <1> 	mov	edx, ebx
   563 0000585A C1EA16              <1> 	shr	edx, PAGE_D_SHIFT ; 22
   564 0000585D C1E202              <1> 	shl	edx, 2 ; offset to page directory (1024*4)
   565 00005860 0315[78900100]      <1> 	add	edx, [u.pgdir]
   566                              <1> 	;
   567 00005866 21C0                <1> 	and	eax, eax
   568 00005868 7506                <1> 	jnz	short spde_1
   569                              <1> 	;
   570 0000586A 8B02                <1> 	mov	eax, [edx]  ; old PDE value
   571                              <1> 	;test	al, 1
   572                              <1> 	;jz	short spde_2
   573 0000586C 662500F0            <1> 	and	ax, PDE_A_CLEAR ; 0F000h  ; clear lower 12 bits
   574                              <1> spde_1:
   575                              <1> 	;and	cx, 0FFFh
   576 00005870 8902                <1> 	mov	[edx], eax
   577 00005872 66090A              <1> 	or	[edx], cx
   578 00005875 C3                  <1> 	retn
   579                              <1> ;spde_2: ; error
   580                              <1> ;	stc
   581                              <1> ;	retn
   582                              <1> 
   583                              <1> set_pte:	; Set page table entry (PTE)
   584                              <1> 	; 24/07/2015
   585                              <1> 	; 20/07/2015
   586                              <1> 	; 23/06/2015
   587                              <1> 	; 18/04/2015
   588                              <1> 	; 12/04/2015
   589                              <1> 	; 10/10/2014 ; (Retro UNIX 386 v1 - beginning)
   590                              <1> 	;
   591                              <1> 	; INPUT ->
   592                              <1> 	;	EAX = physical page address
   593                              <1> 	;	      (use present value if EAX = 0)
   594                              <1> 	;	EBX = virtual (linear) address
   595                              <1> 	;	ECX = page attributes (lower 12 bits)
   596                              <1> 	;	      (higher 20 bits must be ZERO)
   597                              <1> 	;	      (bit 0 must be 1)	 
   598                              <1> 	;	u.pgdir = page directory (physical) address
   599                              <1> 	; OUTPUT ->
   600                              <1> 	;	EAX = physical page address
   601                              <1> 	;	(EDX = PTE value)
   602                              <1> 	;	EBX = virtual address
   603                              <1> 	;
   604                              <1> 	;	CF = 1 -> error
   605                              <1> 	;
   606                              <1> 	; Modified Registers -> EAX, EDX
   607                              <1> 	;
   608 00005876 50                  <1> 	push	eax
   609 00005877 A1[78900100]        <1> 	mov	eax, [u.pgdir] ; 20/07/2015
   610 0000587C E837000000          <1> 	call 	get_pde
   611                              <1> 		; EDX = PDE address
   612                              <1> 		; EAX = PDE value
   613 00005881 5A                  <1> 	pop	edx ; physical page address
   614 00005882 722A                <1> 	jc	short spte_err ; PDE not present
   615                              <1> 	;
   616 00005884 53                  <1> 	push	ebx ; 24/07/2015
   617 00005885 662500F0            <1> 	and	ax, PDE_A_CLEAR ; 0F000h ; clear lower 12 bits
   618                              <1> 			    ; EDX = PT address (physical)	
   619 00005889 C1EB0C              <1> 	shr	ebx, PAGE_SHIFT ; 12
   620 0000588C 81E3FF030000        <1> 	and	ebx, PTE_MASK	; 03FFh
   621                              <1> 			 ; clear higher 10 bits (PD bits)
   622 00005892 C1E302              <1> 	shl	ebx, 2   ; offset to page table (1024*4)
   623 00005895 01C3                <1> 	add	ebx, eax
   624                              <1> 	;
   625 00005897 8B03                <1> 	mov	eax, [ebx] ; Old PTE value
   626 00005899 A801                <1> 	test	al, 1
   627 0000589B 740C                <1> 	jz	short spte_0
   628 0000589D 09D2                <1> 	or	edx, edx
   629 0000589F 750F                <1> 	jnz	short spte_1
   630 000058A1 662500F0            <1> 	and	ax, PTE_A_CLEAR ; 0F000h ; clear lower 12 bits
   631 000058A5 89C2                <1> 	mov	edx, eax
   632 000058A7 EB09                <1> 	jmp	short spte_2	
   633                              <1> spte_0:
   634                              <1> 	; If this PTE contains a swap (disk) address,
   635                              <1> 	; it can be updated by using 'swap_in' procedure
   636                              <1> 	; only!
   637 000058A9 21C0                <1> 	and	eax, eax
   638 000058AB 7403                <1> 	jz	short spte_1
   639                              <1> 	; 24/07/2015
   640                              <1> 	; swapped page ! (on disk)
   641 000058AD 5B                  <1> 	pop	ebx
   642                              <1> spte_err:
   643 000058AE F9                  <1> 	stc
   644 000058AF C3                  <1> 	retn
   645                              <1> spte_1: 
   646 000058B0 89D0                <1> 	mov	eax, edx
   647                              <1> spte_2:
   648 000058B2 09CA                <1> 	or	edx, ecx
   649                              <1> 	; 23/06/2015
   650 000058B4 8913                <1> 	mov	[ebx], edx ; PTE value in EDX
   651                              <1> 	; 24/07/2015
   652 000058B6 5B                  <1> 	pop	ebx
   653 000058B7 C3                  <1> 	retn
   654                              <1> 
   655                              <1> get_pde:	; Get present value of the relevant PDE
   656                              <1> 	; 20/07/2015
   657                              <1> 	; 18/04/2015
   658                              <1> 	; 12/04/2015
   659                              <1> 	; 10/10/2014 ; (Retro UNIX 386 v1 - beginning)
   660                              <1> 	;
   661                              <1> 	; INPUT ->
   662                              <1> 	;	EBX = virtual (linear) address
   663                              <1> 	;	EAX = page directory (physical) address
   664                              <1> 	; OUTPUT ->
   665                              <1> 	;	EDX = Page directory entry address
   666                              <1> 	;	EAX = Page directory entry value
   667                              <1> 	;	CF = 1 -> PDE not present or invalid ? 
   668                              <1> 	; Modified Registers -> EDX, EAX
   669                              <1> 	;
   670 000058B8 89DA                <1> 	mov	edx, ebx
   671 000058BA C1EA16              <1> 	shr	edx, PAGE_D_SHIFT ; 22  (12+10)
   672 000058BD C1E202              <1> 	shl 	edx, 2 ; offset to page directory (1024*4)
   673 000058C0 01C2                <1> 	add	edx, eax ; page directory address (physical)
   674 000058C2 8B02                <1> 	mov	eax, [edx]
   675 000058C4 A801                <1> 	test	al, PDE_A_PRESENT ; page table is present or not !
   676 000058C6 751F                <1> 	jnz	short gpte_retn
   677 000058C8 F9                  <1> 	stc
   678                              <1> gpde_retn:	
   679 000058C9 C3                  <1> 	retn
   680                              <1> 
   681                              <1> get_pte:
   682                              <1> 		; Get present value of the relevant PTE
   683                              <1> 	; 29/07/2015
   684                              <1> 	; 20/07/2015
   685                              <1> 	; 18/04/2015
   686                              <1> 	; 12/04/2015
   687                              <1> 	; 10/10/2014 ; (Retro UNIX 386 v1 - beginning)
   688                              <1> 	;
   689                              <1> 	; INPUT ->
   690                              <1> 	;	EBX = virtual (linear) address
   691                              <1> 	;	EAX = page directory (physical) address
   692                              <1> 	; OUTPUT ->
   693                              <1> 	;	EDX = Page table entry address (if CF=0)
   694                              <1> 	;	      Page directory entry address (if CF=1)
   695                              <1> 	;            (Bit 0 value is 0 if PT is not present)
   696                              <1> 	;	EAX = Page table entry value (page address)
   697                              <1> 	;	CF = 1 -> PDE not present or invalid ? 
   698                              <1> 	; Modified Registers -> EAX, EDX
   699                              <1> 	;
   700 000058CA E8E9FFFFFF          <1> 	call 	get_pde
   701 000058CF 72F8                <1> 	jc	short gpde_retn	; page table is not present
   702                              <1> 	;jnc	short gpte_1
   703                              <1> 	;retn
   704                              <1> ;gpte_1:
   705 000058D1 662500F0            <1> 	and	ax, PDE_A_CLEAR ; 0F000h ; clear lower 12 bits
   706 000058D5 89DA                <1> 	mov	edx, ebx
   707 000058D7 C1EA0C              <1> 	shr	edx, PAGE_SHIFT ; 12
   708 000058DA 81E2FF030000        <1> 	and	edx, PTE_MASK	; 03FFh
   709                              <1> 			 ; clear higher 10 bits (PD bits)
   710 000058E0 C1E202              <1> 	shl	edx, 2 ; offset from start of page table (1024*4)
   711 000058E3 01C2                <1> 	add	edx, eax
   712 000058E5 8B02                <1> 	mov	eax, [edx]
   713                              <1> gpte_retn:
   714 000058E7 C3                  <1> 	retn
   715                              <1> 
   716                              <1> deallocate_page_dir:
   717                              <1> 	; 15/09/2015
   718                              <1> 	; 05/08/2015
   719                              <1> 	; 30/04/2015
   720                              <1> 	; 28/04/2015
   721                              <1> 	; 17/10/2014
   722                              <1> 	; 12/10/2014 (Retro UNIX 386 v1 - beginning)
   723                              <1> 	;
   724                              <1> 	; INPUT ->
   725                              <1> 	;	EAX = PHYSICAL ADDRESS OF THE PAGE DIRECTORY (CHILD)
   726                              <1> 	;	EBX = PHYSICAL ADDRESS OF THE PARENT'S PAGE DIRECTORY
   727                              <1> 	; OUTPUT ->
   728                              <1> 	;	All of page tables in the page directory
   729                              <1> 	;	and page dir's itself will be deallocated
   730                              <1> 	;	except 'read only' duplicated pages (will be converted
   731                              <1> 	;	to writable pages).
   732                              <1> 	;
   733                              <1> 	; Modified Registers -> EAX
   734                              <1> 	;
   735                              <1> 	;
   736 000058E8 56                  <1> 	push	esi
   737 000058E9 51                  <1> 	push	ecx
   738 000058EA 50                  <1> 	push	eax
   739 000058EB 89C6                <1> 	mov	esi, eax 
   740 000058ED 31C9                <1> 	xor	ecx, ecx
   741                              <1> 	; The 1st PDE points to Kernel Page Table 0 (the 1st 4MB),
   742                              <1> 	; it must not be deallocated
   743 000058EF 890E                <1> 	mov	[esi], ecx ; 0 ; clear PDE 0
   744                              <1> dapd_0:
   745 000058F1 AD                  <1> 	lodsd
   746 000058F2 A801                <1> 	test	al, PDE_A_PRESENT ; bit 0, present flag (must be 1)
   747 000058F4 7409                <1> 	jz	short dapd_1	
   748 000058F6 662500F0            <1> 	and	ax, PDE_A_CLEAR ; 0F000h ; clear lower 12 (attribute) bits
   749 000058FA E812000000          <1> 	call	deallocate_page_table			
   750                              <1> dapd_1:
   751 000058FF 41                  <1> 	inc	ecx ; page directory entry index
   752 00005900 81F900040000        <1> 	cmp	ecx, PAGE_SIZE / 4 ; 1024
   753 00005906 72E9                <1> 	jb	short dapd_0
   754                              <1> dapd_2:
   755 00005908 58                  <1> 	pop	eax
   756 00005909 E869000000          <1> 	call	deallocate_page	; deallocate the page dir's itself
   757 0000590E 59                  <1> 	pop	ecx
   758 0000590F 5E                  <1> 	pop	esi
   759 00005910 C3                  <1> 	retn
   760                              <1> 
   761                              <1> deallocate_page_table:
   762                              <1> 	; 29/08/2023 - TRDOS 386 v2.0.6
   763                              <1> 	; 17/04/2021 - TRDOS 386 v2.0.4
   764                              <1> 	;	 (temporary modifications)
   765                              <1> 	; 12/07/2016
   766                              <1> 	; 19/09/2015
   767                              <1> 	; 15/09/2015
   768                              <1> 	; 05/08/2015
   769                              <1> 	; 30/04/2015
   770                              <1> 	; 28/04/2015
   771                              <1> 	; 24/10/2014
   772                              <1> 	; 23/10/2014
   773                              <1> 	; 12/10/2014 (Retro UNIX 386 v1 - beginning)
   774                              <1> 	;
   775                              <1> 	; INPUT ->
   776                              <1> 	;	EAX = PHYSICAL (real/flat) ADDRESS OF THE PAGE TABLE
   777                              <1> 	;	EBX = PHYSICAL ADDRESS OF THE PARENT'S PAGE DIRECTORY
   778                              <1> 	;	(ECX = page directory entry index)
   779                              <1> 	; OUTPUT ->
   780                              <1> 	;	All of pages in the page table and page table's itself
   781                              <1> 	;	will be deallocated except 'read only' duplicated pages
   782                              <1> 	;	(will be converted to writable pages).
   783                              <1> 	;
   784                              <1> 	; Modified Registers -> EAX
   785                              <1> 	;
   786 00005911 56                  <1> 	push	esi
   787 00005912 57                  <1> 	push	edi
   788 00005913 52                  <1> 	push	edx
   789 00005914 50                  <1> 	push	eax ; *
   790 00005915 89C6                <1> 	mov	esi, eax 
   791 00005917 31FF                <1> 	xor	edi, edi ; 0
   792                              <1> dapt_0:
   793 00005919 AD                  <1> 	lodsd
   794 0000591A A801                <1> 	test	al, PTE_A_PRESENT ; bit 0, present flag (must be 1)
   795 0000591C 744C                <1> 	jz	short dapt_1
   796                              <1> 	;
   797 0000591E A802                <1> 	test	al, PTE_A_WRITE   ; bit 1, writable (r/w) flag
   798                              <1> 				  ; (must be 1)
   799 00005920 753D                <1> 	jnz	short dapt_3
   800                              <1> 	; Read only -duplicated- page (belongs to a parent or a child)
   801 00005922 66A90002            <1>         test    ax, PTE_DUPLICATED ; Was this page duplicated 
   802                              <1> 				   ; as child's page ?
   803 00005926 7442                <1> 	jz	short dapt_4 ; Clear PTE but don't deallocate the page!
   804                              <1> 	; check the parent's PTE value is read only & same page or not.. 
   805                              <1> 	; ECX = page directory entry index (0-1023)
   806 00005928 53                  <1> 	push	ebx
   807 00005929 51                  <1> 	push	ecx
   808                              <1> 	;shl	cx, 2 ; *4
   809                              <1> 	; 29/08/2023
   810 0000592A C1E102              <1> 	shl	ecx, 2
   811 0000592D 01CB                <1> 	add	ebx, ecx ; PDE offset (for the parent)
   812 0000592F 8B0B                <1> 	mov	ecx, [ebx]
   813 00005931 F6C101              <1> 	test	cl, PDE_A_PRESENT ; present (valid) or not ?
   814 00005934 7427                <1> 	jz	short dapt_2	; parent process does not use this page
   815 00005936 6681E100F0          <1> 	and	cx, PDE_A_CLEAR ; 0F000h ; Clear attribute bits
   816                              <1> 	; EDI = page table entry index (0-1023)
   817 0000593B 89FA                <1> 	mov	edx, edi 
   818                              <1> 	;shl	dx, 2 ; *4
   819                              <1> 	; 29/08/2023
   820 0000593D C1E202              <1> 	shl	edx, 2
   821 00005940 01CA                <1> 	add	edx, ecx ; PTE offset (for the parent)
   822 00005942 8B1A                <1> 	mov	ebx, [edx]
   823 00005944 F6C301              <1> 	test	bl, PTE_A_PRESENT ; present or not ?
   824 00005947 7414                <1> 	jz	short dapt_2	; parent process does not use this page
   825 00005949 662500F0            <1> 	and	ax, PTE_A_CLEAR ; 0F000h ; Clear attribute bits 
   826 0000594D 6681E300F0          <1> 	and	bx, PTE_A_CLEAR ; 0F000h ; Clear attribute bits
   827 00005952 39D8                <1> 	cmp	eax, ebx	; parent's and child's pages are same ?
   828 00005954 7507                <1> 	jne	short dapt_2	; not same page
   829                              <1> 				; deallocate the child's page
   830 00005956 800A02              <1>         or      byte [edx], PTE_A_WRITE ; convert to writable page (parent)
   831 00005959 59                  <1> 	pop	ecx
   832 0000595A 5B                  <1> 	pop	ebx
   833 0000595B EB0D                <1> 	jmp	short dapt_4
   834                              <1> 
   835                              <1> ; 17/04/2021
   836                              <1> ; ('dapt_1' is disabled as temporary)
   837                              <1> ;
   838                              <1> ;dapt_1:
   839                              <1> ;	or	eax, eax	; swapped page ?
   840                              <1> ;	jz	short dapt_5	; no
   841                              <1> ;				; yes
   842                              <1> ;	shr	eax, 1
   843                              <1> ;	call	unlink_swap_block ; Deallocate swapped page block
   844                              <1> ;				  ; on the swap disk (or in file)
   845                              <1> ;	jmp	short dapt_5
   846                              <1> dapt_2:
   847 0000595D 59                  <1> 	pop	ecx
   848 0000595E 5B                  <1> 	pop	ebx
   849                              <1> dapt_3:	
   850                              <1> 	; 12/07/2016
   851 0000595F 66A90004            <1> 	test	ax, PTE_SHARED ; shared or direct memory access indicator
   852 00005963 7505                <1> 	jnz	short dapt_4   ; AVL bit 1 = 1, do not deallocate this page!
   853                              <1> 	;
   854                              <1> 	;and	ax, PTE_A_CLEAR ; 0F000h ; clear lower 12 (attribute) bits
   855 00005965 E80D000000          <1> 	call	deallocate_page ; set the mem allocation bit of this page
   856                              <1> dapt_4:
   857                              <1> 	; 20/10/2023
   858                              <1> 	; PTE clearing here was/is not necessary
   859                              <1> 	; because this page table is being deallocated
   860                              <1> 	; and it's PTEs will be ineffective.
   861                              <1> 
   862                              <1> 	;mov	dword [esi-4], 0 ; clear/reset PTE (child, dupl. as parent)
   863                              <1> 
   864                              <1> dapt_1:	; 17/04/2021 (temporary)
   865                              <1> dapt_5:
   866 0000596A 47                  <1> 	inc	edi ; page table entry index
   867 0000596B 81FF00040000        <1> 	cmp	edi, PAGE_SIZE / 4 ; 1024
   868 00005971 72A6                <1> 	jb	short dapt_0
   869                              <1> 	;
   870 00005973 58                  <1> 	pop	eax ; *
   871 00005974 5A                  <1> 	pop	edx
   872 00005975 5F                  <1> 	pop	edi	
   873 00005976 5E                  <1> 	pop	esi
   874                              <1> 	;
   875                              <1> 	;call	deallocate_page	; deallocate the page table's itself
   876                              <1> 	;retn
   877                              <1> 
   878                              <1> deallocate_page:
   879                              <1> 	; 15/09/2015
   880                              <1> 	; 28/04/2015
   881                              <1> 	; 10/03/2015
   882                              <1> 	; 17/10/2014
   883                              <1> 	; 12/10/2014 (Retro UNIX 386 v1 - beginning)
   884                              <1> 	;
   885                              <1> 	; INPUT -> 
   886                              <1> 	;	EAX = PHYSICAL (real/flat) ADDRESS OF THE ALLOCATED PAGE
   887                              <1> 	; OUTPUT ->
   888                              <1> 	;	[free_pages] is increased
   889                              <1> 	;	(corresponding MEMORY ALLOCATION TABLE bit is SET)
   890                              <1> 	;	CF = 1 if the page is already deallocated
   891                              <1> 	; 	       (or not allocated) before.  
   892                              <1> 	;
   893                              <1> 	; Modified Registers -> EAX
   894                              <1> 	;
   895 00005977 53                  <1> 	push	ebx
   896 00005978 52                  <1> 	push	edx
   897                              <1> 	;
   898 00005979 C1E80C              <1> 	shr	eax, PAGE_SHIFT      ; shift physical address to 
   899                              <1> 				     ; 12 bits right
   900                              <1> 				     ; to get page number
   901 0000597C 89C2                <1> 	mov	edx, eax
   902                              <1> 	; 15/09/2015
   903 0000597E C1EA03              <1> 	shr	edx, 3		     ; to get offset to M.A.T.
   904                              <1> 				     ; (1 allocation bit = 1 page)
   905                              <1> 				     ; (1 allocation bytes = 8 pages)
   906 00005981 80E2FC              <1> 	and	dl, 0FCh 	     ; clear lower 2 bits
   907                              <1> 				     ; (to get 32 bit position)			
   908                              <1> 	;
   909 00005984 BB00001000          <1> 	mov	ebx, MEM_ALLOC_TBL   ; Memory Allocation Table address
   910 00005989 01D3                <1> 	add	ebx, edx
   911 0000598B 83E01F              <1> 	and	eax, 1Fh	     ; lower 5 bits only
   912                              <1> 				     ; (allocation bit position)	 
   913 0000598E 3B15[94780100]      <1> 	cmp 	edx, [next_page]     ; is the new free page address lower
   914                              <1> 				     ; than the address in 'next_page' ?
   915                              <1> 				     ; (next/first free page value)		
   916 00005994 7306                <1> 	jnb	short dap_1	     ; no	
   917 00005996 8915[94780100]      <1> 	mov	[next_page], edx     ; yes
   918                              <1> dap_1:
   919 0000599C 0FAB03              <1> 	bts	[ebx], eax	     ; unlink/release/deallocate page
   920                              <1> 				     ; set relevant bit to 1.
   921                              <1> 				     ; set CF to the previous bit value	
   922                              <1> 	;cmc			     ; complement carry flag	
   923                              <1> 	;jc	short dap_2	     ; do not increase free_pages count
   924                              <1> 				     ; if the page is already deallocated
   925                              <1> 				     ; before.	
   926 0000599F FF05[90780100]      <1>         inc     dword [free_pages]
   927                              <1> dap_2:
   928 000059A5 5A                  <1> 	pop	edx
   929 000059A6 5B                  <1> 	pop	ebx
   930 000059A7 C3                  <1> 	retn
   931                              <1> 
   932                              <1> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   933                              <1> ;;                                                              ;;
   934                              <1> ;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;;
   935                              <1> ;; Distributed under terms of the GNU General Public License    ;;
   936                              <1> ;;                                                              ;;
   937                              <1> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   938                              <1> 
   939                              <1> ;;$Revision: 5057 $
   940                              <1> 
   941                              <1> 
   942                              <1> ;;align 4
   943                              <1> ;;proc alloc_page
   944                              <1> 
   945                              <1> ;;        pushfd
   946                              <1> ;;        cli
   947                              <1> ;;        push    ebx
   948                              <1> ;;;//-
   949                              <1> ;;        cmp     [pg_data.pages_free], 1
   950                              <1> ;;        jle     .out_of_memory
   951                              <1> ;;;//-
   952                              <1> ;;
   953                              <1> ;;        mov     ebx, [page_start]
   954                              <1> ;;        mov     ecx, [page_end]
   955                              <1> ;;.l1:
   956                              <1> ;;        bsf     eax, [ebx];
   957                              <1> ;;        jnz     .found
   958                              <1> ;;        add     ebx, 4
   959                              <1> ;;        cmp     ebx, ecx
   960                              <1> ;;        jb      .l1
   961                              <1> ;;        pop     ebx
   962                              <1> ;;        popfd
   963                              <1> ;;        xor     eax, eax
   964                              <1> ;;        ret
   965                              <1> ;;.found:
   966                              <1> ;;;//-
   967                              <1> ;;        dec     [pg_data.pages_free]
   968                              <1> ;;        jz      .out_of_memory
   969                              <1> ;;;//-
   970                              <1> ;;        btr     [ebx], eax
   971                              <1> ;;        mov     [page_start], ebx
   972                              <1> ;;        sub     ebx, sys_pgmap
   973                              <1> ;;        lea     eax, [eax+ebx*8]
   974                              <1> ;;        shl     eax, 12
   975                              <1> ;;;//-       dec [pg_data.pages_free]
   976                              <1> ;;        pop     ebx
   977                              <1> ;;        popfd
   978                              <1> ;;        ret
   979                              <1> ;;;//-
   980                              <1> ;;.out_of_memory:
   981                              <1> ;;        mov     [pg_data.pages_free], 1
   982                              <1> ;;        xor     eax, eax
   983                              <1> ;;        pop     ebx
   984                              <1> ;;        popfd
   985                              <1> ;;        ret
   986                              <1> ;;;//-
   987                              <1> ;;endp
   988                              <1> 
   989                              <1> duplicate_page_dir:
   990                              <1> 	; 21/09/2015
   991                              <1> 	; 31/08/2015
   992                              <1> 	; 20/07/2015
   993                              <1> 	; 28/04/2015
   994                              <1> 	; 27/04/2015
   995                              <1> 	; 18/04/2015
   996                              <1> 	; 12/04/2015
   997                              <1> 	; 18/10/2014
   998                              <1> 	; 16/10/2014 (Retro UNIX 386 v1 - beginning)
   999                              <1> 	;
  1000                              <1> 	; INPUT -> 
  1001                              <1> 	;	[u.pgdir] = PHYSICAL (real/flat) ADDRESS of the parent's
  1002                              <1> 	;		    page directory.
  1003                              <1> 	; OUTPUT ->
  1004                              <1> 	;	EAX =  PHYSICAL (real/flat) ADDRESS of the child's
  1005                              <1> 	;	       page directory.
  1006                              <1> 	;	(New page directory with new page table entries.)
  1007                              <1> 	;	(New page tables with read only copies of the parent's
  1008                              <1> 	;	pages.)
  1009                              <1> 	;	EAX = 0 -> Error (CF = 1)
  1010                              <1> 	;
  1011                              <1> 	; Modified Registers -> none (except EAX)
  1012                              <1> 	;
  1013 000059A8 E80BFEFFFF          <1> 	call	allocate_page
  1014 000059AD 723E                <1> 	jc	short dpd_err
  1015                              <1> 	;
  1016 000059AF 55                  <1> 	push	ebp ; 20/07/2015
  1017 000059B0 56                  <1> 	push	esi
  1018 000059B1 57                  <1> 	push	edi
  1019 000059B2 53                  <1> 	push	ebx
  1020 000059B3 51                  <1> 	push	ecx
  1021 000059B4 8B35[78900100]      <1> 	mov	esi, [u.pgdir]
  1022 000059BA 89C7                <1> 	mov	edi, eax
  1023 000059BC 50                  <1> 	push	eax ; save child's page directory address
  1024                              <1> 	; 31/08/2015
  1025                              <1> 	; copy PDE 0 from the parent's page dir to the child's page dir
  1026                              <1> 	; (use same system space for all user page tables) 
  1027 000059BD A5                  <1> 	movsd
  1028 000059BE BD00004000          <1> 	mov	ebp, 1024*4096 ; pass the 1st 4MB (system space)
  1029 000059C3 B9FF030000          <1> 	mov	ecx, (PAGE_SIZE / 4) - 1 ; 1023
  1030                              <1> dpd_0:	
  1031 000059C8 AD                  <1> 	lodsd
  1032                              <1> 	;or	eax, eax
  1033                              <1>         ;jnz     short dpd_1
  1034 000059C9 A801                <1> 	test	al, PDE_A_PRESENT ;  bit 0 =  1
  1035 000059CB 7508                <1> 	jnz	short dpd_1
  1036                              <1>  	; 20/07/2015 (virtual address at the end of the page table)	
  1037 000059CD 81C500004000        <1> 	add	ebp, 1024*4096 ; page size * PTE count
  1038 000059D3 EB0F                <1> 	jmp	short dpd_2
  1039                              <1> dpd_1:	
  1040 000059D5 662500F0            <1> 	and	ax, PDE_A_CLEAR ; 0F000h ; clear attribute bits
  1041 000059D9 89C3                <1> 	mov	ebx, eax
  1042                              <1> 	; EBX = Parent's page table address
  1043 000059DB E81F000000          <1> 	call	duplicate_page_table
  1044 000059E0 720C                <1> 	jc	short dpd_p_err
  1045                              <1> 	; EAX = Child's page table address
  1046 000059E2 0C07                <1> 	or	al, PDE_A_PRESENT + PDE_A_WRITE + PDE_A_USER
  1047                              <1> 			 ; set bit 0, bit 1 and bit 2 to 1
  1048                              <1> 			 ; (present, writable, user)
  1049                              <1> dpd_2:
  1050 000059E4 AB                  <1> 	stosd
  1051 000059E5 E2E1                <1> 	loop	dpd_0
  1052                              <1> 	;
  1053 000059E7 58                  <1> 	pop	eax  ; restore child's page directory address
  1054                              <1> dpd_3:
  1055 000059E8 59                  <1> 	pop	ecx
  1056 000059E9 5B                  <1> 	pop	ebx
  1057 000059EA 5F                  <1> 	pop	edi
  1058 000059EB 5E                  <1> 	pop	esi
  1059 000059EC 5D                  <1> 	pop	ebp ; 20/07/2015
  1060                              <1> dpd_err:
  1061 000059ED C3                  <1> 	retn
  1062                              <1> dpd_p_err:
  1063                              <1> 	; release the allocated pages missing (recover free space)
  1064 000059EE 58                  <1> 	pop	eax  ; the new page directory address (physical)
  1065 000059EF 8B1D[78900100]      <1> 	mov	ebx, [u.pgdir] ; parent's page directory address 
  1066 000059F5 E8EEFEFFFF          <1> 	call 	deallocate_page_dir
  1067 000059FA 29C0                <1> 	sub	eax, eax ; 0
  1068 000059FC F9                  <1> 	stc
  1069 000059FD EBE9                <1> 	jmp	short dpd_3	
  1070                              <1> 
  1071                              <1> duplicate_page_table:
  1072                              <1> 	; 17/04/2021 - TRDOS 386 v2.0.4
  1073                              <1> 	;	 (temporary modifications)
  1074                              <1> 	; 20/02/2017
  1075                              <1> 	; 21/09/2015
  1076                              <1> 	; 20/07/2015
  1077                              <1> 	; 05/05/2015
  1078                              <1> 	; 28/04/2015
  1079                              <1> 	; 27/04/2015
  1080                              <1> 	; 18/04/2015
  1081                              <1> 	; 18/10/2014
  1082                              <1> 	; 16/10/2014 (Retro UNIX 386 v1 - beginning)
  1083                              <1> 	;
  1084                              <1> 	; INPUT -> 
  1085                              <1> 	;	EBX = PHYSICAL (real/flat) ADDRESS of the parent's page table.
  1086                              <1> 	;       20/02/2017		 
  1087                              <1> 	;	EBP = Linear address of the page (from 'duplicate_page_dir')
  1088                              <1> 	;	      (Linear address = CORE + user's virtual address) 	
  1089                              <1> 	; OUTPUT ->
  1090                              <1> 	;	EAX = PHYSICAL (real/flat) ADDRESS of the child's page table.
  1091                              <1> 	;	      (with 'read only' attribute of page table entries)
  1092                              <1> 	;	20/02/2017
  1093                              <1> 	;	EBP = Next linear page address (for 'duplicate_page_dir')
  1094                              <1> 	;	
  1095                              <1> 	;	CF = 1 -> error 
  1096                              <1> 	;
  1097                              <1> 	; Modified Registers -> EBP (except EAX)
  1098                              <1> 	;
  1099 000059FF E8B4FDFFFF          <1> 	call	allocate_page
  1100 00005A04 7258                <1> 	jc	short dpt_err
  1101                              <1> 	;
  1102 00005A06 50                  <1> 	push	eax ; *
  1103 00005A07 56                  <1> 	push	esi
  1104 00005A08 57                  <1> 	push	edi
  1105 00005A09 52                  <1> 	push	edx
  1106 00005A0A 51                  <1> 	push	ecx
  1107                              <1> 	;
  1108 00005A0B 89DE                <1> 	mov	esi, ebx
  1109 00005A0D 89C7                <1> 	mov	edi, eax
  1110 00005A0F 89C2                <1> 	mov	edx, eax
  1111 00005A11 81C200100000        <1> 	add	edx, PAGE_SIZE 	
  1112                              <1> dpt_0:
  1113 00005A17 AD                  <1> 	lodsd
  1114 00005A18 21C0                <1> 	and	eax, eax
  1115 00005A1A 7432                <1> 	jz	short dpt_3
  1116 00005A1C A801                <1> 	test	al, PTE_A_PRESENT ;  bit 0 =  1
  1117                              <1> 	; 17/04/2021 (temporary)
  1118                              <1> 	;jnz	short dpt_1
  1119 00005A1E 7439                <1> 	jz	short dpt_p_err
  1120                              <1> 
  1121                              <1> ; 17/04/2021
  1122                              <1> ; ('reload_page' procedure call is disabled as temporary)
  1123                              <1> ;
  1124                              <1> ;	; 20/07/2015
  1125                              <1> ;	; ebp = virtual (linear) address of the memory page
  1126                              <1> ;	call	reload_page ; 28/04/2015
  1127                              <1> ;	jc	short dpt_p_err
  1128                              <1> dpt_1:
  1129                              <1> 	; 21/09/2015
  1130 00005A20 89C1                <1> 	mov	ecx, eax
  1131 00005A22 662500F0            <1> 	and	ax, PTE_A_CLEAR ; 0F000h ; clear attribute bits
  1132 00005A26 F6C102              <1> 	test	cl, PTE_A_WRITE ; writable page ?
  1133 00005A29 751A                <1> 	jnz	short dpt_2
  1134                              <1> 	; Read only (parent) page
  1135                              <1> 	; 	- there is a third process which uses this page -
  1136                              <1> 	; Allocate a new page for the child process
  1137 00005A2B E888FDFFFF          <1> 	call	allocate_page
  1138 00005A30 7227                <1> 	jc	short dpt_p_err
  1139 00005A32 57                  <1> 	push	edi
  1140 00005A33 56                  <1> 	push	esi
  1141 00005A34 89CE                <1> 	mov	esi, ecx
  1142 00005A36 89C7                <1> 	mov	edi, eax
  1143 00005A38 B900040000          <1> 	mov	ecx, PAGE_SIZE/4
  1144 00005A3D F3A5                <1> 	rep	movsd	; copy page (4096 bytes)
  1145 00005A3F 5E                  <1> 	pop	esi
  1146 00005A40 5F                  <1> 	pop	edi
  1147                              <1> 	;
  1148                              <1> 
  1149                              <1> ; 17/04/2021
  1150                              <1> ; ('add_to_swap_queue' procedure call is disabled as temporary)
  1151                              <1> ; 
  1152                              <1> ;	push	ebx
  1153                              <1> ;	push	eax
  1154                              <1> ;	; 20/07/2015
  1155                              <1> ;	mov	ebx, ebp
  1156                              <1> ;	; ebx = virtual (linear) address of the memory page
  1157                              <1> ;	call	add_to_swap_queue
  1158                              <1> ;	pop	eax
  1159                              <1> ;	pop	ebx
  1160                              <1> 
  1161                              <1> 	; 21/09/2015
  1162 00005A41 0C07                <1> 	or	al, PTE_A_USER+PTE_A_WRITE+PTE_A_PRESENT 
  1163                              <1> 		; user + writable + present page
  1164 00005A43 EB09                <1> 	jmp	short dpt_3
  1165                              <1> dpt_2:
  1166                              <1> 	;or	ax, PTE_A_USER+PTE_A_PRESENT 
  1167 00005A45 0C05                <1> 	or	al, PTE_A_USER+PTE_A_PRESENT 
  1168                              <1> 		    ; (read only page!)
  1169 00005A47 8946FC              <1> 	mov	[esi-4], eax ; update parent's PTE
  1170 00005A4A 660D0002            <1> 	or      ax, PTE_DUPLICATED  ; (read only page & duplicated PTE!)
  1171                              <1> dpt_3:
  1172 00005A4E AB                  <1> 	stosd  ; EDI points to child's PTE  	 
  1173                              <1> 	;
  1174 00005A4F 81C500100000        <1> 	add	ebp, 4096 ; 20/07/2015 (next page)
  1175                              <1> 	;
  1176 00005A55 39D7                <1> 	cmp	edi, edx
  1177 00005A57 72BE                <1> 	jb	short dpt_0
  1178                              <1> dpt_p_err:
  1179 00005A59 59                  <1> 	pop	ecx
  1180 00005A5A 5A                  <1> 	pop	edx
  1181 00005A5B 5F                  <1> 	pop	edi
  1182 00005A5C 5E                  <1> 	pop	esi
  1183 00005A5D 58                  <1> 	pop	eax ; *
  1184                              <1> dpt_err:
  1185 00005A5E C3                  <1> 	retn
  1186                              <1> 
  1187                              <1> page_fault_handler:	; CPU EXCEPTION 0Eh (14) : Page Fault !
  1188                              <1> 	; 29/11/2023 - TRDOS 386 v2.0.7
  1189                              <1> 	; 17/04/2021 - TRDOS 386 v2.0.4
  1190                              <1> 	;	 (temporary modifications)
  1191                              <1> 	; 21/09/2015
  1192                              <1> 	; 19/09/2015
  1193                              <1> 	; 17/09/2015
  1194                              <1> 	; 28/08/2015
  1195                              <1> 	; 20/07/2015
  1196                              <1> 	; 28/06/2015
  1197                              <1> 	; 03/05/2015
  1198                              <1> 	; 30/04/2015
  1199                              <1> 	; 18/04/2015
  1200                              <1> 	; 12/04/2015
  1201                              <1> 	; 30/10/2014
  1202                              <1> 	; 11/09/2014
  1203                              <1> 	; 10/09/2014 (Retro UNIX 386 v1 - beginning)
  1204                              <1> 	;
  1205                              <1> 	; Note: This is not an interrupt/exception handler.
  1206                              <1> 	;	This is a 'page fault remedy' subroutine 
  1207                              <1> 	;	which will be called by standard/uniform
  1208                              <1> 	;	exception handler.
  1209                              <1> 	;
  1210                              <1> 	; INPUT -> 
  1211                              <1> 	;	[error_code] = 32 bit ERROR CODE (lower 5 bits are valid)
  1212                              <1> 	;
  1213                              <1> 	;	cr2 = the virtual (linear) address 
  1214                              <1> 	;	      which has caused to page fault (19/09/2015)
  1215                              <1> 	;
  1216                              <1> 	; OUTPUT ->
  1217                              <1> 	;	(corresponding PAGE TABLE ENTRY is mapped/set)
  1218                              <1> 	;	EAX = 0 -> no error
  1219                              <1> 	;	EAX > 0 -> error code in EAX (also CF = 1)
  1220                              <1> 	;
  1221                              <1> 	; Modified Registers -> none (except EAX)
  1222                              <1> 	;	
  1223                              <1>         ;
  1224                              <1>         ; ERROR CODE:
  1225                              <1> 	;	 31  .....	4   3	2   1	0
  1226                              <1> 	;	+---+-- --+---+---+---+---+---+---+
  1227                              <1> 	;	|   Reserved  | I | R | U | W | P |
  1228                              <1> 	;	+---+-- --+---+---+---+---+---+---+
  1229                              <1> 	;
  1230                              <1> 	; P : PRESENT -	When set, the page fault was caused by 
  1231                              <1>     	;		a page-protection violation. When not set,
  1232                              <1> 	;		it was caused by a non-present page.
  1233                              <1> 	; W : WRITE   -	When set, the page fault was caused by
  1234                              <1> 	;		a page write. When not set, it was caused
  1235                              <1> 	;		by a page read.
  1236                              <1> 	; U : USER    -	When set, the page fault was caused 
  1237                              <1> 	;		while CPL = 3. 
  1238                              <1> 	;		This does not necessarily mean that
  1239                              <1> 	;		the page fault was a privilege violation.
  1240                              <1> 	; R : RESERVD -	When set, the page fault was caused by
  1241                              <1> 	;     WRITE	reading a 1 in a reserved field.
  1242                              <1> 	; I : INSTRUC -	When set, the page fault was caused by
  1243                              <1> 	;     FETCH	an instruction fetch
  1244                              <1> 	;
  1245                              <1> 	;; x86 (32 bit) VIRTUAL ADDRESS TRANSLATION
  1246                              <1> 	;  31               22                  12 11                    0
  1247                              <1> 	; +-------------------+-------------------+-----------------------+
  1248                              <1>        	; | PAGE DIR. ENTRY # | PAGE TAB. ENTRY # |        OFFSET         |
  1249                              <1>        	; +-------------------+-------------------+-----------------------+
  1250                              <1> 	;
  1251                              <1> 
  1252                              <1> 	;; CR3 REGISTER (Control Register 3)
  1253                              <1> 	;  31                                   12             5 4 3 2   0
  1254                              <1> 	; +---------------------------------------+-------------+---+-----+
  1255                              <1>       	; |                                       |  		|P|P|     |
  1256                              <1>       	; |   PAGE DIRECTORY TABLE BASE ADDRESS   |  reserved	|C|W|rsvrd|
  1257                              <1>       	; |                                       | 		|D|T|     |
  1258                              <1>    	; +---------------------------------------+-------------+---+-----+
  1259                              <1> 	;
  1260                              <1> 	;	PWT    - WRITE THROUGH
  1261                              <1> 	;	PCD    - CACHE DISABLE		
  1262                              <1> 	;
  1263                              <1> 	;
  1264                              <1> 	;; x86 PAGE DIRECTORY ENTRY (4 KByte Page)
  1265                              <1> 	;  31                                   12 11  9 8 7 6 5 4 3 2 1 0
  1266                              <1> 	; +---------------------------------------+-----+---+-+-+---+-+-+-+
  1267                              <1>       	; |                                       |     | | | | |P|P|U|R| |
  1268                              <1>       	; |     PAGE TABLE BASE ADDRESS 31..12    | AVL |G|0|D|A|C|W|/|/|P|
  1269                              <1>       	; |                                       |     | | | | |D|T|S|W| |
  1270                              <1>    	; +---------------------------------------+-----+---+-+-+---+-+-+-+
  1271                              <1> 	;
  1272                              <1>         ;       P      - PRESENT
  1273                              <1>         ;       R/W    - READ/WRITE
  1274                              <1>         ;       U/S    - USER/SUPERVISOR
  1275                              <1> 	;	PWT    - WRITE THROUGH
  1276                              <1> 	;	PCD    - CACHE DISABLE	
  1277                              <1> 	;	A      - ACCESSED	
  1278                              <1>         ;       D      - DIRTY (IGNORED)
  1279                              <1> 	;	PAT    - PAGE ATTRIBUTE TABLE INDEX (CACHE BEHAVIOR)
  1280                              <1> 	;	G      - GLOBAL	(IGNORED) 
  1281                              <1>         ;       AVL    - AVAILABLE FOR SYSTEMS PROGRAMMER USE
  1282                              <1> 	;
  1283                              <1> 	;
  1284                              <1> 	;; x86 PAGE TABLE ENTRY (4 KByte Page)
  1285                              <1> 	;  31                                   12 11  9 8 7 6 5 4 3 2 1 0
  1286                              <1> 	; +---------------------------------------+-----+---+-+-+---+-+-+-+
  1287                              <1>       	; |                                       |     | |P| | |P|P|U|R| |
  1288                              <1>       	; |     PAGE FRAME BASE ADDRESS 31..12    | AVL |G|A|D|A|C|W|/|/|P|
  1289                              <1>       	; |                                       |     | |T| | |D|T|S|W| |
  1290                              <1>    	; +---------------------------------------+-----+---+-+-+---+-+-+-+
  1291                              <1> 	;
  1292                              <1>         ;       P      - PRESENT
  1293                              <1>         ;       R/W    - READ/WRITE
  1294                              <1>         ;       U/S    - USER/SUPERVISOR
  1295                              <1> 	;	PWT    - WRITE THROUGH
  1296                              <1> 	;	PCD    - CACHE DISABLE	
  1297                              <1> 	;	A      - ACCESSED	
  1298                              <1>         ;       D      - DIRTY
  1299                              <1> 	;	PAT    - PAGE ATTRIBUTE TABLE INDEX (CACHE BEHAVIOR)
  1300                              <1> 	;	G      - GLOBAL	 
  1301                              <1>         ;       AVL    - AVAILABLE FOR SYSTEMS PROGRAMMER USE
  1302                              <1> 	;
  1303                              <1> 	;
  1304                              <1> 	;; 80386 PAGE TABLE ENTRY (4 KByte Page)
  1305                              <1> 	;  31                                   12 11  9 8 7 6 5 4 3 2 1 0
  1306                              <1> 	; +---------------------------------------+-----+-+-+-+-+---+-+-+-+
  1307                              <1>       	; |                                       |     | | | | | | |U|R| |
  1308                              <1>       	; |     PAGE FRAME BASE ADDRESS 31..12    | AVL |0|0|D|A|0|0|/|/|P|
  1309                              <1>       	; |                                       |     | | | | | | |S|W| |
  1310                              <1>       	; +---------------------------------------+-----+-+-+-+-+---+-+-+-+
  1311                              <1> 	;
  1312                              <1>         ;       P      - PRESENT
  1313                              <1>         ;       R/W    - READ/WRITE
  1314                              <1>         ;       U/S    - USER/SUPERVISOR
  1315                              <1>         ;       D      - DIRTY
  1316                              <1>         ;       AVL    - AVAILABLE FOR SYSTEMS PROGRAMMER USE
  1317                              <1> 	;
  1318                              <1>         ;       NOTE: 0 INDICATES INTEL RESERVED. DO NOT DEFINE.
  1319                              <1> 	;
  1320                              <1> 	;
  1321                              <1> 	;; Invalid Page Table Entry
  1322                              <1> 	; 31                                                           1 0
  1323                              <1>       	; +-------------------------------------------------------------+-+
  1324                              <1>       	; |                                                             | |
  1325                              <1>       	; |                          AVAILABLE                          |0|
  1326                              <1>       	; |                                                             | |
  1327                              <1>       	; +-------------------------------------------------------------+-+
  1328                              <1> 	;
  1329                              <1> 
  1330 00005A5F 53                  <1> 	push	ebx
  1331 00005A60 52                  <1> 	push	edx
  1332 00005A61 51                  <1> 	push	ecx
  1333                              <1> 	;
  1334                              <1> 	; 21/09/2015 (debugging)
  1335 00005A62 FF05[8C900100]      <1> 	inc	dword [u.pfcount] ; page fault count for running process
  1336 00005A68 FF05[38920100]      <1> 	inc	dword [PF_Count] ; total page fault count	
  1337                              <1> 	; 28/06/2015
  1338                              <1> 	;mov	edx, [error_code] ; Lower 5 bits are valid
  1339 00005A6E 8A15[30920100]      <1> 	mov	dl, [error_code]
  1340                              <1> 	;
  1341 00005A74 F6C201              <1> 	test	dl, 1	; page fault was caused by a non-present page
  1342                              <1> 			; sign
  1343 00005A77 7425                <1> 	jz	short pfh_alloc_np
  1344                              <1> 	; 
  1345                              <1> 	; If it is not a 'write on read only page' type page fault
  1346                              <1> 	; major page fault error with minor reason must be returned without 
  1347                              <1> 	; fixing the problem. 'sys_exit with error' will be needed
  1348                              <1> 	; after return here!
  1349                              <1> 	; Page fault will be remedied, by copying page contents
  1350                              <1> 	; to newly allocated page with write permission;
  1351                              <1> 	; sys_fork -> sys_exec -> copy on write, demand paging method is 
  1352                              <1> 	; used for working with minimum possible memory usage. 
  1353                              <1> 	; sys_fork will duplicate page directory and tables of parent  
  1354                              <1> 	; process with 'read only' flag. If the child process attempts to
  1355                              <1> 	; write on these read only pages, page fault will be directed here
  1356                              <1> 	; for allocating a new page with same data/content. 
  1357                              <1> 	;
  1358                              <1> 	; IMPORTANT : Retro UNIX 386 v1 (and SINGLIX and TR-DOS)
  1359                              <1> 	; will not force to separate CODE and DATA space 
  1360                              <1> 	; in a process/program... 
  1361                              <1> 	; CODE segment/section may contain DATA!
  1362                              <1> 	; It is flat, smoth and simplest programming method already as in 
  1363                              <1> 	; Retro UNIX 8086 v1 and MS-DOS programs.
  1364                              <1> 	;	
  1365 00005A79 F6C202              <1> 	test	dl, 2	; page fault was caused by a page write
  1366                              <1> 			; sign
  1367 00005A7C 7418                <1>         jz      short pfh_p_err
  1368                              <1> 	; 31/08/2015
  1369 00005A7E F6C204              <1> 	test	dl, 4	; page fault was caused while CPL = 3 (user mode)
  1370                              <1> 			; sign.  (U+W+P = 4+2+1 = 7)
  1371 00005A81 7413                <1>         jz	short pfh_pv_err
  1372                              <1> 	;
  1373                              <1> 	; make a new page and copy the parent's page content
  1374                              <1> 	; as the child's new page content
  1375                              <1> 	;
  1376 00005A83 0F20D3              <1> 	mov	ebx, cr2 ; CR2 contains the linear address 
  1377                              <1> 			 ; which has caused to page fault
  1378 00005A86 E87C000000          <1> 	call 	copy_page
  1379 00005A8B 7202                <1>         jc	short pfh_im_err ; insufficient memory
  1380                              <1> 	;
  1381 00005A8D EB72                <1>         jmp     pfh_cpp_ok
  1382                              <1> 
  1383                              <1> 	; 29/11/2023
  1384                              <1> pfh_im_err:
  1385 00005A8F B8E4000000          <1> 	mov	eax, ERR_MAJOR_PF + ERR_MINOR_IM ; Error code in AX
  1386                              <1> 			; Major (Primary) Error: Page Fault
  1387                              <1> 			; Minor (Secondary) Error: Insufficient Memory !
  1388 00005A94 EB6D                <1> 	jmp	short pfh_err_retn
  1389                              <1> 
  1390                              <1> 	; 29/11/2023
  1391                              <1> pfh_p_err: ; 09/03/2015
  1392                              <1> pfh_pv_err:
  1393                              <1> 	; Page fault was caused by a protection-violation
  1394 00005A96 B8E6000000          <1> 	mov	eax, ERR_MAJOR_PF + ERR_MINOR_PV ; Error code in AX
  1395                              <1> 			; Major (Primary) Error: Page Fault
  1396                              <1> 			; Minor (Secondary) Error: Protection violation !
  1397 00005A9B F9                  <1> 	stc
  1398 00005A9C EB65                <1> 	jmp	short pfh_err_retn
  1399                              <1> 
  1400                              <1> pfh_alloc_np:
  1401 00005A9E E815FDFFFF          <1> 	call	allocate_page	; (allocate a new page)
  1402 00005AA3 72EA                <1>         jc      pfh_im_err	; 'insufficient memory' error
  1403                              <1> pfh_chk_cpl:
  1404                              <1> 	; EAX = Physical (base) address of the allocated (new) page
  1405                              <1> 		; (Lower 12 bits are ZERO, because 
  1406                              <1> 		;	the address is on a page boundary)
  1407 00005AA5 80E204              <1> 	and	dl, 4	; CPL = 3 ?
  1408 00005AA8 7505                <1> 	jnz	short pfh_um
  1409                              <1> 			; Page fault handler for kernel/system mode (CPL=0)		
  1410 00005AAA 0F20DB              <1> 	mov	ebx, cr3 ; CR3 (Control Register 3) contains physical address
  1411                              <1> 			 ; of the current/active page directory
  1412                              <1> 			 ; (Always kernel/system mode page directory, here!)
  1413                              <1> 			 ; Note: Lower 12 bits are 0. (page boundary)
  1414 00005AAD EB06                <1> 	jmp	short pfh_get_pde
  1415                              <1> 	;
  1416                              <1> pfh_um:			; Page fault handler for user/appl. mode (CPL=3)
  1417 00005AAF 8B1D[78900100]      <1>  	mov	ebx, [u.pgdir] ; Page directory of current/active process
  1418                              <1> 			; Physical address of the USER's page directory
  1419                              <1> 			; Note: Lower 12 bits are 0. (page boundary)
  1420                              <1> pfh_get_pde:
  1421 00005AB5 80CA03              <1> 	or	dl, 3	; USER + WRITE + PRESENT or SYSTEM + WRITE + PRESENT
  1422 00005AB8 0F20D1              <1> 	mov	ecx, cr2 ; CR2 contains the virtual address 
  1423                              <1> 			 ; which has been caused to page fault
  1424                              <1> 			 ;
  1425 00005ABB C1E914              <1> 	shr	ecx, 20	 ; shift 20 bits right
  1426 00005ABE 80E1FC              <1> 	and	cl, 0FCh ; mask lower 2 bits to get PDE offset		
  1427                              <1> 	;
  1428 00005AC1 01CB                <1> 	add	ebx, ecx ; now, EBX points to the relevant page dir entry 
  1429 00005AC3 8B0B                <1> 	mov	ecx, [ebx] ; physical (base) address of the page table 	
  1430 00005AC5 F6C101              <1> 	test	cl, 1	 ; check bit 0 is set (1) or not (0).
  1431 00005AC8 740B                <1> 	jz	short pfh_set_pde ; Page directory entry is not valid,
  1432                              <1> 			  	  ; set/validate page directory entry
  1433 00005ACA 6681E100F0          <1> 	and	cx, PDE_A_CLEAR ; 0F000h ; Clear attribute bits
  1434 00005ACF 89CB                <1> 	mov	ebx, ecx ; Physical address of the page table
  1435 00005AD1 89C1                <1> 	mov	ecx, eax ; new page address (physical) 	
  1436 00005AD3 EB16                <1> 	jmp	short pfh_get_pte
  1437                              <1> pfh_set_pde:
  1438                              <1> 	;; NOTE: Page directories and page tables never be swapped out!
  1439                              <1> 	;;	 (So, we know this PDE is empty or invalid)
  1440                              <1> 	;
  1441 00005AD5 08D0                <1> 	or	al, dl	 ; lower 3 bits are used as U/S, R/W, P flags
  1442 00005AD7 8903                <1> 	mov	[ebx], eax ; Let's put the new page directory entry here !
  1443 00005AD9 30C0                <1> 	xor	al, al	 ; clear lower (3..8) bits
  1444 00005ADB 89C3                <1> 	mov	ebx, eax
  1445 00005ADD E8D6FCFFFF          <1> 	call	allocate_page	 ; (allocate a new page)
  1446 00005AE2 72AB                <1> 	jc	short pfh_im_err   ; 'insufficient memory' error
  1447                              <1> pfh_spde_1:
  1448                              <1> 	; EAX = Physical (base) address of the allocated (new) page
  1449 00005AE4 89C1                <1> 	mov	ecx, eax
  1450 00005AE6 E83EFDFFFF          <1> 	call	clear_page ; Clear page content
  1451                              <1> pfh_get_pte:
  1452 00005AEB 0F20D0              <1> 	mov	eax, cr2 ; virtual address
  1453                              <1> 			 ; which has been caused to page fault
  1454 00005AEE 89C7                <1> 	mov	edi, eax ; 20/07/2015
  1455 00005AF0 C1E80C              <1> 	shr	eax, 12	 ; shift 12 bit right to get 
  1456                              <1> 			 ; higher 20 bits of the page fault address 
  1457 00005AF3 25FF030000          <1> 	and	eax, 3FFh ; mask PDE# bits, the result is PTE# (0 to 1023)
  1458 00005AF8 C1E002              <1> 	shl	eax, 2	; shift 2 bits left to get PTE offset
  1459 00005AFB 01C3                <1> 	add	ebx, eax ; now, EBX points to the relevant page table entry 
  1460                              <1> ; 17/04/2021 temporary
  1461                              <1> ;	mov	eax, [ebx] ; get previous value of pte
  1462                              <1> ;		; bit 0 of EAX is always 0 (otherwise we would not be here)
  1463                              <1> 
  1464                              <1> ; 17/04/2021
  1465                              <1> ; ('swap_in' procedure call has been disabled as temporary)
  1466                              <1> ;
  1467                              <1> ;	and	eax, eax
  1468                              <1> ;	jz	short pfh_gpte_1
  1469                              <1> ;	; 20/07/2015
  1470                              <1> ;	xchg	ebx, ecx ; new page address (physical)
  1471                              <1> ;	push	ebp ; 20/07/2015
  1472                              <1> ;	mov	ebp, cr2
  1473                              <1> ;		; ECX = physical address of the page table entry
  1474                              <1> ;		; EBX = Memory page address (physical!)
  1475                              <1> ;		; EAX = Swap disk (offset) address
  1476                              <1> ;		; EBP = virtual address (page fault address)
  1477                              <1> ;	call	swap_in
  1478                              <1> ;	pop	ebp
  1479                              <1> ;	jc      short pfh_err_retn
  1480                              <1> ;	xchg	ecx, ebx
  1481                              <1> ;		; EBX = physical address of the page table entry
  1482                              <1> ;		; ECX = new page
  1483                              <1> pfh_gpte_1:
  1484 00005AFD 08D1                <1> 	or	cl, dl	; lower 3 bits are used as U/S, R/W, P flags
  1485 00005AFF 890B                <1> 	mov	[ebx], ecx ; Let's put the new page table entry here !
  1486                              <1> pfh_cpp_ok:
  1487                              <1> ; 17/04/2021
  1488                              <1> ; ('add_to_swap_queue' procedure call has been disabled as temporary)
  1489                              <1> ;
  1490                              <1> ;	; 20/07/2015
  1491                              <1> ;	mov	ebx, cr2
  1492                              <1> ;	call 	add_to_swap_queue
  1493                              <1> 	;
  1494                              <1> 	; The new PTE (which contains the new page) will be added to 
  1495                              <1> 	; the swap queue, here. 
  1496                              <1> 	; (Later, if memory will become insufficient, 
  1497                              <1> 	; one page will be swapped out which is at the head of 
  1498                              <1> 	; the swap queue by using FIFO and access check methods.)
  1499                              <1> 	;
  1500 00005B01 31C0                <1> 	xor	eax, eax  ; 0
  1501                              <1> 	;
  1502                              <1> pfh_err_retn:
  1503 00005B03 59                  <1> 	pop	ecx
  1504 00005B04 5A                  <1> 	pop	edx
  1505 00005B05 5B                  <1> 	pop	ebx
  1506 00005B06 C3                  <1> 	retn 
  1507                              <1> 	
  1508                              <1> copy_page:
  1509                              <1> 	; 29/08/2023 (TRDOS 386 v2.0.6)
  1510                              <1> 	; 22/09/2015
  1511                              <1> 	; 21/09/2015
  1512                              <1> 	; 19/09/2015
  1513                              <1> 	; 07/09/2015
  1514                              <1> 	; 31/08/2015
  1515                              <1> 	; 20/07/2015
  1516                              <1> 	; 05/05/2015
  1517                              <1> 	; 03/05/2015
  1518                              <1> 	; 18/04/2015
  1519                              <1> 	; 12/04/2015
  1520                              <1> 	; 30/10/2014
  1521                              <1> 	; 18/10/2014 (Retro UNIX 386 v1 - beginning)
  1522                              <1> 	;
  1523                              <1> 	; INPUT -> 
  1524                              <1> 	;	EBX = Virtual (linear) address of source page
  1525                              <1> 	;	     (Page fault address)
  1526                              <1> 	; OUTPUT ->
  1527                              <1> 	;	EAX = PHYSICAL (real/flat) ADDRESS OF THE ALLOCATED PAGE
  1528                              <1> 	;	(corresponding PAGE TABLE ENTRY is mapped/set)
  1529                              <1> 	;	EAX = 0 (CF = 1) 
  1530                              <1> 	;		if there is not a free page to be allocated
  1531                              <1> 	;	(page content of the source page will be copied
  1532                              <1> 	;	onto the target/new page) 	
  1533                              <1> 	;
  1534                              <1> 	; Modified Registers -> ecx, ebx (except EAX)
  1535                              <1> 	;	
  1536 00005B07 56                  <1> 	push	esi
  1537 00005B08 57                  <1> 	push	edi
  1538                              <1> 	;push	ebx
  1539                              <1> 	;push	ecx
  1540 00005B09 31F6                <1> 	xor 	esi, esi
  1541 00005B0B C1EB0C              <1> 	shr	ebx, 12 ; shift 12 bits right to get PDE & PTE numbers
  1542 00005B0E 89D9                <1> 	mov	ecx, ebx ; save page fault address (as 12 bit shifted)
  1543 00005B10 C1EB08              <1> 	shr	ebx, 8	 ; shift 8 bits right and then
  1544 00005B13 80E3FC              <1> 	and	bl, 0FCh ; mask lower 2 bits to get PDE offset	
  1545 00005B16 89DF                <1> 	mov 	edi, ebx ; save it for the parent of current process
  1546 00005B18 031D[78900100]      <1> 	add	ebx, [u.pgdir] ; EBX points to the relevant page dir entry 
  1547 00005B1E 8B03                <1> 	mov	eax, [ebx] ; physical (base) address of the page table
  1548 00005B20 662500F0            <1> 	and	ax, PTE_A_CLEAR ; 0F000h ; clear attribute bits 	
  1549 00005B24 89CB                <1> 	mov	ebx, ecx   ; (restore higher 20 bits of page fault address)
  1550 00005B26 81E3FF030000        <1> 	and	ebx, 3FFh  ; mask PDE# bits, the result is PTE# (0 to 1023)
  1551                              <1> 	;shl	bx, 2	   ; shift 2 bits left to get PTE offset
  1552                              <1> 	; 29/08/2023
  1553 00005B2C C1E302              <1> 	shl	ebx, 2
  1554 00005B2F 01C3                <1> 	add	ebx, eax   ; EBX points to the relevant page table entry 
  1555                              <1> 	; 07/09/2015
  1556 00005B31 66F7030002          <1>         test    word [ebx], PTE_DUPLICATED ; (Does current process share this
  1557                              <1> 				     ; read only page as a child process?)	
  1558 00005B36 7509                <1> 	jnz	short cpp_0 ; yes
  1559 00005B38 8B0B                <1> 	mov	ecx, [ebx] ; PTE value
  1560 00005B3A 6681E100F0          <1> 	and	cx, PTE_A_CLEAR ; 0F000h  ; clear page attributes
  1561 00005B3F EB31                <1> 	jmp	short cpp_1
  1562                              <1> cpp_0:
  1563 00005B41 89FE                <1> 	mov	esi, edi
  1564 00005B43 0335[7C900100]      <1> 	add	esi, [u.ppgdir] ; the parent's page directory entry
  1565 00005B49 8B06                <1> 	mov	eax, [esi] ; physical (base) address of the page table
  1566 00005B4B 662500F0            <1> 	and	ax, PTE_A_CLEAR ; 0F000h ; clear attribute bits
  1567 00005B4F 89CE                <1> 	mov	esi, ecx   ; (restore higher 20 bits of page fault address)	
  1568 00005B51 81E6FF030000        <1> 	and	esi, 3FFh  ; mask PDE# bits, the result is PTE# (0 to 1023)
  1569                              <1> 	;shl	si, 2	   ; shift 2 bits left to get PTE offset
  1570                              <1> 	; 29/08/2023
  1571 00005B57 C1E602              <1> 	shl	esi, 2
  1572 00005B5A 01C6                <1> 	add	esi, eax   ; EDX points to the relevant page table entry  	
  1573 00005B5C 8B0E                <1> 	mov	ecx, [esi] ; PTE value of the parent process
  1574                              <1> 	; 21/09/2015
  1575 00005B5E 8B03                <1> 	mov	eax, [ebx] ; PTE value of the child process
  1576 00005B60 662500F0            <1> 	and	ax, PTE_A_CLEAR ; 0F000h ; clear page attributes	
  1577                              <1> 	;
  1578 00005B64 F6C101              <1> 	test	cl, PTE_A_PRESENT ; is it a present/valid page ?
  1579 00005B67 7424                <1> 	jz	short cpp_3 ; the parent's page is not same page  	
  1580                              <1> 	;
  1581 00005B69 6681E100F0          <1> 	and	cx, PTE_A_CLEAR ; 0F000h ; clear page attributes
  1582 00005B6E 39C8                <1> 	cmp	eax, ecx   ; Same page?	
  1583 00005B70 751B                <1> 	jne	short cpp_3 ; Parent page and child page are not same 
  1584                              <1> 			    ; Convert child's page to writable page
  1585                              <1> cpp_1:
  1586 00005B72 E841FCFFFF          <1> 	call	allocate_page
  1587 00005B77 721A                <1> 	jc	short cpp_4 ; 'insufficient memory' error
  1588 00005B79 21F6                <1> 	and	esi, esi    ; check ESI is valid or not
  1589 00005B7B 7405                <1> 	jz	short cpp_2
  1590                              <1> 		; Convert read only page to writable page 
  1591                              <1> 		;(for the parent of the current process)
  1592                              <1> 	;and	word [esi], PTE_A_CLEAR ; 0F000h
  1593                              <1> 	; 22/09/2015
  1594 00005B7D 890E                <1> 	mov	[esi], ecx
  1595 00005B7F 800E07              <1> 	or	byte [esi], PTE_A_PRESENT + PTE_A_WRITE + PTE_A_USER
  1596                              <1> 				 ; 1+2+4 = 7
  1597                              <1> cpp_2:
  1598 00005B82 89C7                <1> 	mov	edi, eax ; new page address of the child process
  1599                              <1> 	; 07/09/2015
  1600 00005B84 89CE                <1> 	mov	esi, ecx ; the page address of the parent process
  1601 00005B86 B900040000          <1> 	mov	ecx, PAGE_SIZE / 4
  1602 00005B8B F3A5                <1> 	rep	movsd ; 31/08/2015
  1603                              <1> cpp_3:		
  1604 00005B8D 0C07                <1> 	or	al, PTE_A_PRESENT + PTE_A_WRITE + PTE_A_USER ; 1+2+4 = 7
  1605 00005B8F 8903                <1> 	mov	[ebx], eax ; Update PTE
  1606 00005B91 28C0                <1> 	sub	al, al ; clear attributes
  1607                              <1> cpp_4:
  1608                              <1> 	;pop	ecx
  1609                              <1> 	;pop	ebx
  1610 00005B93 5F                  <1> 	pop	edi
  1611 00005B94 5E                  <1> 	pop	esi
  1612 00005B95 C3                  <1> 	retn
  1613                              <1> 
  1614                              <1> ;; 28/04/2015
  1615                              <1> ;; 24/10/2014
  1616                              <1> ;; 21/10/2014 (Retro UNIX 386 v1 - beginning)
  1617                              <1> ;; SWAP_PAGE_QUEUE (4096 bytes)
  1618                              <1> ;;
  1619                              <1> ;;   0000   0001   0002   0003   ....   1020   1021   1022   1023	
  1620                              <1> ;; +------+------+------+------+-    -+------+------+------+------+
  1621                              <1> ;; |  pg1 |  pg2 |  pg3 |  pg4 | .... |pg1021|pg1022|pg1023|pg1024|
  1622                              <1> ;; +------+------+------+------+-    -+------+------+------+------+    
  1623                              <1> ;;
  1624                              <1> ;; [swpq_last] = 0 to 4096 (step 4) -> the last position on the queue
  1625                              <1> ;;
  1626                              <1> ;; Method:
  1627                              <1> ;;	Swap page queue is a list of allocated pages with physical
  1628                              <1> ;;	addresses (system mode virtual adresses = physical addresses).
  1629                              <1> ;;	It is used for 'swap_in' and 'swap_out' procedures.
  1630                              <1> ;;	When a new page is being allocated, swap queue is updated
  1631                              <1> ;;	by 'swap_queue_shift' procedure, header of the queue (offset 0)
  1632                              <1> ;;	is checked for 'accessed' flag. If the 1st page on the queue
  1633                              <1> ;;	is 'accessed' or 'read only', it is dropped from the list;
  1634                              <1> ;;	other pages from the 2nd to the last (in [swpq_last]) shifted
  1635                              <1> ;; 	to head then the 2nd page becomes the 1st and '[swpq_last]' 
  1636                              <1> ;;	offset value becomes it's previous offset value - 4.
  1637                              <1> ;;	If the 1st page of the swap page queue is not 'accessed'	
  1638                              <1> ;;	the queue/list is not shifted.
  1639                              <1> ;;	After the queue/list shift, newly allocated page is added
  1640                              <1> ;;	to the tail of the queue at the [swpq_count*4] position.
  1641                              <1> ;;	But, if [swpq_count] > 1023, the newly allocated page
  1642                              <1> ;;	will not be added to the tail of swap page queue.  		 
  1643                              <1> ;;	
  1644                              <1> ;;	During 'swap_out' procedure, swap page queue is checked for
  1645                              <1> ;;	the first non-accessed, writable page in the list, 
  1646                              <1> ;;	from the head to the tail. The list is shifted to left 
  1647                              <1> ;;	(to the head) till a non-accessed page will be found in the list.
  1648                              <1> ;;	Then, this page	is swapped out (to disk) and then it is dropped
  1649                              <1> ;;	from the list by a final swap queue shift. [swpq_count] value
  1650                              <1> ;;	is changed. If all pages on the queue' are 'accessed', 
  1651                              <1> ;;	'insufficient memory' error will be returned ('swap_out' 
  1652                              <1> ;;	procedure will be failed)...
  1653                              <1> ;;
  1654                              <1> ;;	Note: If the 1st page of the queue is an 'accessed' page,
  1655                              <1> ;;	'accessed' flag of the page will be reset (0) and that page
  1656                              <1> ;;	(PTE) will be added to the tail of the queue after
  1657                              <1> ;;	the check, if [swpq_count] < 1023. If [swpq_count] = 1024
  1658                              <1> ;;	the queue will be rotated and the PTE in the head will be
  1659                              <1> ;;	added to the tail after resetting 'accessed' bit. 
  1660                              <1> ;;
  1661                              <1> ;;
  1662                              <1> ;;	
  1663                              <1> ;; SWAP DISK/FILE (with 4096 bytes swapped page blocks)
  1664                              <1> ;;
  1665                              <1> ;;  00000000  00000004  00000008  0000000C   ...   size-8    size-4
  1666                              <1> ;; +---------+---------+---------+---------+-- --+---------+---------+
  1667                              <1> ;; |descriptr| page(1) | page(2) | page(3) | ... |page(n-1)| page(n) |
  1668                              <1> ;; +---------+---------+---------+---------+-- --+---------+---------+    
  1669                              <1> ;;
  1670                              <1> ;; [swpd_next] = the first free block address in swapped page records
  1671                              <1> ;;    		 for next free block search by 'swap_out' procedure.
  1672                              <1> ;; [swpd_size] = swap disk/file size in sectors (512 bytes)
  1673                              <1> ;;		 NOTE: max. possible swap disk size is 1024 GB
  1674                              <1> ;; 		 (entire swap space must be accessed by using
  1675                              <1> ;;		 31 bit offset address) 
  1676                              <1> ;; [swpd_free] = free block (4096 bytes) count in swap disk/file space
  1677                              <1> ;; [swpd_start] = absolute/start address of the swap disk/file
  1678                              <1> ;;		  0 for file, or beginning sector of the swap partition
  1679                              <1> ;; [swp_drv] = logical drive description table addr. of swap disk/file
  1680                              <1> ;;
  1681                              <1> ;; 					
  1682                              <1> ;; Method:
  1683                              <1> ;;	When the memory (ram) becomes insufficient, page allocation
  1684                              <1> ;;	procedure swaps out a page from memory to the swap disk 
  1685                              <1> ;;	(partition) or swap file to get a new free page at the memory.
  1686                              <1> ;;	Swapping out is performed by using swap page queue.
  1687                              <1> ;;
  1688                              <1> ;; 	Allocation block size of swap disk/file is equal to page size
  1689                              <1> ;;	(4096 bytes). Swapping address (in sectors) is recorded
  1690                              <1> ;;	into relevant page file entry as 31 bit physical (logical)
  1691                              <1> ;;	offset address as 1 bit shifted to left for present flag (0).
  1692                              <1> ;;	Swapped page address is between 1 and swap disk/file size - 4.	  
  1693                              <1> ;;	Absolute physical (logical) address of the swapped page is 
  1694                              <1> ;;	calculated by adding offset value to the swap partition's 
  1695                              <1> ;;	start address. If the swap device (disk) is a virtual disk 
  1696                              <1> ;;	or it is a file, start address of the swap disk/volume is 0, 
  1697                              <1> ;;	and offset value is equal to absolute (physical or logical)
  1698                              <1> ;;	address/position. (It has not to be ZERO if the swap partition 
  1699                              <1> ;;	is in a partitioned virtual hard disk.) 
  1700                              <1> ;;
  1701                              <1> ;;	Note: Swap addresses are always specified/declared in sectors, 
  1702                              <1> ;;	not in bytes or	in blocks/zones/clusters (4096 bytes) as unit.
  1703                              <1> ;;
  1704                              <1> ;;	Swap disk/file allocation is mapped via 'Swap Allocation Table'
  1705                              <1> ;;	at memory as similar to 'Memory Allocation Table'.
  1706                              <1> ;;
  1707                              <1> ;;	Every bit of Swap Allocation Table repsesents one swap block
  1708                              <1> ;;	(equal to page size) respectively. Bit 0 of the S.A.T. byte 0
  1709                              <1> ;;	is reserved for swap disk/file block 0 as descriptor block
  1710                              <1> ;;	(also for compatibility with PTE). If bit value is ZERO,
  1711                              <1> ;;	it means relevant (respective) block is in use, and, 
  1712                              <1> ;;	of course, if bit value is 1, it means relevant (respective)
  1713                              <1> ;;      swap disk/file block is free.
  1714                              <1> ;;	For example: bit 1 of the byte 128 repsesents block 1025 
  1715                              <1> ;;	(128*8+1) or sector (offset) 8200 on the swap disk or
  1716                              <1> ;;	byte (offset/position) 4198400 in the swap file. 
  1717                              <1> ;;	4GB swap space is represented via 128KB Swap Allocation Table.
  1718                              <1> ;;	Initial layout of Swap Allocation Table is as follows:
  1719                              <1> ;;	------------------------------------------------------------
  1720                              <1> ;;	0111111111111111111111111 .... 11111111111111111111111111111
  1721                              <1> ;;	------------------------------------------------------------
  1722                              <1> ;;	(0 is reserved block, 1s represent free blocks respectively.)
  1723                              <1> ;;	(Note: Allocation cell/unit of the table is bit, not byte)
  1724                              <1> ;;
  1725                              <1> ;;	..............................................................
  1726                              <1> ;;
  1727                              <1> ;;	'swap_out' procedure checks 'free_swap_blocks' count at first,
  1728                              <1> ;;	then it searches Swap Allocation Table if free count is not
  1729                              <1> ;;	zero. From begining the [swpd_next] dword value, the first bit 
  1730                              <1> ;;	position with value of 1 on the table is converted to swap
  1731                              <1> ;;	disk/file offset address, in sectors (not 4096 bytes block).
  1732                              <1> ;;	'ldrv_write' procedure is called with ldrv (logical drive
  1733                              <1> ;;	number of physical swap disk or virtual swap disk)
  1734                              <1> ;;	number, sector offset (not absolute sector -LBA- number),
  1735                              <1> ;;	and sector count (8, 512*8 = 4096) and buffer adress
  1736                              <1> ;;	(memory page). That will be a direct disk write procedure.
  1737                              <1> ;;	(for preventing late memory allocation, significant waiting). 
  1738                              <1> ;;	If disk write procedure returns with error or free count of 
  1739                              <1> ;;	swap blocks is ZERO, 'swap_out' procedure will return with
  1740                              <1> ;;	'insufficient memory error' (cf=1). 
  1741                              <1> ;;
  1742                              <1> ;;	(Note: Even if free swap disk/file blocks was not zero,
  1743                              <1> ;;	any disk write error will not be fixed by 'swap_out' procedure,
  1744                              <1> ;;	in other words, 'swap_out' will not check the table for other
  1745                              <1> ;;	free blocks after a disk write error. It will return to 
  1746                              <1> ;;	the caller with error (CF=1) which means swapping is failed. 
  1747                              <1> ;;
  1748                              <1> ;;	After writing the page on to swap disk/file address/sector,
  1749                              <1> ;;	'swap_out' procesure returns with that swap (offset) sector
  1750                              <1> ;;	address (cf=0). 
  1751                              <1> ;;
  1752                              <1> ;;	..............................................................
  1753                              <1> ;;
  1754                              <1> ;;	'swap_in' procedure loads addressed (relevant) swap disk or
  1755                              <1> ;;	file sectors at specified memory page. Then page allocation
  1756                              <1> ;;	procedure updates relevant page table entry with 'present' 
  1757                              <1> ;;	attribute. If swap disk or file reading fails there is nothing
  1758                              <1> ;;	to do, except to terminate the process which is the owner of
  1759                              <1> ;;	the swapped page.
  1760                              <1> ;;
  1761                              <1> ;;	'swap_in' procedure sets the relevant/respective bit value
  1762                              <1> ;;	in the Swap Allocation Table (as free block). 'swap_in' also
  1763                              <1> ;;	updates [swpd_first] pointer if it is required.
  1764                              <1> ;;
  1765                              <1> ;;	..............................................................	 
  1766                              <1> ;;
  1767                              <1> ;;	Note: If [swap_enabled] value is ZERO, that means there is not
  1768                              <1> ;;	a swap disk or swap file in use... 'swap_in' and 'swap_out'
  1769                              <1> ;;	procedures ans 'swap page que' procedures will not be active...
  1770                              <1> ;;	'Insufficient memory' error will be returned by 'swap_out'
  1771                              <1> ;;	and 'general protection fault' will be returned by 'swap_in'
  1772                              <1> ;;	procedure, if it is called mistakenly (a wrong value in a PTE).		
  1773                              <1> ;;
  1774                              <1> 
  1775                              <1> ; 17/04/2021
  1776                              <1> ; ('swap_in' procedure call is disabled as temporary)
  1777                              <1> 
  1778                              <1> swap_in:
  1779                              <1> 	; 31/08/2015
  1780                              <1> 	; 20/07/2015
  1781                              <1> 	; 28/04/2015
  1782                              <1> 	; 18/04/2015
  1783                              <1> 	; 24/10/2014 (Retro UNIX 386 v1 - beginning)
  1784                              <1> 	;
  1785                              <1> 	; INPUT -> 
  1786                              <1> 	;	EBX = PHYSICAL (real/flat) ADDRESS OF THE MEMORY PAGE
  1787                              <1> 	;	EBP = VIRTUAL (LINEAR) ADDRESS (page fault address)
  1788                              <1> 	;	EAX = Offset Address for the swapped page on the
  1789                              <1> 	;	      swap disk or in the swap file.
  1790                              <1> 	;
  1791                              <1> 	; OUTPUT ->
  1792                              <1> 	;	EAX = 0 if loading at memory has been successful
  1793                              <1> 	;
  1794                              <1> 	;	CF = 1 -> swap disk reading error (disk/file not present
  1795                              <1> 	;		  or sector not present or drive not ready
  1796                              <1> 	;	     EAX = Error code
  1797                              <1> 	;	     [u.error] = EAX 
  1798                              <1> 	;		       = The last error code for the process
  1799                              <1> 	;		         (will be reset after returning to user)	  
  1800                              <1> 	;
  1801                              <1> 	; Modified Registers -> EAX
  1802                              <1> 	;
  1803                              <1> 
  1804                              <1> ;       cmp     dword [swp_drv], 0
  1805                              <1> ;	jna	short swpin_dnp_err
  1806                              <1> ;
  1807                              <1> ;	cmp	eax, [swpd_size]
  1808                              <1> ;	jnb	short swpin_snp_err
  1809                              <1> ;
  1810                              <1> ;	push	esi
  1811                              <1> ;	push	ebx
  1812                              <1> ;	push	ecx
  1813                              <1> ;	mov	esi, [swp_drv]	
  1814                              <1> ;	mov	ecx, PAGE_SIZE / LOGIC_SECT_SIZE  ; 8 !
  1815                              <1> ;		; Note: Even if corresponding physical disk's sector 
  1816                              <1> ;		; size different than 512 bytes, logical disk sector
  1817                              <1> ;		; size is 512 bytes and disk reading procedure
  1818                              <1> ;		; will be performed for reading 4096 bytes
  1819                              <1> ;		; (2*2048, 8*512). 
  1820                              <1> ;	; ESI = Logical disk description table address
  1821                              <1> ;	; EBX = Memory page (buffer) address (physical!)
  1822                              <1> ;	; EAX = Sector adress (offset address, logical sector number)
  1823                              <1> ;	; ECX = Sector count ; 8 sectors
  1824                              <1> ;	push	eax
  1825                              <1> ;	call	logical_disk_read
  1826                              <1> ;	pop	eax
  1827                              <1> ;	jnc	short swpin_read_ok
  1828                              <1> ;	;
  1829                              <1> ;	mov	eax, SWP_DISK_READ_ERR ; drive not ready or read error
  1830                              <1> ;	mov	[u.error], eax
  1831                              <1> ;	jmp	short swpin_retn
  1832                              <1> ;	;
  1833                              <1> ;swpin_read_ok:
  1834                              <1> ;	; EAX = Offset address (logical sector number)
  1835                              <1> ;	call	unlink_swap_block  ; Deallocate swap block	
  1836                              <1> ;	;
  1837                              <1> ;	; EBX = Memory page (buffer) address (physical!)
  1838                              <1> ;	; 20/07/2015
  1839                              <1> ;	mov	ebx, ebp ; virtual address (page fault address)
  1840                              <1> ;       and     bx, ~PAGE_OFF ; ~0FFFh ; reset bits, 0 to 11
  1841                              <1> ;	mov	bl, [u.uno] ; current process number
  1842                              <1> ;	; EBX = Virtual (Linear) address & process number combination
  1843                              <1> ;	call	swap_queue_shift
  1844                              <1> ;	; eax = 0 ; 10/06/2016 (if ebx input > 0, eax output = 0)
  1845                              <1> ;	;sub	eax, eax  ; 0 ; Error Code = 0  (no error)
  1846                              <1> ;	; zf = 1
  1847                              <1> ;swpin_retn:
  1848                              <1> ;	pop	ecx
  1849                              <1> ;	pop	ebx
  1850                              <1> ;	pop	esi
  1851                              <1> ;	retn
  1852                              <1> ;
  1853                              <1> ;swpin_dnp_err:
  1854                              <1> ;	mov	eax, SWP_DISK_NOT_PRESENT_ERR
  1855                              <1> ;swpin_err_retn:
  1856                              <1> ;	mov	[u.error], eax
  1857                              <1> ;	stc
  1858                              <1> ;	retn
  1859                              <1> ;
  1860                              <1> ;swpin_snp_err:
  1861                              <1> ;	mov	eax, SWP_SECTOR_NOT_PRESENT_ERR
  1862                              <1> ;	jmp	short swpin_err_retn
  1863                              <1> 
  1864                              <1> ; 17/04/2021
  1865                              <1> ; ('swap_out' procedure call is disabled as temporary)
  1866                              <1> 
  1867                              <1> swap_out:
  1868                              <1> 	; 10/06/2016
  1869                              <1> 	; 07/06/2016
  1870                              <1>         ; 23/05/2016
  1871                              <1> 	; 19/05/2016 - TRDOS 386 (TRDOS v2.0)
  1872                              <1> 	; 24/10/2014 - 31/08/2015 (Retro UNIX 386 v1)
  1873                              <1> 	;
  1874                              <1> 	; INPUT -> 
  1875                              <1> 	;	none
  1876                              <1> 	;
  1877                              <1> 	; OUTPUT ->
  1878                              <1> 	;	EAX = Physical page address (which is swapped out
  1879                              <1> 	;	      for allocating a new page)
  1880                              <1> 	;	CF = 1 -> swap disk writing error (disk/file not present
  1881                              <1> 	;		  or sector not present or drive not ready
  1882                              <1> 	;	     EAX = Error code
  1883                              <1> 	;	     [u.error] = EAX 
  1884                              <1> 	;		       = The last error code for the process
  1885                              <1> 	;		         (will be reset after returning to user)	  
  1886                              <1> 	;
  1887                              <1> 	; Modified Registers -> none (except EAX)
  1888                              <1> 	;
  1889                              <1> 
  1890                              <1> ;	cmp 	word [swpq_count], 1
  1891                              <1> ;       jc      swpout_im_err ; 'insufficient memory'
  1892                              <1> ;
  1893                              <1> ;       ;cmp    dword [swp_drv], 1
  1894                              <1> ;	;jc	short swpout_dnp_err ; 'swap disk/file not present'
  1895                              <1> ;
  1896                              <1> ;       cmp     dword [swpd_free], 1
  1897                              <1> ;       jc      swpout_nfspc_err ; 'no free space on swap disk'
  1898                              <1> ;
  1899                              <1> ;	push	ebx ; *
  1900                              <1> ;swpout_1:
  1901                              <1> ;	; 10/06/2016
  1902                              <1> ;	xor	ebx, ebx ; shift the queue and return a PTE value
  1903                              <1> ;	call	swap_queue_shift
  1904                              <1> ;	and	eax, eax	; 0 = empty queue (improper entries)
  1905                              <1> ;       jz      swpout_npts_err        ; There is not any proper PTE
  1906                              <1> ;				       ; pointer in the swap queue
  1907                              <1> ;	; EAX = PTE value of the page
  1908                              <1> ;	; EBX = PTE address of the page
  1909                              <1> ;	and	ax, PTE_A_CLEAR ; 0F000h ; clear attribute bits
  1910                              <1> ;	;
  1911                              <1> ;	; 07/06/2016
  1912                              <1> ;	; 19/05/2016
  1913                              <1> ;	; check this page is in timer events or not
  1914                              <1> ;	
  1915                              <1> ;swpout_timer_page_0:
  1916                              <1> ;	push	edx ; **
  1917                              <1> ;
  1918                              <1> ;	; 07/06/2016
  1919                              <1> ;	cmp	byte [timer_events], 0 
  1920                              <1> ;	jna	short swpout_2
  1921                              <1> ;	;
  1922                              <1> ;	mov	dl, [timer_events]
  1923                              <1> ;
  1924                              <1> ;	push	ecx ; ***
  1925                              <1> ;	push	ebx ; ****
  1926                              <1> ;	mov	ebx, timer_set ; beginning address of timer event
  1927                              <1> ;			       ; structures 
  1928                              <1> ;swpout_timer_page_1:
  1929                              <1> ;	mov	cl, [ebx]
  1930                              <1> ;	or	cl, cl ; 0 = free, >0 = process number
  1931                              <1> ;	jz	short swpout_timer_page_3
  1932                              <1> ;	mov	ecx, [ebx+12] ; response (signal return) address
  1933                              <1> ;	and	cx, PTE_A_CLEAR ; clear offset part (right 12 bits)
  1934                              <1> ;				; of the response byte address, to
  1935                              <1> ;				; get beginning of the page address)
  1936                              <1> ;	cmp	eax, ecx
  1937                              <1> ;	jne	short swpout_timer_page_2 ; not same page
  1938                              <1> ;	
  1939                              <1> ;	; !same page!
  1940                              <1> ;	;
  1941                              <1> ;	; NOTE: // 19/05/2016 // - TRDOS 386 feature only ! -
  1942                              <1> ;	; This page will be used by the kernel to put timer event
  1943                              <1> ;	; response (signal return) byte at the requested address;
  1944                              <1> ;	; in order to prevent a possible wrong write (while
  1945                              <1> ;	; this page is swapped out) on physical memory,
  1946                              <1> ;	; we must protect this page against to be swapped out!
  1947                              <1> ;	;
  1948                              <1> ;	pop	ebx ; ****
  1949                              <1> ;	pop	ecx ; ***
  1950                              <1> ;	pop	edx ; **
  1951                              <1> ;	jmp	short swpout_1	; do not swap out this page !
  1952                              <1> ; 
  1953                              <1> ;swpout_timer_page_2:
  1954                              <1> ;	; 07/06/2016
  1955                              <1> ;	dec	dl
  1956                              <1> ;	jz	short swpout_timer_page_4
  1957                              <1> ;swpout_timer_page_3:
  1958                              <1> ;	;cmp	ebx, timer_set + 240 ; last timer event (15*16) 
  1959                              <1> ;	;jnb	short swpout_timer_page_4
  1960                              <1> ;	add	ebx, 16
  1961                              <1> ;	jmp	short swpout_timer_page_1	
  1962                              <1> ;
  1963                              <1> ;swpout_timer_page_4:
  1964                              <1> ;	pop	ebx ; ****
  1965                              <1> ;	pop	ecx ; ***
  1966                              <1> ;swpout_2:
  1967                              <1> ;	mov	edx, ebx	       ; Page table entry address	
  1968                              <1> ;	mov	ebx, eax	       ; Buffer (Page) Address				
  1969                              <1> ;	;
  1970                              <1> ;	call	link_swap_block
  1971                              <1> ;	jnc	short swpout_3	       ; It may not be needed here	
  1972                              <1> ;				       ; because [swpd_free] value
  1973                              <1> ;				       ; was checked at the beginging. 	
  1974                              <1> ;	pop	edx ; **
  1975                              <1> ;	pop	ebx ; *
  1976                              <1> ;	jmp	short swpout_nfspc_err 
  1977                              <1> ;swpout_3:
  1978                              <1> ;	test	eax, 80000000h ; test bit 31 (this may not be needed!)
  1979                              <1> ;	jnz	short swpout_nfspc_err  ; 10/06/2016 (bit 31 = 1 !)
  1980                              <1> ;	;	
  1981                              <1> ;	push	esi ; **
  1982                              <1> ;	push	ecx ; ***
  1983                              <1> ;	push	eax ; sector address ; (31 bit !, bit 31 = 0)
  1984                              <1> ;	mov	esi, [swp_drv]	
  1985                              <1> ;	mov	ecx, PAGE_SIZE / LOGIC_SECT_SIZE  ; 8 !
  1986                              <1> ;		; Note: Even if corresponding physical disk's sector 
  1987                              <1> ;		; size different than 512 bytes, logical disk sector
  1988                              <1> ;		; size is 512 bytes and disk writing procedure
  1989                              <1> ;		; will be performed for writing 4096 bytes
  1990                              <1> ;		; (2*2048, 8*512). 
  1991                              <1> ;	; ESI = Logical disk description table address
  1992                              <1> ;	; EBX = Buffer (Page) address
  1993                              <1> ;	; EAX = Sector adress (offset address, logical sector number)
  1994                              <1> ;	; ECX = Sector count ; 8 sectors
  1995                              <1> ;	; edx = PTE address
  1996                              <1> ;	call	logical_disk_write
  1997                              <1> ;	; edx = PTE address
  1998                              <1> ;	pop	ecx ; sector address	
  1999                              <1> ;	jnc	short swpout_write_ok
  2000                              <1> ;	;
  2001                              <1> ;	;; call	unlink_swap_block ; this block must be left as 'in use'
  2002                              <1> ;swpout_dw_err:
  2003                              <1> ;	mov	eax, SWP_DISK_WRITE_ERR ; drive not ready or write error
  2004                              <1> ;	mov	[u.error], eax
  2005                              <1> ;	jmp	short swpout_retn
  2006                              <1> ;	;
  2007                              <1> ;swpout_write_ok:
  2008                              <1> ;	; EBX = Buffer (page) address
  2009                              <1> ;	; EDX = Page Table Entry address
  2010                              <1> ;	; ECX = Swap disk sector (file block) address (31 bit)
  2011                              <1> ;	shl 	ecx, 1  ; 31 bit sector address from bit 1 to bit 31 
  2012                              <1> ;	mov 	[edx], ecx 
  2013                              <1> ;		; bit 0 = 0 (swapped page)
  2014                              <1> ;	mov	eax, ebx
  2015                              <1> ;swpout_retn:
  2016                              <1> ;	pop	ecx ; ***
  2017                              <1> ;	pop	esi ; **
  2018                              <1> ;	pop	ebx ; *
  2019                              <1> ;	retn
  2020                              <1> ;
  2021                              <1> ;;swpout_dnp_err:
  2022                              <1> ;;	mov	eax, SWP_DISK_NOT_PRESENT_ERR ; disk not present
  2023                              <1> ;;	jmp	short swpout_err_retn
  2024                              <1> ;swpout_nfspc_err:
  2025                              <1> ;	mov	eax, SWP_NO_FREE_SPACE_ERR ; no free space
  2026                              <1> ;swpout_err_retn:
  2027                              <1> ;	mov	[u.error], eax
  2028                              <1> ;	;stc
  2029                              <1> ;	retn
  2030                              <1> ;swpout_npts_err:
  2031                              <1> ;	mov	eax, SWP_NO_PAGE_TO_SWAP_ERR
  2032                              <1> ;	pop	ebx
  2033                              <1> ;	jmp	short swpout_err_retn
  2034                              <1> ;swpout_im_err:
  2035                              <1> ;	mov	eax, ERR_MINOR_IM ; insufficient (out of) memory
  2036                              <1> ;	jmp	short swpout_err_retn
  2037                              <1> 
  2038                              <1> ; 17/04/2021
  2039                              <1> ; ('swap_queue_shift' procedure call is disabled as temporary)
  2040                              <1> 
  2041                              <1> swap_queue_shift:
  2042                              <1> 	; 26/03/2017
  2043                              <1> 	; 10/06/2016
  2044                              <1> 	; 09/06/2016 - TRDOS 386 (TRDOS v2.0)
  2045                              <1> 	; 23/10/2014 - 20/07/2015 (Retro UNIX 386 v1)
  2046                              <1> 	;
  2047                              <1> 	; INPUT ->
  2048                              <1> 	;	EBX = Virtual (linear) address (bit 12 to 31) 
  2049                              <1> 	;	      and process number combination (bit 0 to 11)
  2050                              <1> 	;	EBX = 0 -> shift/drop from the head (offset 0)
  2051                              <1> 	;	
  2052                              <1> 	; OUTPUT ->
  2053                              <1> 	;	If EBX input > 0 
  2054                              <1> 	;	   the queue will be shifted 4 bytes (dword),
  2055                              <1> 	; 	   from the tail to the head, up to entry offset
  2056                              <1> 	; 	   which points to EBX input value or nothing
  2057                              <1> 	;	   to do if EBX value is not found on the queue.
  2058                              <1> 	;	   (The entry -with EBX value- will be removed
  2059                              <1> 	;	   from the queue if it is found.)
  2060                              <1> 	;
  2061                              <1> 	;	   EAX = 0		
  2062                              <1> 	;
  2063                              <1> 	;	If EBX input = 0
  2064                              <1> 	;	   the queue will be shifted 4 bytes (dword),
  2065                              <1> 	; 	   from the tail to the head, if the PTE address
  2066                              <1> 	;	   which is pointed in head of the queue is marked
  2067                              <1> 	;	   as "accessed" or it is marked as "non present".
  2068                              <1> 	;	   (If "accessed" flag of the PTE -which is pointed
  2069                              <1> 	;	   in the head- is set -to 1-, it will be reset
  2070                              <1> 	;	   -to 0- and then, the queue will be rotated 
  2071                              <1> 	;	   -without dropping pointer of the PTE from 
  2072                              <1> 	;	   the queue- for 4 bytes on head to tail direction.
  2073                              <1> 	;	   Pointer in the head will be moved into the tail,
  2074                              <1> 	;	   other PTEs will be shifted on head direction.)
  2075                              <1> 	;
  2076                              <1> 	;	   Swap queue will be shifted up to the first
  2077                              <1> 	;	   'present' or 'non accessed' page will be found
  2078                              <1> 	;	   (as pointed) on the queue head (then it will be
  2079                              <1>         ;          removed/dropped from the queue).
  2080                              <1> 	;
  2081                              <1> 	;	   EAX (> 0) = PTE value of the page which is
  2082                              <1> 	;		 (it's pointer -virtual address-) dropped
  2083                              <1> 	;		 (removed) from swap queue.
  2084                              <1> 	;	   EBX = PTE address of the page (if EAX > 0)
  2085                              <1> 	;	         which is (it's pointer -virtual address-)
  2086                              <1> 	;		 dropped (removed) from swap queue.
  2087                              <1> 	;
  2088                              <1> 	;	   EAX = 0 -> empty swap queue ! 
  2089                              <1> 	;
  2090                              <1> 	; Modified Registers -> EAX, EBX
  2091                              <1> 	;
  2092                              <1> ;	movzx   eax, word [swpq_count]  ; Max. 1024
  2093                              <1> ;	and	ax, ax
  2094                              <1> ;	jz	short swpqs_retn
  2095                              <1> ;	push	edi
  2096                              <1> ;	push	esi
  2097                              <1> ;	push	ecx
  2098                              <1> ;	mov	esi, swap_queue
  2099                              <1> ;	mov	ecx, eax
  2100                              <1> ;	or	ebx, ebx
  2101                              <1> ;	jz	short swpqs_7
  2102                              <1> ;swpqs_1:
  2103                              <1> ;	lodsd
  2104                              <1> ;	cmp	eax, ebx
  2105                              <1> ;	je	short swpqs_2
  2106                              <1> ;	loop	swpqs_1
  2107                              <1> ;	; 10/06/2016
  2108                              <1> ;	sub	eax, eax 
  2109                              <1> ;	jmp	short swpqs_6
  2110                              <1> ;swpqs_2:
  2111                              <1> ;	mov	edi, esi
  2112                              <1> ;	sub 	edi, 4
  2113                              <1> ;swpqs_3:
  2114                              <1> ;	dec	word [swpq_count]
  2115                              <1> ;	jz	short swpqs_5
  2116                              <1> ;swpqs_4:
  2117                              <1> ;	dec 	ecx
  2118                              <1> ;	rep	movsd	; shift up (to the head)
  2119                              <1> ;swpqs_5:
  2120                              <1> ;	xor	eax, eax
  2121                              <1> ;	mov	[edi], eax
  2122                              <1> ;swpqs_6:
  2123                              <1> ;	pop	ecx
  2124                              <1> ;	pop	esi
  2125                              <1> ;	pop	edi
  2126                              <1> ;swpqs_retn:
  2127                              <1> ;	retn		
  2128                              <1> ;swpqs_7:
  2129                              <1> ;	mov	edi, esi ; head
  2130                              <1> ;	lodsd
  2131                              <1> ;	; 20/07/2015
  2132                              <1> ;	mov	ebx, eax
  2133                              <1> ;	and	ebx, ~PAGE_OFF ; ~0FFFh 
  2134                              <1> ;		      ; ebx = virtual address (at page boundary)	
  2135                              <1> ;	and	eax, PAGE_OFF ; 0FFFh
  2136                              <1> ;		      ; ax = process number (1 to 4095)
  2137                              <1> ;	cmp	al, [u.uno]
  2138                              <1> ;		; Max. 16 (nproc) processes for Retro UNIX 386 v1
  2139                              <1> ;	jne	short swpqs_8
  2140                              <1> ;	mov	eax, [u.pgdir]
  2141                              <1> ;	jmp	short swpqs_9
  2142                              <1> ;swpqs_8:
  2143                              <1> ;	; 09/06/2016
  2144                              <1> ;	cmp	byte [eax+p.stat-1], 0
  2145                              <1> ;	jna	short swpqs_3     ; free (or terminated) process
  2146                              <1> ;	cmp	byte [eax+p.stat-1], 2 ; waiting
  2147                              <1> ;	ja	short swpqs_3 	  ; zombie (3) or undefined ?	
  2148                              <1> ;
  2149                              <1> ;	;shl	ax, 2
  2150                              <1> ;	shl	al, 2
  2151                              <1> ;	mov 	eax, [eax+p.upage-4]
  2152                              <1> ;	or	eax, eax
  2153                              <1> ;	jz	short swpqs_3 ; invalid upage
  2154                              <1> ;	add	eax, u.pgdir - user
  2155                              <1> ;			 ; u.pgdir value for the process
  2156                              <1> ;			 ; is in [eax]
  2157                              <1> ;	mov	eax, [eax]
  2158                              <1> ;	and	eax, eax
  2159                              <1> ;	jz	short swpqs_3 ; invalid page directory
  2160                              <1> ;swpqs_9:
  2161                              <1> ;	push	edx
  2162                              <1> ;	; eax = page directory
  2163                              <1> ;	; ebx = virtual address
  2164                              <1> ;	call	get_pte
  2165                              <1> ;	mov	ebx, edx	; PTE address
  2166                              <1> ;	pop	edx
  2167                              <1> ;	; 10/06/2016
  2168                              <1> ;	jc	short swpqs_13 ; empty PDE
  2169                              <1> ;	; EAX = PTE value
  2170                              <1> ;	test	al, PTE_A_PRESENT ; bit 0 = 1
  2171                              <1> ;	jz	short swpqs_13  ; Drop non-present page
  2172                              <1> ;			        ; from the queue (head)
  2173                              <1> ;	test	al, PTE_A_WRITE	; bit 1 = 0 (read only)
  2174                              <1> ;	jz	short swpqs_13  ; Drop read only page
  2175                              <1> ;			        ; from the queue (head) 	
  2176                              <1> ;	;test	al, PTE_A_ACCESS ; bit 5 = 1 (Accessed)
  2177                              <1> ;	;jnz	short swpqs_11  ; present
  2178                              <1> ;			        ; accessed page
  2179                              <1> ;       btr     eax, PTE_A_ACCESS_BIT ; reset 'accessed' bit
  2180                              <1> ;	jc	short swpqs_11  ; accessed page
  2181                              <1> ;
  2182                              <1> ;	dec	ecx
  2183                              <1> ;	mov	[swpq_count], cx
  2184                              <1> ;       jz      short swpqs_10
  2185                              <1> ;		; esi = head + 4
  2186                              <1> ;		; edi = head
  2187                              <1> ;	rep	movsd	 ; n = 1 to k-1, [n - 1] = [n]
  2188                              <1> ;swpqs_10:
  2189                              <1> ;	mov	[edi], ecx ; 0
  2190                              <1> ;	jmp	short swpqs_6 ; 26/03/2017
  2191                              <1> ;
  2192                              <1> ;swpqs_11:
  2193                              <1> ;	mov	[ebx], eax     ; save changed attribute
  2194                              <1> ;	; Rotation (head -> tail)
  2195                              <1> ;	dec	ecx     ; entry count -> last entry number		
  2196                              <1> ;	jz	short swpqs_10
  2197                              <1> ;		; esi = head + 4
  2198                              <1> ;		; edi = head
  2199                              <1> ;	mov	eax, [edi] ; 20/07/2015
  2200                              <1> ;	rep	movsd	 ; n = 1 to k-1, [n - 1] = [n]
  2201                              <1> ;	mov	[edi], eax ; head -> tail ; [k] = [1]
  2202                              <1> ;
  2203                              <1> ;	mov	cx, [swpq_count]
  2204                              <1> ;
  2205                              <1> ;swpqs_12:
  2206                              <1> ;	mov	esi, swap_queue ; head
  2207                              <1> ;       jmp     swpqs_7
  2208                              <1> ;
  2209                              <1> ;swpqs_13:
  2210                              <1> ;	dec	ecx
  2211                              <1> ;	mov	[swpq_count], cx
  2212                              <1> ;       jz      swpqs_5
  2213                              <1> ;	jmp	short swpqs_12
  2214                              <1> 
  2215                              <1> ; 17/04/2021
  2216                              <1> ; ('add_to_swp_queue' procedure call is disabled as temporary)
  2217                              <1> 
  2218                              <1> add_to_swap_queue:
  2219                              <1> 	; 20/02/2017
  2220                              <1> 	; 20/07/2015
  2221                              <1> 	; 24/10/2014 (Retro UNIX 386 v1 - beginning)
  2222                              <1> 	;
  2223                              <1> 	; Adds new page to swap queue
  2224                              <1> 	; (page directories and page tables must not be added
  2225                              <1> 	; to swap queue)	
  2226                              <1> 	;
  2227                              <1> 	; INPUT ->
  2228                              <1> 	;	EBX = Linear (Virtual) addr for current process
  2229                              <1> 	;	[u.uno]
  2230                              <1> 	;	20/02/2017
  2231                              <1> 	;	(Linear address = CORE + user's virtual address)
  2232                              <1> 	;
  2233                              <1> 	; OUTPUT ->
  2234                              <1> 	;	EAX = [swpq_count]
  2235                              <1> 	;	      (after the PTE has been added)
  2236                              <1> 	;	EAX = 0 -> Swap queue is full, (1024 entries)
  2237                              <1> 	;	      the PTE could not be added.
  2238                              <1> 	;
  2239                              <1> 	; Modified Registers -> EAX
  2240                              <1> 	;
  2241                              <1> ;	push	ebx
  2242                              <1> ;       and     bx, ~PAGE_OFF ; ~0FFFh ; reset bits, 0 to 11
  2243                              <1> ;	mov	bl, [u.uno] ; current process number
  2244                              <1> ;	call	swap_queue_shift ; drop from the queue if
  2245                              <1> ;				 ; it is already on the queue
  2246                              <1> ;		; then add it to the tail of the queue
  2247                              <1> ;	movzx	eax, word [swpq_count]
  2248                              <1> ;	cmp	ax, 1024
  2249                              <1> ;	jb	short atsq_1
  2250                              <1> ;	sub	ax, ax
  2251                              <1> ;	pop	ebx
  2252                              <1> ;	retn
  2253                              <1> ;atsq_1:
  2254                              <1> ;	push	esi
  2255                              <1> ;	mov	esi, swap_queue
  2256                              <1> ;	and	ax, ax
  2257                              <1> ;	jz	short atsq_2
  2258                              <1> ;	shl	ax, 2	; convert to offset
  2259                              <1> ;	add	esi, eax
  2260                              <1> ;	shr	ax, 2
  2261                              <1> ;atsq_2:
  2262                              <1> ;	inc	ax
  2263                              <1> ;	mov	[esi], ebx ; Virtual address + [u.uno] combination
  2264                              <1> ;	mov	[swpq_count], ax
  2265                              <1> ;	pop	esi
  2266                              <1> ;	pop	ebx
  2267                              <1> ;	retn
  2268                              <1> 
  2269                              <1> ; 17/04/2021
  2270                              <1> ; ('unlink_swap_block' procedure call is disabled as temporary)
  2271                              <1> 
  2272                              <1> unlink_swap_block:
  2273                              <1> 	; 15/09/2015
  2274                              <1> 	; 30/04/2015
  2275                              <1> 	; 18/04/2015
  2276                              <1> 	; 24/10/2014 (Retro UNIX 386 v1 - beginning)
  2277                              <1> 	;
  2278                              <1> 	; INPUT -> 
  2279                              <1> 	;	EAX = swap disk/file offset address
  2280                              <1> 	;	      (bit 1 to bit 31)
  2281                              <1> 	; OUTPUT ->
  2282                              <1> 	;	[swpd_free] is increased
  2283                              <1> 	;	(corresponding SWAP DISK ALLOC. TABLE bit is SET)
  2284                              <1> 	;
  2285                              <1> 	; Modified Registers -> EAX
  2286                              <1> 	;
  2287                              <1> ;	push	ebx
  2288                              <1> ;	push	edx
  2289                              <1> ;	;
  2290                              <1> ;	shr	eax, SECTOR_SHIFT+1  ;3+1 ; shift sector address to 
  2291                              <1> ;				     ; 3 bits right
  2292                              <1> ;				     ; to get swap block/page number
  2293                              <1> ;	mov	edx, eax
  2294                              <1> ;	; 15/09/2015
  2295                              <1> ;	shr	edx, 3		     ; to get offset to S.A.T.
  2296                              <1> ;				     ; (1 allocation bit = 1 page)
  2297                              <1> ;				     ; (1 allocation bytes = 8 pages)
  2298                              <1> ;	and	dl, 0FCh 	     ; clear lower 2 bits
  2299                              <1> ;				     ; (to get 32 bit position)			
  2300                              <1> ;	;
  2301                              <1> ;	mov	ebx, swap_alloc_table ; Swap Allocation Table address
  2302                              <1> ;	add	ebx, edx
  2303                              <1> ;	and	eax, 1Fh	     ; lower 5 bits only
  2304                              <1> ;				     ; (allocation bit position)	 
  2305                              <1> ;	cmp 	eax, [swpd_next]     ; is the new free block addr. lower
  2306                              <1> ;				     ; than the address in 'swpd_next' ?
  2307                              <1> ;				     ; (next/first free block value)		
  2308                              <1> ;	jnb	short uswpbl_1	     ; no	
  2309                              <1> ;	mov	[swpd_next], eax     ; yes	
  2310                              <1> ;uswpbl_1:
  2311                              <1> ;	bts	[ebx], eax	     ; unlink/release/deallocate block
  2312                              <1> ;				     ; set relevant bit to 1.
  2313                              <1> ;				     ; set CF to the previous bit value	
  2314                              <1> ;	cmc			     ; complement carry flag	
  2315                              <1> ;	jc	short uswpbl_2	     ; do not increase swfd_free count
  2316                              <1> ;				     ; if the block is already deallocated
  2317                              <1> ;				     ; before.	
  2318                              <1> ;       inc     dword [swpd_free]
  2319                              <1> ;uswpbl_2:
  2320                              <1> ;	pop	edx
  2321                              <1> ;	pop	ebx
  2322                              <1> ;	retn
  2323                              <1> 
  2324                              <1> ; 17/04/2021
  2325                              <1> ; ('ink_swap_block' procedure call is disabled as temporary)
  2326                              <1> 
  2327                              <1> link_swap_block:
  2328                              <1> 	; 01/07/2015
  2329                              <1> 	; 18/04/2015
  2330                              <1> 	; 24/10/2014 (Retro UNIX 386 v1 - beginning)
  2331                              <1> 	;
  2332                              <1> 	; INPUT -> none
  2333                              <1> 	;
  2334                              <1> 	; OUTPUT ->
  2335                              <1> 	;	EAX = OFFSET ADDRESS OF THE ALLOCATED BLOCK (4096 bytes)
  2336                              <1> 	;	      in sectors (corresponding 
  2337                              <1> 	;	      SWAP DISK ALLOCATION TABLE bit is RESET)
  2338                              <1> 	;
  2339                              <1> 	;	CF = 1 and EAX = 0 
  2340                              <1> 	; 		   if there is not a free block to be allocated	
  2341                              <1> 	;
  2342                              <1> 	; Modified Registers -> none (except EAX)
  2343                              <1> 	;
  2344                              <1> 
  2345                              <1> ;	;mov	eax, [swpd_free]
  2346                              <1> ;	;and	eax, eax
  2347                              <1> ;	;jz	short out_of_swpspc
  2348                              <1> ;	;
  2349                              <1> ;	push	ebx
  2350                              <1> ;	push	ecx
  2351                              <1> ;	;
  2352                              <1> ;	mov	ebx, swap_alloc_table ; Swap Allocation Table offset
  2353                              <1> ;	mov	ecx, ebx
  2354                              <1> ;	add	ebx, [swpd_next] ; Free block searching starts from here
  2355                              <1> ;				 ; next_free_swap_block >> 5
  2356                              <1> ;	add	ecx, [swpd_last] ; Free block searching ends here
  2357                              <1> ;				 ; (total_swap_blocks - 1) >> 5
  2358                              <1> ;lswbl_scan:
  2359                              <1> ;	cmp	ebx, ecx
  2360                              <1> ;	ja	short lswbl_notfound
  2361                              <1> ;	;
  2362                              <1> ;	bsf	eax, [ebx] ; Scans source operand for first bit set (1).
  2363                              <1> ;			   ; Clears ZF if a bit is found set (1) and 
  2364                              <1> ;			   ; loads the destination with an index to
  2365                              <1> ;			   ; first set bit. (0 -> 31) 
  2366                              <1> ;			   ; Sets ZF to 1 if no bits are found set.
  2367                              <1> ;	; 01/07/2015
  2368                              <1> ;	jnz	short lswbl_found ; ZF = 0 -> a free block has been found
  2369                              <1> ;			 ;
  2370                              <1> ;			 ; NOTE:  a Swap Disk Allocation Table bit 
  2371                              <1> ;			 ;	  with value of 1 means 
  2372                              <1> ;			 ;	  the corresponding page is free 
  2373                              <1> ;			 ;	  (Retro UNIX 386 v1 feaure only!)
  2374                              <1> ;	add	ebx, 4
  2375                              <1> ;			 ; We return back for searching next page block
  2376                              <1> ;			 ; NOTE: [swpd_free] is not ZERO; so, 
  2377                              <1> ;			 ;	 we always will find at least 1 free block here.
  2378                              <1> ;	jmp    	short lswbl_scan
  2379                              <1> ;	;
  2380                              <1> ;lswbl_notfound:	
  2381                              <1> ;	sub	ecx, swap_alloc_table
  2382                              <1> ;	mov	[swpd_next], ecx ; next/first free page = last page 
  2383                              <1> ;				 ; (unlink_swap_block procedure will change it)
  2384                              <1> ;	xor	eax, eax
  2385                              <1> ;	mov	[swpd_free], eax
  2386                              <1> ;	stc
  2387                              <1> ;lswbl_ok:
  2388                              <1> ;	pop	ecx
  2389                              <1> ;	pop	ebx
  2390                              <1> ;	retn
  2391                              <1> ;	;
  2392                              <1> ;;out_of_swpspc:
  2393                              <1> ;;	stc
  2394                              <1> ;;	retn
  2395                              <1> ;
  2396                              <1> ;lswbl_found:
  2397                              <1> ;	mov	ecx, ebx
  2398                              <1> ;	sub	ecx, swap_alloc_table
  2399                              <1> ;	mov	[swpd_next], ecx ; Set first free block searching start
  2400                              <1> ;				 ; address/offset (to the next)
  2401                              <1> ;       dec     dword [swpd_free] ; 1 block has been allocated (X = X-1) 
  2402                              <1> ;	;
  2403                              <1> ;	btr	[ebx], eax	 ; The destination bit indexed by the source value
  2404                              <1> ;				 ; is copied into the Carry Flag and then cleared
  2405                              <1> ;				 ; in the destination.
  2406                              <1> ;				 ;
  2407                              <1> ;				 ; Reset the bit which is corresponding to the 
  2408                              <1> ;				 ; (just) allocated block.
  2409                              <1> ;	shl	ecx, 5		 ; (block offset * 32) + block index
  2410                              <1> ;	add	eax, ecx	 ; = block number
  2411                              <1> ;	shl	eax, SECTOR_SHIFT ; 3, sector (offset) address of the block
  2412                              <1> ;				 ; 1 block =  8 sectors
  2413                              <1> ;	;
  2414                              <1> ;	; EAX = offset address of swap disk/file sector (beginning of the block)
  2415                              <1> ;	;
  2416                              <1> ;	; NOTE: The relevant page table entry will be updated
  2417                              <1> ;	;       according to this EAX value...
  2418                              <1> ;	;
  2419                              <1> ;	jmp	short lswbl_ok
  2420                              <1> 
  2421                              <1> ; 17/04/2021
  2422                              <1> ; ('logical_disk_read' procedure call is disabled as temporary)
  2423                              <1> 
  2424                              <1> logical_disk_read:
  2425                              <1> 	; 20/07/2015
  2426                              <1> 	; 09/03/2015 (temporary code here)
  2427                              <1> 	;
  2428                              <1> 	; INPUT ->
  2429                              <1> 	; 	ESI = Logical disk description table address
  2430                              <1> 	; 	EBX = Memory page (buffer) address (physical!)
  2431                              <1> 	; 	EAX = Sector adress (offset address, logical sector number)
  2432                              <1> 	; 	ECX = Sector count
  2433                              <1> 	;
  2434                              <1> 	;
  2435                              <1> ;	retn
  2436                              <1> 
  2437                              <1> ; 17/04/2021
  2438                              <1> ; ('logical_disk_write' procedure call is disabled as temporary)
  2439                              <1> 
  2440                              <1> logical_disk_write:
  2441                              <1> 	; 20/07/2015
  2442                              <1> 	; 09/03/2015 (temporary code here)
  2443                              <1> 	;
  2444                              <1> 	; INPUT ->
  2445                              <1> 	; 	ESI = Logical disk description table address
  2446                              <1> 	; 	EBX = Memory page (buffer) address (physical!)
  2447                              <1> 	; 	EAX = Sector adress (offset address, logical sector number)
  2448                              <1> 	; 	ECX = Sector count
  2449                              <1> 	;
  2450                              <1> ;	retn
  2451                              <1> 
  2452                              <1> get_physical_addr:
  2453                              <1> 	; 17/04/2021 - TRDOS 386 v2.0.4
  2454                              <1> 	;	(temporary modifications)
  2455                              <1> 	;
  2456                              <1> 	; 26/03/2017
  2457                              <1> 	; 20/02/2017
  2458                              <1> 	; 27/05/2016 - TRDOS 386 (TRDOS v2.0)
  2459                              <1> 	; 18/10/2015
  2460                              <1> 	; 29/07/2015
  2461                              <1> 	; 20/07/2015
  2462                              <1> 	; 04/06/2015
  2463                              <1> 	; 20/05/2015
  2464                              <1> 	; 28/04/2015
  2465                              <1> 	; 18/04/2015
  2466                              <1> 	; Get physical address
  2467                              <1> 	;     (allocates a new page for user if it is not present)
  2468                              <1> 	;	
  2469                              <1> 	; (This subroutine is needed for mapping user's virtual 
  2470                              <1> 	; (buffer) address to physical address (of the buffer).)
  2471                              <1> 	; ('sys write', 'sys read' system calls...)
  2472                              <1> 	;
  2473                              <1> 	; INPUT ->
  2474                              <1> 	;	EBX = virtual address
  2475                              <1> 	;	u.pgdir = page directory (physical) address
  2476                              <1> 	;
  2477                              <1> 	; OUTPUT ->
  2478                              <1> 	;	EAX = physical address 
  2479                              <1> 	;	EBX = linear address	
  2480                              <1> 	;	EDX = physical address of the page frame
  2481                              <1> 	;	      (with attribute bits)
  2482                              <1> 	;	ECX = byte count within the page frame
  2483                              <1> 	;
  2484                              <1> 	; Modified Registers -> EAX, EBX, ECX, EDX
  2485                              <1> 	;
  2486 00005B96 81C300004000        <1> 	add	ebx, CORE ; 18/10/2015
  2487                              <1> get_physical_addr_x: ; 27/05/2016
  2488 00005B9C A1[78900100]        <1> 	mov	eax, [u.pgdir]
  2489 00005BA1 E824FDFFFF          <1> 	call	get_pte
  2490                              <1> 		; EDX = Page table entry address (if CF=0)
  2491                              <1> 	        ;       Page directory entry address (if CF=1)
  2492                              <1> 		;       (Bit 0 value is 0 if PT is not present)
  2493                              <1> 		; EAX = Page table entry value (page address)
  2494                              <1> 		;	CF = 1 -> PDE not present or invalid ? 
  2495 00005BA6 731C                <1> 	jnc	short gpa_1
  2496                              <1> 	;
  2497 00005BA8 E80BFCFFFF          <1> 	call	allocate_page
  2498 00005BAD 723F                <1> 	jc	short gpa_im_err  ; 'insufficient memory' error
  2499                              <1> gpa_0:
  2500 00005BAF E875FCFFFF          <1> 	call 	clear_page
  2501                              <1> 	; EAX = Physical (base) address of the allocated (new) page
  2502 00005BB4 0C07                <1> 	or	al, PDE_A_PRESENT + PDE_A_WRITE + PDE_A_USER ; 4+2+1 = 7
  2503                              <1> 			   ; lower 3 bits are used as U/S, R/W, P flags
  2504                              <1> 			   ; (user, writable, present page)	
  2505 00005BB6 8902                <1> 	mov	[edx], eax ; Let's put the new page directory entry here !
  2506 00005BB8 A1[78900100]        <1> 	mov	eax, [u.pgdir]	
  2507 00005BBD E808FDFFFF          <1> 	call	get_pte
  2508 00005BC2 722A                <1> 	jc	short gpa_im_err ; 'insufficient memory' error
  2509                              <1> gpa_1:
  2510                              <1> 	; EAX = PTE value, EDX = PTE address
  2511 00005BC4 A801                <1> 	test 	al, PTE_A_PRESENT
  2512 00005BC6 7516                <1> 	jnz	short gpa_3 ; 26/03/2017
  2513 00005BC8 09C0                <1> 	or	eax, eax
  2514 00005BCA 7446                <1> 	jz	short gpa_7  ; Allocate a new page
  2515                              <1> 
  2516                              <1> ; 17/04/2021 (TRDOS 386 v2.0.4)
  2517                              <1> ; ('reload_page' procedure call is disabled as temporary)
  2518 00005BCC EB20                <1> 	jmp	short gpa_im_err  ; temporary !
  2519                              <1> 
  2520                              <1> 	; 20/07/2015
  2521                              <1> ;	push	ebp
  2522                              <1> ;	mov	ebp, ebx ; virtual (linear) address
  2523                              <1> ;	; reload swapped page
  2524                              <1> ;	call	reload_page ; 28/04/2015
  2525                              <1> ;	pop	ebp
  2526                              <1> ;	jc	short gpa_retn
  2527                              <1> gpa_2:
  2528                              <1> 	; 26/03/2017
  2529                              <1> 	; 20/02/2017
  2530                              <1> 	; If a page will contain a Signal Response Byte
  2531                              <1> 	; it must not be swapped out, because
  2532                              <1> 	; timer service or irq callback service
  2533                              <1> 	; will write a signal return/response byte 
  2534                              <1> 	; directly by using physical address of Signal
  2535                              <1> 	; Response Byte.(Even if process is not running,
  2536                              <1> 	; or it is running with swapped out pages.)
  2537                              <1> 	;
  2538                              <1> 	; 'no_page_swap' will be set by 'systimer' or
  2539                              <1> 	; 'syscalbac' sistem functions/calls. (*)
  2540                              <1> 	;
  2541 00005BCE 803D[1E8A0100]00    <1> 	cmp	byte [no_page_swap], 0
  2542 00005BD5 761D                <1> 	jna	short gpa_4 ; this page can be swapped out
  2543                              <1> 	; this page must not be swapped out
  2544                              <1> 	; but 'no_page_swap' must be reset here
  2545                              <1> 	; immediately for other callers (*)
  2546                              <1> 	; (otherwise, swap queue would not be long enough) 
  2547 00005BD7 E844000000          <1> 	call	gpa_8 ; 26/03/2017
  2548 00005BDC EB16                <1> 	jmp	short gpa_5
  2549                              <1> gpa_3: 
  2550                              <1> 	; 26/03/2017
  2551 00005BDE 803D[1E8A0100]00    <1> 	cmp	byte [no_page_swap], 0
  2552 00005BE5 7611                <1> 	jna	short gpa_6 ; this page can be swapped out
  2553 00005BE7 E834000000          <1> 	call	gpa_8
  2554 00005BEC EB0A                <1> 	jmp	short gpa_6
  2555                              <1> 
  2556                              <1> gpa_im_err:	
  2557 00005BEE B804000000          <1> 	mov	eax, ERR_MINOR_IM ; Insufficient memory (minor) error!
  2558                              <1> 				  ; Major error = 0 (No protection fault)	
  2559 00005BF3 C3                  <1> 	retn
  2560                              <1> gpa_4:
  2561                              <1> ; 17/04/2021 (TRDOS 386 v2.0.4)
  2562                              <1> ; ('add_to_swap_queue' procedure call is disabled as temporary)
  2563                              <1> 
  2564                              <1> 	; 20/07/2015
  2565                              <1> 	; 20/05/2015
  2566                              <1> 	; add this page to swap queue
  2567                              <1> ;	push	eax 
  2568                              <1> ;	; EBX = Linear (CORE+virtual) address ; 20/02/2017 
  2569                              <1> ;	call 	add_to_swap_queue
  2570                              <1> ;	pop	eax
  2571                              <1> gpa_5:
  2572                              <1> 		; PTE address in EDX
  2573                              <1> 		; virtual address in EBX
  2574                              <1> 	; EAX = memory page address
  2575 00005BF4 0C07                <1> 	or	al, PTE_A_PRESENT + PTE_A_USER + PTE_A_WRITE
  2576                              <1> 				  ; present flag, bit 0 = 1
  2577                              <1> 				  ; user flag, bit 2 = 1	
  2578                              <1> 				  ; writable flag, bit 1 = 1
  2579 00005BF6 8902                <1> 	mov	[edx], eax  ; Update PTE value
  2580                              <1> gpa_6:
  2581                              <1> 	; 18/10/2015
  2582 00005BF8 89D9                <1> 	mov	ecx, ebx
  2583 00005BFA 81E1FF0F0000        <1> 	and	ecx, PAGE_OFF
  2584 00005C00 89C2                <1> 	mov 	edx, eax
  2585 00005C02 662500F0            <1> 	and	ax, PTE_A_CLEAR
  2586 00005C06 01C8                <1> 	add	eax, ecx
  2587 00005C08 F7D9                <1> 	neg	ecx ; 1 -> -1 (0FFFFFFFFh), 4095 (0FFFh) -> -4095
  2588 00005C0A 81C100100000        <1> 	add	ecx, PAGE_SIZE
  2589 00005C10 F8                  <1> 	clc
  2590                              <1> gpa_retn:
  2591 00005C11 C3                  <1> 	retn
  2592                              <1> gpa_7:	
  2593 00005C12 E8A1FBFFFF          <1> 	call	allocate_page
  2594 00005C17 72D5                <1> 	jc	short gpa_im_err ; 'insufficient memory' error
  2595 00005C19 E80BFCFFFF          <1> 	call	clear_page
  2596 00005C1E EBAE                <1> 	jmp	short gpa_2
  2597                              <1> 
  2598                              <1> gpa_8: ; 26/03/2017
  2599 00005C20 C605[1E8A0100]00    <1> 	mov	byte [no_page_swap], 0
  2600                              <1> 
  2601 00005C27 C3                  <1> 	retn	; 17/04/2021 (temporary)
  2602                              <1> 
  2603                              <1> ; 17/04/2021 (TRDOS 386 v2.0.4)
  2604                              <1> ; ('swap_queue_shift' procedure call is disabled as temporary)
  2605                              <1> ;	
  2606                              <1> ;	push	ebx
  2607                              <1> ;	push	eax ; 26/03/2017
  2608                              <1> ;       and     bx, ~PAGE_OFF ; ~0FFFh ; reset bits, 0 to 11
  2609                              <1> ;	mov	bl, [u.uno] ; current process number
  2610                              <1> ;	call	swap_queue_shift ; drop from the queue if
  2611                              <1> ;				 ; it is already on the queue
  2612                              <1> ;	pop	eax ; 26/03/2017
  2613                              <1> ;	pop	ebx
  2614                              <1> ;
  2615                              <1> ;	retn
  2616                              <1> 
  2617                              <1> ; 17/04/2021
  2618                              <1> ; ('reload_page' procedure call is disabled as temporary)
  2619                              <1> 
  2620                              <1> reload_page:
  2621                              <1> 	; 20/07/2015
  2622                              <1> 	; 28/04/2015 (Retro UNIX 386 v1 - beginning)
  2623                              <1> 	;
  2624                              <1> 	; Reload (Restore) swapped page at memory
  2625                              <1> 	;
  2626                              <1> 	; INPUT -> 
  2627                              <1> 	;	EBP = Virtual (linear) memory address
  2628                              <1> 	;	EAX = PTE value (swap disk sector address)
  2629                              <1> 	;	(Swap disk sector address = bit 1 to bit 31 of EAX)	
  2630                              <1> 	; OUTPUT ->
  2631                              <1> 	;	EAX = PHYSICAL (real/flat) ADDRESS OF RELOADED PAGE
  2632                              <1> 	;
  2633                              <1> 	;	CF = 1 and EAX = error code
  2634                              <1> 	;
  2635                              <1> 	; Modified Registers -> none (except EAX)
  2636                              <1> 	;
  2637                              <1> ;	shr	eax, 1   ; Convert PTE value to swap disk address 
  2638                              <1> ;	push	ebx      ;
  2639                              <1> ;	mov	ebx, eax ; Swap disk (offset) address	
  2640                              <1> ;	call	allocate_page
  2641                              <1> ;	jc	short rlp_im_err
  2642                              <1> ;	xchg 	eax, ebx	
  2643                              <1> ;	; EBX = Physical memory (page) address
  2644                              <1> ;	; EAX = Swap disk (offset) address
  2645                              <1> ;	; EBP = Virtual (linear) memory address
  2646                              <1> ;	call	swap_in
  2647                              <1> ;	jc	short rlp_swp_err  ; (swap disk/file read error)
  2648                              <1> ;	mov	eax, ebx	
  2649                              <1> ;rlp_retn:
  2650                              <1> ;	pop	ebx
  2651                              <1> ;	retn
  2652                              <1> ;	
  2653                              <1> ;rlp_im_err:	
  2654                              <1> ;	mov	eax, ERR_MINOR_IM ; Insufficient memory (minor) error!
  2655                              <1> ;				  ; Major error = 0 (No protection fault)	
  2656                              <1> ;	jmp	short rlp_retn
  2657                              <1> ;
  2658                              <1> ;rlp_swp_err:
  2659                              <1> ;	mov 	eax, SWP_DISK_READ_ERR ; Swap disk read error !
  2660                              <1> ;	jmp	short rlp_retn
  2661                              <1> 
  2662                              <1> copy_page_dir:
  2663                              <1> 	; 17/04/2021 (temporary modifications)
  2664                              <1> 	; 19/09/2015
  2665                              <1> 	; temporary - 07/09/2015
  2666                              <1> 	; 07/09/2015 (Retro UNIX 386 v1 - beginning)
  2667                              <1> 	;
  2668                              <1> 	; INPUT -> 
  2669                              <1> 	;	[u.pgdir] = PHYSICAL (real/flat) ADDRESS of the parent's
  2670                              <1> 	;		    page directory.
  2671                              <1> 	; OUTPUT ->
  2672                              <1> 	;	EAX =  PHYSICAL (real/flat) ADDRESS of the child's
  2673                              <1> 	;	       page directory.
  2674                              <1> 	;	(New page directory with new page table entries.)
  2675                              <1> 	;	(New page tables with read only copies of the parent's
  2676                              <1> 	;	pages.)
  2677                              <1> 	;	EAX = 0 -> Error (CF = 1)
  2678                              <1> 	;
  2679                              <1> 	; Modified Registers -> none (except EAX)
  2680                              <1> 	;
  2681 00005C28 E88BFBFFFF          <1> 	call	allocate_page
  2682 00005C2D 723E                <1> 	jc	short cpd_err
  2683                              <1> 	;
  2684 00005C2F 55                  <1> 	push	ebp ; 20/07/2015
  2685 00005C30 56                  <1> 	push	esi
  2686 00005C31 57                  <1> 	push	edi
  2687 00005C32 53                  <1> 	push	ebx
  2688 00005C33 51                  <1> 	push	ecx
  2689 00005C34 8B35[78900100]      <1> 	mov	esi, [u.pgdir]
  2690 00005C3A 89C7                <1> 	mov	edi, eax
  2691 00005C3C 50                  <1> 	push	eax ; save child's page directory address
  2692                              <1> 	; copy PDE 0 from the parent's page dir to the child's page dir
  2693                              <1> 	; (use same system space for all user page tables) 
  2694 00005C3D A5                  <1> 	movsd
  2695 00005C3E BD00004000          <1> 	mov	ebp, 1024*4096 ; pass the 1st 4MB (system space)
  2696 00005C43 B9FF030000          <1> 	mov	ecx, (PAGE_SIZE / 4) - 1 ; 1023
  2697                              <1> cpd_0:	
  2698 00005C48 AD                  <1> 	lodsd
  2699                              <1> 	;or	eax, eax
  2700                              <1>         ;jnz     short cpd_1
  2701 00005C49 A801                <1> 	test	al, PDE_A_PRESENT ;  bit 0 =  1
  2702 00005C4B 7508                <1> 	jnz	short cpd_1
  2703                              <1>  	; (virtual address at the end of the page table)	
  2704 00005C4D 81C500004000        <1> 	add	ebp, 1024*4096 ; page size * PTE count
  2705 00005C53 EB0F                <1> 	jmp	short cpd_2
  2706                              <1> cpd_1:	
  2707 00005C55 662500F0            <1> 	and	ax, PDE_A_CLEAR ; 0F000h ; clear attribute bits
  2708 00005C59 89C3                <1> 	mov	ebx, eax
  2709                              <1> 	; EBX = Parent's page table address
  2710 00005C5B E81F000000          <1> 	call	copy_page_table
  2711 00005C60 720C                <1> 	jc	short cpd_p_err
  2712                              <1> 	; EAX = Child's page table address
  2713 00005C62 0C07                <1> 	or	al, PDE_A_PRESENT + PDE_A_WRITE + PDE_A_USER
  2714                              <1> 			 ; set bit 0, bit 1 and bit 2 to 1
  2715                              <1> 			 ; (present, writable, user)
  2716                              <1> cpd_2:
  2717 00005C64 AB                  <1> 	stosd
  2718 00005C65 E2E1                <1> 	loop	cpd_0
  2719                              <1> 	;
  2720 00005C67 58                  <1> 	pop	eax  ; restore child's page directory address
  2721                              <1> cpd_3:
  2722 00005C68 59                  <1> 	pop	ecx
  2723 00005C69 5B                  <1> 	pop	ebx
  2724 00005C6A 5F                  <1> 	pop	edi
  2725 00005C6B 5E                  <1> 	pop	esi
  2726 00005C6C 5D                  <1> 	pop	ebp
  2727                              <1> cpd_err:
  2728 00005C6D C3                  <1> 	retn
  2729                              <1> cpd_p_err:
  2730                              <1> 	; release the allocated pages missing (recover free space)
  2731 00005C6E 58                  <1> 	pop	eax  ; the new page directory address (physical)
  2732 00005C6F 8B1D[78900100]      <1> 	mov	ebx, [u.pgdir] ; parent's page directory address 
  2733 00005C75 E86EFCFFFF          <1> 	call 	deallocate_page_dir
  2734 00005C7A 29C0                <1> 	sub	eax, eax ; 0
  2735 00005C7C F9                  <1> 	stc
  2736 00005C7D EBE9                <1> 	jmp	short cpd_3	
  2737                              <1> 
  2738                              <1> copy_page_table:
  2739                              <1> 	; 17/04/2021 (temporary modifications)
  2740                              <1> 	; 19/09/2015
  2741                              <1> 	; temporary - 07/09/2015
  2742                              <1> 	; 07/09/2015 (Retro UNIX 386 v1 - beginning)
  2743                              <1> 	;
  2744                              <1> 	; INPUT -> 
  2745                              <1> 	;	EBX = PHYSICAL (real/flat) ADDRESS of the parent's page table.
  2746                              <1> 	;	EBP = page table entry index (from 'copy_page_dir')
  2747                              <1> 	; OUTPUT ->
  2748                              <1> 	;	EAX = PHYSICAL (real/flat) ADDRESS of the child's page table.
  2749                              <1> 	;	EBP = (recent) page table index (for 'add_to_swap_queue')	
  2750                              <1> 	;	CF = 1 -> error 
  2751                              <1> 	;
  2752                              <1> 	; Modified Registers -> EBP (except EAX)
  2753                              <1> 	;
  2754 00005C7F E834FBFFFF          <1> 	call	allocate_page
  2755 00005C84 7244                <1> 	jc	short cpt_err
  2756                              <1> 	;
  2757 00005C86 50                  <1> 	push	eax ; *
  2758                              <1> 	;push 	ebx
  2759 00005C87 56                  <1> 	push	esi
  2760 00005C88 57                  <1> 	push	edi
  2761 00005C89 52                  <1> 	push	edx
  2762 00005C8A 51                  <1> 	push	ecx
  2763                              <1> 	;
  2764 00005C8B 89DE                <1> 	mov	esi, ebx
  2765 00005C8D 89C7                <1> 	mov	edi, eax
  2766 00005C8F 89C2                <1> 	mov	edx, eax
  2767 00005C91 81C200100000        <1> 	add	edx, PAGE_SIZE 	
  2768                              <1> cpt_0:
  2769 00005C97 AD                  <1> 	lodsd
  2770 00005C98 A801                <1> 	test	al, PTE_A_PRESENT ;  bit 0 = 1
  2771                              <1> 	;jnz	short cpt_1 (*)
  2772                              <1> 	; 17/04/2021 (temporary (*)
  2773                              <1> 	;and	eax, eax (*)
  2774 00005C9A 741E                <1> 	jz	short cpt_2  ; 17/04/2021
  2775                              <1> 	
  2776                              <1> ; 17/04/2021
  2777                              <1> ; ('reload_page' procedure call is disabled as temporary)
  2778                              <1> ;
  2779                              <1> ;	; ebp = virtual (linear) address of the memory page
  2780                              <1> ;	call	reload_page ; 28/04/2015
  2781                              <1> ;	jc	short cpt_p_err
  2782                              <1> cpt_1:
  2783 00005C9C 662500F0            <1> 	and	ax, PTE_A_CLEAR ; 0F000h ; clear attribute bits
  2784 00005CA0 89C1                <1> 	mov	ecx, eax
  2785                              <1> 	; Allocate a new page for the child process
  2786 00005CA2 E811FBFFFF          <1> 	call	allocate_page
  2787 00005CA7 721C                <1> 	jc	short cpt_p_err
  2788 00005CA9 57                  <1> 	push	edi
  2789 00005CAA 56                  <1> 	push	esi
  2790 00005CAB 89CE                <1> 	mov	esi, ecx
  2791 00005CAD 89C7                <1> 	mov	edi, eax
  2792 00005CAF B900040000          <1> 	mov	ecx, PAGE_SIZE/4
  2793 00005CB4 F3A5                <1> 	rep	movsd	; copy page (4096 bytes)
  2794 00005CB6 5E                  <1> 	pop	esi
  2795 00005CB7 5F                  <1> 	pop	edi
  2796                              <1> 	; 
  2797                              <1> 
  2798                              <1> ; 17/04/2021
  2799                              <1> ; ('add_to_swap_queue' procedure call is disabled as temporary)	
  2800                              <1> ;
  2801                              <1> ;	push	ebx
  2802                              <1> ;	push	eax
  2803                              <1> ;	mov	ebx, ebp
  2804                              <1> ;	; ebx = virtual address of the memory page
  2805                              <1> ;	call	add_to_swap_queue
  2806                              <1> ;	pop	eax
  2807                              <1> ;	pop	ebx
  2808                              <1> 	;
  2809                              <1> 	;or	ax, PTE_A_USER+PTE_A_PRESENT 
  2810 00005CB8 0C07                <1> 	or	al, PTE_A_USER+PTE_A_WRITE+PTE_A_PRESENT 
  2811                              <1> cpt_2:
  2812 00005CBA AB                  <1> 	stosd  ; EDI points to child's PTE  	 
  2813                              <1> 	;
  2814 00005CBB 81C500100000        <1> 	add	ebp, 4096 ; 20/07/2015 (next page)
  2815                              <1> 	;
  2816 00005CC1 39D7                <1> 	cmp	edi, edx
  2817 00005CC3 72D2                <1> 	jb	short cpt_0
  2818                              <1> cpt_p_err:
  2819 00005CC5 59                  <1> 	pop	ecx
  2820 00005CC6 5A                  <1> 	pop	edx
  2821 00005CC7 5F                  <1> 	pop	edi
  2822 00005CC8 5E                  <1> 	pop	esi
  2823                              <1> 	;pop	ebx
  2824 00005CC9 58                  <1> 	pop	eax ; *
  2825                              <1> cpt_err:
  2826 00005CCA C3                  <1> 	retn
  2827                              <1> 
  2828                              <1> allocate_memory_block:
  2829                              <1> 	; 01/05/2017
  2830                              <1> 	; 28/04/2017
  2831                              <1> 	; 25/04/2017
  2832                              <1> 	; 01/04/2016, 02/04/2016, 03/04/2016
  2833                              <1> 	; 13/03/2016, 14/03/2016
  2834                              <1> 	; 12/03/2016 (TRDOS 386 = TRDOS v2.0)
  2835                              <1> 	; Allocating contiguous memory pages (in the kernel's memory space)
  2836                              <1> 	;
  2837                              <1> 	; INPUT -> 
  2838                              <1> 	;	EAX = Beginning address (physical)
  2839                              <1> 	;	EAX = 0 -> Allocate memory block from the first proper aperture	
  2840                              <1> 	;	ECX = Number of bytes to be allocated
  2841                              <1> 	;
  2842                              <1> 	; OUTPUT ->
  2843                              <1> 	; 	1) cf = 0 -> successful
  2844                              <1> 	;	EAX = Beginning (physical) address of the allocated memory block
  2845                              <1> 	;	ECX = Number of allocated bytes (rounded up to page borders) 
  2846                              <1> 	;	2) cf = 1 -> unsuccessful
  2847                              <1> 	;	 2.1) If EAX > 0 -> 
  2848                              <1> 	;	      (Number of requested pages is more than # of free pages
  2849                              <1> 	;	       but contiguous free pages -the aperture- is not enough!)	   	
  2850                              <1> 	;	      EAX = Beginning address of available aperture
  2851                              <1> 	;		    (one of all aperture with max. aperture size/length)		
  2852                              <1> 	;	      ECX = Size of available aperture (memory block) in bytes
  2853                              <1> 	;	 2.2) If EAX = 0 -> Out of memory error 
  2854                              <1> 	;	            (number of free pages is less than requested number)
  2855                              <1> 	;	      ECX = Total number of free bytes (free pages * 4096) 
  2856                              <1> 	;		    (It is not number of contiguous free bytes)	
  2857                              <1> 	;
  2858                              <1> 	; (Modified Registers -> EAX, ECX)
  2859                              <1> 	;
  2860                              <1> 	; PURPOSE: Loading a file at memory for copying or running etc.
  2861                              <1> 	; If this procedure returns with cf is set, ECX contains maximum
  2862                              <1> 	; available space and EAX contains the beginning address of it.
  2863                              <1> 	; If EAX has zero, ECX contains total number of free bytes.
  2864                              <1> 	; If requested block has been successfully allocated (by rounding up to
  2865                              <1> 	; the last page border), it must be deallocated later by using
  2866                              <1> 	; 'deallocate_memory_block' procedure.    
  2867                              <1> 
  2868 00005CCB 52                  <1> 	push	edx ; *
  2869 00005CCC BAFF0F0000          <1> 	mov	edx, PAGE_SIZE - 1   ; 4095
  2870 00005CD1 01D0                <1> 	add	eax, edx
  2871 00005CD3 01D1                <1> 	add	ecx, edx
  2872 00005CD5 C1E90C              <1> 	shr	ecx, PAGE_SHIFT	     ; 12
  2873                              <1> 
  2874                              <1> 	; ECX = number of contiguous pages to be allocated
  2875 00005CD8 8B15[90780100]      <1> 	mov	edx, [free_pages]
  2876                              <1> 	; 01/05/2017
  2877                              <1> 	;or	ecx, ecx
  2878                              <1> 	;jz	short amb3
  2879                              <1> 	; If ECX=0, set cf to 1 and return with max. available mem block size
  2880                              <1> 
  2881 00005CDE 39D1                <1> 	cmp	ecx, edx
  2882 00005CE0 7760                <1> 	ja	short amb_3
  2883                              <1> 
  2884 00005CE2 C1E80C              <1> 	shr	eax, PAGE_SHIFT      ; 12
  2885                              <1> 
  2886 00005CE5 89C2                <1> 	mov	edx, eax 	     ; page number
  2887 00005CE7 C1EA03              <1> 	shr	edx, 3		     ; to get offset to M.A.T.
  2888                              <1> 				     ; (1 allocation bit = 1 page)
  2889                              <1> 				     ; (1 allocation bytes = 8 pages)
  2890 00005CEA 80E2FC              <1> 	and	dl, 0FCh 	     ; clear lower 2 bits
  2891                              <1> 				     ; (to get 32 bit position)	
  2892 00005CED 53                  <1> 	push	ebx ; **
  2893                              <1> amb_0:
  2894 00005CEE 890D[40840100]      <1> 	mov	[mem_ipg_count], ecx ; initial (reset) value of page count
  2895 00005CF4 890D[44840100]      <1> 	mov	[mem_pg_count], ecx
  2896 00005CFA 31C9                <1> 	xor	ecx, ecx ; 0
  2897 00005CFC 890D[48840100]      <1> 	mov	[mem_aperture], ecx ; 0
  2898 00005D02 890D[4C840100]      <1> 	mov	[mem_max_aperture], ecx ; 0
  2899                              <1> 	
  2900 00005D08 BB00001000          <1> 	mov	ebx, MEM_ALLOC_TBL   ; Memory Allocation Table address.
  2901 00005D0D 3B15[94780100]      <1> 	cmp	edx, [next_page]     ; Is the beginning page address lower
  2902                              <1> 				     ; than the address in 'next_page' ?
  2903                              <1> 				     ; (the first/next free page of user space)		
  2904 00005D13 7208                <1> 	jb	short amb_1
  2905 00005D15 3B15[98780100]      <1> 	cmp 	edx, [last_page]     ; is the beginning page address higher
  2906                              <1> 				     ; than the address in 'last_page' ?
  2907                              <1> 				     ; (end of the memory)		
  2908 00005D1B 7606                <1> 	jna	short amb_2	     ; no	
  2909                              <1> amb_1:
  2910 00005D1D 8B15[94780100]      <1> 	mov	edx, [next_page]     ; M.A.T. offset (1 M.A.T. byte = 8 pages)
  2911                              <1> amb_2:
  2912 00005D23 01D3                <1> 	add	ebx, edx
  2913                              <1> 
  2914                              <1> 	; 28/04/2017
  2915                              <1> 	;xor	ecx, ecx
  2916 00005D25 0FBC0B              <1> 	bsf	ecx, [ebx]	     ; 0 to 31
  2917 00005D28 89D0                <1> 	mov	eax, edx
  2918 00005D2A C1E003              <1> 	shl	eax, 3		     ; *8	
  2919 00005D2D 01C8                <1> 	add	eax, ecx	     ; beginning page number
  2920                              <1> 
  2921 00005D2F A3[50840100]        <1> 	mov	[mem_pg_pos], eax    ; beginning page no (for curr. mem. aperture)
  2922 00005D34 A3[54840100]        <1>  	mov	[mem_max_pg_pos], eax ; beginning page no for max. mem. aperture
  2923                              <1> 
  2924 00005D39 83E01F              <1> 	and	eax, 1Fh	     ; lower 5 bits only (0 to 31)
  2925                              <1> 				     ; (allocation bit position)	 
  2926 00005D3C 750E                <1> 	jnz	short amb_4	     ; 0
  2927 00005D3E B120                <1> 	mov	cl, 32
  2928 00005D40 EB4B                <1> 	jmp	short amb_10
  2929                              <1> 
  2930                              <1> amb_3:	; out_of_memory
  2931 00005D42 31C0                <1> 	xor	eax, eax ; 0
  2932 00005D44 89D1                <1> 	mov	ecx, edx ; free pages
  2933 00005D46 C1E10C              <1> 	shl	ecx, PAGE_SHIFT
  2934 00005D49 5A                  <1> 	pop	edx ; *
  2935 00005D4A F9                  <1> 	stc
  2936 00005D4B C3                  <1> 	retn	
  2937                              <1> amb_4:
  2938 00005D4C 8B13                <1> 	mov	edx, [ebx]
  2939 00005D4E 88C1                <1> 	mov	cl, al ; 1 to 31
  2940 00005D50 D3EA                <1> 	shr	edx, cl
  2941 00005D52 89D0                <1> 	mov	eax, edx
  2942                              <1> amb_5:
  2943 00005D54 D1E8                <1> 	shr	eax, 1 ; (***)
  2944 00005D56 7317                <1> 	jnc	short amb_7
  2945 00005D58 FF05[48840100]      <1> 	inc	dword [mem_aperture]
  2946 00005D5E FF0D[44840100]      <1> 	dec	dword [mem_pg_count]
  2947 00005D64 747F                <1> 	jz	short amb_15
  2948                              <1> amb_6:
  2949                              <1> 	; 28/04/2017
  2950 00005D66 FEC1                <1> 	inc	cl
  2951 00005D68 80F920              <1> 	cmp	cl, 32
  2952 00005D6B 730D                <1> 	jnb	short amb_9
  2953 00005D6D EBE5                <1> 	jmp	short amb_5
  2954                              <1> amb_7:
  2955 00005D6F 50                  <1> 	push	eax ; (***) allocation bits (in shifted status)
  2956 00005D70 E828010000          <1> 	call	amb_26 ; set maximum memory aperture (free memory block size)
  2957 00005D75 58                  <1> 	pop	eax ; (***)
  2958 00005D76 EBEE                <1> 	jmp	short amb_6
  2959                              <1> amb_8:
  2960                              <1> 	; 28/04/2017
  2961 00005D78 B120                <1> 	mov	cl, 32
  2962                              <1> amb_9:
  2963 00005D7A 89DA                <1> 	mov	edx, ebx
  2964 00005D7C 81EA00001000        <1> 	sub	edx, MEM_ALLOC_TBL
  2965 00005D82 3B15[98780100]      <1> 	cmp	edx, [last_page]
  2966 00005D88 7336                <1> 	jnb	short amb_14 ; contiguous pages not enough
  2967 00005D8A 83C304              <1> 	add	ebx, 4
  2968                              <1> amb_10:
  2969 00005D8D 8B03                <1> 	mov	eax, [ebx]
  2970 00005D8F 21C0                <1> 	and 	eax, eax
  2971 00005D91 7408                <1>         jz      short amb_11 ; there is not a free page bit in this alloc dword
  2972 00005D93 40                  <1> 	inc	eax ; 0FFFFFFFFh -> 0
  2973 00005D94 740C                <1> 	jz	short amb_12 ; all of bits are set (32 free pages)
  2974 00005D96 48                  <1> 	dec	eax
  2975 00005D97 28C9                <1> 	sub	cl, cl ; 0
  2976 00005D99 EBB9                <1> 	jmp	short amb_5
  2977                              <1> amb_11:
  2978 00005D9B E8FD000000          <1> 	call	amb_26 ; set maximum memory aperture (free memory block size)
  2979 00005DA0 EBD8                <1> 	jmp	short amb_9	
  2980                              <1> amb_12:
  2981 00005DA2 390D[44840100]      <1> 	cmp	[mem_pg_count], ecx ; 32
  2982 00005DA8 7306                <1> 	jnb	short amb_13
  2983 00005DAA 8B0D[44840100]      <1> 	mov	ecx, [mem_pg_count]
  2984                              <1> amb_13:
  2985 00005DB0 010D[48840100]      <1> 	add	[mem_aperture], ecx
  2986 00005DB6 290D[44840100]      <1> 	sub	[mem_pg_count], ecx
  2987 00005DBC 7627                <1> 	jna	short amb_15
  2988 00005DBE EBBA                <1> 	jmp	short amb_9 ; 01/05/2017
  2989                              <1> amb_14:
  2990 00005DC0 E8D8000000          <1> 	call	amb_26 ; 28/04/2017
  2991 00005DC5 A1[54840100]        <1> 	mov	eax, [mem_max_pg_pos] ; begin address of max. mem aperture	
  2992 00005DCA 8B0D[4C840100]      <1> 	mov	ecx, [mem_max_aperture] ; max. (largest) memory aperture
  2993 00005DD0 F9                  <1> 	stc
  2994 00005DD1 E9BC000000          <1>         jmp     amb_25
  2995                              <1> 
  2996                              <1> allocate_lfb_memory_block:
  2997                              <1> 	; 28/11/2023
  2998                              <1> 	; 20/10/2023 - TRDOS 386 v2.0.7
  2999                              <1> 	; (short way to set the LFB page bits on the M.A.T.)
  3000                              <1> 	; called from 'allocate_lfb_pages_for_kernel' 
  3001 00005DD6 A3[50840100]        <1> 	mov	[mem_pg_pos], eax    ; LFB start/base address as page number
  3002 00005DDB 890D[48840100]      <1> 	mov	[mem_aperture], ecx  ; number of LFB pages
  3003                              <1> 				     ; (!which overlapping main memory!)
  3004 00005DE1 52                  <1> 	push	edx ; *
  3005 00005DE2 53                  <1> 	push	ebx ; **
  3006 00005DE3 EB0B                <1> 	jmp	short amb_16
  3007                              <1> 
  3008                              <1> amb_15: ; OK !
  3009 00005DE5 A1[50840100]        <1> 	mov	eax, [mem_pg_pos]    ; Beginning address as page number
  3010 00005DEA 8B0D[48840100]      <1> 	mov	ecx, [mem_aperture]  ; Free contiguous page count (>=1)
  3011                              <1> amb_16:
  3012                              <1> 	; allocate contiguous memory pages (via memory allocation table bits)
  3013 00005DF0 89C2                <1> 	mov	edx, eax
  3014                              <1> 	; 25/04/2017
  3015 00005DF2 C1EA03              <1> 	shr	edx, 3		 ; 8 pages in one allocation byte
  3016 00005DF5 80E2FC              <1> 	and	dl, 0FCh	 ; clear lower 2 bits
  3017                              <1> 				 ; (for dword/32bit positioning)
  3018                              <1> 
  3019 00005DF8 BB00001000          <1> 	mov	ebx, MEM_ALLOC_TBL
  3020 00005DFD 01D3                <1> 	add	ebx, edx
  3021 00005DFF 83E01F              <1> 	and	eax, 1Fh ; 31
  3022                              <1> 	; 03/04/2016
  3023 00005E02 BA20000000          <1> 	mov	edx, 32
  3024 00005E07 28C2                <1> 	sub	dl, al
  3025 00005E09 39CA                <1> 	cmp	edx, ecx	 ; ecx >= 1
  3026 00005E0B 7602                <1> 	jna	short amb_17
  3027 00005E0D 89CA                <1> 	mov	edx, ecx
  3028                              <1> amb_17:
  3029 00005E0F 29D1                <1> 	sub	ecx, edx
  3030 00005E11 51                  <1> 	push	ecx ; ***
  3031 00005E12 89D1                <1> 	mov	ecx, edx
  3032                              <1> amb_18:		
  3033 00005E14 0FB303              <1> 	btr	[ebx], eax	 ; The destination bit indexed by the source value
  3034                              <1> 				 ; is copied into the Carry Flag and then cleared
  3035                              <1> 				 ; in the destination.
  3036                              <1> 	; 20/10/2023
  3037                              <1> 	; (for LFB page allocation.. 
  3038                              <1> 	;  -here, to prevent using LFB pages for another allocation later-
  3039                              <1> 	;  /// the destination bit must be 0 -already- ..
  3040                              <1> 	;  so, following 'jnc' is not necessary but i am not removing it
  3041                              <1> 	;  for understanding why free page count is decreased here.) 
  3042                              <1> 	;   
  3043                              <1> 	;jnc	short amb_28 ; requested page is already allocated 
  3044                              <1> 
  3045 00005E17 FF0D[90780100]      <1> 	dec     dword [free_pages] ; 1 page has been allocated (X = X-1) 
  3046                              <1> ;amb_28:	; 20/10/2023
  3047 00005E1D 49                  <1> 	dec	ecx
  3048 00005E1E 7404                <1> 	jz	short amb_19
  3049 00005E20 FEC0                <1> 	inc	al
  3050 00005E22 EBF0                <1> 	jmp	short amb_18
  3051                              <1> amb_19:	
  3052 00005E24 59                  <1> 	pop	ecx ; ***
  3053                              <1> 	;and	ecx, ecx ; 0 ?
  3054                              <1> 	;jz	short amb_22	
  3055                              <1> 	; 28/11/2023
  3056 00005E25 E31E                <1> 	jecxz	amb_22
  3057                              <1> 	; 01/04/2016
  3058 00005E27 B020                <1> 	mov	al, 32
  3059                              <1> amb_20:
  3060 00005E29 83C304              <1> 	add	ebx, 4
  3061 00005E2C 39C1                <1> 	cmp	ecx, eax ; 32
  3062 00005E2E 7305                <1> 	jnb	short amb_21
  3063                              <1> 	; ECX < 32
  3064 00005E30 28C0                <1> 	sub	al, al ; 0
  3065 00005E32 50                  <1> 	push	eax ; 0 ***
  3066 00005E33 EBDF                <1> 	jmp	short amb_18
  3067                              <1> amb_21:
  3068 00005E35 2905[90780100]      <1> 	sub	[free_pages], eax   ; [free_pages] = [free_pages] - 32
  3069 00005E3B C70300000000        <1> 	mov	dword [ebx], 0	    ; reset 32 bits
  3070 00005E41 29C1                <1> 	sub	ecx, eax ; 32
  3071 00005E43 75E4                <1> 	jnz	short amb_20
  3072                              <1> amb_22:
  3073 00005E45 A1[50840100]        <1> 	mov	eax, [mem_pg_pos]   ; Beginning address as page number
  3074 00005E4A 8B0D[48840100]      <1> 	mov	ecx, [mem_aperture] ; Free contiguous page count
  3075                              <1> 	; [next_page] update
  3076 00005E50 89C2                <1> 	mov	edx, eax
  3077                              <1> 	; 03/04/2016
  3078 00005E52 C1EA03              <1> 	shr	edx, 3		     ; to get offset to M.A.T.
  3079                              <1> 				     ; (1 allocation bit = 1 page)
  3080                              <1> 				     ; (1 allocation bytes = 8 pages)
  3081 00005E55 80E2FC              <1> 	and	dl, 0FCh 	     ; clear lower 2 bits
  3082                              <1> 				     ; (to get 32 bit position)	
  3083 00005E58 3B15[94780100]      <1> 	cmp	edx, [next_page] ; first free page pointer offset
  3084 00005E5E 7732                <1> 	ja	short amb_25
  3085 00005E60 BB00001000          <1> 	mov	ebx, MEM_ALLOC_TBL
  3086 00005E65 833C1300            <1> 	cmp	dword [ebx+edx], 0
  3087 00005E69 7721                <1> 	ja	short amb_24
  3088 00005E6B 89C2                <1> 	mov	edx, eax
  3089 00005E6D 01CA                <1> 	add	edx, ecx
  3090 00005E6F C1EA03              <1> 	shr	edx, 3
  3091 00005E72 80E2FC              <1> 	and	dl, 0FCh
  3092                              <1> amb_23:
  3093 00005E75 833C1300            <1> 	cmp	dword [ebx+edx], 0
  3094 00005E79 7711                <1> 	ja	short amb_24
  3095 00005E7B 83C204              <1> 	add	edx, 4
  3096 00005E7E 3B15[98780100]      <1> 	cmp	edx, [last_page]    ; last page pointer offset
  3097 00005E84 76EF                <1> 	jna	short amb_23
  3098 00005E86 8B15[9C780100]      <1> 	mov	edx, [first_page]   ; (for) beginning of user's space
  3099                              <1> amb_24:
  3100 00005E8C 8915[94780100]      <1> 	mov	[next_page], edx
  3101                              <1> amb_25:
  3102 00005E92 9C                  <1> 	pushf
  3103 00005E93 C1E00C              <1> 	shl	eax, PAGE_SHIFT	     ; convert to phy. address in bytes
  3104 00005E96 C1E10C              <1> 	shl	ecx, PAGE_SHIFT	     ; convert to byte counts
  3105 00005E99 9D                  <1> 	popf
  3106 00005E9A 5B                  <1> 	pop	ebx ; **
  3107 00005E9B 5A                  <1> 	pop	edx ; *
  3108 00005E9C C3                  <1> 	retn
  3109                              <1> 
  3110                              <1> amb_26:	; set maximum free memory aperture (free memory block size) 
  3111 00005E9D 89DA                <1> 	mov	edx, ebx ; current address
  3112 00005E9F 81EA00001000        <1> 	sub	edx, MEM_ALLOC_TBL ; MAT beginning address
  3113                              <1> 	; 02/04/2016 
  3114 00005EA5 C1E203              <1> 	shl	edx, 3 ; MAT byte offset * 8 = page number base
  3115 00005EA8 01CA                <1> 	add	edx, ecx ; current page number (ecx = 0 to 32)
  3116                              <1> 	;
  3117 00005EAA A1[48840100]        <1> 	mov	eax, [mem_aperture]
  3118 00005EAF 21C0                <1> 	and	eax, eax
  3119 00005EB1 7421                <1>         jz      short amb_27
  3120 00005EB3 C705[48840100]0000- <1>         mov     dword [mem_aperture], 0
  3120 00005EBB 0000                <1>
  3121 00005EBD 3B05[4C840100]      <1> 	cmp	eax, [mem_max_aperture]
  3122 00005EC3 760F                <1> 	jna	short amb_27
  3123 00005EC5 A3[4C840100]        <1> 	mov	[mem_max_aperture], eax
  3124                              <1> 	; 25/04/2017
  3125 00005ECA A1[50840100]        <1> 	mov	eax, [mem_pg_pos]
  3126                              <1> 	; EAX = Beginning page number of the max. aperture 
  3127 00005ECF A3[54840100]        <1> 	mov	[mem_max_pg_pos], eax
  3128                              <1> amb_27: 
  3129 00005ED4 8915[50840100]      <1> 	mov	[mem_pg_pos], edx ; current page
  3130                              <1> 
  3131 00005EDA A1[40840100]        <1> 	mov	eax, [mem_ipg_count] ; initial (reset) value of page count
  3132 00005EDF A3[44840100]        <1> 	mov	[mem_pg_count], eax
  3133                              <1> 
  3134 00005EE4 C3                  <1> 	retn
  3135                              <1> 
  3136                              <1> deallocate_memory_block_x:
  3137                              <1> 	; 26/11/2023 - TRDOS 386 v2.0.7
  3138                              <1> 	; deallocate pages after rounding up
  3139                              <1> 	; ((audio buffer size etc. may not be rounded up to page boundary)) 
  3140 00005EE5 81C1FF0F0000        <1> 	add	ecx, PAGE_SIZE - 1   ; 4095
  3141                              <1> 
  3142                              <1> deallocate_memory_block:
  3143                              <1> 	; 03/04/2016
  3144                              <1> 	; 14/03/2016 (TRDOS 386 = TRDOS v2.0)
  3145                              <1> 	; Deallocating contiguous memory pages (in the kernel's memory space)
  3146                              <1> 	;
  3147                              <1> 	; INPUT -> 
  3148                              <1> 	;	EAX = Beginning address (physical)
  3149                              <1> 	;	ECX = Number of bytes to be deallocated
  3150                              <1> 	;
  3151                              <1> 	; OUTPUT ->
  3152                              <1> 	;	Memory Allocation Table bits will be updated
  3153                              <1> 	;	[free_pages] will be changed (increased)
  3154                              <1> 	;
  3155                              <1> 	; (Modified Registers -> EAX, ECX)
  3156                              <1> 	;
  3157                              <1> 	; PURPOSE: Unloading/Freeing a file -or an allocated memory block- 
  3158                              <1> 	; at memory after copying, running, saving, reading, writing etc.
  3159                              <1> 	;
  3160                              <1> 
  3161 00005EEB 52                  <1> 	push	edx ; *
  3162 00005EEC 53                  <1> 	push	ebx ; **
  3163                              <1> 
  3164 00005EED C1E80C              <1> 	shr	eax, PAGE_SHIFT	     ; 12
  3165 00005EF0 C1E90C              <1> 	shr	ecx, PAGE_SHIFT	     ; 12
  3166                              <1> 
  3167                              <1> 	; EAX = Beginning page number
  3168                              <1> 	; ECX = Number of contiguous pages to be deallocated
  3169                              <1> damb_0:
  3170                              <1> 	; deallocate contiguous memory pages (via memory allocation table bits)
  3171 00005EF3 89C2                <1> 	mov	edx, eax
  3172 00005EF5 C1EA03              <1> 	shr	edx, 3		     ; to get offset to M.A.T.
  3173                              <1> 				     ; (1 allocation bit = 1 page)
  3174                              <1> 				     ; (1 allocation bytes = 8 pages)
  3175 00005EF8 80E2FC              <1> 	and	dl, 0FCh 	     ; clear lower 2 bits
  3176                              <1> 				     ; (to get 32 bit position)	
  3177 00005EFB 3B15[94780100]      <1> 	cmp	edx, [next_page] ; next free page
  3178 00005F01 7306                <1> 	jnb	short damb_1
  3179 00005F03 8915[94780100]      <1> 	mov	[next_page], edx
  3180                              <1> damb_1:
  3181 00005F09 BB00001000          <1> 	mov	ebx, MEM_ALLOC_TBL
  3182 00005F0E 01D3                <1> 	add	ebx, edx
  3183 00005F10 83E01F              <1> 	and	eax, 1Fh ; 31
  3184                              <1> 
  3185                              <1> 	; 03/04/2016
  3186 00005F13 BA20000000          <1> 	mov	edx, 32
  3187 00005F18 28C2                <1> 	sub	dl, al
  3188 00005F1A 39CA                <1> 	cmp	edx, ecx
  3189 00005F1C 7602                <1> 	jna	short damb_2
  3190 00005F1E 89CA                <1> 	mov	edx, ecx
  3191                              <1> damb_2:
  3192 00005F20 29D1                <1> 	sub	ecx, edx
  3193 00005F22 51                  <1> 	push	ecx ; ***
  3194 00005F23 89D1                <1> 	mov	ecx, edx
  3195                              <1> damb_3:		
  3196 00005F25 0FAB03              <1> 	bts	[ebx], eax	     ; unlink/release/deallocate page
  3197                              <1> 				     ; set relevant bit to 1.
  3198                              <1> 				     ; set CF to the previous bit value	
  3199 00005F28 FF05[90780100]      <1> 	inc     dword [free_pages]   ; 1 page has been deallocated (X = X+1) 
  3200 00005F2E 49                  <1> 	dec	ecx
  3201 00005F2F 7404                <1> 	jz	short damb_4
  3202 00005F31 FEC0                <1> 	inc	al
  3203 00005F33 EBF0                <1> 	jmp	short damb_3
  3204                              <1> damb_4:	
  3205 00005F35 59                  <1> 	pop	ecx ; ***
  3206 00005F36 21C9                <1> 	and	ecx, ecx ; 0 ?
  3207 00005F38 741E                <1> 	jz	short damb_7
  3208                              <1> 	; 03/04/2016
  3209 00005F3A B020                <1> 	mov	al, 32
  3210                              <1> damb_5:
  3211 00005F3C 83C304              <1> 	add	ebx, 4
  3212 00005F3F 39C1                <1> 	cmp	ecx, eax ; 32
  3213 00005F41 7305                <1> 	jnb	short damb_6
  3214                              <1> 	; ECX < 32
  3215 00005F43 28C0                <1> 	sub	al, al ; 0
  3216 00005F45 50                  <1> 	push	eax ; 0 ***
  3217 00005F46 EBDD                <1> 	jmp	short damb_3
  3218                              <1> damb_6:
  3219 00005F48 0105[90780100]      <1> 	add	[free_pages], eax ; [free_pages] = [free_pages] + 32
  3220 00005F4E C703FFFFFFFF        <1> 	mov	dword [ebx], 0FFFFFFFFh ; set 32 bits
  3221 00005F54 29C1                <1> 	sub	ecx, eax ; 32
  3222 00005F56 75E4                <1> 	jnz	short damb_5
  3223                              <1> damb_7:
  3224 00005F58 5B                  <1> 	pop	ebx ; **
  3225 00005F59 5A                  <1> 	pop	edx ; *
  3226 00005F5A C3                  <1> 	retn
  3227                              <1> 
  3228                              <1> direct_memory_access:
  3229                              <1> 	; 20/10/2023
  3230                              <1> 	; 17/04/2021 (temporary modifications)
  3231                              <1> 	; 22/07/2017
  3232                              <1> 	; 12/05/2017
  3233                              <1> 	; 16/07/2016
  3234                              <1> 	; 12/07/2016 (TRDOS 386 = TRDOS v2.0)
  3235                              <1> 	; This processure will be called to map
  3236                              <1> 	; user's (ring 3) page tables to access phsical
  3237                              <1> 	; (flat/linear) memory addresses, directly (without
  3238                              <1> 	;  kernel's data transfer functions).
  3239                              <1> 	; 
  3240                              <1> 	; Purpose: Video memory access and shared memory access.
  3241                              <1> 	;
  3242                              <1> 	; INPUT -> 
  3243                              <1> 	;	EAX = Beginning address (physical).
  3244                              <1> 	;	EBX = User's buffer address ; 12/05/2017
  3245                              <1> 	;	ECX = Number of contiguous pages to be mapped.
  3246                              <1> 	; OUTPUT ->
  3247                              <1> 	;	User's page directory and pages tables
  3248                              <1> 	;	will be updated.
  3249                              <1> 	;	
  3250                              <1> 	;	If an old page table entry has valid page address, 
  3251                              <1> 	;	that page will be deallocated just before PTE will
  3252                              <1> 	;	be changed for direct (1 to 1) memory page access.
  3253                              <1> 	;
  3254                              <1> 	;	If old PTE value points to a swapped page,
  3255                              <1>         ;       that page (block) will be unlinked on swap disk. 
  3256                              <1> 	;
  3257                              <1> 	;	Newly allocated pages (except page tables) will not
  3258                              <1> 	;	be applied to Memory Allocation Table.
  3259                              <1> 	;	AVL bit 1 (PTE bit 10) of page table entry will be
  3260                              <1> 	;	used to indicate shared (direct) memory page; then,
  3261                              <1> 	;	this page will not be deallocated later during
  3262                              <1> 	;	process termination. (Memory Allocation Table and
  3263                              <1> 	;	free memory count will not be affected.
  3264                              <1> 	;	(Except deallocating page table's itself.)
  3265                              <1> 	;	
  3266                              <1> 	;      CF = 1 -> error (EAX = error code)
  3267                              <1> 	;      CF = 0 -> success (EAX = beginning address)
  3268                              <1> 	;
  3269                              <1> 	;; (Modified Registers -> none)
  3270                              <1> 	; Modified registers: ebp, edx, ecx, ebx, esi, edi	
  3271                              <1> 	;
  3272                              <1> 
  3273                              <1> 	;push	ebp
  3274                              <1> 	;push	ebx
  3275                              <1> 	;push	ecx
  3276                              <1> 	;push	edx
  3277 00005F5B 662500F0            <1> 	and	ax, PTE_A_CLEAR ; clear page offset
  3278 00005F5F 50                  <1> 	push	eax
  3279                              <1> 	;and	ecx, ecx ; page count
  3280                              <1> 	;jz	dmem_acc_7  ; 'insufficient memory' error
  3281 00005F60 89C5                <1> 	mov	ebp, eax
  3282 00005F62 81C300004000        <1> 	add	ebx, CORE ; 12/05/2017
  3283                              <1> dmem_acc_0: 
  3284 00005F68 891D[EC8E0100]      <1> 	mov	[base_addr], ebx ; 12/05/2017
  3285 00005F6E A1[78900100]        <1> 	mov	eax, [u.pgdir] ; page dir address (physical)
  3286 00005F73 E852F9FFFF          <1> 	call	get_pte
  3287                              <1> 		; EDX = Page table entry address (if CF=0)
  3288                              <1> 	        ;       Page directory entry address (if CF=1)
  3289                              <1> 		;       (Bit 0 value is 0 if PT is not present)
  3290                              <1> 		; EAX = Page table entry value (page address)
  3291                              <1> 		;	CF = 1 -> PDE not present or invalid ? 	
  3292 00005F78 7321                <1> 	jnc	short dmem_acc_1
  3293                              <1> 	; 20/10/2023
  3294                              <1> 	; Allocate a page as a new page table
  3295 00005F7A E839F8FFFF          <1> 	call	allocate_page
  3296                              <1> 	;jc	dmem_acc_7  ; 'insufficient memory' error
  3297                              <1> 	; 17/04/2021
  3298 00005F7F 7215                <1> 	jc	short _dmem_acc_7
  3299                              <1> 	;
  3300 00005F81 E8A3F8FFFF          <1> 	call 	clear_page
  3301                              <1> 	; EAX = Physical (base) address of the allocated (new) page
  3302 00005F86 0C07                <1> 	or	al, PDE_A_PRESENT + PDE_A_WRITE + PDE_A_USER ; 4+2+1 = 7
  3303                              <1> 			   ; lower 3 bits are used as U/S, R/W, P flags
  3304                              <1> 			   ; (user, writable, present page)	
  3305 00005F88 8902                <1> 	mov	[edx], eax ; Let's put the new page directory entry here !
  3306 00005F8A A1[78900100]        <1> 	mov	eax, [u.pgdir]	
  3307 00005F8F E836F9FFFF          <1> 	call	get_pte
  3308                              <1>         ;jc	dmem_acc_7 ; 'insufficient memory' error
  3309                              <1> 	; 17/04/2021
  3310 00005F94 7305                <1> 	jnc	short dmem_acc_1
  3311                              <1> _dmem_acc_7:
  3312 00005F96 E985000000          <1> 	jmp	dmem_acc_7
  3313                              <1> dmem_acc_1:
  3314                              <1> 	; EAX = PTE value, EDX = PTE address
  3315 00005F9B A801                <1> 	test 	al, PTE_A_PRESENT
  3316                              <1> 	;jnz	short dmem_acc_2   ; 17/04/2021 (*)
  3317                              <1> 	; 17/04/2021 (temporary)
  3318 00005F9D 745F                <1> 	jz	short short dmem_acc_6  ; ! temporary ! (*)	
  3319                              <1> 	; 20/10/2023
  3320                              <1> 	; If the page table entry is zero or invalid -not present-
  3321                              <1> 	; it will be directy allocated for the physical memory section
  3322                              <1> 	; without using the M.A.T. (Specially for LFB access -generally-
  3323                              <1> 	; is at the beyod of the physical main memory end.)
  3324                              <1> 	; (M.A.T bits are not used for direct memory access. To cancel
  3325                              <1> 	; direct memory access also is out of the M.A.T scope because
  3326                              <1> 	; direct accessed physical pages are marked as SHARED on their
  3327                              <1> 	; PTE. Shared pages are not dealloaced.)
  3328                              <1> 
  3329                              <1> ; 17/04/2021
  3330                              <1> ; (following code is disabled as temporary)
  3331                              <1> ;
  3332                              <1> ;	or	eax, eax
  3333                              <1> ;	jz	short dmem_acc_6   ; Change PTE
  3334                              <1> ;	shr	eax, 1		; swap disk block (8 sectors) address
  3335                              <1> ;	; unlink swap disk block
  3336                              <1> ;	call	unlink_swap_block
  3337                              <1> ;	jmp	short dmem_acc_6
  3338                              <1> 
  3339                              <1> dmem_acc_2:
  3340 00005F9F A802                <1> 	test	al, PTE_A_WRITE   ; bit 1, writable (r/w) flag
  3341                              <1> 				  ; (must be 1)
  3342 00005FA1 7550                <1> 	jnz	short dmem_acc_4
  3343                              <1> 	; Read only -duplicated- page (belongs to a parent or a child)
  3344 00005FA3 66A90002            <1>         test    ax, PTE_DUPLICATED ; Was this page duplicated 
  3345                              <1> 				   ; as child's page ?
  3346 00005FA7 7455                <1> 	jz	short dmem_acc_5 ; Change PTE but don't deallocate the page!
  3347                              <1> 
  3348                              <1> 	;push	edi
  3349                              <1> 	;push	esi
  3350                              <1> 
  3351 00005FA9 51                  <1> 	push	ecx
  3352                              <1> 	;push	ebx
  3353 00005FAA 8B1D[7C900100]      <1> 	mov	ebx, [u.ppgdir] ; parent's page dir address (physical)
  3354                              <1> 	
  3355                              <1> 	; check the parent's PTE value is read only & same page or not.. 
  3356 00005FB0 89EF                <1> 	mov	edi, ebp
  3357 00005FB2 C1EF16              <1> 	shr	edi, PAGE_D_SHIFT ; 22
  3358                              <1> 	; EDI = page directory entry index (0-1023)
  3359 00005FB5 89EE                <1> 	mov	esi, ebp
  3360 00005FB7 C1EE0C              <1> 	shr	esi, PAGE_SHIFT ; 12	
  3361 00005FBA 81E6FF030000        <1> 	and	esi, PTE_MASK
  3362                              <1> 	; ESI = page table entry index (0-1023)
  3363                              <1> 
  3364 00005FC0 66C1E702            <1> 	shl	di, 2 ; * 4
  3365 00005FC4 01FB                <1> 	add	ebx, edi ; PDE offset (for the parent)
  3366 00005FC6 8B0F                <1> 	mov	ecx, [edi]
  3367 00005FC8 F6C101              <1> 	test	cl, PDE_A_PRESENT ; present (valid) or not ?
  3368 00005FCB 7425                <1> 	jz	short dmem_acc_3	; parent process does not use this page
  3369 00005FCD 6681E100F0          <1> 	and	cx, PDE_A_CLEAR ; 0F000h ; Clear attribute bits
  3370 00005FD2 66C1E602            <1> 	shl	si, 2 ; *4 
  3371 00005FD6 01CE                <1> 	add	esi, ecx ; PTE offset (for the parent)
  3372 00005FD8 8B1E                <1> 	mov	ebx, [esi]
  3373 00005FDA F6C301              <1> 	test	bl, PTE_A_PRESENT ; present or not ?
  3374 00005FDD 7413                <1> 	jz	short dmem_acc_3	; parent process does not use this page
  3375 00005FDF 662500F0            <1> 	and	ax, PTE_A_CLEAR ; 0F000h ; Clear attribute bits 
  3376 00005FE3 6681E300F0          <1> 	and	bx, PTE_A_CLEAR ; 0F000h ; Clear attribute bits
  3377 00005FE8 39D8                <1> 	cmp	eax, ebx	; parent's and child's pages are same ?
  3378 00005FEA 7506                <1> 	jne	short dmem_acc_3	; not same page
  3379                              <1> 				; deallocate the child's page
  3380 00005FEC 800E02              <1>         or      byte [esi], PTE_A_WRITE ; convert to writable page (parent)
  3381                              <1> 	;pop	ebx
  3382 00005FEF 59                  <1> 	pop	ecx
  3383 00005FF0 EB0C                <1> 	jmp	short dmem_acc_5
  3384                              <1> dmem_acc_3:
  3385                              <1> 	;pop	ebx
  3386 00005FF2 59                  <1> 	pop	ecx
  3387                              <1> dmem_acc_4:	
  3388 00005FF3 66A90004            <1> 	test	ax, PTE_SHARED ; shared or direct memory access indicator
  3389 00005FF7 7505                <1> 	jnz	short dmem_acc_5   ; AVL bit 1 = 1, do not deallocate this page!
  3390                              <1> 	;
  3391                              <1> 	;and	ax, PTE_A_CLEAR ; 0F000h ; clear lower 12 (attribute) bits
  3392 00005FF9 E879F9FFFF          <1> 	call	deallocate_page
  3393                              <1> dmem_acc_5:
  3394                              <1> 	;pop	esi
  3395                              <1> 	;pop	edi
  3396                              <1> dmem_acc_6:
  3397 00005FFE 89E8                <1> 	mov	eax, ebp ; physical page (offset=0) address
  3398                              <1> 	; EAX = memory page address
  3399                              <1> 	; EDX = PTE entry address (physical)
  3400 00006000 660D0704            <1> 	or	ax, PTE_A_PRESENT+PTE_A_USER+PTE_A_WRITE+PTE_SHARED
  3401                              <1> 			; present flag, bit 0 = 1
  3402                              <1> 			; user flag, bit 2 = 1	
  3403                              <1> 			; writable flag, bit 1 = 1
  3404                              <1> 			; direct memory access flag, bit 10 = 1
  3405                              <1> 			; (This page must not be deallocated!)
  3406 00006004 8902                <1> 	mov	[edx], eax  ; Update PTE value
  3407 00006006 49                  <1> 	dec	ecx ; remain count of contiguous pages
  3408 00006007 741E                <1> 	jz	short dmem_acc_8
  3409 00006009 81C500100000        <1> 	add	ebp, PAGE_SIZE ; next physical page address
  3410                              <1> 	; 22/07/2017
  3411                              <1> 	;mov	eax, ebp
  3412                              <1> 	; 12/05/2017
  3413 0000600F 8B1D[EC8E0100]      <1> 	mov	ebx, [base_addr] ; linear address (virtual+CORE)
  3414 00006015 81C300100000        <1> 	add	ebx, PAGE_SIZE	; next linear address
  3415 0000601B E948FFFFFF          <1>         jmp     dmem_acc_0
  3416                              <1> dmem_acc_7:  ; ERROR ! 
  3417 00006020 C7042404000000      <1> 	mov	dword [esp], ERR_MINOR_IM 
  3418                              <1> 		; Insufficient memory (minor) error!
  3419                              <1> 		; Major error = 0 (No protection fault)	
  3420                              <1> 	; cf = 1
  3421                              <1> dmem_acc_8:
  3422 00006027 58                  <1> 	pop	eax
  3423                              <1> 	;pop	edx
  3424                              <1> 	;pop	ecx
  3425                              <1> 	;pop	ebx
  3426                              <1> 	;pop	ebp
  3427 00006028 C3                  <1> 	retn
  3428                              <1> 
  3429                              <1> deallocate_user_pages:
  3430                              <1> 	; 20/05/2017
  3431                              <1> 	; 15/05/2017
  3432                              <1> 	; 20/02/2017
  3433                              <1> 	; 19/02/2017 (TRDOS 386 = TRDOS v2.0)
  3434                              <1> 	;
  3435                              <1> 	; Deallocate virtually contiguous user pages (memory block)
  3436                              <1> 	; (caller: 'sysdalloc' system call)
  3437                              <1> 	;
  3438                              <1> 	; INPUT ->
  3439                              <1> 	;	EBX = VIRTUAL ADDRESS (beginning address)
  3440                              <1> 	;	ECX = byte count
  3441                              <1> 	;	[u.pgdir] = user's page directory
  3442                              <1> 	;	[u.ppdir] = parent's page directory
  3443                              <1> 	;
  3444                              <1> 	; OUTPUT ->
  3445                              <1> 	;    If CF = 0 	
  3446                              <1> 	;	EAX = Deallocated memory bytes
  3447                              <1> 	;	  (Even if shared or read only pages will not be
  3448                              <1> 	;	   deallocated on M.A.T., this byte count will be
  3449                              <1> 	;	   returned as virtually deallocated bytes; in fact
  3450                              <1> 	;	   virtually deallocated user pages * 4096.) 
  3451                              <1> 	;	EBX = Virtual address (as rounded up)
  3452                              <1> 	;    If CF = 1    	
  3453                              <1> 	;	EAX = 0 (there is not any deallocated pages)
  3454                              <1> 	;
  3455                              <1> 	; Note: Empty page tables will not be deallocated!!!
  3456                              <1> 	;     (they will be deallocated at process termination stage)
  3457                              <1> 	;
  3458                              <1> 	; Modified Registers -> EAX, EDX, ESI, EDI, EBX, ECX, EBP
  3459                              <1> 	;
  3460 00006029 89DE                <1> 	mov	esi, ebx
  3461 0000602B 89F7                <1> 	mov	edi, esi
  3462 0000602D 01CF                <1> 	add	edi, ecx
  3463 0000602F 81C6FF0F0000        <1> 	add	esi, PAGE_SIZE - 1  ; 4095 (round up)	
  3464 00006035 C1EE0C              <1> 	shr	esi, PAGE_SHIFT
  3465 00006038 C1EF0C              <1> 	shr	edi, PAGE_SHIFT
  3466 0000603B 89F8                <1> 	mov	eax, edi ; end page
  3467 0000603D 29F0                <1> 	sub	eax, esi ; end page - start page
  3468 0000603F 0F86C8000000        <1> 	jna	da_u_pd_err  ; < 1
  3469 00006045 89F3                <1> 	mov	ebx, esi
  3470 00006047 C1E30C              <1> 	shl	ebx, PAGE_SHIFT ; virtual address (as rounded up)
  3471 0000604A 53                  <1> 	push	ebx ; *
  3472 0000604B 89C1                <1> 	mov	ecx, eax ; page count
  3473 0000604D C1E00C              <1> 	shl	eax, PAGE_SHIFT ; byte count as adjusted
  3474 00006050 50                  <1> 	push	eax ; **
  3475 00006051 8B1D[78900100]      <1> 	mov	ebx, [u.pgdir] ; physical addr of user's page dir
  3476 00006057 81C600040000        <1>  	add	esi, CORE/PAGE_SIZE 
  3477 0000605D 89F7                <1> 	mov	edi, esi
  3478 0000605F 81E7FF030000        <1> 	and	edi, PTE_MASK ; PTE entry in the page table
  3479 00006065 57                  <1> 	push	edi ; *** ; PTE index (of page directory)
  3480 00006066 C1EE0A              <1> 	shr	esi, PAGE_D_SHIFT - PAGE_SHIFT ; 22-12=10
  3481 00006069 89F2                <1> 	mov	edx, esi 
  3482                              <1> 	; EDX = PDE index
  3483 0000606B C1E602              <1> 	shl	esi, 2 ; convert PDE index to dword offset
  3484 0000606E 01DE                <1> 	add	esi, ebx ; add page directory address
  3485                              <1> da_u_pd_1:
  3486 00006070 AD                  <1> 	lodsd
  3487                              <1> 	;
  3488 00006071 89F5                <1> 	mov	ebp, esi ; 20/02/2017
  3489                              <1> 	; EBP = next PDE address
  3490                              <1> 	;
  3491 00006073 A801                <1> 	test	al, PDE_A_PRESENT ; bit 0, present flag (must be 1)
  3492 00006075 0F8487000000        <1> 	jz	da_u_pd_3 ; 20/05/2017	
  3493 0000607B 662500F0            <1> 	and	ax, PDE_A_CLEAR ; 0F000h ; clear lower 12 (attribute) bits
  3494                              <1> 	; EAX = PHYSICAL (flat) ADDRESS OF THE PAGE TABLE
  3495 0000607F 8B3C24              <1> 	mov	edi, [esp] ; ***
  3496                              <1> 	; EDI = PTE index (of complete page directory)
  3497                              <1> 	;and	edi, PTE_MASK ; PTE entry in the page table
  3498 00006082 C1E702              <1> 	shl	edi, 2 ; convert PTE index to dword offset
  3499 00006085 89FE                <1> 	mov	esi, edi ; PTE offset in page table (0-4092)
  3500 00006087 01C6                <1> 	add	esi, eax ; now, esi points to requested PTE
  3501                              <1> da_u_pt_0:
  3502 00006089 AD                  <1> 	lodsd
  3503 0000608A A801                <1> 	test	al, PTE_A_PRESENT ; bit 0, present flag (must be 1)
  3504 0000608C 7452                <1> 	jz	short da_u_pt_1
  3505                              <1> 	;
  3506 0000608E A802                <1> 	test	al, PTE_A_WRITE   ; bit 1, writable (r/w) flag
  3507                              <1> 				  ; (must be 1)
  3508 00006090 753C                <1> 	jnz	short da_u_pt_3
  3509                              <1> 	; Read only -duplicated- page (belongs to a parent or a child)
  3510 00006092 66A90002            <1>         test    ax, PTE_DUPLICATED ; Was this page duplicated 
  3511                              <1> 				   ; as child's page ?
  3512 00006096 7441                <1> 	jz	short da_u_pt_4 ; Clear PTE but don't deallocate the page!
  3513                              <1> 	;
  3514                              <1> 	; check the parent's PTE value is read only & same page or not.. 
  3515                              <1> 	; EDX = page directory entry index (0-1023)
  3516 00006098 52                  <1> 	push	edx ; ****
  3517                              <1> 	; EDI = page table entry offset (0-4092)
  3518 00006099 8B1D[7C900100]      <1> 	mov	ebx, [u.ppgdir] ; page directory of the parent process
  3519 0000609F 66C1E202            <1> 	shl	dx, 2 ; *4 
  3520 000060A3 01D3                <1> 	add	ebx, edx ; PDE address (for the parent)
  3521 000060A5 8B13                <1> 	mov	edx, [ebx] ; page table address
  3522 000060A7 F6C201              <1> 	test	dl, PDE_A_PRESENT ; present (valid) or not ?
  3523 000060AA 7421                <1> 	jz	short da_u_pt_2	; parent process does not use this page
  3524 000060AC 6681E200F0          <1> 	and	dx, PDE_A_CLEAR ; 0F000h ; Clear attribute bits
  3525                              <1> 	; EDI = page table entry offset (0-4092)
  3526 000060B1 01D7                <1> 	add	edi, edx	; PTE address (for the parent)
  3527 000060B3 8B1F                <1> 	mov	ebx, [edi]
  3528 000060B5 F6C301              <1> 	test	bl, PTE_A_PRESENT ; present or not ?
  3529 000060B8 7413                <1> 	jz	short da_u_pt_2	; parent process does not use this page
  3530 000060BA 662500F0            <1> 	and	ax, PTE_A_CLEAR ; 0F000h ; Clear attribute bits 
  3531 000060BE 6681E300F0          <1> 	and	bx, PTE_A_CLEAR ; 0F000h ; Clear attribute bits
  3532 000060C3 39D8                <1> 	cmp	eax, ebx	; parent's and child's pages are same ?
  3533 000060C5 7506                <1> 	jne	short da_u_pt_2	; not same page
  3534                              <1> 				; deallocate the child's page
  3535 000060C7 800F02              <1>         or      byte [edi], PTE_A_WRITE ; convert to writable page (parent)
  3536 000060CA 5A                  <1> 	pop	edx ; ****
  3537 000060CB EB0C                <1> 	jmp	short da_u_pt_4
  3538                              <1> 
  3539                              <1> ; 17/04/2021
  3540                              <1> ; ('da_u_pt_1' is disabled as temporary)
  3541                              <1> 
  3542                              <1> ;da_u_pt_1:
  3543                              <1> ;	or	eax, eax	; swapped page ?
  3544                              <1> ;	jz	short da_u_pt_5	; no
  3545                              <1> ;				; yes
  3546                              <1> ;	shr	eax, 1
  3547                              <1> ;	call	unlink_swap_block ; Deallocate swapped page block
  3548                              <1> ;				  ; on the swap disk (or in file)
  3549                              <1> ;	jmp	short da_u_pt_5
  3550                              <1> da_u_pt_2:
  3551 000060CD 5A                  <1> 	pop	edx ; ****
  3552                              <1> da_u_pt_3:
  3553 000060CE 66A90004            <1> 	test	ax, PTE_SHARED	; shared or direct memory access indicator
  3554 000060D2 7505                <1> 	jnz	short da_u_pt_4	; AVL bit 1 = 1, do not deallocate this page!
  3555                              <1> 	;
  3556                              <1> 	;and	ax, PTE_A_CLEAR ; 0F000h ; clear lower 12 (attribute) bits
  3557 000060D4 E89EF8FFFF          <1> 	call	deallocate_page ; set the mem allocation bit of this page
  3558                              <1> da_u_pt_4:
  3559 000060D9 C746FC00000000      <1> 	mov	dword [esi-4], 0 ; clear/reset PTE (child, dupl. as parent)
  3560                              <1> ; 17/04/2021 (temporary)
  3561                              <1> da_u_pt_1:
  3562                              <1> da_u_pt_5:
  3563                              <1> 	; 20/05/2017
  3564 000060E0 58                  <1> 	pop	eax ; *** PTE index (of page directory)
  3565 000060E1 49                  <1> 	dec	ecx ; remain page count
  3566 000060E2 7426                <1> 	jz	short da_u_pd_4
  3567 000060E4 40                  <1> 	inc	eax ; next PTE
  3568 000060E5 6625FF03            <1> 	and	ax, PTE_MASK ; PTE entry index in the page table
  3569 000060E9 50                  <1> 	push	eax ; *** (save again)
  3570                              <1> 	;mov	edi, eax
  3571                              <1> 	;and 	di, PTE_MASK
  3572                              <1> 	;cmp	edi, PAGE_SIZE / 4 ; 1024
  3573                              <1> 	;jnb	short da_u_pd_2
  3574 000060EA 89C7                <1> 	mov	edi, eax
  3575 000060EC C1E702              <1> 	shl	edi, 2 ; convert index to dword offset
  3576                              <1> 	;test	ax, PTE_MASK ; 3FFh
  3577 000060EF 09C0                <1> 	or	eax, eax
  3578 000060F1 7596                <1> 	jnz	short da_u_pt_0 ; 1-1023
  3579                              <1> da_u_pd_2:
  3580 000060F3 42                  <1> 	inc	edx
  3581                              <1> 	; 20/05/2017
  3582 000060F4 6681E2FF03          <1> 	and	dx, PTE_MASK  ; 3FFh
  3583 000060F9 740F                <1> 	jz	short da_u_pd_4  ; 0 (1024)
  3584                              <1> 	;cmp	edx, 1024
  3585                              <1> 	;jnb	short da_u_pd_4
  3586 000060FB 89EE                <1> 	mov	esi, ebp ; 20/02/2017
  3587 000060FD E96EFFFFFF          <1> 	jmp	da_u_pd_1
  3588                              <1> da_u_pd_3:
  3589                              <1> 	; 15/05/2017 (empty page directory entry)
  3590 00006102 81E900040000        <1> 	sub	ecx, 1024
  3591 00006108 77E9                <1> 	ja	short da_u_pd_2 ; 20/05/2017
  3592                              <1> da_u_pd_4:
  3593 0000610A 58                  <1> 	pop	eax ; **
  3594 0000610B 5B                  <1> 	pop	ebx ; *
  3595 0000610C C3                  <1> 	retn
  3596                              <1> 
  3597                              <1> da_u_pd_err:
  3598 0000610D 31C0                <1> 	xor	eax, eax
  3599 0000610F F9                  <1> 	stc	
  3600 00006110 C3                  <1> 	retn
  3601                              <1> 
  3602                              <1> allocate_user_pages:
  3603                              <1> 	; 20/05/2017
  3604                              <1> 	; 01/05/2017, 02/05/2017, 15/05/2017
  3605                              <1> 	; 04/03/2017
  3606                              <1> 	; 20/02/2017 (TRDOS 386 = TRDOS v2.0)
  3607                              <1> 	;
  3608                              <1> 	; Allocate physically contiguous user pages (memory block)
  3609                              <1> 	; (caller: 'sysalloc' system call)
  3610                              <1> 	;
  3611                              <1> 	; Note: This procedure does not alloc a page's itself
  3612                              <1> 	;	(page bits) on Memory Allocation Table.
  3613                              <1> 	;	(allocate_memory_block is needed before this proc)
  3614                              <1> 	;
  3615                              <1> 	; INPUT ->
  3616                              <1> 	;	EAX = PHYSICAL ADDRESS (beginning address)
  3617                              <1> 	;	EBX = VIRTUAL ADDRESS (beginning address)
  3618                              <1> 	;	ECX = byte count (>=4096)
  3619                              <1> 	;	[u.pgdir] = user's page directory
  3620                              <1> 	;	
  3621                              <1> 	;	Note: All addresses are (must be) already adjusted
  3622                              <1> 	;	to page	borders, otherwise, lower 12bits of addresses
  3623                              <1> 	;	and byte count would be truncated.
  3624                              <1> 	;
  3625                              <1> 	; OUTPUT ->
  3626                              <1> 	;	none
  3627                              <1> 	;
  3628                              <1> 	;	CF = 1 -> insufficient memory error
  3629                              <1> 	;
  3630                              <1> 	; Note: All pages will be allocated in physical page order 
  3631                              <1> 	;	from the beginning page address. 
  3632                              <1> 	;	* A new page table will be added to the page dir
  3633                              <1> 	;	  when the requested PDE is invalid.
  3634                              <1> 	;	* Those pages will not be added to swap queue
  3635                              <1> 	;	  because main purpose of this allocation is to
  3636                              <1> 	;	  set a direct memory access (DMA controller) buffer.
  3637                              <1> 	;	 (Swapping out a page in a DMA buffer would be wrong!)
  3638                              <1> 	;	* Previous content of page tables (PTEs) would be
  3639                              <1> 	;	  (should be) deallocated before entering this
  3640                              <1> 	;	  procedure. So, new page table entries (PTEs)
  3641                              <1> 	;	  directly will be written without checking
  3642                              <1> 	;	  their previous content.	
  3643                              <1> 	;	* Only solution to increase free memory by removing
  3644                              <1> 	;	  that non-swappable memory block is to terminate
  3645                              <1> 	;	  the process or to wait until the process will 
  3646                              <1> 	;	  deallocate that memory block as itself. ('sysdalloc')
  3647                              <1> 	;	  (No problem, if the process does not grab all of
  3648                              <1> 	;	  -very big amount of- free memory by using
  3649                              <1> 	;	  'sysalloc' system call!?)
  3650                              <1> 	;	  (Even if the process has grabbed all of free memory, 
  3651                              <1> 	;	  no problem if the process is not running in 
  3652                              <1> 	;	  multitasking mode. No problem in multitasking
  3653                              <1> 	;	  mode if there is not another process which is running
  3654                              <1> 	;	  or waiting or sleeping for an event as it's pages
  3655                              <1> 	;	  are swapped-out. But a new process can not start to
  3656                              <1> 	;	  run if all of free memory has beeen allocated 
  3657                              <1> 	;	  by running processes. Deallocation -'sysdalloc'- 
  3658                              <1> 	;	  or terminate a running process is needed 
  3659                              <1> 	;	  in order to run a new process.) 
  3660                              <1> 	;
  3661                              <1> 	; Modified Registers -> EAX, EDX, ESI, EDI, EBX, ECX, EBP
  3662                              <1> 	;
  3663                              <1> 
  3664                              <1> 	; 01/05/2017
  3665 00006111 662500F0            <1> 	and	ax, ~PAGE_OFF
  3666 00006115 6681E300F0          <1> 	and	bx, ~PAGE_OFF
  3667                              <1> 	; 02/05/2017 
  3668 0000611A BD00F0FFFF          <1> 	mov	ebp, 0FFFFF000h ; 4 Giga Bytes - 4096 Bytes (for Stack)
  3669 0000611F C1E90C              <1> 	shr	ecx, PAGE_SHIFT ; page count
  3670 00006122 83F901              <1> 	cmp	ecx, 1
  3671 00006125 7251                <1> 	jb	short a_u_im_retn
  3672 00006127 89C2                <1> 	mov	edx, eax
  3673 00006129 01CA                <1> 	add	edx, ecx
  3674 0000612B 724B                <1> 	jc	short a_u_im_retn
  3675 0000612D 39D5                <1> 	cmp	ebp, edx
  3676 0000612F 7247                <1> 	jb	short a_u_im_retn
  3677 00006131 89DA                <1> 	mov	edx, ebx
  3678 00006133 81C200004000        <1> 	add	edx, CORE
  3679 00006139 723D                <1> 	jc	short a_u_im_retn	
  3680 0000613B 01CA                <1> 	add	edx, ecx
  3681 0000613D 7239                <1> 	jc	short a_u_im_retn
  3682 0000613F 39D5                <1> 	cmp	ebp, edx
  3683 00006141 7235                <1> 	jb	short a_u_im_retn
  3684                              <1> 	;
  3685 00006143 89C5                <1> 	mov	ebp, eax ; physical address
  3686 00006145 89DE                <1> 	mov	esi, ebx
  3687 00006147 81C600004000        <1> 	add	esi, CORE ; start of user's memory (4M) 
  3688 0000614D C1EE0C              <1> 	shr	esi, PAGE_SHIFT ; higher 20 bits of the linear address
  3689                              <1> 	;shr	ecx, PAGE_SHIFT ; page count
  3690 00006150 8B1D[78900100]      <1> 	mov	ebx, [u.pgdir] ; physical addr of user's page dir
  3691 00006156 89F7                <1> 	mov	edi, esi
  3692 00006158 81E7FF030000        <1> 	and	edi, PTE_MASK ; PTE entry index in the page table
  3693 0000615E 57                  <1> 	push	edi  ; * ; PTE index (in page directory)
  3694 0000615F C1EE0A              <1> 	shr	esi, PAGE_D_SHIFT - PAGE_SHIFT ; 22-12=10
  3695 00006162 89F2                <1> 	mov	edx, esi 
  3696                              <1> 	; EDX = PDE index
  3697 00006164 C1E602              <1> 	shl	esi, 2 ; convert PDE index to dword offset
  3698 00006167 01DE                <1> 	add	esi, ebx ; add page directory address
  3699                              <1> a_u_pd_0:
  3700 00006169 AD                  <1> 	lodsd
  3701                              <1> 	;
  3702 0000616A 89F3                <1> 	mov	ebx, esi ; next PDE address
  3703                              <1> 	;
  3704 0000616C A801                <1> 	test	al, PDE_A_PRESENT ; bit 0, present flag (must be 1)
  3705 0000616E 7513                <1> 	jnz	short a_u_pd_2
  3706                              <1> 	;
  3707                              <1> 	; empty PDE (it does not point to valid page table address)
  3708 00006170 E843F6FFFF          <1> 	call	allocate_page  ; (allocate a new page table)
  3709 00006175 7302                <1> 	jnc	short a_u_pd_1 ; OK... now, we have a new page table.
  3710                              <1> 	; cf = 1
  3711                              <1> 	; There is not a free memory page to allocate a new page table !!!
  3712 00006177 5E                  <1> 	pop	esi ; *
  3713                              <1> a_u_im_retn:
  3714 00006178 C3                  <1> 	retn	; return to 'sysalloc' with 'insufficient memory' error
  3715                              <1> 	;
  3716                              <1> a_u_pd_1: ; clear the new page table content 
  3717                              <1> 	; EAX = Physical (base) address of the new page table
  3718 00006179 E8ABF6FFFF          <1> 	call	clear_page ; Clear page content
  3719                              <1> 	;
  3720 0000617E 0C07                <1> 	or	al, PDE_A_PRESENT + PDE_A_WRITE + PDE_A_USER
  3721                              <1> 		 ; set bit 0, bit 1 and bit 2 to 1
  3722                              <1> 		 ; (present, writable, user)
  3723 00006180 8946FC              <1> 	mov	[esi-4], eax
  3724                              <1> a_u_pd_2:
  3725 00006183 662500F0            <1> 	and	ax, PDE_A_CLEAR ; 0F000h ; clear lower 12 (attribute) bits
  3726                              <1> 	; EAX = PHYSICAL (flat) ADDRESS OF THE PAGE TABLE
  3727 00006187 8B3C24              <1> 	mov	edi, [esp] ; *
  3728                              <1> 	; EDI = PTE index (of page directory)
  3729                              <1> 	;and	edi, PTE_MASK ; PTE entry index in the page table	
  3730                              <1> 	; EBX = next PDE address
  3731 0000618A 89FE                <1> 	mov	esi, edi ; PTE index in page table (0-1023)
  3732 0000618C C1E702              <1> 	shl	edi, 2 ; convert PTE index to dword offset
  3733 0000618F 01C7                <1> 	add	edi, eax ; now, edi points to requested PTE
  3734                              <1> a_u_pt_0:
  3735                              <1> 	; 02/05/2017
  3736 00006191 8B07                <1> 	mov	eax, [edi]
  3737                              <1> 	;
  3738 00006193 A801                <1> 	test	al, PTE_A_PRESENT ; bit 0, present flag (must be 1)
  3739 00006195 7445                <1> 	jz	short a_u_pt_1
  3740                              <1> 	;
  3741 00006197 A802                <1> 	test	al, PTE_A_WRITE   ; bit 1, writable (r/w) flag
  3742                              <1> 				  ; (must be 1)
  3743 00006199 7550                <1> 	jnz	short a_u_pt_3
  3744                              <1> 	; Read only -duplicated- page (belongs to a parent or a child)
  3745 0000619B 66A90002            <1>         test    ax, PTE_DUPLICATED ; Was this page duplicated 
  3746                              <1> 				   ; as child's page ?
  3747 0000619F 7455                <1> 	jz	short a_u_pt_4	; Clear PTE but don't deallocate the page!
  3748                              <1> 	;
  3749                              <1> 	; check the parent's PTE value is read only & same page or not.. 
  3750                              <1> 	; EDX = page directory entry index (0-1023)
  3751 000061A1 52                  <1> 	push	edx ; **
  3752 000061A2 53                  <1> 	push	ebx ; ***
  3753                              <1> 	; ESI = page table entry index (0-1023)
  3754                              <1> 	;push	esi ; **** ; 20/05/2017
  3755 000061A3 8B1D[7C900100]      <1> 	mov	ebx, [u.ppgdir] ; page directory of the parent process
  3756 000061A9 66C1E202            <1> 	shl	dx, 2 ; *4 
  3757 000061AD 01D3                <1> 	add	ebx, edx ; PTE address,0 (for the parent)
  3758 000061AF 8B13                <1> 	mov	edx, [ebx] ; page table address
  3759 000061B1 F6C201              <1> 	test	dl, PDE_A_PRESENT ; present (valid) or not ?
  3760 000061B4 7433                <1> 	jz	short a_u_pt_2	; parent process does not use this page
  3761 000061B6 6681E200F0          <1> 	and	dx, PDE_A_CLEAR ; 0F000h ; Clear attribute bits
  3762 000061BB 66C1E602            <1> 	shl	si, 2 ; *4
  3763                              <1> 	; ESI = page table entry offset (0-4092)
  3764 000061BF 01D6                <1> 	add	esi, edx	; PTE address (for the parent)
  3765 000061C1 8B1E                <1> 	mov	ebx, [esi]
  3766 000061C3 F6C301              <1> 	test	bl, PTE_A_PRESENT ; present or not ?
  3767 000061C6 7421                <1> 	jz	short a_u_pt_2	; parent process does not use this page
  3768 000061C8 662500F0            <1> 	and	ax, PTE_A_CLEAR ; 0F000h ; Clear attribute bits 
  3769 000061CC 6681E300F0          <1> 	and	bx, PTE_A_CLEAR ; 0F000h ; Clear attribute bits
  3770 000061D1 39D8                <1> 	cmp	eax, ebx	; parent's and child's pages are same ?
  3771 000061D3 7514                <1> 	jne	short a_u_pt_2	; not same page
  3772                              <1> 				; deallocate the child's page
  3773 000061D5 800E02              <1>         or      byte [esi], PTE_A_WRITE ; convert to writable page (parent)
  3774                              <1> 	;pop	esi ; **** ; 20/05/2017
  3775 000061D8 5B                  <1> 	pop	ebx ; ***
  3776 000061D9 5A                  <1> 	pop	edx ; **
  3777 000061DA EB1A                <1> 	jmp	short a_u_pt_4
  3778                              <1> a_u_pt_1:
  3779 000061DC 09C0                <1> 	or	eax, eax	; swapped page ?
  3780 000061DE 7416                <1> 	jz	short a_u_pt_4	; no
  3781                              <1> 				; yes
  3782 000061E0 D1E8                <1> 	shr	eax, 1
  3783 000061E2 E8AFF9FFFF          <1> 	call	unlink_swap_block ; Deallocate swapped page block
  3784                              <1> 				  ; on the swap disk (or in file)
  3785 000061E7 EB0D                <1> 	jmp	short a_u_pt_4
  3786                              <1> a_u_pt_2:
  3787                              <1> 	;pop	esi ; **** ; 20/05/2017
  3788 000061E9 5B                  <1> 	pop	ebx ; ***
  3789 000061EA 5A                  <1> 	pop	edx ; **
  3790                              <1> a_u_pt_3:
  3791 000061EB 66A90004            <1> 	test	ax, PTE_SHARED	; shared or direct memory access indicator
  3792 000061EF 7505                <1> 	jnz	short a_u_pt_4	; AVL bit 1 = 1, do not deallocate this page!
  3793                              <1> 	;
  3794                              <1> 	;and	ax, PTE_A_CLEAR ; 0F000h ; clear lower 12 (attribute) bits
  3795 000061F1 E881F7FFFF          <1> 	call	deallocate_page ; set the mem allocation bit of this page
  3796                              <1> 	;
  3797                              <1> a_u_pt_4:
  3798 000061F6 89E8                <1> 	mov	eax, ebp ; physical address
  3799 000061F8 0C07                <1> 	or	al, PTE_A_PRESENT + PTE_A_WRITE + PTE_A_USER ; 04/03/2017
  3800 000061FA AB                  <1> 	stosd
  3801 000061FB 5E                  <1> 	pop	esi ; * ; 20/05/2017
  3802 000061FC 49                  <1> 	dec	ecx ; remain page count
  3803 000061FD 7417                <1> 	jz	short a_u_pd_5
  3804 000061FF 81C500100000        <1> 	add	ebp, PAGE_SIZE
  3805 00006205 46                  <1> 	inc	esi ; next PTE (index)
  3806                              <1> 	; 20/05/2017
  3807                              <1> 	;cmp	esi, PAGE_SIZE/4 ; 1024
  3808                              <1> 	;jb	short a_u_pt_0
  3809 00006206 6681E6FF03          <1> 	and	si, PTE_MASK ; 3FFh (0 to 1023)
  3810 0000620B 56                  <1> 	push	esi ; *
  3811 0000620C 7583                <1> 	jnz	short a_u_pt_0 ; > 0 (<1024)
  3812                              <1> a_u_pd_3:
  3813 0000620E 42                  <1> 	inc	edx
  3814                              <1> ;	cmp	edx, 1024
  3815                              <1> ;	jnb	short a_u_pd_4 ; 02/05/2017 (error!, ecx > 0)
  3816 0000620F 89DE                <1> 	mov	esi, ebx ; the next PDE address
  3817 00006211 E953FFFFFF          <1> 	jmp	a_u_pd_0
  3818                              <1> a_u_pd_4:
  3819                              <1> 	; 02/05/2017
  3820                              <1> ;	stc
  3821                              <1> a_u_pd_5:
  3822                              <1> 	; 20/05/2017
  3823                              <1> 	;pop	edi ; *
  3824 00006216 C3                  <1> 	retn
  3825                              <1> 
  3826                              <1> 	; 28/11/2023
  3827                              <1> ;a_lfb_k__err:
  3828                              <1> 	;retn
  3829                              <1> 
  3830                              <1> allocate_lfb_pages_for_kernel:
  3831                              <1> 	; 02/12/2023
  3832                              <1> 	; 29/11/2023
  3833                              <1> 	; 28/11/2023
  3834                              <1> 	; 20/10/2023 - TRDOS 386 v2.0.7
  3835                              <1> 	; (only the overlapped main memory pages will be allocated)
  3836                              <1> 	; 28/11/2023
  3837                              <1> 	; (but all LFB pages will be added to the kernel's page tables)
  3838                              <1> 	; (NOTE: LFB size -which will be used- is the size of the max.
  3839                              <1> 	;  recognized screen resolution. For example: 1024*768*4 bytes)
  3840                              <1> 	; 15/12/2020
  3841                              <1> 	; 14/12/2020 - TRDOS 386 v2.0.3
  3842                              <1> 	; Set kernel page tables for linear frame buffer 
  3843                              <1> 	;
  3844                              <1> 	; Input:
  3845                              <1> 	;	;[LFB_ADDR] = linear frame buffer base address
  3846                              <1> 	;	;[LFB_SIZE] = linear frame buffer size in bytes
  3847                              <1> 	;	; 29/11/2023
  3848                              <1> 	;	;ebx = Linear frame buffer base address as page num
  3849                              <1> 	;	; 20/10/2023
  3850                              <1> 	;	esi = linear frame buffer base address
  3851                              <1> 	;	ecx = memory size in pages = [memory_size]
  3852                              <1> 	;	; 28/11/2023
  3853                              <1> 	;	edx = linear frame buffer size in pages
  3854                              <1> 	; Output:
  3855                              <1> 	;	none
  3856                              <1> 	;	cf = 1 -> error
  3857                              <1> 	;
  3858                              <1> 	; Modified registers: eax, ebx, ecx, edx, esi, edi, ebp
  3859                              <1> 
  3860                              <1> 
  3861                              <1> ; 02/12/2023 ; (!**!)
  3862                              <1> ; ('memory size' -for M.A.T.- is always <= LFB stat/base address) 
  3863                              <1> %if 0
  3864                              <1> 
  3865                              <1> 	; 29/11/2023
  3866                              <1> 	; allocate LFB blocks which < memory size at first
  3867                              <1> 	
  3868                              <1> 	;mov	eax, edx
  3869                              <1> 	;shl	eax, 12
  3870                              <1> 	;add	eax, esi
  3871                              <1> 	;jc	short a_lfb_k__err ; > 4GB limit
  3872                              <1> 	;
  3873                              <1> 	;;mov	eax, 1048576 ; page count of (full) 4GB memory
  3874                              <1> 	;;sub	eax, edx
  3875                              <1> 	;;cmp	eax, esi
  3876                              <1> 	;jb	short a_lfb_k__err ; > 4GB limit
  3877                              <1> 
  3878                              <1> 	mov	ebx, esi ; LFB base/start address
  3879                              <1> 	shr	ebx, 12	 ; convert byte address to page address
  3880                              <1> 	; ebx = LFB start/base page number 
  3881                              <1> 
  3882                              <1> 	sub	ecx, ebx
  3883                              <1> 	jna	short a_lfb_k_2 ; skip M.A.T. bit allocation 
  3884                              <1> 	cmp	ecx, edx
  3885                              <1> 	jna	short a_lfb_k_0
  3886                              <1> 	mov	ecx, edx
  3887                              <1> a_lfb_k_0:
  3888                              <1> 	sub	edx, ecx
  3889                              <1> 	jna	short a_lfb_k_1
  3890                              <1> 
  3891                              <1> 	; edx = remain count of LFB pages which are out of the M.A.T. 
  3892                              <1> 	; ebx = LFB start/base page number
  3893                              <1> 	; ecx = page allocation count in the M.A.T.
  3894                              <1> 
  3895                              <1> 	;mov	eax, 4096
  3896                              <1> 	;mul	ecx
  3897                              <1> 	mov	eax, ecx
  3898                              <1> 	shl	eax, 12 ; * 4096
  3899                              <1> 
  3900                              <1> 	add	esi, eax
  3901                              <1> 	; esi = LFB address just after the main memory if there is	
  3902                              <1> a_lfb_k_1:
  3903                              <1> 	mov	eax, ebx ; LFB start/base page number
  3904                              <1> 	call	allocate_lfb_memory_block
  3905                              <1> 
  3906                              <1> 	; here if there is, remain (the 2nd) part of the LFB 
  3907                              <1> 	; will be allocated by using new kernel page table(s)
  3908                              <1> 	; (but M.A.T. bits will not be cleared because 
  3909                              <1> 	;  the 2nd LFB part is out of the M.A.T.)	
  3910                              <1> 	
  3911                              <1> 	and	edx, edx
  3912                              <1> 	jz	short a_lfb_k_6  ; all LFB pages have been allocated
  3913                              <1> 
  3914                              <1> %endif
  3915                              <1> 
  3916                              <1> a_lfb_k_2:
  3917                              <1> 	; 29/11/2023
  3918 00006217 C1EE0C              <1> 	shr	esi, 12	; convert LFB address to page number
  3919                              <1> 	; edx = count of pages to be added (in kernel page tables)
  3920                              <1> 	; 28/11/2023
  3921 0000621A 89D5                <1> 	mov	ebp, edx
  3922 0000621C 81C2FF030000        <1> 	add	edx, 1023 ; round up
  3923 00006222 C1EA0A              <1> 	shr	edx, 10	  ; / 1024
  3924                              <1> 	; edx = count of kernel page tables to be added
  3925                              <1> 	; (edx = 1 or edx = 2)
  3926                              <1> 	; ((1024*768*4 = 3145728 bytes, 768 PTEs, 1 page table))
  3927                              <1> 	; ((1920*1080*4 = 8294400 bytes, 2025 PTEs, 2 page tables)) 
  3928 00006225 E88EF5FFFF          <1> 	call	allocate_page
  3929                              <1> 	;jc	short a_lfb_k__err
  3930                              <1> 	; (mem alloc error is not expected at this startup stage)
  3931                              <1> 	; eax = physical address of the new page table
  3932 0000622A 89F7                <1> 	mov	edi, esi  ; LFB start/base page number
  3933 0000622C C1EF0A              <1> 	shr	edi, 10
  3934                              <1> 	; edi = PDE entry number of the Linear Frame Buffer addr
  3935                              <1> 	; (edi = 832 for 0D0000000h, edi = 896 for 0E0000000h)
  3936 0000622F C1E702              <1> 	shl	edi, 2
  3937                              <1> 	; edi = PDE offset
  3938 00006232 033D[88780100]      <1> 	add	edi, [k_page_dir] ; Kernel's Page Dir Address
  3939 00006238 50                  <1> 	push	eax ; +
  3940 00006239 660D0304            <1> 	or	ax, PDE_A_PRESENT + PDE_A_WRITE + PDE_EXTERNAL
  3941                              <1> 				; supervisor + read&write + present
  3942                              <1> 				; + external memory block (LFB)
  3943 0000623D AB                  <1> 	stosd
  3944                              <1> 
  3945 0000623E 4A                  <1> 	dec	edx
  3946 0000623F 740C                <1> 	jz	short a_lfb_k_3	; only 1 new page table
  3947                              <1> 
  3948                              <1> 	; the 2nd page table
  3949 00006241 E872F5FFFF          <1> 	call	allocate_page
  3950                              <1> 	;jc	short a_lfb_k__err
  3951                              <1> 	; (mem alloc error is not expected at this startup stage)
  3952                              <1> 	; eax = physical address of the new page table
  3953 00006246 89C3                <1> 	mov	ebx, eax
  3954 00006248 660D0304            <1> 	or	ax, PDE_A_PRESENT + PDE_A_WRITE + PDE_EXTERNAL
  3955                              <1> 				; supervisor + read&write + present
  3956                              <1> 				; + external memory block (LFB)
  3957 0000624C AB                  <1> 	stosd
  3958                              <1> 
  3959                              <1> a_lfb_k_3:
  3960                              <1> 	; set new PTEs
  3961                              <1> 	;
  3962                              <1> 	; ebp = count of pages (PTEs) to be allocated
  3963 0000624D 5F                  <1> 	pop	edi ; +	 ; 1st page table address	
  3964                              <1> 	; 29/11/2023
  3965 0000624E B900040000          <1> 	mov	ecx, 1024	; number of PTEs in a page table
  3966 00006253 89F0                <1> 	mov	eax, esi	; LFB base/start page number
  3967                              <1> 			 	; (may be the 2nd part of the LFB)
  3968 00006255 C1E00C              <1> 	shl	eax, 12
  3969 00006258 660D0304            <1> 	or	ax, PTE_A_PRESENT + PTE_A_WRITE + PTE_EXTERNAL
  3970                              <1> 				; supervisor + read&write + present
  3971                              <1> 				; + external memory block (LFB)
  3972                              <1> a_lfb_k_4:
  3973 0000625C AB                  <1> 	stosd			; save as PTE
  3974 0000625D 4D                  <1> 	dec	ebp
  3975 0000625E 740D                <1> 	jz	short a_lfb_k_5
  3976 00006260 0500100000          <1> 	add	eax, 4096	; the next page address
  3977 00006265 E2F5                <1> 	loop	a_lfb_k_4
  3978                              <1> 	
  3979                              <1> 	;and	ebx, ebx
  3980                              <1> 	;jz	short a_lfb_k_6
  3981 00006267 89DF                <1> 	mov	edi, ebx	; the 2nd page table address
  3982                              <1> 	;xor	ebx, ebx
  3983                              <1> 	;mov	ecx, 1024
  3984 00006269 B504                <1> 	mov	ch, 4 ; cx = 4*256 = 1024
  3985 0000626B EBEF                <1> 	jmp	short a_lfb_k_4 ; only 1 more loop (no the 3rd pt)
  3986                              <1> 				; (ebp <= 1024 here)
  3987                              <1> a_lfb_k_5:
  3988 0000626D 49                  <1> 	dec	ecx
  3989 0000626E 7404                <1> 	jz	short a_lfb_k_6
  3990 00006270 31C0                <1> 	xor	eax, eax	; clear page table entry (empty)
  3991 00006272 F3AB                <1> 	rep	stosd
  3992                              <1> a_lfb_k_6:
  3993                              <1> 	; 29/11/2023
  3994 00006274 C3                  <1> 	retn
  3995                              <1> 
  3996                              <1> ; 28/11/2023
  3997                              <1> %if 0 
  3998                              <1> 
  3999                              <1> allocate_lfb_pages_for_kernel:
  4000                              <1> 	; 20/10/2023 - TRDOS 386 v2.0.7
  4001                              <1> 	; (only the overlapped main memory pages will be allocated)
  4002                              <1> 	; ((if LFB base/start address is greater than -or equal to-
  4003                              <1> 	;      main memory size, this procedure is not called/used)) 
  4004                              <1> 	; 15/12/2020
  4005                              <1> 	; 14/12/2020 - TRDOS 386 v2.0.3
  4006                              <1> 	; Set kernel page tables for linear frame buffer 
  4007                              <1> 	;
  4008                              <1> 	; Input:
  4009                              <1> 	;	;[LFB_ADDR] = linear frame buffer base address
  4010                              <1> 	;	;[LFB_SIZE] = linear frame buffer size in bytes
  4011                              <1> 	;	; 20/10/2023
  4012                              <1> 	;	eax = Linear frame buffer base address as page num
  4013                              <1> 	;	      (eax < memory size)
  4014                              <1> 	;	esi = linear frame buffer base address
  4015                              <1> 	;	ecx = memory size in pages = [memory_size]
  4016                              <1> 	; Output:
  4017                              <1> 	;	none
  4018                              <1> 	;	cf = 1 -> error
  4019                              <1> 	;
  4020                              <1> 	; Modified registers: eax, ecx, edx, edi
  4021                              <1> 
  4022                              <1> 	; 20/10/2023
  4023                              <1> 	;mov	edi, [LFB_ADDR]
  4024                              <1> 	;mov	edx, [LFB_SIZE]
  4025                              <1> 
  4026                              <1> 	;;;
  4027                              <1> 	; 20/10/2023
  4028                              <1> 	mov	edi, eax ; LFB base/start page number
  4029                              <1> 	;mov	ecx, [memory_size]
  4030                              <1> 	sub	ecx, eax	
  4031                              <1> 
  4032                              <1> 	; ecx = number of pages to be set as (already) allocated 
  4033                              <1> 	;;;
  4034                              <1> 
  4035                              <1> 	; 20/10/2023
  4036                              <1> 	shr	edi, 10 ; convert page number to PDE entry number
  4037                              <1> 			; (1024 pages per page table -the shift
  4038                              <1> 			; result is a page table index number
  4039                              <1> 			; or page directory entry number <= 1023)
  4040                              <1> 	;shr	edi, 22	; convert address to page number
  4041                              <1> 			; and then convert it to PDE entry offset
  4042                              <1> 			; (1 PDE is for 4MB, 22 bit shift)
  4043                              <1> 
  4044                              <1> 	shl	di, 2	; * 4 to obtain the PDE offset
  4045                              <1> 
  4046                              <1> 	; 20/10/2023
  4047                              <1> 	;;add	edx, 4095
  4048                              <1> 	;shr	edx, 12	; convert LFB size to LFB page count
  4049                              <1> 	
  4050                              <1> 	;mov	ecx, edx ; * ; LFB page count
  4051                              <1> 	; 20/10/2023
  4052                              <1> 	mov	edx, ecx ; *
  4053                              <1> 			; 20/10/2023
  4054                              <1> 			; edx = page count (to be set as allocated)
  4055                              <1> 			; 	from the LFB start page
  4056                              <1> 			; (it may be <= linear frame buffer size) 
  4057                              <1> 
  4058                              <1> 	add	ecx, 1023 ; page count + 1023
  4059                              <1> 	shr	ecx, 10 ; convert to page directory entry count	
  4060                              <1> 			; (page table count)
  4061                              <1> 	push	ecx ; **
  4062                              <1> 	shl	ecx, 12 ; convert to byte count
  4063                              <1> 
  4064                              <1> 	; 20/10/2023
  4065                              <1> 	; (absolute allocation is needed instead of the first fit)
  4066                              <1> 	;xor	eax, eax ; first available pages
  4067                              <1> 	
  4068                              <1> 	; 20/10/2023
  4069                              <1> 	;mov	esi, [LFB_ADDR]
  4070                              <1> 	mov	eax, esi ; linear frame buffer's base/start address	
  4071                              <1> 
  4072                              <1> 	; allocate contiguous memory block for these kernel pages
  4073                              <1> 	
  4074                              <1> 	;call	allocate_memory_block
  4075                              <1> 	; 20/10/2023 
  4076                              <1> 	; (short way to set LFB page bits on the 'M.A.T.)
  4077                              <1> 	call	allocate_lfb_memory_block ; in 'allocate_memory_block'	
  4078                              <1> 
  4079                              <1> 	; eax = start address of (contiguous) memory block
  4080                              <1> 	pop	ecx ; ** ; PDE count
  4081                              <1> 	jnc	short a_lfb_k_1
  4082                              <1> 	; error (cf=1)
  4083                              <1> 	retn
  4084                              <1> a_lfb_k_1:
  4085                              <1> 	; Allocate (new) page tables in kernel's page directory
  4086                              <1> 	push	ecx ; PDE (page table) count
  4087                              <1> 	push	eax ; start address of contiguous memory pages
  4088                              <1> 		    ; (at page boundary)	
  4089                              <1> 	; edi = 1st page directory entry offset
  4090                              <1> 	add	edi, [k_page_dir] ; Kernel's Page Dir Address
  4091                              <1> a_lfb_k_2:
  4092                              <1> 	or	ax, PDE_A_PRESENT + PDE_A_WRITE + PDE_EXTERNAL
  4093                              <1> 				; supervisor + read&write + present 	
  4094                              <1> 				; + external memory block (LFB)
  4095                              <1> 	stosd
  4096                              <1> 	add	eax, 4096
  4097                              <1> 	loop	a_lfb_k_2
  4098                              <1> 	
  4099                              <1> 	pop	edi ; start addr of contiguous memory pages
  4100                              <1> 	pop	ecx ; page table (PDE) count
  4101                              <1> 
  4102                              <1> 	; Allocate pages in (new) kernel page tables
  4103                              <1> 	
  4104                              <1> 	; (Note: page tables are contiguous in pyhsical memory)
  4105                              <1> 	shl	ecx, 10 ; * 1024, convert to (total) PTE count 
  4106                              <1> 	
  4107                              <1> 	mov	eax, [LFB_ADDR]
  4108                              <1> 	; edx = LFB page count
  4109                              <1> 	;and	ax, ~4095  ; lw of LFB address is 0
  4110                              <1> a_lfb_k_3:	
  4111                              <1> 	or	ax, PTE_A_PRESENT + PTE_A_WRITE + PTE_EXTERNAL
  4112                              <1> 				; supervisor + read&write + present 	
  4113                              <1> 				; + external memory block (LFB)
  4114                              <1> 	stosd
  4115                              <1> 	dec	edx
  4116                              <1> 	jz	short a_lfb_k_4 ; LFB size has been completed (!?)
  4117                              <1> 	add	eax, 4096	
  4118                              <1> 	loop	a_lfb_k_3
  4119                              <1> 
  4120                              <1> 	retn
  4121                              <1> 	
  4122                              <1> a_lfb_k_4:
  4123                              <1> 	; clear PTEs for empty/free pages 
  4124                              <1> 	; 	(if there are after LFB !?)
  4125                              <1> 	xor	eax, eax ; clear page table entry (empty)
  4126                              <1> 	rep	stosd
  4127                              <1> 	retn
  4128                              <1> 
  4129                              <1> %endif
  4130                              <1> 
  4131                              <1> ;deallocate_lfb_pages_for_kernel:
  4132                              <1> 	; 15/12/2020
  4133                              <1> 	; 14/12/2020 - TRDOS 386 v2.0.3
  4134                              <1> 	; Reset/Release kernel page tables
  4135                              <1> 	;	 which are used for linear frame buffer 
  4136                              <1> 	; (this procedure will be called by kernel only)
  4137                              <1> 	;
  4138                              <1> 	; Input:
  4139                              <1> 	;	[LFB_ADDR] = linear frame buffer base address
  4140                              <1>  	;	[FFB_SIZE] = linear frame buffer size in bytes
  4141                              <1> 	; Output:
  4142                              <1> 	;	none
  4143                              <1> 	;
  4144                              <1> 	; Modified registers: eax, ecx, edi
  4145                              <1> 
  4146                              <1> 	;mov	edi, [LFB_ADDR]
  4147                              <1> 	;mov	ecx, [LFB_SIZE]
  4148                              <1> 	;
  4149                              <1> 	;shr	edi, 22	; convert address to page number
  4150                              <1> 	;		; and then convert it to PDE entry offset
  4151                              <1> 	;		; (1 PDE is for 4MB, 22 bit shift)
  4152                              <1> 	;
  4153                              <1> 	;shl	di, 2	; * 4 for offset 
  4154                              <1> 	;
  4155                              <1> 	;;add	ecx, 4095
  4156                              <1> 	;shr	ecx, 12	; convert LFB size to page count  
  4157                              <1> 	;
  4158                              <1> 	;add	ecx, 1023 ; page count + 1023
  4159                              <1> 	;shr	ecx, 10 ; convert to page directory entry count	
  4160                              <1> 	;		; (page table count)
  4161                              <1> 	;push	ecx ; *
  4162                              <1> 	;shl	ecx, 12 ; convert to byte count
  4163                              <1> 	;
  4164                              <1> 	;xor	eax, eax ; first available pages
  4165                              <1> 	;
  4166                              <1> 	;; deallocate contiguous memory block for kernel pages
  4167                              <1> 	;
  4168                              <1> 	;call	deallocate_memory_block
  4169                              <1> 	;
  4170                              <1> 	;pop	ecx ; * ; PDE count
  4171                              <1> 	;
  4172                              <1> 	;; Release/Free PDEs (page tables) in kernel's page dir
  4173                              <1> 	;; edi = 1st page directory entry offset
  4174                              <1> 	;add	edi, [k_page_dir] ; Kernel's Page Dir Address
  4175                              <1> 	;sub	eax, eax ; clear (also invalidate)
  4176                              <1> 	;rep	stosd
  4177                              <1> 	;
  4178                              <1> 	;retn
  4179                              <1> 
  4180                              <1> ; /// End Of MEMORY MANAGEMENT FUNCTIONS ///
  4181                              <1> 
  4182                              <1> ;; Data:
  4183                              <1> 
  4184                              <1> ; 09/03/2015
  4185                              <1> ;swpq_count: dw 0 ; count of pages on the swap que
  4186                              <1> ;swp_drv:    dd 0 ; logical drive description table address of the swap drive/disk
  4187                              <1> ;swpd_size:  dd 0 ; size of swap drive/disk (volume) in sectors (512 bytes). 		  				
  4188                              <1> ;swpd_free:  dd 0 ; free page blocks (4096 bytes) on swap disk/drive (logical)
  4189                              <1> ;swpd_next:  dd 0 ; next free page block
  4190                              <1> ;swpd_last:  dd 0 ; last swap page block
  3222                                  %include 'timer.s'   ; 17/01/2015
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.5 - timer.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 08/08/2022  (Previous: 18/04/2021)
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 17/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.15 (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> ;
    25                              <1> ; ///////// TIMER (& REAL TIME CLOCK) FUNCTIONS ///////////////
    26                              <1> 
    27                              <1> int1Ah:
    28                              <1> 	; 29/01/2016
    29                              <1> 	; 17/01/2016 (TRDOS 386 = TRDOS v2.0)
    30 00006275 9C                  <1> 	pushfd
    31 00006276 0E                  <1> 	push 	cs
    32 00006277 E801000000          <1> 	call 	TIME_OF_DAY_1
    33 0000627C C3                  <1> 	retn
    34                              <1> 
    35                              <1> ;-------------------------------------------------------------------------------
    36                              <1> 
    37                              <1> ;--- INT 1A H -- (TIME OF DAY) --------------------------------------------------
    38                              <1> ;       THIS BIOS ROUTINE ALLOWS THE CLOCKS TO BE SET OR READ			:
    39                              <1> ;										:
    40                              <1> ; PARAMETERS:									:
    41                              <1> ;     (AH) = 00H  READ THE CURRENT SETTING AND RETURN WITH,			:
    42                              <1> ;                      (CX) = HIGH PORTION OF COUNT				:
    43                              <1> ;                      (DX) = LOW PORTION OF COUNT				:
    44                              <1> ;                      (AL) = 0 TIMER HAS NOT PASSED 24 HOURS SINCE LAST READ	:
    45                              <1> ;                             1 IF ON ANOTHER DAY. (RESET TO ZERO AFTER READ)	:
    46                              <1> ;										:
    47                              <1> ;     (AH) = 01H  SET THE CURRENT CLOCK USING,					:
    48                              <1> ;		     (CX) = HIGH PORTION OF COUNT				:
    49                              <1> ;		     (DX) = LOW PORTION OF COUNT.				:
    50                              <1> ;										:
    51                              <1> ;             NOTE: COUNTS OCCUR AT THE RATE OF 1193180/65536 COUNTS/SECOND	:
    52                              <1> ;                   (OR ABOUT 18.2 PER SECOND -- SEE EQUATES)			:
    53                              <1> ;										:
    54                              <1> ;     (AH) = 02H  READ THE REAL TIME CLOCK AND RETURN WITH,			:
    55                              <1> ;                      (CH) = HOURS IN BCD (00-23)				:
    56                              <1> ;                      (CL) = MINUTES IN BCD (00-59)				:
    57                              <1> ;                      (DH) = SECONDS IN BCD (00-59)				:
    58                              <1> ;                      (DL) = DAYLIGHT SAVINGS ENABLE (00-01)			:
    59                              <1> ;										:
    60                              <1> ;     (AH) = 03H  SET THE REAL TIME CLOCK USING,				:
    61                              <1> ;                     (CH) = HOURS IN BCD (00-23)				:
    62                              <1> ;                     (CL) = MINUTES IN BCD (00-59)				:
    63                              <1> ;                     (DH) = SECONDS IN BCD (00-59)				:
    64                              <1> ;                     (DL) = 01 IF DAYLIGHT SAVINGS ENABLE OPTION, ELSE 00.	:
    65                              <1> ;										:
    66                              <1> ;             NOTE: (DL) = 00 IF DAYLIGHT SAVINGS TIME ENABLE IS NOT ENABLED.	:
    67                              <1> ;                   (DL) = 01 ENABLES TWO SPECIAL UPDATES THE LAST SUNDAY IN	:
    68                              <1> ;	            APRIL   (1:59:59 --> 3:00:00 AM) AND THE LAST SUNDAY IN	:
    69                              <1> ;                   OCTOBER (1:59:59 --> 1:00:00 AM) THE FIRST TIME.		:
    70                              <1> ;										:
    71                              <1> ;     (AH) = 04H  READ THE DATE FROM THE REAL TIME CLOCK AND RETURN WITH,	:
    72                              <1> ;                      (CH) = CENTURY IN BCD (19 OR 20)				:
    73                              <1> ;                      (CL) = YEAR IN BCD (00-99)				:
    74                              <1> ;                      (DH) = MONTH IN BCD (01-12)				:
    75                              <1> ;                      (DL) = DAY IN BCD (01-31).				:
    76                              <1> ;										:
    77                              <1> ;     (AH) = 05H  SET THE DATE INTO THE REAL TIME CLOCK USING,			:
    78                              <1> ;                     (CH) = CENTURY IN BCD (19 OR 20)				:
    79                              <1> ;                     (CL) = YEAR IN BCD (00-99)				:
    80                              <1> ;                     (DH) = MONTH IN BCD (01-12)				:
    81                              <1> ;                     (DL) = DAY IN BCD (01-31).				:
    82                              <1> ;										:
    83                              <1> ;     (AH) = 06H  SET THE ALARM TO INTERRUPT AT SPECIFIED TIME,			:
    84                              <1> ;                     (CH) = HOURS IN BCD (00-23 (OR FFH))			:
    85                              <1> ;                     (CL) = MINUTES IN BCD (00-59 (OR FFH))			:
    86                              <1> ;                     (DH) = SECONDS IN BCD (00-59 (OR FFH))			:
    87                              <1> ;										:
    88                              <1> ;     (AH) = 07H  RESET THE ALARM INTERRUPT FUNCTION.				:
    89                              <1> ;										:
    90                              <1> ; NOTES: FOR ALL RETURNS CY= 0 FOR SUCCESSFUL OPERATION.			:
    91                              <1> ;        FOR (AH)= 2, 4, 6 - CARRY FLAG SET IF REAL TIME CLOCK NOT OPERATING.	:
    92                              <1> ;        FOR (AH)= 6 - CARRY FLAG SET IF ALARM ALREADY ENABLED. 		:
    93                              <1> ;        FOR THE ALARM FUNCTION (AH = 6) THE USER MUST SUPPLY A ROUTINE AND	:
    94                              <1> ;         INTERCEPT THE CORRECT ADDRESS IN THE VECTOR TABLE FOR INTERRUPT 4AH.	:
    95                              <1> ;         USE 0FFH FOR ANY "DO NOT CARE" POSITION FOR INTERVAL INTERRUPTS.	:
    96                              <1> ;        INTERRUPTS ARE DISABLED DURING DATA MODIFICATION. 			:
    97                              <1> ;        AH & AL ARE RETURNED MODIFIED AND NOT DEFINED EXCEPT WHERE INDICATED.	:
    98                              <1> ;--------------------------------------------------------------------------------
    99                              <1> 
   100                              <1> ; 29/07/2022
   101                              <1> ; 15/01/2017
   102                              <1> ; 14/01/2017
   103                              <1> ; 07/01/2017
   104                              <1> ; 02/01/2017
   105                              <1> ; 29/05/2016
   106                              <1> ; 29/01/2016
   107                              <1> ; 17/01/2016 (TRDOS 386 = TRDOS v2.0)
   108                              <1> 
   109                              <1> ; 29/05/2016
   110                              <1> ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
   111                              <1> int35h:  ; Date/Time functions
   112                              <1> 
   113                              <1> TIME_OF_DAY_1:
   114                              <1> 	; 07/08/5022
   115                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
   116                              <1> 	;sti				; INTERRUPTS BACK ON
   117                              <1> 	; 29/05/2016
   118 0000627D 80642408FE          <1> 	and	byte [esp+8], 11111110b	; clear carry bit of eflags register
   119                              <1> 	;
   120 00006282 80FC08              <1> 	cmp	ah, (RTC_TBE-RTC_TB)/4	; CHECK IF COMMAND IN VALID RANGE (0-7)
   121 00006285 F5                  <1> 	cmc				; COMPLEMENT CARRY FOR ERROR EXIT
   122                              <1> 	; (*) jc short TIME_9		; EXIT WITH CARRY = 1 IF NOT VALID
   123 00006286 721A                <1> 	jc	short _TIME_9 ; 29/05/2016
   124                              <1> 
   125 00006288 1E                  <1> 	push	ds
   126 00006289 56                  <1> 	push	esi
   127 0000628A 66BE1000            <1> 	mov	si, KDATA		; kernel data segment
   128 0000628E 8EDE                <1> 	mov	ds, si
   129                              <1> 
   130                              <1> 	;;15/01/2017
   131                              <1> 	; 14/01/2017
   132                              <1> 	; 02/01/2017
   133                              <1> 	;;mov	byte [intflg], 35h	; date & time interrupt 
   134                              <1> 	;sti
   135                              <1> 	;
   136 00006290 C0E402              <1> 	shl	ah, 2			; convert function to dword offset
   137 00006293 0FB6F4              <1> 	movzx	esi, ah			; PLACE INTO ADDRESSING REGISTER
   138                              <1> 	;cli				; NO INTERRUPTS DURING TIME FUNCTIONS
   139 00006296 FF96[A8620000]      <1> 	call	[esi+RTC_TB]		; VECTOR TO FUNCTION REQUESTED WITH CY=0
   140                              <1> 					; RETURN WITH CARRY FLAG SET FOR RESULT
   141                              <1> 	;sti				; INTERRUPTS BACK ON
   142 0000629C B400                <1> 	mov	ah, 0			; CLEAR (AH) TO ZERO
   143 0000629E 5E                  <1> 	pop	esi			; RECOVER USERS REGISTER
   144 0000629F 1F                  <1> 	pop	ds			; RECOVER USERS SEGMENT SELECTOR
   145                              <1> 
   146                              <1> 	;;15/01/2017
   147                              <1> 	; 02/01/2017
   148                              <1> 	;;mov	byte [ss:intflg], 0 ; 07/01/2017
   149                              <1> 
   150                              <1> ;TIME_9:
   151                              <1> 					; RETURN WITH CY= 0 IF NO ERROR
   152                              <1> 	; (*) 29/05/2016
   153                              <1> 	; (*) retf 4 ; skip eflags on stack
   154 000062A0 7305                <1> 	jnc	short _TIME_10
   155                              <1> _TIME_9:
   156                              <1> 	; 29/05/2016 -set carry flag on stack-
   157                              <1> 	; [esp] = EIP
   158                              <1> 	; [esp+4] = CS
   159                              <1> 	; [esp+8] = E-FLAGS
   160 000062A2 804C240801          <1> 	or	byte [esp+8], 1	 ; set carry bit of eflags register
   161                              <1> 	; [esp+12] = ESP (user)
   162                              <1> 	; [esp+16] = SS (User)
   163                              <1> _TIME_10:
   164 000062A7 CF                  <1> 	iretd
   165                              <1> 	
   166                              <1> 	; (*) 29/05/2016 - 'ref 4' intruction causes to stack fault
   167                              <1> 	; (OUTER-PRIVILEGE-LEVEL)
   168                              <1> 	; INTEL 80386 PROGRAMMER'S REFERENCE MANUAL 1986
   169                              <1> 	; // RETF instruction:
   170                              <1> 	;
   171                              <1> 	; IF OperandMode=32 THEN
   172                              <1>  	;    Load CS:EIP from stack;
   173                              <1>  	;    Set CS RPL to CPL;
   174                              <1>  	;    Increment eSP by 8 plus the immediate offset if it exists;
   175                              <1>  	;    Load SS:eSP from stack;
   176                              <1>  	; ELSE (* OperandMode=16 *)
   177                              <1>  	;    Load CS:IP from stack;
   178                              <1>  	;    Set CS RPL to CPL;
   179                              <1>  	;    Increment eSP by 4 plus the immediate offset if it exists;
   180                              <1> 	;    Load SS:eSP from stack;
   181                              <1>  	; FI;
   182                              <1> 	;
   183                              <1> 	; //					
   184                              <1> 					; ROUTINE VECTOR TABLE (AH)=
   185                              <1> RTC_TB:
   186 000062A8 [C8620000]          <1> 	dd	RTC_00			; 0 = READ CURRENT CLOCK COUNT
   187 000062AC [DB620000]          <1> 	dd	RTC_10			; 1 = SET CLOCK COUNT
   188 000062B0 [E9620000]          <1> 	dd	RTC_20			; 2 = READ THE REAL TIME CLOCK TIME
   189 000062B4 [17630000]          <1> 	dd	RTC_30			; 3 = SET REAL TIME CLOCK TIME
   190 000062B8 [54630000]          <1> 	dd	RTC_40			; 4 = READ THE REAL TIME CLOCK DATE
   191 000062BC [7A630000]          <1> 	dd	RTC_50			; 5 = SET REAL TIME CLOCK DATE
   192 000062C0 [D9630000]          <1> 	dd	RTC_60			; 6 = SET THE REAL TIME CLOCK ALARM
   193 000062C4 [2B640000]          <1> 	dd	RTC_70			; 7 = RESET ALARM
   194                              <1> 
   195                              <1> RTC_TBE	equ	$
   196                              <1> 
   197                              <1> RTC_00:				; READ TIME COUNT
   198 000062C8 A0[0C790100]        <1> 	mov	al, [TIMER_OFL]		; GET THE OVERFLOW FLAG
   199 000062CD C605[0C790100]00    <1> 	mov	byte [TIMER_OFL], 0	; AND THEN RESET THE OVERFLOW FLAG
   200 000062D4 8B0D[08790100]      <1>         mov     ecx, [TIMER_LH]         ; GET COUNT OF TIME
   201 000062DA C3                  <1> 	retn
   202                              <1> 
   203                              <1> RTC_10:				; SET TIME COUNT
   204 000062DB 890D[08790100]      <1>         mov     [TIMER_LH], ecx         ; SET TIME COUNT
   205 000062E1 C605[0C790100]00    <1> 	mov	byte [TIMER_OFL], 0	; RESET OVERFLOW FLAG
   206 000062E8 C3                  <1> 	retn				; RETURN WITH NO CARRY
   207                              <1> 
   208                              <1> RTC_20:				; GET RTC TIME
   209 000062E9 E8C7010000          <1> 	call	UPD_IPR			; CHECK FOR UPDATE IN PROCESS
   210 000062EE 7226                <1> 	jc	short RTC_29		; EXIT IF ERROR (CY= 1)
   211                              <1> 
   212 000062F0 B000                <1> 	mov	al, CMOS_SECONDS	; SET ADDRESS OF SECONDS
   213 000062F2 E8F4010000          <1> 	call	CMOS_READ		; GET SECONDS
   214 000062F7 88C6                <1> 	mov	dh, al			; SAVE
   215 000062F9 B00B                <1> 	mov	al, CMOS_REG_B		; ADDRESS ALARM REGISTER
   216 000062FB E8EB010000          <1> 	call	CMOS_READ		; READ CURRENT VALUE OF DSE BIT
   217 00006300 2401                <1> 	and	al, 00000001b		; MASK FOR VALID DSE BIT
   218 00006302 88C2                <1> 	mov	dl, al			; SET [DL] TO ZERO FOR NO DSE BIT
   219 00006304 B002                <1> 	mov	al, CMOS_MINUTES	; SET ADDRESS OF MINUTES
   220 00006306 E8E0010000          <1> 	call	CMOS_READ		; GET MINUTES
   221 0000630B 88C1                <1> 	mov	cl, al			; SAVE
   222 0000630D B004                <1>         mov     al, CMOS_HOURS          ; SET ADDRESS OF HOURS
   223                              <1> RTC_41:		; 29/07/2022
   224 0000630F E8D7010000          <1> 	call	CMOS_READ		; GET HOURS
   225 00006314 88C5                <1> 	mov	ch, al			; SAVE
   226                              <1> 	; 29/07/2022
   227                              <1> 	;clc				; SET CY= 0
   228                              <1> RTC_29:
   229 00006316 C3                  <1> 	retn				; RETURN WITH RESULT IN CARRY FLAG
   230                              <1> 
   231                              <1> RTC_30:				; SET RTC TIME
   232 00006317 E899010000          <1> 	call	UPD_IPR			; CHECK FOR UPDATE IN PROCESS
   233 0000631C 7305                <1> 	jnc	short RTC_35		; GO AROUND IF CLOCK OPERATING
   234 0000631E E8AD010000          <1> 	call	RTC_STA			; ELSE TRY INITIALIZING CLOCK
   235                              <1> RTC_35:
   236 00006323 88F4                <1> 	mov	ah, dh			; GET TIME BYTE - SECONDS
   237 00006325 B000                <1> 	mov	al, CMOS_SECONDS	; ADDRESS SECONDS
   238 00006327 E894000000          <1> 	call	CMOS_WRITE		; UPDATE SECONDS
   239 0000632C 88CC                <1> 	mov	ah, cl			; GET TIME BYTE - MINUTES
   240 0000632E B002                <1> 	mov	al, CMOS_MINUTES	; ADDRESS MINUTES
   241 00006330 E88B000000          <1> 	call	CMOS_WRITE		; UPDATE MINUTES
   242 00006335 88EC                <1> 	mov	ah, ch			; GET TIME BYTE - HOURS
   243 00006337 B004                <1> 	mov	al, CMOS_HOURS		; ADDRESS HOURS
   244 00006339 E882000000          <1> 	call	CMOS_WRITE		; UPDATE ADDRESS
   245                              <1> 	;mov	al, CMOS_REG_B		; ADDRESS ALARM REGISTER
   246                              <1> 	;mov	ah, al
   247 0000633E 66B80B0B            <1> 	mov	ax, CMOS_REG_B * 257
   248 00006342 E8A4010000          <1> 	call	CMOS_READ		; READ CURRENT TIME
   249 00006347 2462                <1> 	and	al, 01100010b		; MASK FOR VALID BIT POSITIONS
   250 00006349 0C02                <1> 	or	al, 00000010b		; TURN ON 24 HOUR MODE
   251 0000634B 80E201              <1> 	and	dl, 00000001b		; USE ONLY THE DSE BIT
   252 0000634E 08D0                <1> 	or	al, dl			; GET DAY LIGHT SAVINGS TIME BIT (OSE)
   253 00006350 86E0                <1> 	xchg	ah, al			; PLACE IN WORK REGISTER AND GET ADDRESS
   254                              <1> 	;call	CMOS_WRITE		; SET NEW ALARM SITS
   255                              <1> 	;clc				; SET CY= 0
   256                              <1> 	;retn				; RETURN WITH CY= 0
   257                              <1> 	; 29/07/2022
   258 00006352 EB6C                <1> 	jmp	short CMOS_WRITE
   259                              <1> 
   260                              <1> RTC_40:				; GET RTC DATE
   261 00006354 E85C010000          <1> 	call	UPD_IPR			; CHECK FOR UPDATE IN PROCESS
   262                              <1> 	;jc	short RTC_49		; EXIT IF ERROR (CY= 1)
   263                              <1> 	; 07/08/2022
   264 00006359 72BB                <1> 	jc	short RTC_29
   265                              <1> 
   266 0000635B B007                <1> 	mov	al, CMOS_DAY_MONTH	; ADDRESS DAY OF MONTH
   267 0000635D E889010000          <1> 	call	CMOS_READ		; READ DAY OF MONTH
   268 00006362 88C2                <1> 	mov	dl, al			; SAVE
   269 00006364 B008                <1> 	mov	al, CMOS_MONTH		; ADDRESS MONTH
   270 00006366 E880010000          <1> 	call	CMOS_READ		; READ MONTH
   271 0000636B 88C6                <1> 	mov	dh, al			; SAVE
   272 0000636D B009                <1> 	mov	al, CMOS_YEAR		; ADDRESS YEAR
   273 0000636F E877010000          <1> 	call	CMOS_READ		; READ YEAR
   274 00006374 88C1                <1> 	mov	cl, al			; SAVE
   275 00006376 B032                <1> 	mov	al, CMOS_CENTURY	; ADDRESS CENTURY LOCATION
   276                              <1> ; 29/07/2022
   277                              <1> ;	call	CMOS_READ		; GET CENTURY BYTE
   278                              <1> ;	mov	ch, al			; SAVE
   279                              <1> ;	; 29/07/2022
   280                              <1> ;	;clc				; SET CY=0
   281                              <1> ;RTC_49:
   282                              <1> ;	retn				; RETURN WITH RESULTS IN CARRY FLAG
   283                              <1> 
   284                              <1> 	; 29/07/2022
   285 00006378 EB95                <1> 	jmp	short RTC_41
   286                              <1> 
   287                              <1> 
   288                              <1> RTC_50:				; SET RTC DATE
   289 0000637A E836010000          <1> 	call	UPD_IPR			; CHECK FOR UPDATE IN PROCESS
   290 0000637F 7305                <1> 	jnc	short RTC_55		; GO AROUND IF NO ERROR
   291 00006381 E84A010000          <1> 	call	RTC_STA			; ELSE INITIALIZE CLOCK
   292                              <1> RTC_55:
   293 00006386 66B80600            <1> 	mov	ax, CMOS_DAY_WEEK	; ADDRESS OF DAY OF WEEK BYTE
   294 0000638A E831000000          <1> 	call	CMOS_WRITE		; LOAD ZEROS TO DAY OF WEEK
   295 0000638F 88D4                <1> 	mov	ah, dl			; GET DAY OF MONTH BYTE
   296 00006391 B007                <1> 	mov	al, CMOS_DAY_MONTH	; ADDRESS DAY OF MONTH BYTE
   297 00006393 E828000000          <1> 	call	CMOS_WRITE		; WRITE OF DAY OF MONTH REGISTER
   298 00006398 88F4                <1> 	mov	ah, dh			; GET MONTH
   299 0000639A B008                <1> 	mov	al, CMOS_MONTH		; ADDRESS MONTH BYTE
   300 0000639C E81F000000          <1> 	call	CMOS_WRITE		; WRITE MONTH REGISTER
   301 000063A1 88CC                <1> 	mov	ah, cl			; GET YEAR BYTE
   302 000063A3 B009                <1> 	mov	al, CMOS_YEAR		; ADDRESS YEAR REGISTER
   303 000063A5 E816000000          <1> 	call	CMOS_WRITE		; WRITE YEAR REGISTER
   304 000063AA 88EC                <1> 	mov	ah, ch			; GET CENTURY BYTE
   305 000063AC B032                <1> 	mov	al, CMOS_CENTURY	; ADDRESS CENTURY BYTE
   306 000063AE E80D000000          <1> 	call	CMOS_WRITE		; WRITE CENTURY LOCATION
   307                              <1> 	;mov	al, CMOS_REG_B		; ADDRESS ALARM REGISTER
   308                              <1> 	;mov	ah, al
   309 000063B3 66B80B0B            <1> 	mov	ax, CMOS_REG_B * 257
   310 000063B7 E82F010000          <1> 	call	CMOS_READ		; READ CURRENT SETTINGS
   311 000063BC 247F                <1> 	and	al, 07Fh		; CLEAR 'SET BIT'
   312 000063BE 86E0                <1> 	xchg	ah, al			; MOVE TO WORK REGISTER
   313                              <1> 	;call	CMOS_WRITE		; AND START CLOCK UPDATING
   314                              <1> 	;clc				; SET CY= 0
   315                              <1> 	;retn				; RETURN CY=0
   316                              <1> 	; 29/07/2022
   317                              <1> 	;jmp	short CMOS_WRITE
   318                              <1> 
   319                              <1> ;-------------------------------------------------------------------------------
   320                              <1> 
   321                              <1> ; 08/08/2022
   322                              <1> ; 29/07/2022 (TRDOS 386 v2.0.5)
   323                              <1> ; 18/04/2021 (TRDOS 386 v2.0.4)
   324                              <1> ; 17/01/2016 (TRDOS 386 = TRDOS v2.0)
   325                              <1> 
   326                              <1> ;--- CMOS_WRITE ----------------------------------------------------------------
   327                              <1> ;	WRITE BYTE TO CMOS SYSTEM CLOCK CONFIGURATION TABLE		       :
   328                              <1> ;									       :
   329                              <1> ; INPUT: (AL)=	CMOS TABLE ADDRESS TO BE WRITTEN TO			       :
   330                              <1> ;		BIT    7 = 0 FOR NMI ENABLED AND 1 FOR NMI DISABLED ON EXIT    :
   331                              <1> ;		BITS 6-0 = ADDRESS OF TABLE LOCATION TO WRITE		       :
   332                              <1> ;	 (AH)=	NEW VALUE TO BE PLACED IN THE ADDRESSED TABLE LOCATION	       :
   333                              <1> ;									       :
   334                              <1> ; OUTPUT:	VALUE IN (AH) PLACED IN LOCATION (AL) WITH NMI LEFT DISABLED   :
   335                              <1> ;		IF BIT 7 OF (AL) IS ON, DURING THE CMOS UPDATE BOTH NMI AND    :
   336                              <1> ;		NORMAL INTERRUPTS ARE DISABLED TO PROTECT CMOS DATA INTEGRITY. :
   337                              <1> ;		THE CMOS ADDRESS REGISTER IS POINTED TO A DEFAULT VALUE AND    :
   338                              <1> ;		THE INTERRUPT FLAG RESTORED TO THE ENTRY STATE ON RETURN.      :
   339                              <1> ;		ONLY THE CMOS LOCATION AND THE NMI STATE IS CHANGED.	       :
   340                              <1> ;-------------------------------------------------------------------------------
   341                              <1> 
   342                              <1> 	; 08/08/2022
   343                              <1> CMOS_WRITE:				; WRITE (AH) TO LOCATION (AL)
   344                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
   345                              <1> 	;pushf				; SAVE INTERRUPT ENABLE STATUS AND FLAGS
   346                              <1> 	;;push	ax			; SAVE WORK REGISTER VALUES
   347                              <1> 	; 18/04/2021
   348                              <1> 	;push	eax
   349 000063C0 D0C0                <1> 	rol	al, 1			; MOVE NMI BIT TO LOW POSITION
   350 000063C2 F9                  <1> 	stc				; FORCE NMI BIT ON IN CARRY FLAG
   351 000063C3 D0D8                <1> 	rcr	al, 1			; HIGH BIT ON TO DISABLE NMI - OLD IN CY
   352 000063C5 FA                  <1> 	cli				; DISABLE INTERRUPTS
   353 000063C6 E670                <1> 	out	CMOS_PORT, al		; ADDRESS LOCATION AND DISABLE NMI
   354 000063C8 88E0                <1> 	mov	al, ah			; GET THE DATA BYTE TO WRITE
   355 000063CA E671                <1> 	out	CMOS_DATA, al		; PLACE IN REQUESTED CMOS LOCATION
   356 000063CC B01E                <1> 	mov	al, CMOS_SHUT_DOWN*2	; GET ADDRESS OF DEFAULT LOCATION
   357                              <1> 	;mov	al, CMOS_REG_D*2 	; GET ADDRESS OF DEFAULT LOCATION
   358 000063CE D0D8                <1> 	rcr	al, 1			; PUT ORIGINAL NMI MASK BIT INTO ADDRESS
   359 000063D0 E670                <1> 	out	CMOS_PORT, al		; SET DEFAULT TO READ ONLY REGISTER
   360                              <1> 	;nop				; I/O DELAY
   361                              <1> 	; 29/07/2022
   362 000063D2 E6EB                <1> 	out	0EBh, al ; NEWIODELAY ; AWARD BIOS 1999, ATIME.ASM
   363 000063D4 E471                <1> 	in	al, CMOS_DATA		; OPEN STANDBY LATCH
   364                              <1> 	;;pop	ax			; RESTORE WORK REGISTERS
   365                              <1> 	; 18/04/2021
   366                              <1> 	;pop	eax
   367                              <1> 	;popf
   368                              <1> 	; 29/07/2022
   369                              <1> 	;clc
   370                              <1> 	; 08/08/2022
   371 000063D6 30C0                <1> 	xor	al, al
   372 000063D8 C3                  <1> 	retn
   373                              <1> 
   374                              <1> ;-------------------------------------------------------------------------------
   375                              <1> 
   376                              <1> RTC_60:				; SET RTC ALARM
   377 000063D9 B00B                <1> 	mov	al, CMOS_REG_B		; ADDRESS ALARM
   378 000063DB E80B010000          <1> 	call	CMOS_READ		; READ ALARM REGISTER
   379 000063E0 A820                <1> 	test	al, 20h			; CHECK FOR ALARM ALREADY ENABLED
   380 000063E2 F9                  <1> 	stc				; SET CARRY IN CASE OF ERROR
   381 000063E3 7541                <1> 	jnz	short RTC_69		; ERROR EXIT IF ALARM SET
   382 000063E5 E8CB000000          <1> 	call	UPD_IPR			; CHECK FOR UPDATE IN PROCESS
   383 000063EA 7305                <1> 	jnc	short RTC_65		; SKIP INITIALIZATION IF NO ERROR
   384 000063EC E8DF000000          <1> 	call	RTC_STA			; ELSE INITIALIZE CLOCK
   385                              <1> RTC_65:	
   386 000063F1 88F4                <1> 	mov	ah, dh			; GET SECONDS BYTE
   387 000063F3 B001                <1> 	mov	al, CMOS_SEC_ALARM	; ADDRESS THE SECONDS ALARM REGISTER
   388 000063F5 E8C6FFFFFF          <1> 	call	CMOS_WRITE		; INSERT SECONDS
   389 000063FA 88CC                <1> 	mov	ah, cl			; GET MINUTES PARAMETER
   390 000063FC B003                <1> 	mov	al, CMOS_MIN_ALARM	; ADDRESS MINUTES ALARM REGISTER
   391 000063FE E8BDFFFFFF          <1> 	call	CMOS_WRITE		; INSERT MINUTES
   392 00006403 88EC                <1> 	mov	ah, ch			; GET HOURS PARAMETER
   393 00006405 B005                <1> 	mov	al, CMOS_HR_ALARM	; ADDRESS HOUR ALARM REGISTER
   394 00006407 E8B4FFFFFF          <1> 	call	CMOS_WRITE		; INSERT HOURS
   395 0000640C E4A1                <1> 	in	al, INTB01		; READ SECOND INTERRUPT MASK REGISTER
   396 0000640E 24FE                <1> 	and	al, 0FEh		; ENABLE ALARM TIMER BIT (CY= 0)
   397 00006410 E6A1                <1> 	out	INTB01, al		; WRITE UPDATED MASK
   398                              <1> 	;mov	al, CMOS_REG_B		; ADDRESS ALARM REGISTER
   399                              <1> 	;mov	ah, al
   400 00006412 66B80B0B            <1> 	mov	ax, CMOS_REG_B * 257
   401 00006416 E8D0000000          <1> 	call	CMOS_READ		; READ CURRENT ALARM REGISTER
   402 0000641B 247F                <1> 	and	al, 07Fh		; ENSURE SET BIT TURNED OFF
   403 0000641D 0C20                <1> 	or	al, 20h			; TURN ON ALARM ENABLE
   404 0000641F 86E0                <1> 	xchg	ah, al			; MOVE MASK TO OUTPUT REGISTER
   405 00006421 E89AFFFFFF          <1> 	call	CMOS_WRITE		; WRITE NEW ALARM MASK
   406                              <1> 	; 29/07/2022
   407                              <1> 	;clc				; SET CY= 0
   408                              <1> RTC_69:
   409 00006426 66B80000            <1> 	mov	ax, 0			; CLEAR AX REGISTER
   410 0000642A C3                  <1> 	retn				; RETURN WITH RESULTS IN CARRY FLAC
   411                              <1> 
   412                              <1> RTC_70:				; RESET ALARM
   413                              <1> 	;mov	al, CMOS_REG_B		; ADDRESS ALARM REGISTER
   414                              <1> 	;mov	ah, al
   415 0000642B 66B80B0B            <1> 	mov	ax, CMOS_REG_B * 257	; ADDRESS ALARM REGISTER (TO BOTH AH,AL)
   416 0000642F E8B7000000          <1> 	call	CMOS_READ		; READ ALARM REGISTER
   417 00006434 2457                <1> 	and	al, 57h			; TURN OFF ALARM ENABLE
   418 00006436 86E0                <1> 	xchg	ah, al			; SAVE DATA AND RECOVER ADDRESS
   419                              <1> 	;call	CMOS_WRITE		; RESTORE NEW VALUE
   420                              <1> 	;clc				; SET CY= 0
   421                              <1> 	;retn				; RETURN WITH NO CARRY
   422                              <1> 	; 29/07/2022
   423 00006438 EB86                <1> 	jmp	short CMOS_WRITE
   424                              <1> 
   425                              <1> ;-------------------------------------------------------------------------------
   426                              <1> 
   427                              <1> ; 17/01/2016 (TRDOS 386 = TRDOS v2.0)
   428                              <1> 
   429                              <1> ;--- HARDWARE INT 70 H -- ( IRQ LEVEL 8) ----------------------------------------
   430                              <1> ; ALARM INTERRUPT HANDLER (RTC)							:
   431                              <1> ;       THIS ROUTINE HANDLES THE PERIODIC AND ALARM INTERRUPTS FROM THE CMOS	:
   432                              <1> ;       TIMER. INPUT FREQUENCY IS 1.024 KHZ OR APPROXIMATELY 1024 INTERRUPTS	:
   433                              <1> ;       EVERY SECOND FOR THE PERIODIC INTERRUPT. FOR THE ALARM FUNCTION,	:
   434                              <1> ;       THE INTERRUPT WILL OCCUR AT THE DESIGNATED TIME.			:
   435                              <1> ;										:
   436                              <1> ;       INTERRUPTS ARE ENABLED WHEN THE EVENT OR ALARM FUNCTION IS ACTIVATED.	:
   437                              <1> ;       FOR THE EVENT INTERRUPT, THE HANDLER WILL DECREMENT THE WAIT COUNTER	:
   438                              <1> ;       AND WHEN IT EXPIRES WILL SET THE DESIGNATED LOCATION TO 80H. FOR	:
   439                              <1> ;       THE ALARM INTERRUPT. THE USER MUST PROVIDE A ROUTINE TO INTERCEPT	:
   440                              <1> ;       THE CORRECT ADDRESS FROM THE VECTOR TABLE INVOKED BY INTERRUPT 4AH	:
   441                              <1> ;       PRIOR TO SETTING THE REAL TIME CLOCK ALARM (INT 1AH, AH= 06H).		:
   442                              <1> ;--------------------------------------------------------------------------------
   443                              <1> 
   444                              <1> RTC_A_INT: ; 07/01/2017
   445                              <1> ;RTC_INT:				; ALARM INTERRUPT
   446 0000643A 1E                  <1> 	push	ds			; LEAVE INTERRUPTS DISABLED
   447 0000643B 50                  <1> 	push	eax			; SAVE REGISTERS
   448 0000643C 57                  <1> 	push	edi
   449                              <1> RTC_I_1:				; CHECK FOR SECOND INTERRUPT
   450 0000643D 66B88C8B            <1> 	mov	ax, 256*(CMOS_REG_B+NMI)+CMOS_REG_C+NMI ; ALARM AND STATUS
   451 00006441 E670                <1> 	out	CMOS_PORT, al		; WRITE ALARM FLAG MASK ADDRESS
   452 00006443 90                  <1> 	nop				; I/O DELAY
   453 00006444 EB00                <1> 	jmp	short $+2
   454 00006446 E471                <1> 	in	al, CMOS_DATA		; READ AND RESET INTERRUPT REQUEST FLAGS
   455 00006448 A860                <1> 	test	al, 01100000b		; CHECK FOR EITHER INTERRUPT PENDING
   456 0000644A 745B                <1> 	jz	short	RTC_I_9		; EXIT IF NOT A VALID RTC INTERRUPT
   457                              <1> 
   458 0000644C 86E0                <1> 	xchg	ah, al			; SAVE FLAGS AND GET ENABLE ADDRESS
   459 0000644E E670                <1> 	out	CMOS_PORT, al		; WRITE ALARM ENABLE MASK ADDRESS
   460 00006450 90                  <1> 	nop				; I/O DELAY
   461 00006451 EB00                <1> 	jmp	short $+2	
   462 00006453 E471                <1> 	in	al, CMOS_DATA		; READ CURRENT ALARM ENABLE MASK
   463 00006455 20E0                <1> 	and	al, ah			; ALLOW ONLY SOURCES THAT ARE ENABLED
   464 00006457 A840                <1> 	test	al, 01000000b		; CHECK FOR PERIODIC INTERRUPT
   465 00006459 7439                <1> 	jz	short RTC_I_5		; SKIP IF NOT A PERIODIC INTERRUPT
   466                              <1> 
   467                              <1> ;-----	DECREMENT WAIT COUNT BY INTERRUPT INTERVAL
   468                              <1> 
   469 0000645B 66BF1000            <1> 	mov	di, KDATA		; kernel data segment
   470 0000645F 8EDF                <1> 	mov	ds, di
   471                              <1> 	
   472 00006461 812D[00790100]D003- <1> 	sub	dword [RTC_LH], 976	; DECREMENT COUNT BY 1/1024
   472 00006469 0000                <1>
   473 0000646B 7327                <1> 	jnc	short RTC_I_5		; SKIP TILL 32 BIT WORD LESS THAN ZERO
   474                              <1> 
   475                              <1> ;-----	TURN OFF PERIODIC INTERRUPT ENABLE
   476                              <1> 
   477                              <1> 	;push	ax			; SAVE INTERRUPT FLAG MASK
   478                              <1> 	; 18/04/2021
   479 0000646D 50                  <1> 	push	eax
   480 0000646E 66B88B8B            <1> 	mov	ax, 257*(CMOS_REG_B+NMI) ; INTERRUPT ENABLE REGISTER
   481 00006472 E670                <1> 	out	CMOS_PORT, al		; WRITE ADDRESS TO CMOS CLOCK
   482 00006474 90                  <1> 	nop				; I/O DELAY
   483 00006475 EB00                <1> 	jmp	short $+2
   484 00006477 E471                <1> 	in	al, CMOS_DATA		; READ CURRENT ENABLES
   485 00006479 24BF                <1> 	and	al, 0BFh		; TURN OFF PIE
   486 0000647B 86C4                <1> 	xchg	al, ah			; GET CMOS ADDRESS AND SAVE VALUE
   487 0000647D E670                <1> 	out	CMOS_PORT, al		; ADDRESS REGISTER B
   488 0000647F 86C4                <1> 	xchg	al, ah			; GET NEW INTERRUPT ENABLE MASK
   489 00006481 E671                <1> 	out	CMOS_DATA, al		; SET MASK IN INTERRUPT ENABLE REGISTER
   490 00006483 C605[04790100]00    <1> 	mov	byte [RTC_WAIT_FLAG], 0	; SET FUNCTION ACTIVE FLAG OFF
   491 0000648A 8B3D[05790100]      <1> 	mov	edi, [USER_FLAG]	; SET UP (DS:DI) TO POINT TO USER FLAG
   492 00006490 C60780              <1> 	mov	byte [edi], 80h		; TURN ON USERS FLAG
   493                              <1> 	;pop	ax			; GET INTERRUPT SOURCE BACK
   494                              <1> 	; 18/04/2021
   495 00006493 58                  <1> 	pop	eax
   496                              <1> RTC_I_5:
   497 00006494 A820                <1> 	test	al, 00100000b		; TEST FOR ALARM INTERRUPT
   498 00006496 740D                <1> 	jz	short RTC_I_7		; SKIP USER INTERRUPT CALL IF NOT ALARM
   499                              <1> 
   500 00006498 B00D                <1> 	mov	al, CMOS_REG_D		; POINT TO DEFAULT READ ONLY REGISTER
   501 0000649A E670                <1> 	out	CMOS_PORT, al		; ENABLE NMI AND CMOS ADDRESS TO DEFAULT
   502 0000649C FB                  <1> 	sti				; INTERRUPTS BACK ON NOW
   503 0000649D 52                  <1> 	push	edx
   504 0000649E E8DBBB0000          <1> 	call	INT4Ah			; TRANSFER TO USER ROUTINE
   505 000064A3 5A                  <1> 	pop	edx
   506 000064A4 FA                  <1> 	cli				; BLOCK INTERRUPT FOR RETRY
   507                              <1> RTC_I_7:				; RESTART ROUTINE TO HANDLE DELAYED
   508 000064A5 EB96                <1> 	jmp	short RTC_I_1		;  ENTRY AND SECOND EVENT BEFORE DONE
   509                              <1> 
   510                              <1> RTC_I_9:				; EXIT - NO PENDING INTERRUPTS
   511 000064A7 B00D                <1> 	mov	al, CMOS_REG_D		; POINT TO DEFAULT READ ONLY REGISTER
   512 000064A9 E670                <1> 	out	CMOS_PORT, al		; ENABLE NMI AND CMOS ADDRESS TO DEFAULT
   513 000064AB B020                <1> 	mov	al, EOI			; END OF INTERRUPT MASK TO 8259 - 2
   514 000064AD E6A0                <1> 	out	INTB00, al		; TO 8259 - 2
   515 000064AF E620                <1> 	out	INTA00,	al		; TO 8259 - 1
   516 000064B1 5F                  <1> 	pop	edi			; RESTORE REGISTERS
   517 000064B2 58                  <1> 	pop	eax
   518 000064B3 1F                  <1> 	pop	ds
   519 000064B4 CF                  <1> 	iretd				; END OF INTERRUPT
   520                              <1> 
   521                              <1> ;-------------------------------------------------------------------------------
   522                              <1> 
   523                              <1> 	; 29/05/2016 - TRDOS 386 (TRDOS v2.0)
   524                              <1> 	; 22/08/2014 (Retro UNIX 386 v1)
   525                              <1> 	; IBM PC/AT BIOS source code ----- 10/06/85 (bios2.asm)
   526                              <1> UPD_IPR:				; WAIT TILL UPDATE NOT IN PROGRESS
   527 000064B5 51                  <1> 	push	ecx
   528                              <1> 
   529                              <1> 	; 29/05/2016
   530 000064B6 B968110000          <1> 	mov	ecx, ((1984+244)*4)/2	; AWARD BIOS 1999, ATIME.ASM		
   531                              <1> 					; 'WAITCPU_CK_UD_STAT'
   532                              <1> 					; (244Us + 1984Us)
   533                              <1> 					; (assume each read takes
   534                              <1> 					;  2 microseconds).
   535                              <1> 	;mov	ecx, 65535		
   536                              <1> 		;mov cx, 800		; SET TIMEOUT LOOP COUNT (= 800)	
   537                              <1> UPD_10:
   538 000064BB B00A                <1> 	mov	al, CMOS_REG_A		; ADDRESS STATUS REGISTER A
   539 000064BD FA                  <1> 	cli				; NO TIMER INTERRUPTS DURING UPDATES
   540 000064BE E828000000          <1> 	call	CMOS_READ		; READ UPDATE IN PROCESS FLAG
   541 000064C3 A880                <1> 	test	al, 80h			; IF UIP BIT IS ON ( CANNOT READ TIME )
   542 000064C5 7406                <1> 	jz	short UPD_90		; EXIT WITH CY= 0 IF CAN READ CLOCK NOW
   543 000064C7 FB                  <1> 	sti				; ALLOW INTERRUPTS WHILE WAITING
   544 000064C8 E2F1                <1> 	loop	UPD_10			; LOOP TILL READY OR TIMEOUT
   545 000064CA 31C0                <1> 	xor	eax, eax ; xor ax, ax	; CLEAR RESULTS IF ERROR
   546 000064CC F9                  <1> 	stc				; SET CARRY FOR ERROR
   547                              <1> UPD_90:
   548 000064CD 59                  <1> 	pop	ecx			; RESTORE CALLERS REGISTER
   549 000064CE FA                  <1> 	cli				; INTERRUPTS OFF DURING SET
   550 000064CF C3                  <1> 	retn				; RETURN WITH CY FLAG SET
   551                              <1> 
   552                              <1> 	; 18/04/2021
   553                              <1> RTC_STA:			; INITIALIZE REAL TIME CLOCK
   554                              <1> 	;mov	al, CMOS_REG_A		; ADDRESS REGISTER A AND LOAD DATA MASK		
   555                              <1> 	;mov	ah, 26h
   556 000064D0 66B80A26            <1> 	mov	ax, (26h*100h)+CMOS_REG_A
   557 000064D4 E8E7FEFFFF          <1> 	call	CMOS_WRITE		; INITIALIZE STATUS REGISTER A
   558                              <1> 	;mov	al, CMOS_REG_B		; SET "SET BIT" FOR CLOCK INITIALIZATION	
   559                              <1> 	;mov	ah, 82h
   560 000064D9 66B80B82            <1> 	mov	ax, (82h*100h)+CMOS_REG_B
   561 000064DD E8DEFEFFFF          <1> 	call	CMOS_WRITE		; AND 24 HOUR MODE TO REGISTER B
   562 000064E2 B00C                <1> 	mov	al, CMOS_REG_C		; ADDRESS REGISTER C
   563 000064E4 E802000000          <1> 	call	CMOS_READ		; READ REGISTER C TO INITIALIZE
   564 000064E9 B00D                <1> 	mov	al, CMOS_REG_D		; ADDRESS REGISTER D
   565                              <1> 	; 18/04/2021
   566                              <1> 	;call	CMOS_READ		; READ REGISTER D TO INITIALIZE
   567                              <1> 	;retn
   568                              <1> 	;jmp	short CMOS_READ ; 18/04/2021
   569                              <1> 
   570                              <1> ;-------------------------------------------------------------------------------
   571                              <1> 
   572                              <1> 	; 29/07/2022 - TRDOS 386 v2.0.5
   573                              <1> 	; 18/04/2021 - TRDOS 386 v2.0.4
   574                              <1> 	; 29/05/2016 - TRDOS 386 (TRDOS v2.0) 
   575                              <1> 	; 22/08/2014 (Retro UNIX 386 v1)
   576                              <1> 	; IBM PC/AT BIOS source code ----- 10/06/85 (test4.asm)
   577                              <1> 
   578                              <1> ;--- CMOS_READ -----------------------------------------------------------------
   579                              <1> ;		READ BYTE FROM CMOS_SYSTEM CLOCK CONFIGURATION TABLE	       :
   580                              <1> ;									       :
   581                              <1> ; INPUT: (AL)=	CMOS_TABLE ADDRESS TO BE READ				       :
   582                              <1> ;		BIT    7 = 0 FOR NMI ENABLED AND 1 FOR NMI DISABLED ON EXIT    :
   583                              <1> ;		BITS 6-0 = ADDRESS OF TABLE LOCATION TO READ		       :
   584                              <1> ;									       :
   585                              <1> ; OUTPUT: (AL)	VALUE AT LOCATION (AL) MOVED INTO (AL). IF BIT 7 OF (AL) WAS   :
   586                              <1> ;		ON THEN NMI LEFT DISABLED, DURING THE CMOS READ BOTH NMI AND   :
   587                              <1> ;		NORMAL INTERRUPTS ARE DISABLED TO PROTECT CMOS DATA INTEGRITY. :
   588                              <1> ;		THE CMOS ADDRESS REGISTER IS POINTED TO A DEFAULT VALUE AND    :
   589                              <1> ;		THE INTERRUPT FLAG RESTORED TO THE ENTRY STATE ON RETURN.      :
   590                              <1> ;		ONLY THE (AL) REGISTER AND THE NMI STATE IS CHANGED.	       :
   591                              <1> ;-------------------------------------------------------------------------------
   592                              <1> 
   593                              <1> CMOS_READ:
   594                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
   595                              <1> 	;pushf				; SAVE INTERRUPT ENABLE STATUS AND FLAGS
   596 000064EB D0C0                <1> 	rol	al, 1			; MOVE NMI BIT TO LOW POSITION
   597 000064ED F9                  <1> 	stc				; FORCE NMI BIT ON IN CARRY FLAG
   598 000064EE D0D8                <1> 	rcr	al, 1			; HIGH BIT ON TO DISABLE NMI - OLD IN CY
   599 000064F0 FA                  <1> 	cli				; DISABLE INTERRUPTS
   600 000064F1 E670                <1> 	out	CMOS_PORT, al		; ADDRESS LOCATION AND DISABLE NMI
   601                              <1> 	; 29/05/2016
   602                              <1> 	;nop				; I/O DELAY
   603 000064F3 E6EB                <1> 	out	0EBh, al ; NEWIODELAY ; AWARD BIOS 1999, ATIME.ASM
   604                              <1> 	;
   605 000064F5 E471                <1> 	in	al, CMOS_DATA		; READ THE REQUESTED CMOS LOCATION
   606                              <1> 	;push	ax	; SAVE (AH) REGISTER VALUE AND CMOS BYTE
   607                              <1> 	; 18/04/2021
   608 000064F7 50                  <1> 	push	eax
   609                              <1> 	; 15/03/2015 ; IBM PC/XT Model 286 BIOS source code 
   610                              <1> 		     ; ----- 10/06/85 (test4.asm)
   611 000064F8 B01E                <1> 	mov	al, CMOS_SHUT_DOWN*2 	; GET ADDRESS OF DEFAULT LOCATION
   612                              <1> 	;mov	al, CMOS_REG_D*2 	; GET ADDRESS OF DEFAULT LOCATION
   613 000064FA D0D8                <1> 	rcr	al, 1			; PUT ORIGINAL NMI MASK BIT INTO ADDRESS
   614 000064FC E670                <1> 	out	CMOS_PORT, al		; SET DEFAULT TO READ ONLY REGISTER
   615                              <1> 	;pop	ax			; RESTORE (AH) AND (AL), CMOS BYTE
   616                              <1> 	; 18/04/2021
   617 000064FE 58                  <1> 	pop	eax
   618                              <1> 	; 29/07/2022
   619                              <1> 	;popf
   620 000064FF F8                  <1> 	clc	; 29/07/2022	
   621 00006500 C3                  <1> 	retn				; RETURN WITH FLAGS RESTORED
   622                              <1> 
   623                              <1> ;-------------------------------------------------------------------------------
   624                              <1> 
   625                              <1> ; /// End Of TIMER FUNCTIONS ///
  3223                                  
  3224 00006501 90<rep Fh>              Align 16
  3225                                  
  3226                                  gdt:	; Global Descriptor Table
  3227                                  	; 02/12/2020
  3228                                  	; (30/07/2015, conforming cs)
  3229                                  	; (26/03/2015)
  3230                                  	; (24/03/2015, tss)
  3231                                  	; (19/03/2015)
  3232                                  	; (29/12/2013)
  3233                                  	;
  3234 00006510 0000000000000000        	dw 0, 0, 0, 0		; NULL descriptor
  3235                                  gdt_kcode:
  3236                                  	; 18/08/2014
  3237                                  			; 8h kernel code segment, base = 00000000h		
  3238                                  	;dw 0FFFFh, 0, 9E00h, 00CFh	; KCODE  ; 30/12/2016	 
  3239 00006518 FFFF0000009ACF00        	dw 0FFFFh, 0, 9A00h, 00CFh	; KCODE
  3240                                  gdt_kdata:
  3241                                  			; 10h kernel data segment, base = 00000000h	
  3242 00006520 FFFF00000092CF00        	dw 0FFFFh, 0, 9200h, 00CFh	; KDATA
  3243                                  gdt_ucode:
  3244                                  			; 1Bh user code segment, base address = 400000h ; CORE
  3245                                  	;dw 0FBFFh, 0, 0FE40h, 00CFh	; UCODE  ; 30/12/2016	
  3246 00006528 FFFB000040FACF00        	dw 0FBFFh, 0, 0FA40h, 00CFh	; UCODE
  3247                                  gdt_udata: 
  3248                                  			; 23h user data segment, base address = 400000h ; CORE
  3249 00006530 FFFB000040F2CF00        	dw 0FBFFh, 0, 0F240h, 00CFh	; UDATA
  3250                                  gdt_tss:
  3251                                  			; Task State Segment
  3252 00006538 6700                    	dw 0067h ; Limit = 103 ; (104-1, tss size = 104 byte, 
  3253                                  			       ;  no IO permission in ring 3)
  3254                                  gdt_tss0:
  3255 0000653A 0000                    	dw 0  ; TSS base address, bits 0-15 
  3256                                  gdt_tss1:
  3257 0000653C 00                      	db 0  ; TSS base address, bits 16-23 
  3258                                  	      		; 49h	
  3259 0000653D E9                      	db 11101001b ; 0E9h => P=1/DPL=11/0/1/0/B/1 --> B = Task is busy (1)
  3260 0000653E 00                      	db 0 ; G/0/0/AVL/LIMIT=0000 ; (Limit bits 16-19 = 0000) (G=0, 1 byte)
  3261                                  gdt_tss2:
  3262 0000653F 00                      	db 0  ; TSS base address, bits 24-31 
  3263                                  
  3264                                  	; 04/12/2023 - TRDOS v2.0.7
  3265                                  	; 30/11/2020
  3266                                  	; 29/11/2020 - TRDOS v2.0.3
  3267                                  	; VESA VBE3 VIDE BIOS 32 BIT PMI SEGMENTS (16 bit segments)
  3268                                  			; 30h ; VBE3CS
  3269                                  _vbe3_CS:  ; vesa vbe3 bios uses this as code seg (same addr with _vbe3_DS)
  3270                                  	; limit = 65536, base addr = 0, P/DPL/1/Type/C/R/A = 9Ah, 16 bit
  3271                                  	;dw 0FFFFh, 0, 9A00h, 0 ; Note: base addr will be initialized
  3272                                  	; 04/12/2023 - TRDOS 386 v2.0.7	; (+!*!+)
  3273 00006540 FFFF0000069A0000        	dw 0FFFFh, 0, 9A06h, 0	; VBE3BIOSCODE_ADDR = 60000h
  3274                                  			; 38h ; VBE3BDS
  3275                                  _vbe3_BDS: ; vesa vbe3 bios uses this as equivalent of rombios data segment
  3276                                  	; limit = 1536, base addr = 0, P/DPL/1/Type/E/W/A = 92h, 16 bit
  3277 00006548 FF05000000920000        	dw 05FFh, 0, 9200h, 0 ; Note: base addr will be initialized	
  3278                                  			; 40h ; VBE3A000 
  3279                                  _A0000Sel: ; VGA default video memory address
  3280                                  	; limit = 65536, base addr = 0A0000h, 16 bit
  3281 00006550 FFFF00000A920000        	dw 0FFFFh, 0, 920Ah, 0
  3282                                  			; 48h ; VBE3B000 
  3283                                  _B0000Sel: ; MDA (monochrome) video memory address
  3284                                  	; limit = 65536, base addr = 0B0000h, 16 bit
  3285 00006558 FFFF00000B920000        	dw 0FFFFh, 0, 920Bh, 0
  3286                                  			; 50h ; VBE3B800 
  3287                                  _B8000Sel: ; CGA video memory address
  3288                                  	; limit = 32768, base addr = 0B8000h, 16 bit
  3289 00006560 FF7F00800B920000        	dw 07FFFh, 8000h, 920Bh, 0
  3290                                  			; 58h ; VBE3DS 
  3291                                  _vbe3_DS: ; vesa vbe3 bios uses this as data seg (CodeSegSel in PMInfoBlock)
  3292                                  	; limit = 65536, base addr = 0, P/DPL/1/Type/E/W/A = 92h, 16 bit
  3293                                  	;dw 0FFFFh, 0, 9200h, 0 ; Note: base addr will be initialized
  3294                                  	; 04/12/2023 - TRDOS 386 v2.0.7	; (+!*!+)
  3295 00006568 FFFF000006920000        	dw 0FFFFh, 0, 9206h, 0	; VBE3BIOSCODE_ADDR = 60000h
  3296                                  			; 60h ; VBE3SS   
  3297                                  _vbe3_SS: ; kernel's stack segment but 16 bit version (same stack addr)
  3298                                  	; limit = 1024, base addr = 0, P/DPL/1/Type/E/W/A = 92h, 16 bit
  3299 00006570 FF03000000920000        	dw 03FFh, 0, 9200h, 0 ; Note: base addr will be initialized
  3300                                  			; 68h ; VBE3ES 	
  3301                                  _vbe3_ES: ; extra 16 bit segment points to buffers in kernel's mem space
  3302                                  	; limit = 2048, base addr = 0, P/DPL/1/Type/E/W/A = 92h, 16 bit
  3303 00006578 FF07000000920000        	dw 07FFh, 0, 9200h,0 ; Note: base addr will be initialized
  3304                                  			; 70h ; KODE16	
  3305                                  _16bit_CS: ; 16 bit code segment points to kernel's far return addr
  3306                                  	; limit = 16M, base addr = 0, P/DPL/1/Type/E/W/A = 92h, 16 bit
  3307 00006580 FFFF0000009AFF00        	dw 0FFFFh, 0, 9A00h, 00FFh ; Note: base addr will be initialized
  3308                                  
  3309                                  gdt_end:
  3310                                  	;; 9Eh = 1001 1110b (GDT byte 5) P=1/DPL=00/1/TYPE=1110, 
  3311                                  					;; Type= 1 (code)/C=1/R=1/A=0
  3312                                  		; P= Present, DPL=0=ring 0,  1= user (0= system)
  3313                                  		; 1= Code C= Conforming, R= Readable, A= Accessed
  3314                                  
  3315                                  	;; 9Ah = 1001 1010b (GDT byte 5) P=1/DPL=00/1/TYPE=1010, 
  3316                                  					;; Type= 1 (code)/C=0/R=1/A=0
  3317                                  		; P= Present, DPL=0=ring 0,  1= user (0= system)
  3318                                  		; 1= Code C= non-Conforming, R= Readable, A= Accessed
  3319                                  
  3320                                  	;; 92h = 1001 0010b (GDT byte 5) P=1/DPL=00/1/TYPE=1010, 
  3321                                  					;; Type= 0 (data)/E=0/W=1/A=0
  3322                                  		; P= Present, DPL=0=ring 0,  1= user (0= system)
  3323                                  		; 0= Data E= Expansion direction (1= down, 0= up)
  3324                                  		; W= Writeable, A= Accessed
  3325                                  
  3326                                  	;; FEh = 1111 1110b (GDT byte 5) P=1/DPL=11/1/TYPE=1110, 
  3327                                  					;; Type= 1 (code)/C=1/R=1/A=0
  3328                                  		; P= Present, DPL=3=ring 3,  1= user (0= system)
  3329                                  		; 1= Code C= Conforming, R= Readable, A= Accessed
  3330                                  	
  3331                                  	;; FAh = 1111 1010b (GDT byte 5) P=1/DPL=11/1/TYPE=1010, 
  3332                                  					;; Type= 1 (code)/C=0/R=1/A=0
  3333                                  		; P= Present, DPL=3=ring 3,  1= user (0= system)
  3334                                  		; 1= Code C= non-Conforming, R= Readable, A= Accessed
  3335                                  
  3336                                  	;; F2h = 1111 0010b (GDT byte 5) P=1/DPL=11/1/TYPE=0010, 
  3337                                  					;; Type= 0 (data)/E=0/W=1/A=0
  3338                                  		; P= Present, DPL=3=ring 3,  1= user (0= system)
  3339                                  		; 0= Data E= Expansion direction (1= down, 0= up)
  3340                                  	
  3341                                  	;; CFh = 1100 1111b (GDT byte 6) G=1/B=1/0/AVL=0, Limit=1111b (3)
  3342                                  
  3343                                  		;; Limit = FFFFFh (=> FFFFFh+1= 100000h) // bits 0-15, 48-51 //
  3344                                  		;	 = 100000h * 1000h (G=1) = 4GB
  3345                                  		;; Limit = FFBFFh (=> FFBFFh+1= FFC00h) // bits 0-15, 48-51 //
  3346                                  		;	 = FFC00h * 1000h (G=1) = 4GB - 4MB
  3347                                  		; G= Granularity (1= 4KB), B= Big (32 bit), 
  3348                                  		; AVL= Available to programmers	
  3349                                  
  3350                                  gdtd:
  3351 00006588 7700                            dw gdt_end - gdt - 1    ; Limit (size)
  3352 0000658A [10650000]                      dd gdt			; Address of the GDT
  3353                                  
  3354                                  	; 20/08/2014
  3355                                  idtd:
  3356 0000658E 7F02                            dw idt_end - idt - 1    ; Limit (size)
  3357 00006590 [A0750100]                      dd idt			; Address of the IDT
  3358                                  
  3359                                  ; 20/02/2017
  3360                                  ;;; 11/03/2015
  3361                                  %include 'diskdata.s'	; DISK (BIOS) DATA (initialized)
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.5 - diskdata.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 06/08/2022 (Previous: 24/01/2016)
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 24/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.15 (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 00006594 [F7650000]          <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 00006598 01                  <1> 		DB	01		; DRIVE TYPE, MEDIA TABLE
   113                              <1>                 ;DW	MD_TBL1
   114 00006599 [B6650000]          <1> 		dd	MD_TBL1
   115 0000659D 82                  <1> 		DB	02+BIT7ON
   116                              <1> 		;DW	MD_TBL2
   117 0000659E [C3650000]          <1>                 dd      MD_TBL2
   118 000065A2 02                  <1> DR_DEFAULT:	DB	02
   119                              <1>                 ;DW	MD_TBL3
   120 000065A3 [D0650000]          <1> 		dd      MD_TBL3
   121 000065A7 03                  <1> 		DB	03
   122                              <1>                 ;DW	MD_TBL4
   123 000065A8 [DD650000]          <1> 		dd      MD_TBL4
   124 000065AC 84                  <1> 		DB	04+BIT7ON
   125                              <1>                 ;DW	MD_TBL5
   126 000065AD [EA650000]          <1> 		dd      MD_TBL5
   127 000065B1 04                  <1> 		DB	04
   128                              <1>                 ;DW	MD_TBL6
   129 000065B2 [F7650000]          <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 000065B6 DF                  <1> 	DB	11011111B	; SRT=D, HD UNLOAD=0F - 1ST SPECIFY BYTE
   141 000065B7 02                  <1> 	DB	2		; HD LOAD=1, MODE=DMA - 2ND SPECIFY BYTE
   142 000065B8 25                  <1> 	DB	MOTOR_WAIT	; WAIT TIME AFTER OPERATION TILL MOTOR OFF
   143 000065B9 02                  <1> 	DB	2		; 512 BYTES/SECTOR
   144 000065BA 09                  <1> 	DB	09		; EOT (LAST SECTOR ON TRACK)
   145 000065BB 2A                  <1> 	DB	02AH		; GAP LENGTH
   146 000065BC FF                  <1> 	DB	0FFH		; DTL
   147 000065BD 50                  <1> 	DB	050H		; GAP LENGTH FOR FORMAT
   148 000065BE F6                  <1> 	DB	0F6H		; FILL BYTE FOR FORMAT
   149 000065BF 0F                  <1> 	DB	15		; HEAD SETTLE TIME (MILLISECONDS)
   150 000065C0 08                  <1> 	DB	8		; MOTOR START TIME (1/8 SECONDS)
   151 000065C1 27                  <1> 	DB	39		; MAX. TRACK NUMBER
   152 000065C2 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 000065C3 DF                  <1> 	DB	11011111B	; SRT=D, HD UNLOAD=0F - 1ST SPECIFY BYTE
   158 000065C4 02                  <1> 	DB	2		; HD LOAD=1, MODE=DMA - 2ND SPECIFY BYTE
   159 000065C5 25                  <1> 	DB	MOTOR_WAIT	; WAIT TIME AFTER OPERATION TILL MOTOR OFF
   160 000065C6 02                  <1> 	DB	2		; 512 BYTES/SECTOR
   161 000065C7 09                  <1> 	DB	09		; EOT (LAST SECTOR ON TRACK)
   162 000065C8 2A                  <1> 	DB	02AH		; GAP LENGTH
   163 000065C9 FF                  <1> 	DB	0FFH		; DTL
   164 000065CA 50                  <1> 	DB	050H		; GAP LENGTH FOR FORMAT
   165 000065CB F6                  <1> 	DB	0F6H		; FILL BYTE FOR FORMAT
   166 000065CC 0F                  <1> 	DB	15		; HEAD SETTLE TIME (MILLISECONDS)
   167 000065CD 08                  <1> 	DB	8		; MOTOR START TIME (1/8 SECONDS)
   168 000065CE 27                  <1> 	DB	39		; MAX. TRACK NUMBER
   169 000065CF 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 000065D0 DF                  <1> 	DB	11011111B	; SRT=D, HD UNLOAD=0F - 1ST SPECIFY BYTE
   175 000065D1 02                  <1> 	DB	2		; HD LOAD=1, MODE=DMA - 2ND SPECIFY BYTE
   176 000065D2 25                  <1> 	DB	MOTOR_WAIT	; WAIT TIME AFTER OPERATION TILL MOTOR OFF
   177 000065D3 02                  <1> 	DB	2		; 512 BYTES/SECTOR
   178 000065D4 0F                  <1> 	DB	15		; EOT (LAST SECTOR ON TRACK)
   179 000065D5 1B                  <1> 	DB	01BH		; GAP LENGTH
   180 000065D6 FF                  <1> 	DB	0FFH		; DTL
   181 000065D7 54                  <1> 	DB	054H		; GAP LENGTH FOR FORMAT
   182 000065D8 F6                  <1> 	DB	0F6H		; FILL BYTE FOR FORMAT
   183 000065D9 0F                  <1> 	DB	15		; HEAD SETTLE TIME (MILLISECONDS)
   184 000065DA 08                  <1> 	DB	8		; MOTOR START TIME (1/8 SECONDS)
   185 000065DB 4F                  <1> 	DB	79		; MAX. TRACK NUMBER
   186 000065DC 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 000065DD DF                  <1> 	DB	11011111B	; SRT=D, HD UNLOAD=0F - 1ST SPECIFY BYTE
   192 000065DE 02                  <1> 	DB	2		; HD LOAD=1, MODE=DMA - 2ND SPECIFY BYTE
   193 000065DF 25                  <1> 	DB	MOTOR_WAIT	; WAIT TIME AFTER OPERATION TILL MOTOR OFF
   194 000065E0 02                  <1> 	DB	2		; 512 BYTES/SECTOR
   195 000065E1 09                  <1> 	DB	09		; EOT (LAST SECTOR ON TRACK)
   196 000065E2 2A                  <1> 	DB	02AH		; GAP LENGTH
   197 000065E3 FF                  <1> 	DB	0FFH		; DTL
   198 000065E4 50                  <1> 	DB	050H		; GAP LENGTH FOR FORMAT
   199 000065E5 F6                  <1> 	DB	0F6H		; FILL BYTE FOR FORMAT
   200 000065E6 0F                  <1> 	DB	15		; HEAD SETTLE TIME (MILLISECONDS)
   201 000065E7 08                  <1> 	DB	8		; MOTOR START TIME (1/8 SECONDS)
   202 000065E8 4F                  <1> 	DB	79		; MAX. TRACK NUMBER
   203 000065E9 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 000065EA DF                  <1> 	DB	11011111B	; SRT=D, HD UNLOAD=0F - 1ST SPECIFY BYTE
   209 000065EB 02                  <1> 	DB	2		; HD LOAD=1, MODE=DMA - 2ND SPECIFY BYTE
   210 000065EC 25                  <1> 	DB	MOTOR_WAIT	; WAIT TIME AFTER OPERATION TILL MOTOR OFF
   211 000065ED 02                  <1> 	DB	2		; 512 BYTES/SECTOR
   212 000065EE 09                  <1> 	DB	09		; EOT (LAST SECTOR ON TRACK)
   213 000065EF 2A                  <1> 	DB	02AH		; GAP LENGTH
   214 000065F0 FF                  <1> 	DB	0FFH		; DTL
   215 000065F1 50                  <1> 	DB	050H		; GAP LENGTH FOR FORMAT
   216 000065F2 F6                  <1> 	DB	0F6H		; FILL BYTE FOR FORMAT
   217 000065F3 0F                  <1> 	DB	15		; HEAD SETTLE TIME (MILLISECONDS)
   218 000065F4 08                  <1> 	DB	8		; MOTOR START TIME (1/8 SECONDS)
   219 000065F5 4F                  <1> 	DB	79		; MAX. TRACK NUMBER
   220 000065F6 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 000065F7 AF                  <1> 	DB	10101111B	; SRT=A, HD UNLOAD=0F - 1ST SPECIFY BYTE
   226 000065F8 02                  <1> 	DB	2		; HD LOAD=1, MODE=DMA - 2ND SPECIFY BYTE
   227 000065F9 25                  <1> 	DB	MOTOR_WAIT	; WAIT TIME AFTER OPERATION TILL MOTOR OFF
   228 000065FA 02                  <1> 	DB	2		; 512 BYTES/SECTOR
   229 000065FB 12                  <1> 	DB	18		; EOT (LAST SECTOR ON TRACK)
   230 000065FC 1B                  <1> 	DB	01BH		; GAP LENGTH
   231 000065FD FF                  <1> 	DB	0FFH		; DTL
   232 000065FE 6C                  <1> 	DB	06CH		; GAP LENGTH FOR FORMAT
   233 000065FF F6                  <1> 	DB	0F6H		; FILL BYTE FOR FORMAT
   234 00006600 0F                  <1> 	DB	15		; HEAD SETTLE TIME (MILLISECONDS)
   235 00006601 08                  <1> 	DB	8		; MOTOR START TIME (1/8 SECONDS)
   236 00006602 4F                  <1> 	DB	79		; MAX. TRACK NUMBER
   237 00006603 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 00006604 E0                  <1> 	db	NO_ERR
   280 00006605 024001BB            <1> 	db	BAD_ADDR_MARK,BAD_SEEK,BAD_CMD,UNDEF_ERR
   281 00006609 04BB100A            <1> 	db	RECORD_NOT_FND,UNDEF_ERR,BAD_ECC,BAD_SECTOR
   282                              <1> 
   283                              <1> ; 06/08/2022
   284                              <1> ; 17/12/2014 (mov ax, [cfd])
   285                              <1> ; 11/12/2014
   286                              <1> ;cfd:		db	0		; current floppy drive (for GET_PARM)
   287                              <1> ; 17/12/2014				; instead of 'DISK_POINTER'
   288                              <1> ;pfd:		db	1		; previous floppy drive (for GET_PARM)
   289                              <1> 					; (initial value of 'pfd 
   290                              <1> 					; must be different then 'cfd' value
   291                              <1> 					; to force updating/initializing
   292                              <1> 					; current drive parameters) 
   293                              <1> ; 06/08/2022 - TRDOS 386 Kernel v2.0.5
   294                              <1> ; 11/07/2022 - Retro UNIX 386 v1.1 (Kernel v0.2.1.5)
   295 0000660D FF                  <1> pfd:		db	0FFh
   296                              <1> 
   297                              <1> align 2
   298                              <1> 
   299 0000660E F001                <1> HF_PORT:	dw 	1F0h  ; Default = 1F0h
   300                              <1> 			      ; (170h)
   301 00006610 F603                <1> HF_REG_PORT:	dw	3F6h  ; HF_PORT + 206h
   302                              <1> 
   303                              <1> ; 05/01/2015 
   304 00006612 00                  <1> hf_m_s:         db      0     ; (0 = Master, 1 = Slave)
   305                              <1> 
   306                              <1> ; *****************************************************************************
  3362                                  
  3363 00006613 90                      Align 2
  3364                                  
  3365                                  ; 04/11/2014 (Retro UNIX 386 v1)
  3366 00006614 0000                    mem_1m_1k:   dw 0  ; Number of contiguous KB between
  3367                                                       ; 1 and 16 MB, max. 3C00h = 15 MB.
  3368 00006616 0000                    mem_16m_64k: dw 0  ; Number of contiguous 64 KB blocks
  3369                                  		   ; between 16 MB and 4 GB.
  3370                                  
  3371                                  ; 12/11/2014 (Retro UNIX 386 v1)
  3372 00006618 00                      boot_drv:    db 0 ; boot drive number (physical)
  3373                                  ; 24/11/2014
  3374 00006619 00                      drv:	     db 0 
  3375 0000661A 00                      last_drv:    db 0 ; last hdd
  3376 0000661B 00                      hdc:         db 0  ; number of hard disk drives
  3377                                  		     ; (present/detected)
  3378                                  
  3379                                  ; 24/11/2014 (Retro UNIX 386 v1)
  3380                                  ; Physical drive type & flags
  3381 0000661C 00                      fd0_type:    db 0  ; floppy drive type
  3382 0000661D 00                      fd1_type:    db 0  ; 4 = 1.44 Mb, 80 track, 3.5" (18 spt)
  3383                                  		     ; 6 = 2.88 Mb, 80 track, 3.5" (36 spt)
  3384                                  		     ; 3 = 720 Kb, 80 track, 3.5" (9 spt)
  3385                                  		     ; 2 = 1.2 Mb, 80 track, 5.25" (15 spt)
  3386                                  		     ; 1 = 360 Kb, 40 track, 5.25" (9 spt)		
  3387 0000661E 00                      hd0_type:    db 0  ; EDD status for hd0 (bit 7 = present flag)
  3388 0000661F 00                      hd1_type:    db 0  ; EDD status for hd1 (bit 7 = present flag)
  3389 00006620 00                      hd2_type:    db 0  ; EDD status for hd2 (bit 7 = present flag)
  3390 00006621 00                      hd3_type:    db 0  ; EDD status for hd3 (bit 7 = present flag)
  3391                                  		     ; bit 0 - Fixed disk access subset supported
  3392                                  		     ; bit 1 - Drive locking and ejecting
  3393                                  		     ; bit 2 - Enhanced disk drive support
  3394                                  		     ; bit 3 = Reserved (64 bit EDD support)
  3395                                  		     ; (If bit 0 is '1' Retro UNIX 386 v1
  3396                                  		     ; will interpret it as 'LBA ready'!)
  3397                                  
  3398                                  ; 08/08/2022
  3399                                  ; (drv.cylinders, drv.spt, drv.spt will not be used now on)
  3400                                  ; ('diskio.inc')
  3401                                  ; ((spt and heads and cylinder counts will be taken from DPT))
  3402                                  
  3403                                  ;; 11/03/2015 - 10/07/2015
  3404                                  ;drv.cylinders: dw 0,0,0,0,0,0,0
  3405                                  ;drv.heads:     dw 0,0,0,0,0,0,0
  3406                                  ;drv.spt:       dw 0,0,0,0,0,0,0
  3407                                  ; 12/07/2022 - 11/03/2015
  3408 00006622 000000000000000000-     drv.size:      dd 0,0,0,0,0,0,0
  3408 0000662B 000000000000000000-
  3408 00006634 000000000000000000-
  3408 0000663D 00                 
  3409 0000663E 00000000000000          drv.status:    db 0,0,0,0,0,0,0
  3410 00006645 00000000000000          drv.error:     db 0,0,0,0,0,0,0
  3411                                  ;
  3412                                  
  3413                                  Align 2
  3414                                  
  3415                                  ;;; 11/03/2015
  3416                                  %include 'kybdata.s'	; KEYBOARD (BIOS) DATA
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.5 - kybdata.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 24/07/2022 (Previous: 17/01/2016)
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 17/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.15 (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> ; 24/07/2022 - TRDOS 386 Kernel v2.0.5
    26                              <1> ; 05/12/2014
    27                              <1> ; 04/12/2014 (derived from pc-xt-286 bios source code -1986-) 
    28                              <1> ; 03/06/86  KEYBOARD BIOS
    29                              <1> 
    30                              <1> ;---------------------------------------------------------------------------------
    31                              <1> ;	KEY IDENTIFICATION SCAN TABLES
    32                              <1> ;---------------------------------------------------------------------------------
    33                              <1> 
    34                              <1> ;-----	TABLES FOR ALT CASE ------------
    35                              <1> ;-----	ALT-INPUT-TABLE 
    36 0000664C 524F50514B          <1> K30:	db	82,79,80,81,75
    37 00006651 4C4D474849          <1> 	db	76,77,71,72,73		; 10 NUMBER ON KEYPAD
    38                              <1> ;-----	SUPER-SHIFT-TABLE 
    39 00006656 101112131415        <1> 	db	16,17,18,19,20,21	; A-Z TYPEWRITER CHARS
    40 0000665C 161718191E1F        <1> 	db	22,23,24,25,30,31
    41 00006662 202122232425        <1> 	db	32,33,34,35,36,37
    42 00006668 262C2D2E2F30        <1> 	db	38,44,45,46,47,48
    43 0000666E 3132                <1> 	db	49,50
    44                              <1> 
    45                              <1> ;-----	TABLE OF SHIFT KEYS AND MASK VALUES
    46                              <1> ;-----	KEY_TABLE 
    47 00006670 52                  <1> _K6:    db      INS_KEY                 ; INSERT KEY
    48 00006671 3A4546381D          <1> 	db	CAPS_KEY,NUM_KEY,SCROLL_KEY,ALT_KEY,CTL_KEY
    49 00006676 2A36                <1>         db      LEFT_KEY,RIGHT_KEY
    50                              <1> _K6L    equ     $-_K6
    51                              <1> 
    52                              <1> ;-----	MASK_TABLE
    53 00006678 80                  <1> _K7:    db      INS_SHIFT               ; INSERT MODE SHIFT
    54 00006679 4020100804          <1> 	db	CAPS_SHIFT,NUM_SHIFT,SCROLL_SHIFT,ALT_SHIFT,CTL_SHIFT
    55 0000667E 0201                <1> 	db	LEFT_SHIFT,RIGHT_SHIFT
    56                              <1> 
    57                              <1> ;-----	TABLES FOR CTRL CASE		;---- CHARACTERS ------
    58 00006680 1BFF00FFFFFF        <1> _K8:	db	27,-1,0,-1,-1,-1	; Esc, 1, 2, 3, 4, 5
    59 00006686 1EFFFFFFFF1F        <1> 	db 	30,-1,-1,-1,-1,31	; 6, 7, 8, 9, 0, -
    60                              <1> 	;db	-1,127,-1,17,23,5	; =, Bksp, Tab, Q, W, E
    61 0000668C FF7F94111705        <1> 	db	-1,127,148,17,23,5 ; 24/07/2022
    62 00006692 12141915090F        <1> 	db	18,20,25,21,9,15	; R, T, Y, U, I, O
    63 00006698 101B1D0AFF01        <1> 	db	16,27,29,10,-1,1	; P, [, ], Enter, Ctrl, A
    64 0000669E 13040607080A        <1> 	db	19,4,6,7,8,10		; S, D, F, G, H, J
    65 000066A4 0B0CFFFFFFFF        <1> 	db	11,12,-1,-1,-1,-1	; K, L, :, ', `, LShift
    66 000066AA 1C1A18031602        <1> 	db	28,26,24,3,22,2		; Bkslash, Z, X, C, V, B
    67 000066B0 0E0DFFFFFFFF        <1> 	db	14,13,-1,-1,-1,-1	; N, M, ,, ., /, RShift
    68 000066B6 96FF20FF            <1> 	db	150,-1,' ',-1		; *, ALT, Spc, CL
    69                              <1> 	;				;----- FUNCTIONS ------		
    70 000066BA 5E5F60616263        <1> 	db 	94,95,96,97,98,99	; F1 - F6
    71 000066C0 64656667FFFF        <1> 	db	100,101,102,103,-1,-1	; F7 - F10, NL, SL
    72 000066C6 778D848E738F        <1> 	db	119,141,132,142,115,143	; Home, Up, PgUp, -, Left, Pad5
    73 000066CC 749075917692        <1> 	db 	116,144,117,145,118,146 ; Right, +, End, Down, PgDn, Ins
    74 000066D2 93FFFFFF898A        <1> 	db	147,-1,-1,-1,137,138	; Del, SysReq, Undef, WT, F11, F12
    75                              <1> 
    76                              <1> ;-----	TABLES FOR LOWER CASE ----------
    77 000066D8 1B3132333435363738- <1> K10:	db 	27,'1234567890-=',8,9
    77 000066E1 39302D3D0809        <1>
    78 000066E7 71776572747975696F- <1> 	db 	'qwertyuiop[]',13,-1,'asdfghjkl;',39
    78 000066F0 705B5D0DFF61736466- <1>
    78 000066F9 67686A6B6C3B27      <1>
    79 00006700 60FF5C7A786376626E- <1> 	db	96,-1,92,'zxcvbnm,./',-1,'*',-1,' ',-1
    79 00006709 6D2C2E2FFF2AFF20FF  <1>
    80                              <1> ;-----	LC TABLE SCAN
    81 00006712 3B3C3D3E3F          <1> 	db	59,60,61,62,63		; BASE STATE OF F1 - F10
    82 00006717 4041424344          <1> 	db	64,65,66,67,68
    83 0000671C FFFF                <1> 	db	-1,-1			; NL, SL
    84                              <1> 
    85                              <1> ;-----	KEYPAD TABLE
    86 0000671E 474849FF4BFF        <1> K15:	db	71,72,73,-1,75,-1	; BASE STATE OF KEYPAD KEYS
    87 00006724 4DFF4F50515253      <1> 	db	77,-1,79,80,81,82,83
    88 0000672B FFFF5C8586          <1> 	db	-1,-1,92,133,134	; SysRq, Undef, WT, F11, F12
    89                              <1> 
    90                              <1> ;-----	TABLES FOR UPPER CASE ----------
    91 00006730 1B21402324255E262A- <1> K11:	db 	27,'!@#$%',94,'&*()_+',8,0
    91 00006739 28295F2B0800        <1>
    92 0000673F 51574552545955494F- <1> 	db 	'QWERTYUIOP{}',13,-1,'ASDFGHJKL:"'
    92 00006748 507B7D0DFF41534446- <1>
    92 00006751 47484A4B4C3A22      <1>
    93 00006758 7EFF7C5A584356424E- <1> 	db	126,-1,'|ZXCVBNM<>?',-1,'*',-1,' ',-1
    93 00006761 4D3C3E3FFF2AFF20FF  <1>
    94                              <1> ;-----	UC TABLE SCAN
    95 0000676A 5455565758          <1> K12:	db	84,85,86,87,88		; SHIFTED STATE OF F1 - F10
    96 0000676F 595A5B5C5D          <1> 	db	89,90,91,92,93
    97 00006774 FFFF                <1> 	db	-1,-1			; NL, SL
    98                              <1> 
    99                              <1> ;-----	NUM STATE TABLE
   100 00006776 3738392D3435362B31- <1> K14:	db 	'789-456+1230.'		; NUMLOCK STATE OF KEYPAD KEYS
   100 0000677F 3233302E            <1>
   101                              <1> 	;
   102 00006783 FFFF7C8788          <1> 	db	-1,-1,124,135,136	; SysRq, Undef, WT, F11, F12
   103                              <1> 
   104                              <1> ; 26/08/2014
   105                              <1> ; Retro UNIX 8086 v1 - UNIX.ASM (03/03/2014)
   106                              <1> ; Derived from IBM "pc-at" 
   107                              <1> ; rombios source code (06/10/1985)
   108                              <1> ; 'dseg.inc'
   109                              <1> 
   110                              <1> ;---------------------------------------;
   111                              <1> ;	SYSTEM DATA AREA		;
   112                              <1> ;----------------------------------------
   113 00006788 00                  <1> BIOS_BREAK	db	0		; BIT 7=1 IF BREAK KEY HAS BEEN PRESSED
   114                              <1> 
   115                              <1> ;----------------------------------------
   116                              <1> ;	KEYBOARD DATA AREAS		;
   117                              <1> ;----------------------------------------
   118                              <1> 
   119 00006789 00                  <1> KB_FLAG		db	0		; KEYBOARD SHIFT STATE AND STATUS FLAGS
   120 0000678A 00                  <1> KB_FLAG_1	db	0		; SECOND BYTE OF KEYBOARD STATUS
   121 0000678B 00                  <1> KB_FLAG_2	db	0		; KEYBOARD LED FLAGS
   122 0000678C 00                  <1> KB_FLAG_3	db	0		; KEYBOARD MODE STATE AND TYPE FLAGS
   123 0000678D 00                  <1> ALT_INPUT	db	0		; STORAGE FOR ALTERNATE KEY PAD ENTRY
   124 0000678E [9E670000]          <1> BUFFER_START	dd	KB_BUFFER 	; OFFSET OF KEYBOARD BUFFER START
   125 00006792 [BE670000]          <1> BUFFER_END	dd	KB_BUFFER + 32	; OFFSET OF END OF BUFFER
   126 00006796 [9E670000]          <1> BUFFER_HEAD	dd	KB_BUFFER 	; POINTER TO HEAD OF KEYBOARD BUFFER
   127 0000679A [9E670000]          <1> BUFFER_TAIL	dd	KB_BUFFER 	; POINTER TO TAIL OF KEYBOARD BUFFER
   128                              <1> ; ------	HEAD = TAIL INDICATES THAT THE BUFFER IS EMPTY
   129 0000679E 0000<rep 10h>       <1> KB_BUFFER	times	16 dw 0		; ROOM FOR 16 SCAN CODE ENTRIES
   130                              <1> 
   131                              <1> ; /// End Of KEYBOARD DATA ///
  3417                                  %include 'vidata.s'	; VIDEO (BIOS) DATA
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.7 - vidata.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 17/10/2023 (Previous: 24/11/2020)
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 16/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.15 (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 000067BE 03                  <1> CRT_MODE:	db	3	; CURRENT DISPLAY MODE (TYPE)
    29 000067BF 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 000067C0 50                  <1> CRT_COLS:	db	80	; Number of columns
    52                              <1> 
    53                              <1> ; 01/07/2016
    54 000067C1 00                  <1> CRT_PALETTE:	db 	0	; Current palette setting
    55                              <1> 
    56                              <1> ; 03/07/2016
    57 000067C2 10                  <1> CHAR_HEIGHT:	db	16	; Default character height
    58 000067C3 60                  <1> VGA_VIDEO_CTL:	db	60h	; ROM BIOS DATA AREA Offset 87h
    59 000067C4 F9                  <1> VGA_SWITCHES:	db 	0F9h	; Feature Bit Switches (the basic screen)
    60 000067C5 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 000067C6 19                  <1> VGA_ROWS:	db	25
    73                              <1> 
    74                              <1> ; 16/01/2016
    75                              <1> chr_attrib:  ; Character color/attributes for video pages (0 to 7)
    76 000067C7 0707070707070707    <1> 	db	07h, 07h, 07h, 07h, 07h, 07h, 07h, 07h
    77                              <1> ; 30/01/2016
    78                              <1> vmode:
    79 000067CF 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 000067D7 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 000067D9 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 000067DA 0302010007040506    <1> 	db 	03h, 02h, 01h, 00h, 07h, 04h, 05h, 06h
    96                              <1> vga_g_modes: ; 31/07/2016
    97 000067E2 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 000067EA [4A680000]          <1> 	dd	vga_mode_03h
   104 000067EE [4A680000]          <1> 	dd	vga_mode_03h ; mode 02h -> mode 03h 
   105 000067F2 [8A680000]          <1> 	dd	vga_mode_01h
   106 000067F6 [8A680000]          <1> 	dd	vga_mode_01h ; mode 00h -> mode 01h
   107                              <1> 	;dd	vga_mode_07h
   108 000067FA [4A680000]          <1> 	dd	vga_mode_03h ; mode 07h -> mode 03h
   109 000067FE [CA680000]          <1> 	dd	vga_mode_04h
   110 00006802 [CA680000]          <1> 	dd	vga_mode_04h ; mode 05h -> mode 04h	
   111 00006806 [0A690000]          <1> 	dd	vga_mode_06h
   112 0000680A [4A690000]          <1> 	dd	vga_mode_13h
   113 0000680E [8A690000]          <1> 	dd	vga_mode_F0h
   114 00006812 [CA690000]          <1> 	dd	vga_mode_12h
   115 00006816 [0A6A0000]          <1> 	dd	vga_mode_6Ah
   116 0000681A [4A6A0000]          <1> 	dd	vga_mode_0Dh
   117 0000681E [8A6A0000]          <1> 	dd	vga_mode_0Eh
   118 00006822 [CA6A0000]          <1> 	dd	vga_mode_10h
   119 00006826 [0A6B0000]          <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 0000682A 0000000000020202    <1> 	db	CTEXT, CTEXT, CTEXT, CTEXT, MTEXT, CGA, CGA, CGA
   132                              <1> vga_g_memmodel: ; 31/07/2016
   133 00006832 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 0000683A 020202020001010103- <1> 	db	2, 2, 2, 2, 0, 1, 1, 1, 3, 3, 2, 2, 1, 1, 2, 2  
   139 00006843 03020201010202      <1>
   140                              <1> 						; (vgatables.h, VGAMODES, dac) 
   141                              <1> 						; 17/11/2020
   142                              <1> vga_params:
   143                              <1> 	; 23/11/2020
   144                              <1> 	; 16/11/2020
   145                              <1> 	; 09/11/2020, 10/11/2020, 11/11/2020 (TRDOS 386 v2.0.3)
   146                              <1> 	; 25/07/2016 
   147                              <1> 	; 19/07/2016
   148                              <1> 	; 03/07/2016
   149                              <1> 	; derived from 'Plex86/Bochs VGABios' source code
   150                              <1> 	; vgabios-0.7a (2011)
   151                              <1> 	; by the LGPL VGABios Developers Team (2001-2008)
   152                              <1> 	; 'vgatables.h'
   153                              <1> 	; Oracle VirtualBox 5.0.24 VGABios Source Code
   154                              <1> 	; ('vgabios.c', 'vgatables.h', 'vgafonts.h', 'vgarom.asm')
   155                              <1> 
   156                              <1> 	; 09/11/2020
   157                              <1> 	; Block Structure of Video Parameter Table
   158                              <1> 	;
   159                              <1> 	; Offset	# Bytes		Contents
   160                              <1> 	;
   161                              <1> 	;  0		1		# columns
   162                              <1> 	;  1		1  		# rows - 1 
   163                              <1> 	;  2		1		Pixels/character
   164                              <1> 	;  3-4		2		Page length		
   165                              <1> 	;  5-8		4		Sequencer Registers
   166                              <1> 	;  9		1		Miscellaneous Register	
   167                              <1> 	;  10-34	25		CRTC Registers
   168                              <1> 	;  35-54	20		Attribute Registers
   169                              <1> 	;  55-63	9		Graphics Controller Registers
   170                              <1> 	;
   171                              <1> 	; Ref: Programmer's Guide to EGA, VGA, and Super VGA cards
   172                              <1> 	; (Richard F. Ferraro, 1994)  
   173                              <1> 
   174                              <1> 	;
   175                              <1> vga_mode_03h:  ; mode 03h, 80*25 text, CGA colors
   176                              <1> 	; 11/11/2020
   177 0000684A 5018100010          <1>  	db	80, 24, 16, 00h, 10h ; tw, th-1, ch, slength (5)
   178 0000684F 00030002            <1>  	db	00h, 03h, 00h, 02h ; sequ regs (4)
   179 00006853 67                  <1>  	db	67h	; misc reg (1)
   180 00006854 5F4F50825581BF1F    <1>  	db	5Fh, 4Fh, 50h, 82h, 55h, 81h, 0BFh, 1Fh
   181                              <1>  	; 09/11/2020
   182                              <1> 	;db	5Fh, 4Fh, 50h, 82h, 54h, 80h, 0BFh, 1Fh
   183 0000685C 004F                <1> 	db	00h, 4Fh
   184                              <1> vga_p_cm_pos equ $ - vga_mode_03h
   185 0000685E 0D0E00000000        <1> 	db	0Dh, 0Eh, 00h, 00h, 00h, 00h
   186 00006864 9C8E8F281F96B9A3    <1>  	db	9Ch, 8Eh, 8Fh, 28h, 1Fh, 96h, 0B9h, 0A3h
   187 0000686C FF                  <1> 	db	0FFh	; crtc_regs (25)
   188 0000686D 0001020304051407    <1> 	db	00h, 01h, 02h, 03h, 04h, 05h, 14h, 07h
   189 00006875 38393A3B3C3D3E3F    <1>  	db	38h, 39h, 3Ah, 3Bh, 3Ch, 3Dh, 3Eh, 3Fh
   190                              <1>  	; 17/10/2023
   191 0000687D 0C000F08            <1> 	db	0Ch, 00h, 0Fh, 08h  ; actl regs (20)
   192                              <1> 	;db	0Ch, 00h, 0Fh, 00h  ; 19/11/2020
   193 00006881 0000000000100E0FFF  <1> 	db	00h, 00h, 00h, 00h, 00h, 10h, 0Eh, 0Fh, 0FFh ; grdc regs (9)
   194                              <1> 	; 09/11/2020
   195                              <1> 	;db	00h, 00h, 00h, 00h, 00h, 10h, 0Eh, 00h, 0FFh ; grdc regs (9)
   196                              <1> vga_mode_01h:	; mode 01h, 40*25 text, CGA colors
   197 0000688A 2818100008          <1> 	db	40, 24, 16, 00h, 08h ; tw, th-1, ch, slength
   198 0000688F 08030002            <1> 	db	08h, 03h, 00h, 02h  ; sequ regs
   199 00006893 67                  <1> 	db	67h	; misc reg
   200 00006894 2D2728902BA0BF1F    <1> 	db	2Dh, 27h, 28h, 90h, 2Bh, 0A0h, 0BFh, 1Fh
   201 0000689C 004F0D0E00000000    <1> 	db	00h, 4Fh, 0Dh, 0Eh, 00h, 00h, 00h, 00h
   202 000068A4 9C8E8F141F96B9A3    <1> 	db	9Ch, 8Eh, 8Fh, 14h, 1Fh, 96h, 0B9h, 0A3h
   203 000068AC FF                  <1> 	db	0FFh	; crtc_regs
   204 000068AD 0001020304051407    <1> 	db	00h, 01h, 02h, 03h, 04h, 05h, 14h, 07h
   205 000068B5 38393A3B3C3D3E3F    <1> 	db	38h, 39h, 3Ah, 3Bh, 3Ch, 3Dh, 3Eh, 3Fh
   206                              <1>  	;db	0Ch, 00h, 0Fh, 08h  ; actl regs (20)
   207 000068BD 0C000F00            <1> 	db	0Ch, 00h, 0Fh, 00h  ; 19/11/2020
   208 000068C1 0000000000100E0FFF  <1> 	db	00h, 00h, 00h, 00h, 00h, 10h, 0Eh, 0Fh, 0FFh ; grdc regs
   209                              <1> ;vga_mode_07h:	; mode 07h, 80*25 text, mono color
   210                              <1> ;	db	80, 24, 16, 00h, 10h  ; tw, th-1, ch, slength
   211                              <1> ;	db	00h, 03h, 00h, 02h ; sequ regs
   212                              <1> ;	db	66h	; misc reg
   213                              <1> ;	db	5Fh, 4Fh, 50h, 82h, 55h, 81h, 0BFh, 1Fh
   214                              <1> ;	db	00h, 4Fh, 0Dh, 0Eh, 00h, 00h, 00h, 00h
   215                              <1> ;	db	9Ch, 8Eh, 8Fh, 28h, 0Fh, 96h, 0B9h, 0A3h
   216                              <1> ;	db	0FFh	; crtc regs
   217                              <1> ;	db	00h, 08h, 08h, 08h, 08h, 08h, 08h, 08h
   218                              <1> ;	db	10h, 18h, 18h, 18h, 18h, 18h, 18h, 18h
   219                              <1> ;	db	0Eh, 00h, 0Fh, 08h  ; actl regs
   220                              <1> ;	db	00h, 00h, 00h, 00h, 00h, 10h, 0Ah, 0Fh, 0FFh ; grdc regs
   221                              <1> vga_mode_04h:	; 320*200 graphics, 4 colors, CGA
   222                              <1> 	; 11/11/2020
   223 000068CA 2818080040          <1> 	db	40, 24, 8, 00h, 40h ; tw, th-1, ch, slength
   224 000068CF 09030002            <1> 	db	09h, 03h, 00h, 02h ; sequ regs
   225 000068D3 63                  <1> 	db	63h	; misc reg
   226 000068D4 2D2728902B80BF1F    <1> 	db	2Dh, 27h, 28h, 90h, 2Bh, 80h, 0BFh, 1Fh
   227 000068DC 00C1000000000000    <1> 	db	00h, 0C1h, 00h, 00h, 00h, 00h, 00h, 00h
   228 000068E4 9C8E8F140096B9A2    <1> 	db	9Ch, 8Eh, 8Fh, 14h, 00h, 96h, 0B9h, 0A2h
   229 000068EC FF                  <1> 	db	0FFh	; crtc_regs
   230 000068ED 0013151702040607    <1> 	db	00h, 13h, 15h, 17h, 02h, 04h, 06h, 07h
   231 000068F5 1011121314151617    <1> 	db	10h, 11h, 12h, 13h, 14h, 15h, 16h, 17h
   232 000068FD 01000300            <1> 	db	01h, 00h, 03h, 00h ; actl regs
   233 00006901 0000000000300F0FFF  <1> 	db 	00h, 00h, 00h, 00h, 00h, 30h, 0Fh, 0Fh, 0FFh ; grdc regs
   234                              <1> vga_mode_06h:	; 640*200 graphics, 2 colors, CGA
   235                              <1> 	; 11/11/2020
   236 0000690A 5018080040          <1> 	db	80, 24, 8, 00h, 40h   ;	tw, th-1, ch, slength
   237 0000690F 01010006            <1> 	db	01h, 01h, 00h, 06h ; sequ regs
   238 00006913 63                  <1> 	db	63h	; misc reg
   239 00006914 5F4F50825480BF1F    <1> 	db	5Fh, 4Fh, 50h, 82h, 54h, 80h, 0BFh, 1Fh
   240 0000691C 00C1000000000000    <1> 	db	00h, 0C1h, 00h, 00h, 00h, 00h, 00h, 00h
   241 00006924 9C8E8F280096B9C2    <1> 	db	9Ch, 8Eh, 8Fh, 28h, 00h, 96h, 0B9h, 0C2h
   242 0000692C FF                  <1> 	db	0FFh	; crtc regs
   243 0000692D 0017171717171717    <1> 	db	00h, 17h, 17h, 17h, 17h, 17h, 17h, 17h
   244 00006935 1717171717171717    <1> 	db	17h, 17h, 17h, 17h, 17h, 17h, 17h, 17h
   245 0000693D 01000100            <1> 	db	01h, 00h, 01, 00h  ; actl regs
   246 00006941 0000000000000D0FFF  <1> 	db	00h, 00h, 00h, 00h, 00h, 00h, 0Dh, 0Fh, 0FFh ; grdc regs
   247                              <1> vga_mode_13h:  ; mode 13h, 300*200, 256 colors, linear
   248                              <1> 	; 11/11/2020
   249                              <1> 	;db 	40, 24, 8, 00h, 20h ; tw, th-1, ch, slength (5)
   250                              <1> 	; 23/11/2020 - 10/11/2020
   251 0000694A 28180800FA          <1> 	db 	40, 24, 8, 00h, 0FAh ; tw, th-1, ch, slength (5)
   252 0000694F 010F000E            <1> 	db	01h, 0Fh, 00h, 0Eh ; sequ regs (4)
   253 00006953 63                  <1> 	db	63h	; misc reg (1)
   254 00006954 5F4F50825480BF1F    <1> 	db	5Fh, 4Fh, 50h, 82h, 54h, 80h, 0BFh, 1Fh 
   255 0000695C 0041000000000000    <1> 	db 	00h, 041h, 00h, 00h, 00h, 00h, 00h, 00h
   256 00006964 9C8E8F284096B9A3    <1> 	db	9Ch, 8Eh, 8Fh, 28h, 40h, 96h, 0B9h, 0A3h
   257                              <1> 	;db	9Ch, 0Eh, 8Fh, 28h, 40h, 96h, 0B9h, 0A3h ; 17/10/2023
   258 0000696C FF                  <1> 	db	0FFh	; crtc regs (25)
   259 0000696D 0001020304050607    <1> 	db	00h, 01h, 02h, 03h, 04h, 05h, 06h, 07h
   260 00006975 08090A0B0C0D0E0F    <1>  	db	08h, 09h, 0Ah, 0Bh, 0Ch, 0Dh, 0Eh, 0Fh
   261 0000697D 41000F00            <1>  	db	41h, 00h, 0Fh, 00h  ; actl regs (20)
   262                              <1> 	; 10/11/2020
   263                              <1>  	;db	41h, 01h, 0Fh, 13h  ; actl regs (20) 
   264 00006981 000000000040050FFF  <1> 	db	00h, 00h, 00h, 00h, 00h, 40h, 05h, 0Fh, 0FFh ; grdc regs (9)
   265                              <1> vga_mode_setl equ $ - vga_mode_13h  ; = 64
   266                              <1> vga_mode_F0h:  ; mode X ; 320*240, 256 colors, planar
   267 0000698A 2818080000          <1> 	db 	40, 24, 8, 00h, 00h ; tw, th-1, ch, slength
   268 0000698F 010F0006            <1> 	db	01h, 0Fh, 00h, 06h ; sequ regs
   269 00006993 E3                  <1> 	db	0E3h	; misc reg
   270 00006994 5F4F508254800D3E    <1> 	db	5Fh, 4Fh, 50h, 82h, 54h, 80h, 0Dh, 3Eh 
   271 0000699C 0041000000000000    <1>  	db 	00h, 41h, 00h, 00h, 00h, 00h, 00h, 00h
   272 000069A4 EAACDF2800E706E3    <1> 	db	0EAh, 0ACh, 0DFh, 28h, 00h, 0E7h, 06h, 0E3h
   273 000069AC FF                  <1> 	db	0FFh	; crtc regs (25)
   274 000069AD 0001020304050607    <1> 	db	00h, 01h, 02h, 03h, 04h, 05h, 06h, 07h
   275 000069B5 08090A0B0C0D0E0F    <1>  	db	08h, 09h, 0Ah, 0Bh, 0Ch, 0Dh, 0Eh, 0Fh
   276 000069BD 41000F00            <1>  	db	41h, 00h, 0Fh, 00h  ; actl regs
   277 000069C1 000000000040050FFF  <1> 	db	00h, 00h, 00h, 00h, 00h, 40h, 05h, 0Fh, 0FFh ; grdc regs
   278                              <1> vga_mode_12h:  ; mode 12h, 640*480, 16 colors, planar
   279                              <1> 	; 11/11/2020
   280                              <1>  	;db 	80, 29, 16, 0, 0 ; tw, th-1, ch, slength
   281                              <1> 	; 09/11/2020
   282 000069CA 501D1000A0          <1>  	db 	80, 29, 16, 00h, 0A0h ; tw, th-1, ch, slength
   283 000069CF 010F0006            <1> 	db	01h, 0Fh, 00h, 06h ; sequ regs
   284 000069D3 E3                  <1> 	db 	0E3h	; misc reg
   285 000069D4 5F4F508254800B3E    <1> 	db	5Fh, 4Fh, 50h, 82h, 54h, 80h, 0Bh, 3Eh
   286                              <1> 	; 09/11/2020
   287                              <1> 	;db	5Fh, 4Fh, 50h, 82h, 53h, 9Fh, 0Bh, 3Eh
   288 000069DC 0040000000000000    <1> 	db	00h, 40h, 00h, 00h, 00h, 00h, 00h, 00h
   289 000069E4 EA8CDF2800E704E3    <1>  	db	0EAh, 8Ch, 0DFh, 28h, 00h, 0E7h, 04h, 0E3h
   290                              <1> 	; 09/11/2020
   291                              <1>  	;db	0E9h, 8Bh, 0DFh, 28h, 00h, 0E7h, 04h, 0E3h
   292 000069EC FF                  <1> 	db	0FFh	; crtc regs
   293 000069ED 0001020304051407    <1> 	db	00h, 01h, 02h, 03h, 04h, 05h, 14h, 07h
   294 000069F5 38393A3B3C3D3E3F    <1> 	db	38h, 39h, 3Ah, 3Bh, 3Ch, 3Dh, 3Eh, 3Fh
   295 000069FD 01000F00            <1> 	db	01h, 00h, 0Fh, 00h  ; actl regs
   296 00006A01 000000000000050FFF  <1> 	db	00h, 00h, 00h, 00h, 00h, 00h, 05h, 0Fh, 0FFh ; grdc regs
   297                              <1> vga_mode_6Ah:  ; mode 6Ah, 800*600, 16 colors, planar
   298                              <1> 	; 11/11/2020
   299 00006A0A 6424100000          <1>  	db 	100, 36, 16, 00h, 00h ; tw, th-1, ch, slength
   300 00006A0F 010F0006            <1> 	db	01h, 0Fh, 00h, 06h ; sequ regs
   301 00006A13 E3                  <1> 	db 	0E3h	; misc reg
   302 00006A14 7F6363836B1B72F0    <1> 	db	7Fh, 63h, 63h, 83h, 6Bh, 1Bh, 72h, 0F0h
   303 00006A1C 0060000000000000    <1> 	db	00h, 60h, 00h, 00h, 00h, 00h, 00h, 00h
   304 00006A24 598D5732005773E3    <1>  	db	59h, 8Dh, 57h, 32h, 00h, 57h, 73h, 0E3h
   305 00006A2C FF                  <1> 	db	0FFh	; crtc regs
   306 00006A2D 0001020304051407    <1> 	db	00h, 01h, 02h, 03h, 04h, 05h, 14h, 07h
   307 00006A35 38393A3B3C3D3E3F    <1> 	db	38h, 39h, 3Ah, 3Bh, 3Ch, 3Dh, 3Eh, 3Fh
   308 00006A3D 01000F00            <1> 	db	01h, 00h, 0Fh, 00h  ; actl regs
   309 00006A41 000000000000050FFF  <1> 	db	00h, 00h, 00h, 00h, 00h, 00h, 05h, 0Fh, 0FFh ; grdc regs
   310                              <1> vga_mode_0Dh:  ; mode 0Dh, 320*200, 16 colors, planar
   311 00006A4A 2818080020          <1>  	db 	40, 24, 8, 00h, 20h ; tw, th-1, ch, slength
   312 00006A4F 090F0006            <1> 	db	09h, 0Fh, 00h, 06h ; sequ regs
   313 00006A53 63                  <1> 	db 	63h	; misc reg
   314 00006A54 2D2728902B80BF1F    <1> 	db	2Dh, 27h, 28h, 90h, 2Bh, 80h, 0BFh, 1Fh
   315 00006A5C 00C0000000000000    <1> 	db	00h, 0C0h, 00h, 00h, 00h, 00h, 00h, 00h
   316 00006A64 9C8E8F140096B9E3    <1>  	db	9Ch, 8Eh, 8Fh, 14h, 00h, 96h, 0B9h, 0E3h
   317 00006A6C FF                  <1> 	db	0FFh	; crtc regs
   318 00006A6D 0001020304050607    <1> 	db	00h, 01h, 02h, 03h, 04h, 05h, 06h, 07h
   319 00006A75 1011121314151617    <1> 	db	10h, 11h, 12h, 13h, 14h, 15h, 16h, 17h
   320 00006A7D 01000F00            <1> 	db	01h, 00h, 0Fh, 00h  ; actl regs
   321 00006A81 000000000000050FFF  <1> 	db	00h, 00h, 00h, 00h, 00h, 00h, 05h, 0Fh, 0FFh ; grdc regs
   322                              <1> vga_mode_0Eh:  ; mode 0Eh, 640*200, 16 colors, planar
   323 00006A8A 5018080040          <1>  	db 	80, 24, 8, 00h, 40h ; tw, th-1, ch, slength
   324 00006A8F 010F0006            <1> 	db	01h, 0Fh, 00h, 06h ; sequ regs
   325 00006A93 63                  <1> 	db 	63h	; misc reg
   326 00006A94 5F4F50825480BF1F    <1> 	db	5Fh, 4Fh, 50h, 82h, 54h, 80h, 0BFh, 1Fh
   327 00006A9C 00C0000000000000    <1> 	db	00h, 0C0h, 00h, 00h, 00h, 00h, 00h, 00h
   328 00006AA4 9C8E8F280096B9E3    <1>  	db	9Ch, 8Eh, 8Fh, 28h, 00h, 96h, 0B9h, 0E3h
   329 00006AAC FF                  <1> 	db	0FFh	; crtc regs
   330 00006AAD 0001020304050607    <1> 	db	00h, 01h, 02h, 03h, 04h, 05h, 06h, 07h
   331 00006AB5 1011121314151617    <1> 	db	10h, 11h, 12h, 13h, 14h, 15h, 16h, 17h
   332 00006ABD 01000F00            <1> 	db	01h, 00h, 0Fh, 00h  ; actl regs
   333 00006AC1 000000000000050FFF  <1> 	db	00h, 00h, 00h, 00h, 00h, 00h, 05h, 0Fh, 0FFh ; grdc regs
   334                              <1> vga_mode_10h: ; mode 10h, 640*350, 16 colors, planar
   335 00006ACA 50180E0080          <1>  	db 	80, 24, 14, 00h, 80h ; tw, th-1, ch, slength
   336 00006ACF 010F0006            <1> 	db	01h, 0Fh, 00h, 06h ; sequ regs
   337 00006AD3 A3                  <1> 	db 	0A3h	; misc reg
   338 00006AD4 5F4F50825480BF1F    <1> 	db	5Fh, 4Fh, 50h, 82h, 54h, 80h, 0BFh, 1Fh
   339 00006ADC 0040000000000000    <1> 	db	00h, 40h, 00h, 00h, 00h, 00h, 00h, 00h
   340 00006AE4 83855D280F63BAE3    <1>  	db	83h, 85h, 5Dh, 28h, 0Fh, 63h, 0BAh, 0E3h
   341 00006AEC FF                  <1> 	db	0FFh	; crtc regs
   342 00006AED 0001020304051407    <1> 	db	00h, 01h, 02h, 03h, 04h, 05h, 14h, 07h
   343 00006AF5 38393A3B3C3D3E3F    <1> 	db	38h, 39h, 3Ah, 3Bh, 3Ch, 3Dh, 3Eh, 3Fh
   344 00006AFD 01000F00            <1> 	db	01h, 00h, 0Fh, 00h  ; actl regs
   345 00006B01 000000000000050FFF  <1> 	db	00h, 00h, 00h, 00h, 00h, 00h, 05h, 0Fh, 0FFh ; grdc regs
   346                              <1> vga_mode_11h: ; mode 11h, 640*480, mono color, planar
   347                              <1>  	; 11/11/2020
   348 00006B0A 501D1000A0          <1> 	db 	80, 29, 16, 00h, 0A0h ; tw, th-1, ch, slength
   349 00006B0F 010F0006            <1> 	db	01h, 0Fh, 00h, 06h ; sequ regs
   350 00006B13 E3                  <1> 	db 	0E3h	; misc reg
   351 00006B14 5F4F508254800B3E    <1> 	db	5Fh, 4Fh, 50h, 82h, 54h, 80h, 0Bh, 3Eh
   352 00006B1C 0040000000000000    <1> 	db	00h, 40h, 00h, 00h, 00h, 00h, 00h, 00h
   353 00006B24 EA8CDF2800E704C3    <1>  	db	0EAh, 8Ch, 0DFh, 28h, 00h, 0E7h, 04h, 0C3h ; 11/11/2020
   354 00006B2C FF                  <1> 	db	0FFh	; crtc regs
   355 00006B2D 003F003F003F003F    <1> 	db	00h, 3Fh, 00h, 3Fh, 00h, 3Fh, 00h, 3Fh
   356 00006B35 003F003F003F003F    <1> 	db	00h, 3Fh, 00h, 3Fh, 00h, 3Fh, 00h, 3Fh
   357 00006B3D 01000F00            <1> 	db	01h, 00h, 0Fh, 00h  ; actl regs
   358 00006B41 000000000000050FFF  <1> 	db	00h, 00h, 00h, 00h, 00h, 00h, 05h, 0Fh, 0FFh ; grdc regs
   359                              <1> end_of_vga_params:
   360                              <1> 
   361                              <1> ; /// End Of VIDEO DATA ///
   362                              <1> 
   363                              <1> ; 23/11/2020
   364                              <1> ; VBE 2 BOCHS/QEMU emulator extensions 
   365                              <1> ;	for TRDOS 386 v2 kernel (video bios)  
   366                              <1> 
   367                              <1> ; vbetables.h by Volker Rupper (02/01/2020)
   368                              <1> 
   369                              <1> b_vbe_modes:
   370                              <1> 	;/* standard VESA modes */	
   371 00006B4A 0001800290010800    <1> 	dw 100h,  640, 400,  8
   372 00006B52 01018002E0010800    <1> 	dw 101h,  640, 480,  8
   373 00006B5A 0301200358020800    <1> 	dw 103h,  800, 600,  8
   374 00006B62 0501000400030800    <1> 	dw 105h, 1024, 768,  8
   375 00006B6A 0E014001C8001000    <1> 	dw 10Eh,  320, 200, 16
   376 00006B72 0F014001C8001800    <1> 	dw 10Fh,  320, 200, 24
   377 00006B7A 11018002E0011000    <1> 	dw 111h,  640, 480, 16
   378 00006B82 12018002E0011800    <1> 	dw 112h,  640, 480, 24
   379 00006B8A 1401200358021000    <1> 	dw 114h,  800, 600, 16
   380 00006B92 1501200358021800    <1> 	dw 115h,  800, 600, 24
   381 00006B9A 1701000400031000    <1> 	dw 117h, 1024, 768, 16
   382 00006BA2 1801000400031800    <1> 	dw 118h, 1024, 768, 24
   383                              <1> 
   384                              <1> ;/* BOCHS/PLEX86 'own' mode numbers */
   385 00006BAA 40014001C8002000    <1> 	dw 140h,  320,  200, 32
   386 00006BB2 4101800290012000    <1> 	dw 141h,  640,  400, 32
   387 00006BBA 42018002E0012000    <1> 	dw 142h,  640,  480, 32
   388 00006BC2 4301200358022000    <1> 	dw 143h,  800,  600, 32
   389 00006BCA 4401000400032000    <1> 	dw 144h, 1024,  768, 32
   390 00006BD2 46014001C8000800    <1> 	dw 146h,  320,  200,  8
   391 00006BDA 8D010005D0021000    <1> 	dw 18Dh, 1280,  720, 16
   392 00006BE2 8E010005D0021800    <1> 	dw 18Eh, 1280,  720, 24
   393 00006BEA 8F010005D0022000    <1> 	dw 18Fh, 1280,  720, 32
   394 00006BF2 9001800738041000    <1> 	dw 190h, 1920, 1080, 16
   395 00006BFA 9101800738041800    <1> 	dw 191h, 1920, 1080, 24
   396 00006C02 9201800738042000    <1> 	dw 192h, 1920, 1080, 32
   397                              <1> 
   398                              <1> end_of_b_vbe_modes:
   399                              <1> 
   400                              <1> MA1 equ VBE_MODE_ATTRIBUTE_SUPPORTED
   401                              <1> MA2 equ VBE_MODE_ATTRIBUTE_EXTENDED_INFO_AVAILABLE
   402                              <1> MA3 equ VBE_MODE_ATTRIBUTE_COLOR_MODE
   403                              <1> MA4 equ VBE_MODE_ATTRIBUTE_LINEAR_FRAME_BUFFER_MODE
   404                              <1> MA5 equ	VBE_MODE_ATTRIBUTE_GRAPHICS_MODE
   405                              <1> 
   406                              <1> MODE_ATTRIBUTES equ MA1|MA2|MA3|MA4|MA5
   407                              <1> 
   408                              <1> WA1 equ VBE_WINDOW_ATTRIBUTE_RELOCATABLE
   409                              <1> WA2 equ	VBE_WINDOW_ATTRIBUTE_READABLE
   410                              <1> WA3 equ VBE_WINDOW_ATTRIBUTE_WRITEABLE
   411                              <1> 
   412                              <1> WINA_ATTRIBUTES equ WA1|WA2|WA3
   413                              <1> 
   414                              <1> ; 24/11/2020
   415                              <1> 
   416                              <1> %if 0
   417                              <1> 
   418                              <1> MODE_INFO_LIST: 
   419                              <1> 
   420                              <1> ; 24/11/2020
   421                              <1> ; '%if 0' disables 24 mode info tables here, until %endif 
   422                              <1> ; ('set_mode_info_list' will set only 1 list for selected mode)
   423                              <1> ; (Purpose: To save about 1 KB kernel size by removing fixed data)
   424                              <1> 
   425                              <1> 			dw	0100h ; 640x400x8 
   426                              <1> ModeAttributes1: 	dw	MODE_ATTRIBUTES
   427                              <1> WinAAttributes1: 	db	WINA_ATTRIBUTES
   428                              <1> WinBAttributes1: 	db	0
   429                              <1> WinGranularity1: 	dw	VBE_DISPI_BANK_SIZE_KB
   430                              <1> WinSize1: 		dw	VBE_DISPI_BANK_SIZE_KB
   431                              <1> WinASegment1:		dw	VGAMEM_GRAPH
   432                              <1> WinBSegment1:		dw	0000h
   433                              <1> WinFuncPtr1:		dd	0
   434                              <1> BytesPerScanLine1: 	dw	640
   435                              <1> XResolution1:		dw	640
   436                              <1> YResolution1:		dw	400
   437                              <1> XCharSize1:		db	8
   438                              <1> YCharSize1:		db	16
   439                              <1> NumberOfPlanes1: 	db	1
   440                              <1> BitsPerPixel1:		db	8
   441                              <1> NumberOfBanks1:		db	4
   442                              <1> MemoryModel1:		db	VBE_MEMORYMODEL_PACKED_PIXEL
   443                              <1> BankSize1:		db	0
   444                              <1> NumberOfImagePages1: 	db	64
   445                              <1> Reserved_page1:		db	0
   446                              <1> RedMaskSize1:		db	0
   447                              <1> RedFieldPosition1: 	db	0
   448                              <1> GreenMaskSize1:		db	0
   449                              <1> GreenFieldPosition1: 	db	0
   450                              <1> BlueMaskSize1:		db	0
   451                              <1> BlueFieldPosition1: 	db	0
   452                              <1> RsvdMaskSize1: 		db	0
   453                              <1> RsvdFieldPosition1: 	db	0
   454                              <1> DirectColorModeInfo1: 	db	0
   455                              <1> PhysBasePtr1:		dd	VBE_DISPI_LFB_PHYSICAL_ADDRESS
   456                              <1> OffScreenMemOffset1: 	dd	0
   457                              <1> OffScreenMemSize1: 	dw	0
   458                              <1> LinBytesPerScanLine1: 	dw	640
   459                              <1> BnkNumberOfPages1: 	db	0
   460                              <1> LinNumberOfPages1: 	db	0
   461                              <1> LinRedMaskSize1:	db	0
   462                              <1> LinRedFieldPosition1: 	db	0
   463                              <1> LinGreenMaskSize1: 	db	0
   464                              <1> LinGreenFieldPosition1: db	0
   465                              <1> LinBlueMaskSize1: 	db	0
   466                              <1> LinBlueFieldPosition1: 	db	0
   467                              <1> LinRsvdMaskSize1: 	db	0
   468                              <1> LinRsvdFieldPosition1: 	db	0
   469                              <1> MaxPixelClock1:		dd	0
   470                              <1> 
   471                              <1> 			dw	0101h ; 640x480x8
   472                              <1> ModeAttributes2: 	dw	MODE_ATTRIBUTES
   473                              <1> WinAAttributes2: 	db	WINA_ATTRIBUTES
   474                              <1> WinBAttributes2: 	db	0
   475                              <1> WinGranularity2: 	dw	VBE_DISPI_BANK_SIZE_KB
   476                              <1> WinSize2: 		dw	VBE_DISPI_BANK_SIZE_KB
   477                              <1> WinASegment2:		dw	VGAMEM_GRAPH
   478                              <1> WinBSegment2:		dw	0000h
   479                              <1> WinFuncPtr2:		dd	0
   480                              <1> BytesPerScanLine2:	dw	640
   481                              <1> XResolution2:		dw	640
   482                              <1> YResolution2:		dw	480
   483                              <1> XCharSize2:		db	8
   484                              <1> YCharSize2:		db	16
   485                              <1> NumberOfPlanes2:	db	1
   486                              <1> BitsPerPixel2:		db	8
   487                              <1> NumberOfBanks2:		db	5
   488                              <1> MemoryModel2:		db	VBE_MEMORYMODEL_PACKED_PIXEL
   489                              <1> BankSize2:		db	0
   490                              <1> NumberOfImagePages2:	db	53
   491                              <1> Reserved_page2:		db	0
   492                              <1> RedMaskSize2:		db	0
   493                              <1> RedFieldPosition2:	db	0
   494                              <1> GreenMaskSize2:		db	0
   495                              <1> GreenFieldPosition2:	db	0
   496                              <1> BlueMaskSize2:		db	0
   497                              <1> BlueFieldPosition2:	db	0
   498                              <1> RsvdMaskSize2:		db	0
   499                              <1> RsvdFieldPosition2:	db	0
   500                              <1> DirectColorModeInfo2:	db	0
   501                              <1> PhysBasePtr2:		dd	VBE_DISPI_LFB_PHYSICAL_ADDRESS
   502                              <1> OffScreenMemOffset2:	dd	0
   503                              <1> OffScreenMemSize2:	dw	0
   504                              <1> LinBytesPerScanLine2:	dw	640
   505                              <1> BnkNumberOfPages2: 	db	0
   506                              <1> LinNumberOfPages2: 	db	0
   507                              <1> LinRedMaskSize2:	db	0
   508                              <1> LinRedFieldPosition2: 	db	0
   509                              <1> LinGreenMaskSize2: 	db	0
   510                              <1> LinGreenFieldPosition2: db	0
   511                              <1> LinBlueMaskSize2: 	db	0
   512                              <1> LinBlueFieldPosition2: 	db	0
   513                              <1> LinRsvdMaskSize2: 	db	0
   514                              <1> LinRsvdFieldPosition2: 	db	0
   515                              <1> MaxPixelClock2:		dd	0
   516                              <1> 			
   517                              <1> 			dw	0103h ; 800x600x8
   518                              <1> ModeAttributes3: 	dw	MODE_ATTRIBUTES
   519                              <1> WinAAttributes3: 	db	WINA_ATTRIBUTES
   520                              <1> WinBAttributes3: 	db	0
   521                              <1> WinGranularity3: 	dw	VBE_DISPI_BANK_SIZE_KB
   522                              <1> WinSize3: 		dw	VBE_DISPI_BANK_SIZE_KB
   523                              <1> WinASegment3:		dw	VGAMEM_GRAPH
   524                              <1> WinBSegment3:		dw	0000h
   525                              <1> WinFuncPtr3:		dd	0
   526                              <1> BytesPerScanLine3:	dw	800
   527                              <1> XResolution3:		dw	800
   528                              <1> YResolution3:		dw	600
   529                              <1> XCharSize3:		db	8
   530                              <1> YCharSize3:		db	16
   531                              <1> NumberOfPlanes3:	db	1
   532                              <1> BitsPerPixel3:		db	8
   533                              <1> NumberOfBanks3:		db	8
   534                              <1> MemoryModel3:		db	VBE_MEMORYMODEL_PACKED_PIXEL
   535                              <1> BankSize3:		db	0
   536                              <1> NumberOfImagePages3:	db	33
   537                              <1> Reserved_page3:		db	0
   538                              <1> RedMaskSize3:		db	0
   539                              <1> RedFieldPosition3:	db	0
   540                              <1> GreenMaskSize3:		db	0
   541                              <1> GreenFieldPosition3:	db	0
   542                              <1> BlueMaskSize3:		db	0
   543                              <1> BlueFieldPosition3:	db	0
   544                              <1> RsvdMaskSize3:		db	0
   545                              <1> RsvdFieldPosition3:	db	0
   546                              <1> DirectColorModeInfo3:	db	0
   547                              <1> PhysBasePtr3:		dd	VBE_DISPI_LFB_PHYSICAL_ADDRESS
   548                              <1> OffScreenMemOffset3:	dd	0
   549                              <1> OffScreenMemSize3:	dw	0
   550                              <1> LinBytesPerScanLine3:	dw	800
   551                              <1> BnkNumberOfPages3: 	db	0
   552                              <1> LinNumberOfPages3: 	db	0
   553                              <1> LinRedMaskSize3:	db	0
   554                              <1> LinRedFieldPosition3: 	db	0
   555                              <1> LinGreenMaskSize3: 	db	0
   556                              <1> LinGreenFieldPosition: 	db	0
   557                              <1> LinBlueMaskSize: 	db	0
   558                              <1> LinBlueFieldPosition: 	db	0
   559                              <1> LinRsvdMaskSize: 	db	0
   560                              <1> LinRsvdFieldPosition: 	db	0
   561                              <1> MaxPixelClock:		dd	0
   562                              <1> 			
   563                              <1> 			dw	0105h ; 1024x768x8
   564                              <1> ModeAttributes4: 	dw	MODE_ATTRIBUTES
   565                              <1> WinAAttributes4: 	db	WINA_ATTRIBUTES
   566                              <1> WinBAttributes4: 	db	0
   567                              <1> WinGranularity4: 	dw	VBE_DISPI_BANK_SIZE_KB
   568                              <1> WinSize4: 		dw	VBE_DISPI_BANK_SIZE_KB
   569                              <1> WinASegment4:		dw	VGAMEM_GRAPH
   570                              <1> WinBSegment4:		dw	0000h
   571                              <1> WinFuncPtr4:		dd	0
   572                              <1> BytesPerScanLine4:	dw	1024
   573                              <1> XResolution4:		dw	1024
   574                              <1> YResolution4:		dw	768
   575                              <1> XCharSize4:		db	8
   576                              <1> YCharSize4:		db	16
   577                              <1> NumberOfPlanes4:	db	1
   578                              <1> BitsPerPixel4:		db	8
   579                              <1> NumberOfBanks4:		db	12
   580                              <1> MemoryModel4:		db	VBE_MEMORYMODEL_PACKED_PIXEL
   581                              <1> BankSize4:		db	0
   582                              <1> NumberOfImagePages4:	db	20
   583                              <1> Reserved_page4:		db	0
   584                              <1> RedMaskSize4:		db	0
   585                              <1> RedFieldPosition4:	db	0
   586                              <1> GreenMaskSize4:		db	0
   587                              <1> GreenFieldPosition4:	db	0
   588                              <1> BlueMaskSize4:		db	0
   589                              <1> BlueFieldPosition4:	db	0
   590                              <1> RsvdMaskSize4:		db	0
   591                              <1> RsvdFieldPosition4:	db	0
   592                              <1> DirectColorModeInfo4:	db	0
   593                              <1> PhysBasePtr4:		dd	VBE_DISPI_LFB_PHYSICAL_ADDRESS
   594                              <1> OffScreenMemOffset4:	dd	0
   595                              <1> OffScreenMemSize4:	dw	0
   596                              <1> LinBytesPerScanLine4:	dw	1024
   597                              <1> BnkNumberOfPages4: 	db	0
   598                              <1> LinNumberOfPages4: 	db	0
   599                              <1> LinRedMaskSize4:	db	0
   600                              <1> LinRedFieldPosition4: 	db	0
   601                              <1> LinGreenMaskSize4: 	db	0
   602                              <1> LinGreenFieldPosition4: db	0
   603                              <1> LinBlueMaskSize4: 	db	0
   604                              <1> LinBlueFieldPosition4: 	db	0
   605                              <1> LinRsvdMaskSize4: 	db	0
   606                              <1> LinRsvdFieldPosition4: 	db	0
   607                              <1> MaxPixelClock4:		dd	0
   608                              <1> 
   609                              <1> 			dw	010Eh ; 320x200x16
   610                              <1> ModeAttributes5: 	dw	MODE_ATTRIBUTES
   611                              <1> WinAAttributes5: 	db	WINA_ATTRIBUTES
   612                              <1> WinBAttributes5: 	db	0
   613                              <1> WinGranularity5: 	dw	VBE_DISPI_BANK_SIZE_KB
   614                              <1> WinSize5: 		dw	VBE_DISPI_BANK_SIZE_KB
   615                              <1> WinASegment5:		dw	VGAMEM_GRAPH
   616                              <1> WinBSegment5:		dw	0000h
   617                              <1> WinFuncPtr5:		dd	0
   618                              <1> BytesPerScanLine5:	dw	640
   619                              <1> XResolution5:		dw	320
   620                              <1> YResolution5:		dw	200
   621                              <1> XCharSize5:		db	8
   622                              <1> YCharSize5:		db	16
   623                              <1> NumberOfPlanes5:	db	1
   624                              <1> BitsPerPixel5:		db	16
   625                              <1> NumberOfBanks5:		db	2
   626                              <1> MemoryModel5:		db	VBE_MEMORYMODEL_DIRECT_COLOR
   627                              <1> BankSize5:		db	0
   628                              <1> NumberOfImagePages5:	db	130
   629                              <1> Reserved_page5:		db	0
   630                              <1> RedMaskSize5:		db	5
   631                              <1> RedFieldPosition5:	db	11
   632                              <1> GreenMaskSize5:		db	6
   633                              <1> GreenFieldPosition5:	db	5
   634                              <1> BlueMaskSize5:		db	5
   635                              <1> BlueFieldPosition5:	db	0
   636                              <1> RsvdMaskSize5:		db	0
   637                              <1> RsvdFieldPosition5:	db	0
   638                              <1> DirectColorModeInfo5:	db	0
   639                              <1> PhysBasePtr5:		dd	VBE_DISPI_LFB_PHYSICAL_ADDRESS
   640                              <1> OffScreenMemOffset5:	dd	0
   641                              <1> OffScreenMemSize5:	dw	0
   642                              <1> LinBytesPerScanLine5:	dw	640
   643                              <1> BnkNumberOfPages5: 	db	0
   644                              <1> LinNumberOfPages5: 	db	0
   645                              <1> LinRedMaskSize5:	db	5
   646                              <1> LinRedFieldPosition5:	db	11
   647                              <1> LinGreenMaskSize5:	db	6
   648                              <1> LinGreenFieldPosition5:	db	5
   649                              <1> LinBlueMaskSize5:	db	5
   650                              <1> LinBlueFieldPosition5:	db	0
   651                              <1> LinRsvdMaskSize5:	db	0
   652                              <1> LinRsvdFieldPosition5:	db	0
   653                              <1> MaxPixelClock5:		dd	0
   654                              <1> 	
   655                              <1> 			dw	010Fh ; 320x200x24
   656                              <1> ModeAttributes6: 	dw	MODE_ATTRIBUTES
   657                              <1> WinAAttributes6: 	db	WINA_ATTRIBUTES
   658                              <1> WinBAttributes6: 	db	0
   659                              <1> WinGranularity6: 	dw	VBE_DISPI_BANK_SIZE_KB
   660                              <1> WinSize6: 		dw	VBE_DISPI_BANK_SIZE_KB
   661                              <1> WinASegment6:		dw	VGAMEM_GRAPH
   662                              <1> WinBSegment6:		dw	0000h
   663                              <1> WinFuncPtr6:		dd	0
   664                              <1> BytesPerScanLine6:	dw	960
   665                              <1> XResolution6:		dw	320
   666                              <1> YResolution6:		dw	200
   667                              <1> XCharSize6:		db	8
   668                              <1> YCharSize6:		db	16
   669                              <1> NumberOfPlanes6:	db	1
   670                              <1> BitsPerPixel6:		db	24
   671                              <1> NumberOfBanks6:		db	3
   672                              <1> MemoryModel6:		db	VBE_MEMORYMODEL_DIRECT_COLOR
   673                              <1> BankSize6:		db	0
   674                              <1> NumberOfImagePages6:	db	86
   675                              <1> Reserved_page6:		db	0
   676                              <1> RedMaskSize6:		db	8
   677                              <1> RedFieldPosition6:	db	16
   678                              <1> GreenMaskSize6:		db	8
   679                              <1> GreenFieldPosition6:	db	8
   680                              <1> BlueMaskSize6:		db	8
   681                              <1> BlueFieldPosition6:	db	0
   682                              <1> RsvdMaskSize6:		db	0
   683                              <1> RsvdFieldPosition6:	db	0
   684                              <1> DirectColorModeInfo6:	db	0
   685                              <1> PhysBasePtr6:		dd	VBE_DISPI_LFB_PHYSICAL_ADDRESS
   686                              <1> OffScreenMemOffset6:	dd	0
   687                              <1> OffScreenMemSize6:	dw	0
   688                              <1> LinBytesPerScanLine6:	dw	960
   689                              <1> BnkNumberOfPages6: 	db	0
   690                              <1> LinNumberOfPages6: 	db	0
   691                              <1> LinRedMaskSize6:	db	8
   692                              <1> LinRedFieldPosition6:	db	16
   693                              <1> LinGreenMaskSize6:	db	8
   694                              <1> LinGreenFieldPosition6:	db	8
   695                              <1> LinBlueMaskSize6:	db	8
   696                              <1> LinBlueFieldPosition6:	db	0
   697                              <1> LinRsvdMaskSize6:	db	0
   698                              <1> LinRsvdFieldPosition6:	db	0
   699                              <1> MaxPixelClock6:		dd	0
   700                              <1> 	
   701                              <1> 			dw	0111h ; 640x480x16
   702                              <1> ModeAttributes7: 	dw	MODE_ATTRIBUTES
   703                              <1> WinAAttributes7: 	db	WINA_ATTRIBUTES
   704                              <1> WinBAttributes7: 	db	0
   705                              <1> WinGranularity7: 	dw	VBE_DISPI_BANK_SIZE_KB
   706                              <1> WinSize7: 		dw	VBE_DISPI_BANK_SIZE_KB
   707                              <1> WinASegment7:		dw	VGAMEM_GRAPH
   708                              <1> WinBSegment7:		dw	0000h
   709                              <1> WinFuncPtr7:		dd	0
   710                              <1> BytesPerScanLine7:	dw	1280
   711                              <1> XResolution7:		dw	640
   712                              <1> YResolution7:		dw	480
   713                              <1> XCharSize7:		db	8
   714                              <1> YCharSize7:		db	16
   715                              <1> NumberOfPlanes7:	db	1
   716                              <1> BitsPerPixel7:		db	16
   717                              <1> NumberOfBanks7:		db	10
   718                              <1> MemoryModel7:		db	VBE_MEMORYMODEL_DIRECT_COLOR
   719                              <1> BankSize7:		db	0
   720                              <1> NumberOfImagePages7:	db	26
   721                              <1> Reserved_page7:		db	0
   722                              <1> RedMaskSize7:		db	5
   723                              <1> RedFieldPosition7:	db	11
   724                              <1> GreenMaskSize7:		db	6
   725                              <1> GreenFieldPosition7:	db	5
   726                              <1> BlueMaskSize7:		db	5
   727                              <1> BlueFieldPosition7:	db	0
   728                              <1> RsvdMaskSize7:		db	0
   729                              <1> RsvdFieldPosition7:	db	0
   730                              <1> DirectColorModeInfo7:	db	0
   731                              <1> PhysBasePtr7:		dd	VBE_DISPI_LFB_PHYSICAL_ADDRESS,
   732                              <1> OffScreenMemOffset7:	dd	0
   733                              <1> OffScreenMemSize7:	dw	0
   734                              <1> LinBytesPerScanLine7:	dw	1280
   735                              <1> BnkNumberOfPages7: 	db	0
   736                              <1> LinNumberOfPages7: 	db	0
   737                              <1> LinRedMaskSize7:	db	5
   738                              <1> LinRedFieldPosition7:	db	11
   739                              <1> LinGreenMaskSize7:	db	6
   740                              <1> LinGreenFieldPosition7:	db	5
   741                              <1> LinBlueMaskSize7:	db	5
   742                              <1> LinBlueFieldPosition7:	db	0
   743                              <1> LinRsvdMaskSize7:	db	0
   744                              <1> LinRsvdFieldPosition7:	db	0
   745                              <1> MaxPixelClock7:		dd	0
   746                              <1> 
   747                              <1> 			dw	0112h ; 640x480x24
   748                              <1> ModeAttributes8: 	dw	MODE_ATTRIBUTES
   749                              <1> WinAAttributes8: 	db	WINA_ATTRIBUTES
   750                              <1> WinBAttributes8: 	db	0
   751                              <1> WinGranularity8: 	dw	VBE_DISPI_BANK_SIZE_KB
   752                              <1> WinSize8: 		dw	VBE_DISPI_BANK_SIZE_KB
   753                              <1> WinASegment8:		dw	VGAMEM_GRAPH
   754                              <1> WinBSegment8:		dw	0000h
   755                              <1> WinFuncPtr8:		dd	0
   756                              <1> BytesPerScanLine8:	dw	1920
   757                              <1> XResolution8:		dw	640
   758                              <1> YResolution8:		dw	480
   759                              <1> XCharSize8:		db	8
   760                              <1> YCharSize8:		db	16
   761                              <1> NumberOfPlanes8:	db	1
   762                              <1> BitsPerPixel8:		db	24
   763                              <1> NumberOfBanks8:		db	15
   764                              <1> MemoryModel8:		db	VBE_MEMORYMODEL_DIRECT_COLOR
   765                              <1> BankSize8:		db	0
   766                              <1> NumberOfImagePages8:	db	17
   767                              <1> Reserved_page8:		db	0
   768                              <1> RedMaskSize8:		db	8
   769                              <1> RedFieldPosition8:	db	16
   770                              <1> GreenMaskSize8:		db	8
   771                              <1> GreenFieldPosition8:	db	8
   772                              <1> BlueMaskSize8:		db	8
   773                              <1> BlueFieldPosition8:	db	0
   774                              <1> RsvdMaskSize8:		db	0
   775                              <1> RsvdFieldPosition8:	db	0
   776                              <1> DirectColorModeInfo8:	db	0
   777                              <1> PhysBasePtr8:		dd	VBE_DISPI_LFB_PHYSICAL_ADDRESS
   778                              <1> OffScreenMemOffset8:	dd	0
   779                              <1> OffScreenMemSize8:	dw	0
   780                              <1> LinBytesPerScanLine8:	dw	1920
   781                              <1> BnkNumberOfPages8: 	db	0
   782                              <1> LinNumberOfPages8: 	db	0
   783                              <1> LinRedMaskSize8:	db	8
   784                              <1> LinRedFieldPosition8:	db	16
   785                              <1> LinGreenMaskSize8:	db	8
   786                              <1> LinGreenFieldPosition8:	db	8
   787                              <1> LinBlueMaskSize8:	db	8
   788                              <1> LinBlueFieldPosition8:	db	0
   789                              <1> LinRsvdMaskSize8:	db	0
   790                              <1> LinRsvdFieldPosition8:	db	0
   791                              <1> MaxPixelClock8:		dd	0
   792                              <1> 
   793                              <1> 			dw	0114h ; 800x600x16
   794                              <1> ModeAttributes9: 	dw	MODE_ATTRIBUTES
   795                              <1> WinAAttributes9: 	db	WINA_ATTRIBUTES
   796                              <1> WinBAttributes9: 	db	0
   797                              <1> WinGranularity9: 	dw	VBE_DISPI_BANK_SIZE_KB
   798                              <1> WinSize9: 		dw	VBE_DISPI_BANK_SIZE_KB
   799                              <1> WinASegment9:		dw	VGAMEM_GRAPH
   800                              <1> WinBSegment9:		dw	0000h
   801                              <1> WinFuncPtr9:		dd	0
   802                              <1> BytesPerScanLine9:	dw	1600
   803                              <1> XResolution9:		dw	800
   804                              <1> YResolution9:		dw	600
   805                              <1> XCharSize9:		db	8
   806                              <1> YCharSize9:		db	16
   807                              <1> NumberOfPlanes9:	db	1
   808                              <1> BitsPerPixel9:		db	16
   809                              <1> NumberOfBanks9:		db	15
   810                              <1> MemoryModel9:		db	VBE_MEMORYMODEL_DIRECT_COLOR
   811                              <1> BankSize9:		db	0
   812                              <1> NumberOfImagePages9:	db	16
   813                              <1> Reserved_page9:		db	0
   814                              <1> RedMaskSize9:		db	5
   815                              <1> RedFieldPosition9:	db	11
   816                              <1> GreenMaskSize9:		db	6
   817                              <1> GreenFieldPosition9:	db	5
   818                              <1> BlueMaskSize9:		db	5
   819                              <1> BlueFieldPosition9:	db	0
   820                              <1> RsvdMaskSize9:		db	0
   821                              <1> RsvdFieldPosition9:	db	0
   822                              <1> DirectColorModeInfo9:	db	0
   823                              <1> PhysBasePtr9:		dd	VBE_DISPI_LFB_PHYSICAL_ADDRESS
   824                              <1> OffScreenMemOffset9:	dd	0
   825                              <1> OffScreenMemSize9:	dw	0
   826                              <1> LinBytesPerScanLine9:	dw	1600
   827                              <1> BnkNumberOfPages9: 	db	0
   828                              <1> LinNumberOfPages9: 	db	0
   829                              <1> LinRedMaskSize9:	db	5
   830                              <1> LinRedFieldPosition9:	db	11
   831                              <1> LinGreenMaskSize9:	db	6
   832                              <1> LinGreenFieldPosition9:	db	5
   833                              <1> LinBlueMaskSize9:	db	5
   834                              <1> LinBlueFieldPosition9:	db	0
   835                              <1> LinRsvdMaskSize9:	db	0
   836                              <1> LinRsvdFieldPosition9:	db	0
   837                              <1> MaxPixelClock9:		dd	0
   838                              <1> 	
   839                              <1> 			dw	0115h ; 800x600x24
   840                              <1> ModeAttributes10: 	dw	MODE_ATTRIBUTES
   841                              <1> WinAAttributes10: 	db	WINA_ATTRIBUTES
   842                              <1> WinBAttributes10: 	db	0
   843                              <1> WinGranularity10: 	dw	VBE_DISPI_BANK_SIZE_KB
   844                              <1> WinSize10: 		dw	VBE_DISPI_BANK_SIZE_KB
   845                              <1> WinASegment10:		dw	VGAMEM_GRAPH
   846                              <1> WinBSegment10:		dw	0000h
   847                              <1> WinFuncPtr10:		dd	0
   848                              <1> BytesPerScanLine10:	dw	2400
   849                              <1> XResolution10:		dw	800
   850                              <1> YResolution10:		dw	600
   851                              <1> XCharSize10:		db	8
   852                              <1> YCharSize10:		db	16
   853                              <1> NumberOfPlanes10:	db	1
   854                              <1> BitsPerPixel10:		db	24
   855                              <1> NumberOfBanks10:	db	22
   856                              <1> MemoryModel10:		db	VBE_MEMORYMODEL_DIRECT_COLOR
   857                              <1> BankSize10:		db	0
   858                              <1> NumberOfImagePages10:	db	10
   859                              <1> Reserved_page10:	db	0
   860                              <1> RedMaskSize10:		db	8
   861                              <1> RedFieldPosition10:	db	16
   862                              <1> GreenMaskSize10:	db	8
   863                              <1> GreenFieldPosition10:	db	8
   864                              <1> BlueMaskSize10:		db	8
   865                              <1> BlueFieldPosition10:	db	0
   866                              <1> RsvdMaskSize10:		db	0
   867                              <1> RsvdFieldPosition10:	db	0
   868                              <1> DirectColorModeInfo10:	db	0
   869                              <1> PhysBasePtr10:		dd	VBE_DISPI_LFB_PHYSICAL_ADDRESS
   870                              <1> OffScreenMemOffset10:	dd	0
   871                              <1> OffScreenMemSize10:	dw	0
   872                              <1> LinBytesPerScanLine10:	dw	2400
   873                              <1> BnkNumberOfPages10: 	db	0
   874                              <1> LinNumberOfPages10: 	db	0
   875                              <1> LinRedMaskSize10:	db	8
   876                              <1> LinRedFieldPosition10:	db	16
   877                              <1> LinGreenMaskSize10:	db	8
   878                              <1> LinGreenFieldPosition10:db	8
   879                              <1> LinBlueMaskSize10:	db	8
   880                              <1> LinBlueFieldPosition10:	db	0
   881                              <1> LinRsvdMaskSize10:	db	0
   882                              <1> LinRsvdFieldPosition10:	db	0
   883                              <1> MaxPixelClock10:	dd	0
   884                              <1> 
   885                              <1> 			dw	0117h ; 1024x768x16
   886                              <1> ModeAttributes11: 	dw	MODE_ATTRIBUTES
   887                              <1> WinAAttributes11: 	db	WINA_ATTRIBUTES
   888                              <1> WinBAttributes11: 	db	0
   889                              <1> WinGranularity11: 	dw	VBE_DISPI_BANK_SIZE_KB
   890                              <1> WinSize11: 		dw	VBE_DISPI_BANK_SIZE_KB
   891                              <1> WinASegment11:		dw	VGAMEM_GRAPH
   892                              <1> WinBSegment11:		dw	0000h
   893                              <1> WinFuncPtr11:		dd	0
   894                              <1> BytesPerScanLine11:	dw	2048
   895                              <1> XResolution11:		dw	1024
   896                              <1> YResolution11:		dw	768
   897                              <1> XCharSize11:		db	8
   898                              <1> YCharSize11:		db	16
   899                              <1> NumberOfPlanes11:	db	1
   900                              <1> BitsPerPixel11:		db	16
   901                              <1> NumberOfBanks11:	db	24
   902                              <1> MemoryModel11:		db	VBE_MEMORYMODEL_DIRECT_COLOR
   903                              <1> BankSize11:		db	0
   904                              <1> NumberOfImagePages11:	db	9
   905                              <1> Reserved_page11:	db	0
   906                              <1> RedMaskSize11:		db	5
   907                              <1> RedFieldPosition11:	db	11
   908                              <1> GreenMaskSize11:	db	6
   909                              <1> GreenFieldPosition11:	db	5
   910                              <1> BlueMaskSize11:		db	5
   911                              <1> BlueFieldPosition11:	db	0
   912                              <1> RsvdMaskSize11:		db	0
   913                              <1> RsvdFieldPosition11:	db	0
   914                              <1> DirectColorModeInfo11:	db	0
   915                              <1> PhysBasePtr11:		dd	VBE_DISPI_LFB_PHYSICAL_ADDRESS,
   916                              <1> OffScreenMemOffset11:	dd	0
   917                              <1> OffScreenMemSize11:	dw	0
   918                              <1> LinBytesPerScanLine11:	dw	2048
   919                              <1> BnkNumberOfPages11: 	db	0
   920                              <1> LinNumberOfPages11: 	db	0
   921                              <1> LinRedMaskSize11:	db	5
   922                              <1> LinRedFieldPosition11:	db	11
   923                              <1> LinGreenMaskSize11:	db	6
   924                              <1> LinGreenFieldPosition11:db	5
   925                              <1> LinBlueMaskSize11:	db	5
   926                              <1> LinBlueFieldPosition11:	db	0
   927                              <1> LinRsvdMaskSize11:	db	0
   928                              <1> LinRsvdFieldPosition11:	db	0
   929                              <1> MaxPixelClock11:	dd	0
   930                              <1> 
   931                              <1> 			dw	0118h ; 1024x768x24
   932                              <1> ModeAttributes12: 	dw	MODE_ATTRIBUTES
   933                              <1> WinAAttributes12: 	db	WINA_ATTRIBUTES
   934                              <1> WinBAttributes12: 	db	0
   935                              <1> WinGranularity12: 	dw	VBE_DISPI_BANK_SIZE_KB
   936                              <1> WinSize12: 		dw	VBE_DISPI_BANK_SIZE_KB
   937                              <1> WinASegment12:		dw	VGAMEM_GRAPH
   938                              <1> WinBSegment12:		dw	0000h
   939                              <1> WinFuncPtr12:		dd	0
   940                              <1> BytesPerScanLine12:	dw	3072
   941                              <1> XResolution12:		dw	1024
   942                              <1> YResolution12:		dw	768
   943                              <1> XCharSize12:		db	8
   944                              <1> YCharSize12:		db	16
   945                              <1> NumberOfPlanes12:	db	1
   946                              <1> BitsPerPixel12:		db	24
   947                              <1> NumberOfBanks12:	db	36
   948                              <1> MemoryModel12:		db	VBE_MEMORYMODEL_DIRECT_COLOR
   949                              <1> BankSize12:		db	0
   950                              <1> NumberOfImagePages12:	db	6
   951                              <1> Reserved_page12:	db	0
   952                              <1> RedMaskSize12:		db	8
   953                              <1> RedFieldPosition12:	db	16
   954                              <1> GreenMaskSize12:	db	8
   955                              <1> GreenFieldPosition12:	db	8
   956                              <1> BlueMaskSize12:		db	8
   957                              <1> BlueFieldPosition12:	db	0
   958                              <1> RsvdMaskSize12:		db	0
   959                              <1> RsvdFieldPosition12:	db	0
   960                              <1> DirectColorModeInfo12:	db	0
   961                              <1> PhysBasePtr12:		dd	VBE_DISPI_LFB_PHYSICAL_ADDRESS
   962                              <1> OffScreenMemOffset12:	dd	0
   963                              <1> OffScreenMemSize12:	dw	0
   964                              <1> LinBytesPerScanLine12:	dw	3072
   965                              <1> BnkNumberOfPages12: 	db	0
   966                              <1> LinNumberOfPages12: 	db	0
   967                              <1> LinRedMaskSize12:	db	8
   968                              <1> LinRedFieldPosition12:	db	16
   969                              <1> LinGreenMaskSize12:	db	8
   970                              <1> LinGreenFieldPosition12:db	8
   971                              <1> LinBlueMaskSize12:	db	8
   972                              <1> LinBlueFieldPosition12:	db	0
   973                              <1> LinRsvdMaskSize12:	db	0
   974                              <1> LinRsvdFieldPosition12:	db	0
   975                              <1> MaxPixelClock12:	dd	0
   976                              <1> 
   977                              <1> 			dw	0140h ; 320x200x32
   978                              <1> ModeAttributes13: 	dw	MODE_ATTRIBUTES
   979                              <1> WinAAttributes13: 	db	WINA_ATTRIBUTES
   980                              <1> WinBAttributes13: 	db	0
   981                              <1> WinGranularity13: 	dw	VBE_DISPI_BANK_SIZE_KB
   982                              <1> WinSize13: 		dw	VBE_DISPI_BANK_SIZE_KB
   983                              <1> WinASegment13:		dw	VGAMEM_GRAPH
   984                              <1> WinBSegment13:		dw	0000h
   985                              <1> WinFuncPtr13:		dd	0
   986                              <1> BytesPerScanLine13:	dw	1280
   987                              <1> XResolution13:		dw	320
   988                              <1> YResolution13:		dw	200
   989                              <1> XCharSize13:		db	8
   990                              <1> YCharSize13:		db	16
   991                              <1> NumberOfPlanes13:	db	1
   992                              <1> BitsPerPixel13:		db	32
   993                              <1> NumberOfBanks13:	db	4
   994                              <1> MemoryModel13:		db	VBE_MEMORYMODEL_DIRECT_COLOR
   995                              <1> BankSize13:		db	0
   996                              <1> NumberOfImagePages13:	db	64
   997                              <1> Reserved_page13:	db	0
   998                              <1> RedMaskSize13:		db	8
   999                              <1> RedFieldPosition13:	db	16
  1000                              <1> GreenMaskSize13:	db	8
  1001                              <1> GreenFieldPosition13:	db	8
  1002                              <1> BlueMaskSize13:		db	8
  1003                              <1> BlueFieldPosition13:	db	0
  1004                              <1> RsvdMaskSize13:		db	8
  1005                              <1> RsvdFieldPosition13:	db	24
  1006                              <1> DirectColorModeInfo13:	db	VBE_DIRECTCOLOR_RESERVED_BITS_AVAILABLE
  1007                              <1> PhysBasePtr13:		dd	VBE_DISPI_LFB_PHYSICAL_ADDRESS
  1008                              <1> OffScreenMemOffset13:	dd	0
  1009                              <1> OffScreenMemSize13:	dw	0
  1010                              <1> LinBytesPerScanLine13:	dw	1280
  1011                              <1> BnkNumberOfPages13: 	db	0
  1012                              <1> LinNumberOfPages13: 	db	0
  1013                              <1> LinRedMaskSize13:	db	8
  1014                              <1> LinRedFieldPosition13:	db	16
  1015                              <1> LinGreenMaskSize13:	db	8
  1016                              <1> LinGreenFieldPosition13:db	8
  1017                              <1> LinBlueMaskSize13:	db	8
  1018                              <1> LinBlueFieldPosition13:	db	0
  1019                              <1> LinRsvdMaskSize13:	db	8
  1020                              <1> LinRsvdFieldPosition13:	db	24
  1021                              <1> MaxPixelClock13:	dd	0
  1022                              <1> 
  1023                              <1> 			dw	0141h ; 640x400x32
  1024                              <1> ModeAttributes14: 	dw	MODE_ATTRIBUTES
  1025                              <1> WinAAttributes14: 	db	WINA_ATTRIBUTES
  1026                              <1> WinBAttributes14: 	db	0
  1027                              <1> WinGranularity14: 	dw	VBE_DISPI_BANK_SIZE_KB
  1028                              <1> WinSize14: 		dw	VBE_DISPI_BANK_SIZE_KB
  1029                              <1> WinASegment14:		dw	VGAMEM_GRAPH
  1030                              <1> WinBSegment14:		dw	0000h
  1031                              <1> WinFuncPtr14:		dd	0
  1032                              <1> BytesPerScanLine14:	dw	2560
  1033                              <1> XResolution14:		dw	640
  1034                              <1> YResolution14:		dw	400
  1035                              <1> XCharSize14:		db	8
  1036                              <1> YCharSize14:		db	16
  1037                              <1> NumberOfPlanes14:	db	1
  1038                              <1> BitsPerPixel14:		db	32
  1039                              <1> NumberOfBanks14:	db	16
  1040                              <1> MemoryModel14:		db	VBE_MEMORYMODEL_DIRECT_COLOR
  1041                              <1> BankSize14:		db	0
  1042                              <1> NumberOfImagePages14:	db	15
  1043                              <1> Reserved_page14:	db	0
  1044                              <1> RedMaskSize14:		db	8
  1045                              <1> RedFieldPosition14:	db	16
  1046                              <1> GreenMaskSize14:	db	8
  1047                              <1> GreenFieldPosition14:	db	8
  1048                              <1> BlueMaskSize14:		db	8
  1049                              <1> BlueFieldPosition14:	db	0
  1050                              <1> RsvdMaskSize14:		db	8
  1051                              <1> RsvdFieldPosition14:	db	24
  1052                              <1> DirectColorModeInfo14:	db	VBE_DIRECTCOLOR_RESERVED_BITS_AVAILABLE
  1053                              <1> PhysBasePtr14:		dd	VBE_DISPI_LFB_PHYSICAL_ADDRESS
  1054                              <1> OffScreenMemOffset14:	dd  	0
  1055                              <1> OffScreenMemSize14:	dw	0
  1056                              <1> LinBytesPerScanLine14:	dw	2560
  1057                              <1> BnkNumberOfPages14: 	db	0
  1058                              <1> LinNumberOfPages14: 	db	0
  1059                              <1> LinRedMaskSize14:	db	8
  1060                              <1> LinRedFieldPosition14:	db	16
  1061                              <1> LinGreenMaskSize14:	db	8
  1062                              <1> LinGreenFieldPosition14:db	8
  1063                              <1> LinBlueMaskSize14:	db	8
  1064                              <1> LinBlueFieldPosition14:	db	0
  1065                              <1> LinRsvdMaskSize14:	db	8
  1066                              <1> LinRsvdFieldPosition14:	db	24
  1067                              <1> MaxPixelClock14:	dd	0
  1068                              <1> 
  1069                              <1> 			dw	0142 ; 640x480x32
  1070                              <1> ModeAttributes15: 	dw	MODE_ATTRIBUTES
  1071                              <1> WinAAttributes15: 	db	WINA_ATTRIBUTES
  1072                              <1> WinBAttributes15: 	db	0
  1073                              <1> WinGranularity15: 	dw	VBE_DISPI_BANK_SIZE_KB
  1074                              <1> WinSize15: 		dw	VBE_DISPI_BANK_SIZE_KB
  1075                              <1> WinASegment15:		dw	VGAMEM_GRAPH
  1076                              <1> WinBSegment15:		dw	0000h
  1077                              <1> WinFuncPtr15:		dd	0
  1078                              <1> BytesPerScanLine15:	dw	2560
  1079                              <1> XResolution15:		dw	640
  1080                              <1> YResolution15:		dw	480
  1081                              <1> XCharSize15:		db	8
  1082                              <1> YCharSize15:		db	16
  1083                              <1> NumberOfPlanes15:	db	1
  1084                              <1> BitsPerPixel15:		db	32
  1085                              <1> NumberOfBanks15:	db	19
  1086                              <1> MemoryModel15:		db	VBE_MEMORYMODEL_DIRECT_COLOR
  1087                              <1> BankSize15:		db	0
  1088                              <1> NumberOfImagePages15:	db	12
  1089                              <1> Reserved_page15:	db	0
  1090                              <1> RedMaskSize15:		db	8
  1091                              <1> RedFieldPosition15:	db	16
  1092                              <1> GreenMaskSize15:	db	8
  1093                              <1> GreenFieldPosition15:	db	8
  1094                              <1> BlueMaskSize15:		db	8
  1095                              <1> BlueFieldPosition15:	db	0
  1096                              <1> RsvdMaskSize15:		db	8
  1097                              <1> RsvdFieldPosition15:	db	24
  1098                              <1> DirectColorModeInfo15:	db	VBE_DIRECTCOLOR_RESERVED_BITS_AVAILABLE,
  1099                              <1> PhysBasePtr15:		dd	VBE_DISPI_LFB_PHYSICAL_ADDRESS,
  1100                              <1> OffScreenMemOffset15:	dd	0
  1101                              <1> OffScreenMemSize15:	dw	0
  1102                              <1> LinBytesPerScanLine15:	dw	2560
  1103                              <1> BnkNumberOfPages15: 	db	0
  1104                              <1> LinNumberOfPages15: 	db	0
  1105                              <1> LinRedMaskSize15:	db	8
  1106                              <1> LinRedFieldPosition15:	db	16
  1107                              <1> LinGreenMaskSize15:	db	8
  1108                              <1> LinGreenFieldPosition15:db	8
  1109                              <1> LinBlueMaskSize15:	db	8
  1110                              <1> LinBlueFieldPosition15:	db	0
  1111                              <1> LinRsvdMaskSize15:	db	8
  1112                              <1> LinRsvdFieldPosition15:	db	24
  1113                              <1> MaxPixelClock15:	dd	0
  1114                              <1> 
  1115                              <1> 			dw	0143h ; 800x600x32
  1116                              <1> ModeAttributes16: 	dw	MODE_ATTRIBUTES
  1117                              <1> WinAAttributes16: 	db	WINA_ATTRIBUTES
  1118                              <1> WinBAttributes16: 	db	0
  1119                              <1> WinGranularity16: 	dw	VBE_DISPI_BANK_SIZE_KB
  1120                              <1> WinSize16: 		dw	VBE_DISPI_BANK_SIZE_KB
  1121                              <1> WinASegment16:		dw	VGAMEM_GRAPH
  1122                              <1> WinBSegment16:		dw	0000h
  1123                              <1> WinFuncPtr16:		dd	0
  1124                              <1> BytesPerScanLine16:	dw	3200
  1125                              <1> XResolution16:		dw	800
  1126                              <1> YResolution16:		dw	600
  1127                              <1> XCharSize16:		db	8
  1128                              <1> YCharSize16:		db	16
  1129                              <1> NumberOfPlanes16:	db	1
  1130                              <1> BitsPerPixel16:		db	32
  1131                              <1> NumberOfBanks16:	db	30
  1132                              <1> MemoryModel16:		db	VBE_MEMORYMODEL_DIRECT_COLOR
  1133                              <1> BankSize16:		db	0
  1134                              <1> NumberOfImagePages16:	db	7
  1135                              <1> Reserved_page16:	db	0
  1136                              <1> RedMaskSize16:		db	8
  1137                              <1> RedFieldPosition16:	db	16
  1138                              <1> GreenMaskSize16:	db	8
  1139                              <1> GreenFieldPosition16:	db	8
  1140                              <1> BlueMaskSize16:		db	8
  1141                              <1> BlueFieldPosition16:	db	0
  1142                              <1> RsvdMaskSize16:		db	8
  1143                              <1> RsvdFieldPosition16:	db	24
  1144                              <1> DirectColorModeInfo16:	db	VBE_DIRECTCOLOR_RESERVED_BITS_AVAILABLE,
  1145                              <1> PhysBasePtr16:		dd	VBE_DISPI_LFB_PHYSICAL_ADDRESS,
  1146                              <1> OffScreenMemOffset16:	dd	0
  1147                              <1> OffScreenMemSize16:	dw	0
  1148                              <1> LinBytesPerScanLine16:	dw	3200
  1149                              <1> BnkNumberOfPages16: 	db	0
  1150                              <1> LinNumberOfPages16: 	db	0
  1151                              <1> LinRedMaskSize16:	db	8
  1152                              <1> LinRedFieldPosition16:	db	16
  1153                              <1> LinGreenMaskSize16:	db	8
  1154                              <1> LinGreenFieldPosition16:db	8
  1155                              <1> LinBlueMaskSize16:	db	8
  1156                              <1> LinBlueFieldPosition16:	db	0
  1157                              <1> LinRsvdMaskSize16:	db	8
  1158                              <1> LinRsvdFieldPosition16:	db	24
  1159                              <1> MaxPixelClock16:	dd	0
  1160                              <1> 	
  1161                              <1> 			dw	0144h ; 1024x768x32
  1162                              <1> ModeAttributes17: 	dw	MODE_ATTRIBUTES
  1163                              <1> WinAAttributes17: 	db	WINA_ATTRIBUTES
  1164                              <1> WinBAttributes17: 	db	0
  1165                              <1> WinGranularity17: 	dw	VBE_DISPI_BANK_SIZE_KB
  1166                              <1> WinSize17: 		dw	VBE_DISPI_BANK_SIZE_KB
  1167                              <1> WinASegment17:		dw	VGAMEM_GRAPH
  1168                              <1> WinBSegment17:		dw	0000h
  1169                              <1> WinFuncPtr17:		dd	0
  1170                              <1> BytesPerScanLine17:	dw	4096
  1171                              <1> XResolution17:		dw	1024
  1172                              <1> YResolution17:		dw	768
  1173                              <1> XCharSize17:		db	8
  1174                              <1> YCharSize17:		db	16
  1175                              <1> NumberOfPlanes17:	db	1
  1176                              <1> BitsPerPixel17:		db	32
  1177                              <1> NumberOfBanks17:	db	48
  1178                              <1> MemoryModel17:		db	VBE_MEMORYMODEL_DIRECT_COLOR
  1179                              <1> BankSize17:		db	0
  1180                              <1> NumberOfImagePages17:	db	4
  1181                              <1> Reserved_page17:	db	0
  1182                              <1> RedMaskSize17:		db	8
  1183                              <1> RedFieldPosition17:	db	16
  1184                              <1> GreenMaskSize17:	db	8
  1185                              <1> GreenFieldPosition17:	db	8
  1186                              <1> BlueMaskSize17:		db	8
  1187                              <1> BlueFieldPosition17:	db	0
  1188                              <1> RsvdMaskSize17:		db	8
  1189                              <1> RsvdFieldPosition17:	db	24
  1190                              <1> DirectColorModeInfo17:	db	VBE_DIRECTCOLOR_RESERVED_BITS_AVAILABLE
  1191                              <1> PhysBasePtr17:		dd	VBE_DISPI_LFB_PHYSICAL_ADDRESS
  1192                              <1> OffScreenMemOffset17:	dd	0
  1193                              <1> OffScreenMemSize17:	dw	0
  1194                              <1> LinBytesPerScanLine17:	dw	4096
  1195                              <1> BnkNumberOfPages17: 	db	0
  1196                              <1> LinNumberOfPages17: 	db	0
  1197                              <1> LinRedMaskSize17:	db	8
  1198                              <1> LinRedFieldPosition17:	db	16
  1199                              <1> LinGreenMaskSize17:	db	8
  1200                              <1> LinGreenFieldPosition17:db	8
  1201                              <1> LinBlueMaskSize17:	db	8
  1202                              <1> LinBlueFieldPosition17:	db	0
  1203                              <1> LinRsvdMaskSize17:	db	8
  1204                              <1> LinRsvdFieldPosition17:	db	24
  1205                              <1> MaxPixelClock17:	dd	0
  1206                              <1> 	
  1207                              <1> 			dw	0146h ; 320x200x8
  1208                              <1> ModeAttributes18: 	dw	MODE_ATTRIBUTES
  1209                              <1> WinAAttributes18: 	db	WINA_ATTRIBUTES
  1210                              <1> WinBAttributes18: 	db	0
  1211                              <1> WinGranularity18: 	dw	VBE_DISPI_BANK_SIZE_KB
  1212                              <1> WinSize18: 		dw	VBE_DISPI_BANK_SIZE_KB
  1213                              <1> WinASegment18:		dw	VGAMEM_GRAPH
  1214                              <1> WinBSegment18:		dw	0000h
  1215                              <1> WinFuncPtr18:		dd	0
  1216                              <1> BytesPerScanLine18:	dw	320
  1217                              <1> XResolution18:		dw	320
  1218                              <1> YResolution18:		dw	200
  1219                              <1> XCharSize18:		db	8
  1220                              <1> YCharSize18:		db	16
  1221                              <1> NumberOfPlanes18:	db	1
  1222                              <1> BitsPerPixel18:		db	8
  1223                              <1> NumberOfBanks18:	db	1
  1224                              <1> MemoryModel18:		db	VBE_MEMORYMODEL_PACKED_PIXEL
  1225                              <1> BankSize18:		db	0
  1226                              <1> NumberOfImagePages18:	db	255 ; 261 in vbetables.h (03/01/2020) !
  1227                              <1> Reserved_page18:	db	0
  1228                              <1> RedMaskSize18:		db	0
  1229                              <1> RedFieldPosition18:	db	0
  1230                              <1> GreenMaskSize18:	db	0
  1231                              <1> GreenFieldPosition18:	db	0
  1232                              <1> BlueMaskSize18:		db	0
  1233                              <1> BlueFieldPosition18:	db	0
  1234                              <1> RsvdMaskSize18:		db	0
  1235                              <1> RsvdFieldPosition18:	db	0
  1236                              <1> DirectColorModeInfo18:	db	0
  1237                              <1> PhysBasePtr18:		dd	VBE_DISPI_LFB_PHYSICAL_ADDRESS
  1238                              <1> OffScreenMemOffset18:	dd	0
  1239                              <1> OffScreenMemSize18:	dw	0
  1240                              <1> LinBytesPerScanLine18:	dw	320
  1241                              <1> BnkNumberOfPages18: 	db	0
  1242                              <1> LinNumberOfPages18: 	db	0
  1243                              <1> LinRedMaskSize18:	db	0
  1244                              <1> LinRedFieldPosition18: 	db	0
  1245                              <1> LinGreenMaskSize18: 	db	0
  1246                              <1> LinGreenFieldPosition18:db	0
  1247                              <1> LinBlueMaskSize18: 	db	0
  1248                              <1> LinBlueFieldPosition18: db	0
  1249                              <1> LinRsvdMaskSize18: 	db	0
  1250                              <1> LinRsvdFieldPosition18: db	0
  1251                              <1> MaxPixelClock18:	dd	0
  1252                              <1> 
  1253                              <1> 			dw	018Dh ; 1280x720x16
  1254                              <1> ModeAttributes19: 	dw	MODE_ATTRIBUTES
  1255                              <1> WinAAttributes19: 	db	WINA_ATTRIBUTES
  1256                              <1> WinBAttributes19: 	db	0
  1257                              <1> WinGranularity19: 	dw	VBE_DISPI_BANK_SIZE_KB
  1258                              <1> WinSize19: 		dw	VBE_DISPI_BANK_SIZE_KB
  1259                              <1> WinASegment19:		dw	VGAMEM_GRAPH
  1260                              <1> WinBSegment19:		dw	0000h
  1261                              <1> WinFuncPtr19:		dd	0
  1262                              <1> BytesPerScanLine19:	dw	2560
  1263                              <1> XResolution19:		dw	1280
  1264                              <1> YResolution19:		dw	720
  1265                              <1> XCharSize19:		db	8
  1266                              <1> YCharSize19:		db	16
  1267                              <1> NumberOfPlanes19:	db	1
  1268                              <1> BitsPerPixel19:		db	16
  1269                              <1> NumberOfBanks19:	db	29
  1270                              <1> MemoryModel19:		db	VBE_MEMORYMODEL_DIRECT_COLOR
  1271                              <1> BankSize19:		db	0
  1272                              <1> NumberOfImagePages19:	db	8
  1273                              <1> Reserved_page19:	db	0
  1274                              <1> RedMaskSize19:		db	5
  1275                              <1> RedFieldPosition19:	db	11
  1276                              <1> GreenMaskSize19:	db	6
  1277                              <1> GreenFieldPosition19:	db	5
  1278                              <1> BlueMaskSize19:		db	5
  1279                              <1> BlueFieldPosition19:	db	0
  1280                              <1> RsvdMaskSize19:		db	0
  1281                              <1> RsvdFieldPosition19:	db	0
  1282                              <1> DirectColorModeInfo19:	db	0
  1283                              <1> PhysBasePtr19:		dd	VBE_DISPI_LFB_PHYSICAL_ADDRESS
  1284                              <1> OffScreenMemOffset19:	dd	0
  1285                              <1> OffScreenMemSize19:	dw	0
  1286                              <1> LinBytesPerScanLine19:	dw	2560
  1287                              <1> BnkNumberOfPages19: 	db	0
  1288                              <1> LinNumberOfPages19: 	db	0
  1289                              <1> LinRedMaskSize19:	db	5
  1290                              <1> LinRedFieldPosition19:	db	11
  1291                              <1> LinGreenMaskSize19:	db	6
  1292                              <1> LinGreenFieldPosition19:db	5
  1293                              <1> LinBlueMaskSize19:	db	5
  1294                              <1> LinBlueFieldPosition19:	db	0
  1295                              <1> LinRsvdMaskSize19:	db	0
  1296                              <1> LinRsvdFieldPosition19:	db	0
  1297                              <1> MaxPixelClock19:	dd	0
  1298                              <1> 
  1299                              <1> 			dw	018Eh ; 1280x720x24
  1300                              <1> ModeAttributes20: 	dw	MODE_ATTRIBUTES
  1301                              <1> WinAAttributes20: 	db	WINA_ATTRIBUTES
  1302                              <1> WinBAttributes20: 	db	0
  1303                              <1> WinGranularity20: 	dw	VBE_DISPI_BANK_SIZE_KB
  1304                              <1> WinSize20: 		dw	VBE_DISPI_BANK_SIZE_KB
  1305                              <1> WinASegment20:		dw	VGAMEM_GRAPH
  1306                              <1> WinBSegment20:		dw	0000h
  1307                              <1> WinFuncPtr20:		dd	0
  1308                              <1> BytesPerScanLine20:	dw	3840
  1309                              <1> XResolution20:		dw	1280
  1310                              <1> YResolution20:		dw	720
  1311                              <1> XCharSize20:		db	8
  1312                              <1> YCharSize20:		db	16
  1313                              <1> NumberOfPlanes20:	db	1
  1314                              <1> BitsPerPixel20:		db	24
  1315                              <1> NumberOfBanks20:	db	43
  1316                              <1> MemoryModel20:		db	VBE_MEMORYMODEL_DIRECT_COLOR
  1317                              <1> BankSize20:		db	0
  1318                              <1> NumberOfImagePages20:	db	5
  1319                              <1> Reserved_page20:	db	0
  1320                              <1> RedMaskSize20:		db	8
  1321                              <1> RedFieldPosition20:	db	16
  1322                              <1> GreenMaskSize20:	db	8
  1323                              <1> GreenFieldPosition20:	db	8
  1324                              <1> BlueMaskSize20:		db	8
  1325                              <1> BlueFieldPosition20:	db	0
  1326                              <1> RsvdMaskSize20:		db	0
  1327                              <1> RsvdFieldPosition20:	db	0
  1328                              <1> DirectColorModeInfo20:	db	0
  1329                              <1> PhysBasePtr20:		dd	VBE_DISPI_LFB_PHYSICAL_ADDRESS
  1330                              <1> OffScreenMemOffset20:	dd	0
  1331                              <1> OffScreenMemSize20:	dw	0
  1332                              <1> LinBytesPerScanLine20:	dw	3840
  1333                              <1> BnkNumberOfPages20: 	db	0
  1334                              <1> LinNumberOfPages20: 	db	0
  1335                              <1> LinRedMaskSize20:	db	8
  1336                              <1> LinRedFieldPosition20:	db	16
  1337                              <1> LinGreenMaskSize20:	db	8
  1338                              <1> LinGreenFieldPosition20:db	8
  1339                              <1> LinBlueMaskSize20:	db	8
  1340                              <1> LinBlueFieldPosition20:	db	0
  1341                              <1> LinRsvdMaskSize20:	db	0
  1342                              <1> LinRsvdFieldPosition20:	db	0
  1343                              <1> MaxPixelClock20:	dd	0
  1344                              <1> 	
  1345                              <1> 			dw	018Fh ; 1280x720x32
  1346                              <1> ModeAttributes21: 	dw	MODE_ATTRIBUTES
  1347                              <1> WinAAttributes21: 	db	WINA_ATTRIBUTES
  1348                              <1> WinBAttributes21: 	db	0
  1349                              <1> WinGranularity21: 	dw	VBE_DISPI_BANK_SIZE_KB
  1350                              <1> WinSize21: 		dw	VBE_DISPI_BANK_SIZE_KB
  1351                              <1> WinASegment21:		dw	VGAMEM_GRAPH
  1352                              <1> WinBSegment21:		dw	0000h
  1353                              <1> WinFuncPtr21:		dd	0
  1354                              <1> BytesPerScanLine21:	dw	5120
  1355                              <1> XResolution21:		dw	1280
  1356                              <1> YResolution21:		dw	720
  1357                              <1> XCharSize21:		db	8
  1358                              <1> YCharSize21:		db	16
  1359                              <1> NumberOfPlanes21:	db	1
  1360                              <1> BitsPerPixel21:		db	32
  1361                              <1> NumberOfBanks21:	db	57
  1362                              <1> MemoryModel21:		db	VBE_MEMORYMODEL_DIRECT_COLOR
  1363                              <1> BankSize21:		db	0
  1364                              <1> NumberOfImagePages21:	db	3
  1365                              <1> Reserved_page21:	db	0
  1366                              <1> RedMaskSize21:		db	8
  1367                              <1> RedFieldPosition21:	db	16
  1368                              <1> GreenMaskSize21:	db	8
  1369                              <1> GreenFieldPosition21:	db	8
  1370                              <1> BlueMaskSize21:		db	8
  1371                              <1> BlueFieldPosition21:	db	0
  1372                              <1> RsvdMaskSize21:		db	8
  1373                              <1> RsvdFieldPosition21:	db	24
  1374                              <1> DirectColorModeInfo21:	db	VBE_DIRECTCOLOR_RESERVED_BITS_AVAILABLE
  1375                              <1> PhysBasePtr21:		dd	VBE_DISPI_LFB_PHYSICAL_ADDRESS
  1376                              <1> OffScreenMemOffset21:	dd	0
  1377                              <1> OffScreenMemSize21:	dw	0
  1378                              <1> LinBytesPerScanLine21:	dw	5120
  1379                              <1> BnkNumberOfPages21: 	db	0
  1380                              <1> LinNumberOfPages21: 	db	0
  1381                              <1> LinRedMaskSize21:	db	8
  1382                              <1> LinRedFieldPosition21:	db	16
  1383                              <1> LinGreenMaskSize21:	db	8
  1384                              <1> LinGreenFieldPosition21:db	8
  1385                              <1> LinBlueMaskSize21:	db	8
  1386                              <1> LinBlueFieldPosition21:	db	0
  1387                              <1> LinRsvdMaskSize21:	db	8
  1388                              <1> LinRsvdFieldPosition21:	db	24
  1389                              <1> MaxPixelClock21:	dd	0
  1390                              <1> 			
  1391                              <1> 			dw	0190h ; 1920x1080x16
  1392                              <1> ModeAttributes22: 	dw	MODE_ATTRIBUTES
  1393                              <1> WinAAttributes22: 	db	WINA_ATTRIBUTES
  1394                              <1> WinBAttributes22: 	db	0
  1395                              <1> WinGranularity22: 	dw	VBE_DISPI_BANK_SIZE_KB
  1396                              <1> WinSize22: 		dw	VBE_DISPI_BANK_SIZE_KB
  1397                              <1> WinASegment22:		dw	VGAMEM_GRAPH
  1398                              <1> WinBSegment22:		dw	0000h
  1399                              <1> WinFuncPtr22:		dd	0
  1400                              <1> BytesPerScanLine22:	dw	3840
  1401                              <1> XResolution22:		dw	1920
  1402                              <1> YResolution22:		dw	1080
  1403                              <1> XCharSize22:		db	8
  1404                              <1> YCharSize22:		db	16
  1405                              <1> NumberOfPlanes22:	db	1
  1406                              <1> BitsPerPixel22:		db	16
  1407                              <1> NumberOfBanks22:	db	64
  1408                              <1> MemoryModel22:		db	VBE_MEMORYMODEL_DIRECT_COLOR,
  1409                              <1> BankSize22:		db	0
  1410                              <1> NumberOfImagePages22:	db	3
  1411                              <1> Reserved_page22:	db	0
  1412                              <1> RedMaskSize22:		db	5
  1413                              <1> RedFieldPosition22:	db	11
  1414                              <1> GreenMaskSize22:	db	6
  1415                              <1> GreenFieldPosition22:	db	5
  1416                              <1> BlueMaskSize22:		db	5
  1417                              <1> BlueFieldPosition22:	db	0
  1418                              <1> RsvdMaskSize22:		db	0
  1419                              <1> RsvdFieldPosition22:	db	0
  1420                              <1> DirectColorModeInfo22:	db	0
  1421                              <1> PhysBasePtr22:		dd	VBE_DISPI_LFB_PHYSICAL_ADDRESS
  1422                              <1> OffScreenMemOffset22:	dd	0
  1423                              <1> OffScreenMemSize22:	dw	0
  1424                              <1> LinBytesPerScanLine22:	dw	3840
  1425                              <1> BnkNumberOfPages22: 	db	0
  1426                              <1> LinNumberOfPages22: 	db	0
  1427                              <1> LinRedMaskSize22:	db	5
  1428                              <1> LinRedFieldPosition22:	db	11
  1429                              <1> LinGreenMaskSize22:	db	6
  1430                              <1> LinGreenFieldPosition22:db	5
  1431                              <1> LinBlueMaskSize22:	db	5
  1432                              <1> LinBlueFieldPosition22:	db	0
  1433                              <1> LinRsvdMaskSize22:	db	0
  1434                              <1> LinRsvdFieldPosition22:	db	0
  1435                              <1> MaxPixelClock22:	dd	0
  1436                              <1> 			
  1437                              <1> 			dw	0191h ; 1920x1080x24
  1438                              <1> ModeAttributes23: 	dw	MODE_ATTRIBUTES
  1439                              <1> WinAAttributes23: 	db	WINA_ATTRIBUTES
  1440                              <1> WinBAttributes23: 	db	0
  1441                              <1> WinGranularity23: 	dw	VBE_DISPI_BANK_SIZE_KB
  1442                              <1> WinSize23: 		dw	VBE_DISPI_BANK_SIZE_KB
  1443                              <1> WinASegment23:		dw	VGAMEM_GRAPH
  1444                              <1> WinBSegment23:		dw	0000h
  1445                              <1> WinFuncPtr23:		dd	0
  1446                              <1> BytesPerScanLine23:	dw	5760
  1447                              <1> XResolution23:		dw	1920
  1448                              <1> YResolution23:		dw	1080
  1449                              <1> XCharSize23:		db	8
  1450                              <1> YCharSize23:		db	16
  1451                              <1> NumberOfPlanes23:	db	1
  1452                              <1> BitsPerPixel23:		db	24
  1453                              <1> NumberOfBanks23:	db	95
  1454                              <1> MemoryModel23:		db	VBE_MEMORYMODEL_DIRECT_COLOR
  1455                              <1> BankSize23:		db	0
  1456                              <1> NumberOfImagePages23:	db	1
  1457                              <1> Reserved_page23:	db	0
  1458                              <1> RedMaskSize23:		db	8
  1459                              <1> RedFieldPosition23:	db	16
  1460                              <1> GreenMaskSize23:	db	8
  1461                              <1> GreenFieldPosition23:	db	8
  1462                              <1> BlueMaskSize23:		db	8
  1463                              <1> BlueFieldPosition23:	db	0
  1464                              <1> RsvdMaskSize23:		db	0
  1465                              <1> RsvdFieldPosition23:	db	0
  1466                              <1> DirectColorModeInfo23:	db	0
  1467                              <1> PhysBasePtr23:		dd	VBE_DISPI_LFB_PHYSICAL_ADDRESS
  1468                              <1> OffScreenMemOffset23:	dd	0
  1469                              <1> OffScreenMemSize23:	dw	0
  1470                              <1> LinBytesPerScanLine23:	dw	5760
  1471                              <1> BnkNumberOfPages23: 	db	0
  1472                              <1> LinNumberOfPages23: 	db	0
  1473                              <1> LinRedMaskSize23:	db	8
  1474                              <1> LinRedFieldPosition23:	db	16
  1475                              <1> LinGreenMaskSize23:	db	8
  1476                              <1> LinGreenFieldPosition23:db	8
  1477                              <1> LinBlueMaskSize23:	db	8
  1478                              <1> LinBlueFieldPosition23:	db	0
  1479                              <1> LinRsvdMaskSize23:	db	0
  1480                              <1> LinRsvdFieldPosition23:	db	0
  1481                              <1> MaxPixelClock23:	dd	0
  1482                              <1> 
  1483                              <1> 			dw	0192h ; 1920x1080x32
  1484                              <1> ModeAttributes24: 	dw	MODE_ATTRIBUTES
  1485                              <1> WinAAttributes24: 	db	WINA_ATTRIBUTES
  1486                              <1> WinBAttributes24: 	db	0
  1487                              <1> WinGranularity24: 	dw	VBE_DISPI_BANK_SIZE_KB
  1488                              <1> WinSize24: 		dw	VBE_DISPI_BANK_SIZE_KB
  1489                              <1> WinASegment24:		dw	VGAMEM_GRAPH
  1490                              <1> WinBSegment24:		dw	0000h
  1491                              <1> WinFuncPtr24:		dd	0
  1492                              <1> BytesPerScanLine24:	dw	7680
  1493                              <1> XResolution24:		dw	1920
  1494                              <1> YResolution24:		dw	1080
  1495                              <1> XCharSize24:		db	8
  1496                              <1> YCharSize24:		db	16
  1497                              <1> NumberOfPlanes24:	db	1
  1498                              <1> BitsPerPixel24:		db	32
  1499                              <1> NumberOfBanks24:	db	127
  1500                              <1> MemoryModel24:		db	VBE_MEMORYMODEL_DIRECT_COLOR
  1501                              <1> BankSize24:		db	0
  1502                              <1> NumberOfImagePages24:	db	1
  1503                              <1> Reserved_page24:	db	0
  1504                              <1> RedMaskSize24:		db	8
  1505                              <1> RedFieldPosition24:	db	16
  1506                              <1> GreenMaskSize24:	db	8
  1507                              <1> GreenFieldPosition24:	db	8
  1508                              <1> BlueMaskSize24:		db	8
  1509                              <1> BlueFieldPosition24:	db	0
  1510                              <1> RsvdMaskSize24:		db	8
  1511                              <1> RsvdFieldPosition24:	db	24
  1512                              <1> DirectColorModeInfo24:	db	VBE_DIRECTCOLOR_RESERVED_BITS_AVAILABLE
  1513                              <1> PhysBasePtr24:		dd	VBE_DISPI_LFB_PHYSICAL_ADDRESS
  1514                              <1> OffScreenMemOffset24:	dd	0
  1515                              <1> OffScreenMemSize24:	dw	0
  1516                              <1> LinBytesPerScanLine24:	dw 	7680
  1517                              <1> BnkNumberOfPages24: 	db	0
  1518                              <1> LinNumberOfPages24: 	db	0
  1519                              <1> LinRedMaskSize24:	db	8
  1520                              <1> LinRedFieldPosition24:	db	16
  1521                              <1> LinGreenMaskSize24:	db	8
  1522                              <1> LinGreenFieldPosition24:db	8
  1523                              <1> LinBlueMaskSize24:	db	8
  1524                              <1> LinBlueFieldPosition24:	db	0
  1525                              <1> LinRsvdMaskSize24:	db	8
  1526                              <1> LinRsvdFieldPosition24:	db	24
  1527                              <1> MaxPixelClock24:	dd	0
  1528                              <1> 
  1529                              <1> VBE_VESA_MODE_END_OF_LIST: dw	0
  1530                              <1> 
  1531                              <1> %endif
  1532                              <1> 
  1533                              <1> ; 24/11/2020
  1534                              <1> 
  1535                              <1> direct_color_fields:
  1536                              <1> 	; 24/11/2020
  1537                              <1> 
  1538                              <1> ; (vbetables-gen.c)
  1539                              <1> ; // Direct Color fields 
  1540                              <1> ; (required for direct/6 and YUV/7 memory models)
  1541                              <1> ; switch(pm->depth) {
  1542                              <1>     
  1543                              <1> ;case 8:
  1544 00006C0A 00                  <1> r_size_8:  db 0
  1545 00006C0B 00                  <1> r_pos_8:   db 0
  1546 00006C0C 00                  <1> g_size_8:  db 0
  1547 00006C0D 00                  <1> g_pos_8:   db 0
  1548 00006C0E 00                  <1> b_size_8:  db 0
  1549 00006C0F 00                  <1> b_pos_8:   db 0
  1550 00006C10 00                  <1> a_size_8:  db 0
  1551 00006C11 00                  <1> a_pos_8:   db 0
  1552                              <1> 
  1553                              <1> ;case 16:
  1554 00006C12 05                  <1> r_size_16:  db 5
  1555 00006C13 0B                  <1> r_pos_16:   db 11
  1556 00006C14 06                  <1> g_size_16:  db 6
  1557 00006C15 05                  <1> g_pos_16:   db 5
  1558 00006C16 05                  <1> b_size_16:  db 5
  1559 00006C17 00                  <1> b_pos_16:   db 0
  1560 00006C18 00                  <1> a_size_16:  db 0
  1561 00006C19 00                  <1> a_pos_16:   db 0
  1562                              <1> 
  1563                              <1> ;case 24:
  1564 00006C1A 08                  <1> r_size_24:  db 8
  1565 00006C1B 10                  <1> r_pos_24:   db 16
  1566 00006C1C 08                  <1> g_size_24:  db 8
  1567 00006C1D 08                  <1> g_pos_24:   db 8
  1568 00006C1E 08                  <1> b_size_24:  db 8
  1569 00006C1F 00                  <1> b_pos_24:   db 0
  1570 00006C20 00                  <1> a_size_24:  db 0
  1571 00006C21 00                  <1> a_pos_24:   db 0
  1572                              <1> 
  1573                              <1> ;case 32:
  1574 00006C22 08                  <1> r_size_32:  db 8
  1575 00006C23 10                  <1> r_pos_32:   db 16
  1576 00006C24 08                  <1> g_size_32:  db 8
  1577 00006C25 08                  <1> g_pos_32:   db 8
  1578 00006C26 08                  <1> b_size_32:  db 8
  1579 00006C27 00                  <1> b_pos_32:   db 0
  1580 00006C28 08                  <1> a_size_32:  db 8
  1581 00006C29 18                  <1> a_pos_32:   db 24
  3418                                  ;%include 'diskdata.s'	; DISK (BIOS) DATA (initialized)
  3419                                  ;;;
  3420                                  
  3421                                  Align 2
  3422                                  
  3423                                  %include 'sysdefs.s' ; 24/01/2015
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.5) - SYSTEM DEFINITIONS : sysdefs.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 23/07/2022  (Previous: 31/12/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> ; 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> ; 31/12/2017
    79                              <1> ; 19/02/2017
    80                              <1> ; 15/10/2016
    81                              <1> ; 20/05/2016
    82                              <1> ; 19/05/2016
    83                              <1> ; 18/05/2016
    84                              <1> ; 29/04/2016 
    85                              <1> ; TRDOS 386 (TRDOS v2.0) system calls - temporary List 
    86                              <1> ; 14/07/2013 - 21/09/2015 (Retro UNIX 8086 & 386 system calls) 
    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> _rename	equ 9  ; TRDOS 386, Rename File (31/12/2017)	
    97                              <1> _delete	equ 10 ; TRDOS 386, Delete File (29/12/2017)
    98                              <1> _exec	equ 11
    99                              <1> _chdir	equ 12
   100                              <1> _time 	equ 13 ; TRDOS 386, Get Sys Date&Time (30/12/2017)
   101                              <1> _mkdir 	equ 14
   102                              <1> _chmod	equ 15 ; TRDOS 386, Change Attributes (30/12/2017) 
   103                              <1> _rmdir	equ 16 ; TRDOS 386, Remove Directory (29/12/2017)
   104                              <1> _break	equ 17
   105                              <1> _drive	equ 18 ; TRDOS 386, Get/Set Current Drv (30/12/2017) 
   106                              <1> _seek	equ 19
   107                              <1> _tell 	equ 20
   108                              <1> _mem	equ 21 ; TRDOS 386, Get Total&Free Mem (31/12/2017)
   109                              <1> _prompt	equ 22 ; TRDOS 386, Change Cmd Prompt (31/12/2017)
   110                              <1> _path	equ 23 ; TRDOS 386, Get/Set Run Path (31/12/2017)
   111                              <1> _env	equ 24 ; TRDOS 386, Get/Set Env Vars (31/12/2017)
   112                              <1> _stime	equ 25 ; TRDOS 386, Set Sys Date&Time (30/12/2017)
   113                              <1> _quit	equ 26	
   114                              <1> _intr	equ 27
   115                              <1> _dir	equ 28 ; TRDOS 386, Get Curr Drive&Dir (30/12/2017) 
   116                              <1> _emt 	equ 29
   117                              <1> _ldrvt 	equ 30 ; TRDOS 386, Get Logical DOS DDT (30/12/2017)
   118                              <1> _video  equ 31 ; TRDOS 386 Video Functions (16/05/2016)
   119                              <1> _audio	equ 32 ; TRDOS 386 Video Functions (16/05/2016)
   120                              <1> _timer	equ 33 ; TRDOS 386 Timer Functions (18/05/2016)
   121                              <1> _sleep	equ 34 ; Retro UNIX 8086 v1 feature only !
   122                              <1> _msg	equ 35 ; Retro UNIX 386 v1 feature only !
   123                              <1> _geterr	equ 36 ; Retro UNIX 386 v1 feature only !
   124                              <1> _fpsave equ 37 ; TRDOS 386 FPU state option (28/02/2017)
   125                              <1> _pri 	equ 38 ; change priority - TRDOS 386 (20/05/2016)
   126                              <1> _rele	equ 39 ; TRDOS 386 (19/05/2016)
   127                              <1> _fff	equ 40 ; Find First File - TRDOS 386 (15/10/2016)
   128                              <1> _fnf	equ 41 ; Find Next File - TRDOS 386 (15/10/2016)
   129                              <1> _alloc	equ 42 ; Allocate memory - TRDOS 386 (19/02/2017)
   130                              <1> 	       ; TRDOS 386 (19/02/2017) DMA buff fuctions		
   131                              <1> _dalloc equ 43 ; Deallocate mem - TRDOS 386 (19/02/2017)
   132                              <1> _calbac equ 44 ; Set IRQ callback - TRDOS 386 (20/02/2017)  				
   133                              <1> _dma	equ 45 ; DMA service - TRDOS 386 (20/08/2017)  
   134                              <1> 
   135                              <1> %macro sys 1-4
   136                              <1>     ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
   137                              <1>     ; 03/09/2015	
   138                              <1>     ; 13/04/2015
   139                              <1>     ; Retro UNIX 386 v1 system call.		
   140                              <1>     %if %0 >= 2   
   141                              <1>         mov ebx, %2
   142                              <1>         %if %0 >= 3    
   143                              <1>             mov ecx, %3
   144                              <1>             %if %0 = 4
   145                              <1>                mov edx, %4   
   146                              <1>             %endif
   147                              <1>         %endif
   148                              <1>     %endif
   149                              <1>     mov eax, %1
   150                              <1>     ;int 30h
   151                              <1>     int 40h ; TRDOS 386 (TRDOS v2.0)		   
   152                              <1> %endmacro
   153                              <1> 
   154                              <1> ; TRDOS 386 system calls, interrupt number
   155                              <1> ; 25/12/2016
   156                              <1> SYSCALL_INT_NUM   equ '40' ; '40h'
   157                              <1> 
   158                              <1> ; 13/05/2015 - ERROR CODES
   159                              <1> ERR_FILE_NOT_OPEN  equ 10 ; 'file not open !' error
   160                              <1> ERR_FILE_ACCESS    equ 11 ; 'permission denied !' error
   161                              <1> ; 14/05/2015
   162                              <1> ERR_DIR_ACCESS     equ 11 ; 'permission denied !' error
   163                              <1> ERR_FILE_NOT_FOUND equ 12 ; 'file not found !' error
   164                              <1> ERR_TOO_MANY_FILES equ 13 ; 'too many open files !' error
   165                              <1> ERR_DIR_EXISTS     equ 14 ; 'directory already exists !' error 	
   166                              <1> ; 16/05/2015		
   167                              <1> ERR_DRV_NOT_RDY    equ 15 ; 'drive not ready !' error
   168                              <1> ; 18/05/2015
   169                              <1> ERR_DEV_NOT_RDY    equ 15 ; 'device not ready !' error
   170                              <1> ERR_DEV_ACCESS     equ 11 ; 'permission denied !' error 
   171                              <1> ERR_DEV_NOT_OPEN   equ 10 ; 'device not open !' error	
   172                              <1> ; 07/06/2015
   173                              <1> ERR_FILE_EOF	   equ 16 ; 'end of file !' error
   174                              <1> ERR_DEV_VOL_SIZE   equ 16 ; 'out of volume !' error
   175                              <1> ; 09/06/2015
   176                              <1> ERR_DRV_READ	   equ 17 ; 'disk read error !'
   177                              <1> ERR_DRV_WRITE	   equ 18 ; 'disk write error !'
   178                              <1> ; 16/06/2015
   179                              <1> ERR_NOT_DIR	   equ 19 ; 'not a (valid) directory !' error
   180                              <1> ERR_FILE_SIZE	   equ 20 ; 'file size error !'	
   181                              <1> ; 22/06/2015
   182                              <1> ERR_NOT_SUPERUSER  equ 11 ; 'permission denied !' error
   183                              <1> ERR_NOT_OWNER      equ 11 ; 'permission denied !' error
   184                              <1> ERR_NOT_FILE       equ 11 ; 'permission denied !' error	
   185                              <1> ; 23/06/2015
   186                              <1> ERR_FILE_EXISTS    equ 14 ; 'file already exists !' error
   187                              <1> ERR_DRV_NOT_SAME   equ 21 ; 'not same drive !' error
   188                              <1> ERR_DIR_NOT_FOUND  equ 12 ; 'directory not found !' error
   189                              <1> ERR_NOT_EXECUTABLE equ 22 ; 'not executable file !' error
   190                              <1> ; 27/06/2015
   191                              <1> ERR_INV_PARAMETER  equ 23 ; 'invalid parameter !' error
   192                              <1> ERR_INV_DEV_NAME   equ 24 ; 'invalid device name !' error
   193                              <1> ; 29/06/2015
   194                              <1> ERR_TIME_OUT	   equ 25 ; 'time out !' error			
   195                              <1> ERR_DEV_NOT_RESP   equ 25 ; 'device not responding !' error
   196                              <1> ; 10/10/2016
   197                              <1> ERR_INV_FILE_NAME  equ 26 ; 'invalid file name !' error
   198                              <1> ERR_INV_FLAGS	   equ 23 ; 'invalid flags !' error
   199                              <1> ; For code compatibility with previous version of TRDOS (2011)
   200                              <1> ; (Temporary error codes for current TRDOS 386 -2016- version) 
   201                              <1> ERR_NO_MORE_FILES  equ 12 ; 'no more files !' error
   202                              <1> ERR_PATH_NOT_FOUND equ  3 ; 'path not found !' error 
   203                              <1> 			  ; 'dir not found !' ; TRDOS 8086
   204                              <1> ERR_NOT_FOUND:	   equ  2 ; 'file not found !' ; TRDOS 8086
   205                              <1> ERR_DISK_SPACE	   equ 39 ; 'out of volume !' TRDOS 8086
   206                              <1> 			  ; 'insufficient disk space !' ; 27h
   207                              <1> ERR_DISK_WRITE	   equ 30 ; 'disk write protected !' ; 16/10/2016
   208                              <1> ERR_ACCESS_DENIED  equ  5 ; 'access denied !' ; TRDOS 8086 	
   209                              <1> ; 28/02/2017
   210                              <1> ERR_PERM_DENIED	   equ 11 ; 'permission denied !' error  	
   211                              <1> ; 18/05/2016
   212                              <1> ERR_MISC	   equ 27 ; miscellaneous/other errors
   213                              <1> ; 15/10/2016
   214                              <1> ; TRDOS 8086 -> TRDOS 386 (0Bh -> 28)
   215                              <1> ERR_INV_FORMAT	   equ 28 ; 'invalid format !' error
   216                              <1> ; TRDOS 8086 -> TRDOS 386 (0Dh -> 29)
   217                              <1> ERR_INV_DATA	   equ 29 ; 'invalid data !' error
   218                              <1> ; TRDOS 8086 -> TRDOS 386 (0Eh -> 20)
   219                              <1> ERR_ZERO_LENGTH	   equ 20  ; 'zero length !' error 	
   220                              <1> ; TRDOS 8086 -> TRDOS 386 (15h -> 17, 1Dh -> 18, 1Eh -> 17) 	
   221                              <1> ERR_DRV_NR_READ	   equ 17 ; 'drive not ready or read error !'
   222                              <1> ERR_DRV_NR_WRITE   equ 18 ; 'drive not ready or write error !'		
   223                              <1> ; 15/10/2016
   224                              <1> ERR_INV_PATH_NAME  equ 19 ; 'bad path name !' error
   225                              <1> ERR_BAD_CMD_ARG	   equ  1 ; 'bad command argument !' ; TRDOS 8086
   226                              <1> ERR_INV_FNUMBER	   equ  1 ; 'invalid function number !' ; TRDOS 8086
   227                              <1> ERR_BIG_FILE	   equ  8 ; 'big file & out of memory ! ; TRDOS 8086 	
   228                              <1> ERR_BIG_DATA	   equ  8 ; 'big data & out of memory ! ; TRDOS 8086
   229                              <1> ERR_CLUSTER	   equ 35 ; 'cluster not available !' ; TRDOS 8086
   230                              <1> ERR_OUT_OF_MEMORY  equ  4 ; 'out of memory !'
   231                              <1> 			  ; 'insufficient memory !'
   232                              <1> ERR_P_VIOLATION	   equ	6 ; 'protection violation !'
   233                              <1> ERR_PAGE_FAULT	   equ 224 ;'page fault !' ;0E0h						 
   234                              <1> ERR_SWP_DISK_READ  	   equ 40
   235                              <1> ERR_SWP_DISK_NOT_PRESENT   equ 41
   236                              <1> ERR_SWP_SECTOR_NOT_PRESENT equ 42
   237                              <1> ERR_SWP_NO_FREE_SPACE      equ 43
   238                              <1> ERR_SWP_DISK_WRITE         equ 44
   239                              <1> ERR_SWP_NO_PAGE_TO_SWAP    equ 45
   240                              <1> ; 10/04/2017
   241                              <1> ERR_BUFFER	   equ 46  ; 'buffer error !'
   242                              <1> ; 28/08/2017 (20/08/2017)
   243                              <1> ERR_DMA		   equ -1  ; DMA buffer (allocation/misc.) error!
   244                              <1> 
   245                              <1> ; 26/08/2015
   246                              <1> ; 24/07/2015
   247                              <1> ; 24/06/2015
   248                              <1> MAX_ARG_LEN	   equ 256 ; max. length of sys exec arguments
   249                              <1> ; 01/07/2015
   250                              <1> MAX_MSG_LEN	   equ 255 ; max. msg length for 'sysmsg'
   251                              <1> ;	
   252                              <1> ; 06/10/2016
   253                              <1> ;OPENFILES	   equ 10  ; max. number of open files (system)
   254                              <1> ; 23/07/2022
   255                              <1> OPENFILES	   equ 32  ; max. number of open files (system)
   256                              <1> ; 07/10/2016
   257                              <1> ;NUMOFDEVICES	   equ 20  ; max. num of available devices (sys)
   258                              <1> 			 		
  3424                                  %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
  3425                                  %include 'trdosk1.s' ; 04/01/2016 
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.5) - SYS INIT : trdosk1.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 25/07/2022 (Previous: 18/04/2021)
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 04/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.15 (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> 	; 18/04/2021 (TRDOS 386 v2.0.4) 
    18                              <1> 	; 20/01/2018  (v2.0.1)
    19                              <1> 	; 23/01/2017  (v2.0.0)
    20                              <1> 	; 07/05/2016
    21                              <1> 	; 02/05/2016
    22                              <1> 	; 24/04/2016
    23                              <1> 	; 14/04/2016
    24                              <1> 	; 13/04/2016
    25                              <1> 	; 30/03/2016
    26                              <1> 	; 24/01/2016
    27                              <1> 	; 06/01/2016
    28                              <1> 	; 04/01/2016 (TRDOS 386 v2.0 - Beginning)
    29                              <1> 
    30                              <1> 	; 23/01/2017 - reset timer frequency (to 18.2Hz)
    31 00006C2A B036                <1> 	mov	al, 00110110b ; 36h
    32 00006C2C E643                <1>  	out	43h, al
    33 00006C2E 31C0                <1> 	xor	eax, eax  ; sub	al, al ; 0
    34 00006C30 E640                <1> 	out	40h, al ; LB
    35 00006C32 E640                <1> 	out	40h, al ; HB
    36                              <1>  	; 
    37                              <1> 	; 30/03/2016
    38                              <1> 	; Clear Logical DOS Disk Description Tables Area
    39                              <1> 	;xor	eax, eax
    40 00006C34 BF00010900          <1> 	mov	edi, Logical_DOSDisks
    41 00006C39 B980060000          <1> 	mov	ecx, 6656/4 ; 26*256 = 6656 bytes
    42 00006C3E F3AB                <1> 	rep	stosd ; 1664 times 4 bytes
    43                              <1> 
    44 00006C40 B83F3A2F00          <1> 	mov	eax, '?:/'
    45 00006C45 A3[4B790100]        <1> 	mov	[Current_Dir_Drv], eax
    46                              <1> 
    47                              <1> 	; Logical DRV INIT (only for hard disks)
    48 00006C4A E8F1030000          <1> 	call 	ldrv_init  ; trdosk2.s
    49                              <1> 	
    50                              <1> 	; When floppy_drv_init call is disabled
    51                              <1> 	; media changed sign is needed
    52                              <1> 	; for proper drive initialization
    53                              <1>         
    54 00006C4F BE00010900          <1> 	mov 	esi, Logical_DOSDisks
    55 00006C54 B001                <1> 	mov 	al, 1 ; Initialization sign (invalid_fd_parameter)
    56 00006C56 83C67E              <1> 	add 	esi, LD_MediaChanged ; Media Change Status = 1 (init needed)
    57 00006C59 8806                <1> 	mov 	[esi], al ; A:
    58 00006C5B 81C600010000        <1> 	add 	esi, 100h 
    59 00006C61 8806                <1> 	mov 	[esi], al ; B: 
    60                              <1>            
    61                              <1> _current_drive_bootdisk:
    62 00006C63 8A15[18660000]      <1> 	mov 	dl, [boot_drv] ; physical drive number
    63 00006C69 80FAFF              <1> 	cmp 	dl, 0FFh
    64 00006C6C 740A                <1> 	je 	short _last_dos_diskno_check
    65                              <1> _boot_drive_check:
    66 00006C6E 80FA80              <1> 	cmp 	dl, 80h
    67 00006C71 7218                <1> 	jb 	short _current_drive_a
    68 00006C73 80EA7E              <1> 	sub 	dl, 7Eh ; C = 2 , D = 3
    69 00006C76 EB13                <1> 	jmp 	short _current_drive_a 
    70                              <1> 
    71                              <1> _last_dos_diskno_check:
    72 00006C78 8A15[BC300100]      <1> 	mov 	dl, [Last_DOS_DiskNo]
    73 00006C7E 80FA02              <1> 	cmp 	dl, 2
    74 00006C81 7706                <1> 	ja 	short _current_drive_c
    75 00006C83 7406                <1> 	je 	short _current_drive_a
    76 00006C85 30D2                <1> 	xor 	dl, dl ; A:
    77 00006C87 EB02                <1> 	jmp 	short _current_drive_a
    78                              <1> 
    79                              <1> _current_drive_c:
    80 00006C89 B202                <1> 	mov 	dl, 2 ; C:
    81                              <1> 
    82                              <1> _current_drive_a:
    83 00006C8B 8815[19660000]      <1> 	mov	[drv], dl
    84 00006C91 BE[BE300100]        <1>         mov     esi, msg_CRLF_temp
    85 00006C96 E8AF000000          <1> 	call 	print_msg
    86                              <1> 
    87 00006C9B 8A15[19660000]      <1> 	mov	dl, [drv]
    88                              <1> _default_drive_c:
    89 00006CA1 E8E50B0000          <1> 	call 	change_current_drive
    90 00006CA6 731C                <1> 	jnc 	short _start_mainprog
    91                              <1> 
    92                              <1> _drv_not_ready_error: 
    93 00006CA8 BE[81330100]        <1> 	mov 	esi, msgl_drv_not_ready
    94 00006CAD E898000000          <1> 	call 	print_msg
    95                              <1>         ;jmp	_end_of_mainprog
    96                              <1> 
    97                              <1> 	; 20/01/2018
    98 00006CB2 B202                <1> 	mov	dl, 2
    99 00006CB4 3815[19660000]      <1> 	cmp	[drv], dl
   100 00006CBA 736C                <1> 	jnb	short _end_of_mainprog
   101 00006CBC 8815[19660000]      <1> 	mov	[drv], dl
   102 00006CC2 EBDD                <1> 	jmp	short _default_drive_c
   103                              <1> 
   104                              <1> _start_mainprog:
   105                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
   106                              <1> 	; 18/04/2021 (TRDOS 386 v2.0.4 - Beginning) 
   107                              <1> 	; 07/01/2017
   108                              <1> 	; 07/05/2016
   109                              <1> 	; 02/05/2016
   110                              <1> 	; 24/04/2016 (TRDOS 386 v2)
   111                              <1> 	; Retro UNIX 386 v1, 'sys_init' (u0.s)
   112                              <1> 	; 23/06/2015
   113                              <1> 
   114                              <1> 	; 02/05/2016
   115                              <1> 	; 24/04/2016
   116                              <1> 	;mov	ax, 1
   117                              <1> 	; 18/04/2021 - TRDOS 386 v2.0.4
   118 00006CC4 31C0                <1> 	xor	eax, eax
   119 00006CC6 FEC0                <1> 	inc	al  ; eax = 1
   120 00006CC8 A2[71900100]        <1> 	mov	[u.uno], al
   121 00006CCD 66A3[08900100]      <1> 	mov	[mpid], ax
   122 00006CD3 66A3[048F0100]      <1> 	mov	[p.pid], ax
   123 00006CD9 A2[648F0100]        <1> 	mov	[p.stat], al
   124 00006CDE C605[68900100]04    <1> 	mov	byte [u.quant], time_count  ; 07/01/2017
   125                              <1> 	;
   126 00006CE5 A1[88780100]        <1> 	mov	eax, [k_page_dir]
   127 00006CEA A3[78900100]        <1> 	mov	[u.pgdir], eax ; reset
   128                              <1> 	;
   129 00006CEF E8C4EAFFFF          <1> 	call	allocate_page
   130                              <1> 	;jc	panic
   131                              <1> 	; 25/07/2022
   132 00006CF4 7305                <1> 	jnc	short _start_mainprog_1
   133 00006CF6 E9AE000000          <1> 	jmp	panic
   134                              <1> 
   135                              <1> _start_mainprog_1:
   136 00006CFB A3[74900100]        <1> 	mov	[u.upage], eax ; user structure page	
   137 00006D00 A3[748F0100]        <1> 	mov	[p.upage], eax
   138 00006D05 E81FEBFFFF          <1> 	call	clear_page
   139                              <1> 	;
   140                              <1> 	; 24/08/2015
   141 00006D0A FE0D[14900100]      <1> 	dec 	byte [sysflg] ; FFh = ready for system call
   142                              <1> 			      ; 0 = executing a system call
   143                              <1> 	; 13/04/2016
   144                              <1> 	; Clear Environment Variables Page/Area
   145 00006D10 BF00300900          <1> 	mov	edi, Env_Page ; 93000h
   146 00006D15 B980000000          <1> 	mov	ecx, Env_Page_Size / 4	; 512/4  (4096/4)				 	  		 	  
   147 00006D1A 31C0                <1> 	xor	eax, eax
   148 00006D1C F3AB                <1> 	rep	stosd
   149                              <1> 
   150                              <1> 	; 14/04/2016
   151 00006D1E E858330000          <1>  	call	mainprog_startup_configuration
   152                              <1> 
   153 00006D23 E8A00C0000          <1>         call    dos_prompt
   154                              <1>               
   155                              <1> _end_of_mainprog:
   156 00006D28 BE[BE300100]        <1>         mov     esi, msg_CRLF_temp
   157 00006D2D E818000000          <1> 	call 	print_msg
   158 00006D32 BE[C4300100]        <1> 	mov 	esi, mainprog_Version
   159 00006D37 E80E000000          <1> 	call 	print_msg
   160                              <1> 	; 24/01/2016
   161 00006D3C 28E4                <1> 	sub	ah, ah
   162 00006D3E E8D0A1FFFF          <1> 	call	int16h ; call getch
   163 00006D43 E95EA6FFFF          <1> 	jmp	cpu_reset
   164                              <1> 
   165 00006D48 EBFE                <1> infinitiveloop: jmp short infinitiveloop
   166                              <1> 
   167                              <1> print_msg:
   168                              <1> 	; 13/05/2016
   169                              <1> 	; 04/01/2016
   170                              <1> 	; 01/07/2015
   171                              <1> 	; 13/03/2015 (Retro UNIX 386 v1)
   172                              <1> 	; 07/03/2014 (Retro UNIX 8086 v1)
   173                              <1> 	; (Modified registers: EAX, EBX, ECX, EDX, ESI, EDI)
   174                              <1> 	;
   175 00006D4A 8A3D[B6780100]      <1> 	mov	bh, [ACTIVE_PAGE] ; 04/01/2016 (ptty)
   176                              <1> 	;mov	bl, 07h ; Black background, light gray forecolor
   177                              <1> 
   178 00006D50 AC                  <1> 	lodsb
   179                              <1> pmsg1:
   180 00006D51 56                  <1> 	push 	esi
   181                              <1> 	;mov	bh, [ACTIVE_PAGE] ; 04/01/2016 (ptty)
   182 00006D52 B307                <1> 	mov	bl, 07h ; Black background, light gray forecolor
   183 00006D54 E833B5FFFF          <1> 	call 	_write_tty
   184 00006D59 5E                  <1> 	pop	esi
   185 00006D5A AC                  <1> 	lodsb
   186 00006D5B 20C0                <1> 	and 	al, al
   187 00006D5D 75F2                <1> 	jnz 	short pmsg1
   188 00006D5F C3                  <1> 	retn
   189                              <1> 
   190                              <1> clear_screen:
   191                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
   192                              <1> 	; 06/12/2020 
   193                              <1> 	; 03/12/2020 (TRDOS 386 v2.0.3)
   194                              <1> 	; 13/05/2016
   195                              <1> 	; 30/01/2016
   196                              <1> 	; 24/01/2016
   197                              <1> 	; 04/01/2016
   198 00006D60 0FB61D[B6780100]    <1> 	movzx	ebx, byte [ACTIVE_PAGE] ; video page number (0 to 7)
   199                              <1> 	; 25/07/2022
   200                              <1> 	;sub	al, al
   201                              <1> 	; al = 0
   202 00006D67 8AA3[CF670000]      <1> 	mov 	ah, [ebx+vmode] ; default = 03h (80x25 text)
   203 00006D6D 80FC04              <1> 	cmp	ah, 4
   204 00006D70 7205                <1> 	jb	short cls1
   205 00006D72 80FC07              <1> 	cmp	ah, 7
   206 00006D75 752B                <1> 	jne	short vga_clear
   207                              <1> cls1:
   208                              <1> 	;mov	bh, bl
   209                              <1> 	;mov	bl, 7
   210 00006D77 3A25[BE670000]      <1> 	cmp	ah, [CRT_MODE] ; current video mode ? 
   211 00006D7D 740D                <1> 	je	short cls2 ; yes (current video mode = 3)
   212                              <1> 	;;call	set_mode_3 ; set video mode to 3 (& clear screen)
   213                              <1> 	;;retn
   214                              <1> 	; 06/12/2020
   215                              <1> 	;cmp	byte [pmi32], 0
   216                              <1> 	; 25/07/2022
   217 00006D7F 383D[D49E0100]      <1> 	cmp	[pmi32], bh ; 0
   218 00006D85 771B                <1> 	ja	short vga_clear 	
   219 00006D87 E90AB5FFFF          <1> 	jmp	set_mode_3
   220                              <1> cls2:
   221 00006D8C 88DF                <1> 	mov	bh, bl ; video page (0 to 7)
   222 00006D8E B307                <1> 	mov	bl, 07h ; attribute to be used on blanked line
   223                              <1> 	; 25/07/2022
   224                              <1> 	;sub 	al, al ; 0 = entire window
   225                              <1> 	;xor 	cx, cx
   226                              <1> 	; 25/07/2022
   227                              <1> 	; al = 0
   228 00006D90 31C9                <1> 	xor	ecx, ecx
   229 00006D92 66BA4F18            <1> 	mov 	dx, 184Fh
   230 00006D96 E843B2FFFF          <1> 	call	_scroll_up ; 24/01/2016
   231                              <1> 	;
   232                              <1> 	;mov	bh, [ACTIVE_PAGE] ; video page number (0 to 7)
   233                              <1> 	;xor 	dx, dx
   234                              <1> 	; 25/07/2022
   235 00006D9B 31D2                <1> 	xor	edx, edx
   236                              <1> 	;call	_set_cpos ; 24/01/2016 
   237                              <1> 	;;retn
   238                              <1> 	; 03/12/2020
   239 00006D9D E982B5FFFF          <1> 	jmp	_set_cpos ; returns to the caller of this proc
   240                              <1> ;cls3:
   241                              <1> ;	retn
   242                              <1> 
   243                              <1> 	; 06/12/2020
   244                              <1> vga_clear:
   245                              <1> 	; 03/12/2020
   246                              <1> 	; set mode by using _int10h
   247                              <1> 	; (also clears screen)
   248                              <1> 	;mov	al, ah
   249                              <1> 	;sub	ah, ah  ; set current video mode
   250                              <1> 	; 25/07/2022
   251 00006DA2 86E0                <1> 	xchg	ah, al
   252                              <1> 	; ah = 0
   253                              <1> 	; al = video mode
   254                              <1> 	;call	_int10h ; simulates int 10h in TRDOS 386 kernel
   255                              <1> 	;jmp	short cls3
   256 00006DA4 E972A9FFFF          <1> 	jmp	_int10h ; returns to the caller of this proc
   257                              <1> 
   258                              <1> panic:
   259                              <1> 	; 13/05/2016 (TRDOS 386 = TRDOS v2)
   260                              <1> 	; 13/03/2015 (Retro UNIX 386 v1)
   261                              <1> 	; 07/03/2014 (Retro UNIX 8086 v1)
   262 00006DA9 BE[6F3B0100]        <1> 	mov 	esi, panic_msg
   263 00006DAE E897FFFFFF          <1> 	call 	print_msg
   264                              <1> key_to_reboot:
   265                              <1>         ; 24/01/2016
   266 00006DB3 28E4                <1>         sub     ah, ah
   267 00006DB5 E859A1FFFF          <1>         call    int16h	; call getch
   268                              <1>         ; wait for a character from the current tty
   269                              <1> 	;
   270 00006DBA B00A                <1> 	mov	al, 0Ah
   271 00006DBC 8A3D[B6780100]      <1> 	mov	bh, [ptty] ; [ACTIVE_PAGE]
   272 00006DC2 B307                <1> 	mov	bl, 07h ; Black background, 
   273                              <1> 			; light gray forecolor
   274 00006DC4 E8C3B4FFFF          <1> 	call 	_write_tty
   275 00006DC9 E9D8A5FFFF          <1> 	jmp	cpu_reset 
   276                              <1> 
   277                              <1> ctrlbrk:
   278                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
   279                              <1> 	; 12/11/2015
   280                              <1> 	; 13/03/2015 (Retro UNIX 386 v1)
   281                              <1> 	; 06/12/2013 (Retro UNIX 8086 v1)
   282                              <1> 	;
   283                              <1> 	; INT 1Bh (control+break) handler		
   284                              <1> 	;
   285                              <1>       	; Retro Unix 8086 v1 feature only!
   286                              <1>       	;
   287                              <1> 	
   288                              <1> 	; 25/07/2022
   289 00006DCE 52                  <1> 	push	edx
   290 00006DCF 31D2                <1> 	xor	edx, edx
   291                              <1> 	;cmp 	word [u.intr], 0
   292 00006DD1 663915[6C900100]    <1> 	cmp	[u.intr], dx ; 0
   293 00006DD8 763D                <1> 	jna 	short cbrk4
   294                              <1> cbrk0:
   295                              <1> 	; 12/11/2015
   296                              <1> 	; 06/12/2013
   297                              <1> 	;cmp 	word [u.quit], 0
   298 00006DDA 663915[6E900100]    <1> 	cmp	[u.quit], dx ; 0 ; 25/07/2022
   299 00006DE1 7434                <1> 	jz	short cbrk4
   300                              <1> 	
   301                              <1> 	; 20/09/2013	
   302                              <1> 	;push 	ax
   303 00006DE3 50                  <1> 	push	eax ; 25/07/2022
   304 00006DE4 A0[B6780100]        <1> 	mov	al, [ptty]
   305                              <1> 	
   306                              <1> 	; 12/11/2015
   307                              <1> 	;
   308                              <1> 	; ctrl+break (EOT, CTRL+D) from serial port
   309                              <1> 	; or ctrl+break from console (pseudo) tty
   310                              <1> 	; (!redirection!)
   311                              <1> 	
   312 00006DE9 3C08                <1> 	cmp	al, 8 ; serial port tty nums > 7
   313 00006DEB 720E                <1>         jb      short cbrk1 ; console (pseudo) tty
   314                              <1> 		
   315                              <1> 	; Serial port interrupt handler sets [ptty]
   316                              <1> 	; to the port's tty number (as temporary).
   317                              <1> 	;
   318                              <1> 	; If active process is using a stdin or 
   319                              <1> 	; stdout redirection (by the shell),
   320                              <1>         ; console tty keyboard must be available
   321                              <1> 	; to terminate running process,
   322                              <1> 	; in order to prevent a deadlock. 
   323                              <1> 
   324                              <1> 	; 25/07/2022
   325                              <1> 	;push	edx
   326                              <1> 	;movzx	edx, byte [u.uno]
   327 00006DED 8A15[71900100]      <1> 	mov	dl, [u.uno]
   328 00006DF3 3A82[438F0100]      <1> 	cmp     al, [edx+p.ttyc-1] ; console tty (rw)
   329                              <1> 	;pop	edx
   330 00006DF9 7412                <1> 	je	short cbrk2
   331                              <1> cbrk1:
   332 00006DFB FEC0                <1> 	inc 	al  ; [u.ttyp] : 1 based tty number
   333                              <1> 	; 06/12/2013
   334 00006DFD 3A05[54900100]      <1> 	cmp	al, [u.ttyp]   ; recent open tty (r)
   335 00006E03 7408                <1> 	je	short cbrk2	
   336 00006E05 3A05[55900100]      <1>         cmp     al, [u.ttyp+1] ; recent open tty (w)
   337 00006E0B 7509                <1> 	jne	short cbrk3	
   338                              <1> cbrk2:
   339                              <1> 	;; 06/12/2013
   340                              <1> 	;mov	ax, [u.quit]
   341                              <1> 	;and	ax, ax
   342                              <1> 	;jz	short cbrk3
   343                              <1> 	
   344                              <1> 	;xor	ax, ax ; 0
   345                              <1> 	;dec	ax
   346                              <1> 	; 0FFFFh = 'ctrl+brk' keystroke
   347                              <1> 	; 25/07/2022
   348 00006E0D 31C0                <1> 	xor	eax, eax ; 0
   349 00006E0F 48                  <1> 	dec	eax ; -1 ; 0FFFFFFFFh
   350 00006E10 66A3[6E900100]      <1> 	mov	[u.quit], ax
   351                              <1> cbrk3:
   352                              <1> 	;pop	ax
   353 00006E16 58                  <1> 	pop	eax ; 25/07/2022
   354                              <1> cbrk4:
   355                              <1> 	; 25/07/2022
   356 00006E17 5A                  <1> 	pop	edx
   357 00006E18 C3                  <1> 	retn
   358                              <1> 
   359                              <1> ; 31/12/2017
   360                              <1> ; TRDOS 386 - 30/12/2017
   361                              <1> %define get_rtc_date RTC_40
   362                              <1> %define get_rtc_time RTC_20
   363                              <1> %define	set_rtc_date RTC_50
   364                              <1> %define set_rtc_time RTC_30	
   365                              <1> get_rtc_date_time:
   366                              <1> ; Retro UNIX 8086 v1 - UNIX.ASM (01/09/2014)
   367                              <1> ;epoch:
   368                              <1> 	; 18/04/2021 (TRDOS 386 v2.0.3)
   369                              <1> 	; 30/12/2017 (TRDOS 386 = TRDOS v2.0)
   370                              <1> 	; 15/03/2015 (Retro UNIX 386 v1 - 32 bit version)
   371                              <1> 	; 09/04/2013 (Retro UNIX 8086 v1 - UNIX.ASM)
   372                              <1> 	; 'epoch' procedure prototype: 
   373                              <1> 	; 	            UNIXCOPY.ASM, 10/03/2013
   374                              <1> 	; 14/11/2012
   375                              <1> 	; unixboot.asm (boot file configuration)
   376                              <1> 	; version of "epoch" procedure in "unixproc.asm"
   377                              <1> 	; 21/7/2012
   378                              <1> 	; 15/7/2012
   379                              <1> 	; 14/7/2012		
   380                              <1> 	; Erdogan Tan - RETRO UNIX v0.1
   381                              <1> 	; compute current date and time as UNIX Epoch/Time
   382                              <1> 	; UNIX Epoch: seconds since 1/1/1970 00:00:00
   383                              <1> 	;
   384                              <1>         ;  ((Modified registers: EAX, EDX, ECX, EBX))  
   385                              <1> 	;
   386                              <1> 
   387                              <1> 	; 18/04/2021
   388                              <1> 	; INPUT:
   389                              <1> 	;	none (real time clock)
   390                              <1> 	; OUTPUT:
   391                              <1> 	;	eax = unix epoch time value
   392                              <1> 	;	    (seconds since 1/1/1970 00:00:00)
   393                              <1> 
   394 00006E19 E8CBF4FFFF          <1> 	call 	get_rtc_time		; Return Current Time
   395                              <1>         ;xchg 	ch, cl ; 18/04/2021
   396 00006E1E 66890D[56750100]    <1>         mov 	[hour], cx    ; BCD, cl = minute, ch = hour
   397                              <1>         ;xchg 	dh, dl ; 18/04/2021
   398                              <1> 	;mov 	[second], dx  ; BCD, dh = second, dl = dse
   399                              <1> 	; 18/04/2021
   400 00006E25 8835[5A750100]      <1> 	mov	[second], dh  ; second
   401                              <1> 	;
   402 00006E2B E824F5FFFF          <1>         call 	get_rtc_date		; Return Current Date
   403                              <1>         ;xchg 	ch, cl ; 18/04/2021
   404 00006E30 66890D[50750100]    <1>         mov 	[year], cx    ; BCD, cl = year, ch = century
   405                              <1>         ;xchg 	dh, dl ; 18/04/2021
   406 00006E37 668915[52750100]    <1>         mov 	[month], dx   ; BCD, dl = day, dh = month
   407                              <1> 	;
   408                              <1> 	;mov 	al, [hour]    ; Hour
   409                              <1>         ; 18/04/2021
   410 00006E3E A0[57750100]        <1> 	mov	al, [hour+1]  ; Hour
   411                              <1> 	   	; AL <-- BCD number
   412 00006E43 D410                <1>         db 	0D4h, 10h		; Undocumented inst. AAM
   413                              <1> 					; AH = AL / 10h
   414                              <1> 					; AL = AL MOD 10h
   415 00006E45 D50A                <1>         aad 	; AX= AH*10+AL
   416                              <1> 	;mov 	[hour], al
   417                              <1> 	;mov 	al, [hour+1]  ; Minute
   418 00006E47 8605[56750100]      <1> 	xchg	al, [hour]    ; [hour] = hour, al = minute
   419                              <1> 	   	; AL <-- BCD number
   420 00006E4D D410                <1>         db 	0D4h, 10h		; Undocumented inst. AAM
   421                              <1> 					; AH = AL / 10h
   422                              <1> 					; AL = AL MOD 10h
   423 00006E4F D50A                <1>         aad 	; AX= AH*10+AL
   424 00006E51 A2[58750100]        <1> 	mov 	[minute], al
   425 00006E56 A0[5A750100]        <1> 	mov 	al, [second]  ; Second
   426                              <1> 	   	; AL <-- BCD number
   427 00006E5B D410                <1>         db 	0D4h, 10h		; Undocumented inst. AAM
   428                              <1> 					; AH = AL / 10h
   429                              <1> 					; AL = AL MOD 10h
   430 00006E5D D50A                <1>         aad 	; AX= AH*10+AL
   431 00006E5F A2[5A750100]        <1> 	mov 	[second], al
   432 00006E64 66A1[50750100]      <1> 	mov 	ax, [year]    ; Year (century)
   433                              <1> 	; 18/04/2021
   434                              <1> 	;push 	eax ; puhs ax
   435                              <1> 	;mov	al, ah ; century ; 18/04/2021
   436                              <1> 	   	; AL <-- BCD number
   437 00006E6A D410                <1>         db 	0D4h, 10h		; Undocumented inst. AAM
   438                              <1> 					; AH = AL / 10h
   439                              <1> 					; AL = AL MOD 10h
   440 00006E6C D50A                <1>         aad 	; AX= AH*10+AL
   441                              <1> 	;mov 	ah, 100
   442                              <1> 	;mul 	ah
   443                              <1> 	;mov 	[year], ax
   444                              <1> 	; 18/04/2021
   445                              <1> 	; ax = al = year (0 to 99)
   446 00006E6E 668705[50750100]    <1> 	xchg	ax, [year]    ; [year+1] = century -> ah
   447                              <1> 	;pop	eax ; pop ax
   448 00006E75 88E0                <1> 	mov	al, ah  ; century
   449                              <1> 	   	; AL <-- BCD number
   450 00006E77 D410                <1>         db 	0D4h, 10h		; Undocumented inst. AAM
   451                              <1> 					; AH = AL / 10h
   452                              <1> 					; AL = AL MOD 10h
   453 00006E79 D50A                <1>         aad 	; AX= AH*10+AL
   454                              <1> 	; 18/04/2021
   455 00006E7B B464                <1> 	mov	ah, 100	      ; 100*(century byte of year)
   456 00006E7D F6E4                <1> 	mul	ah
   457                              <1> 	;
   458 00006E7F 660105[50750100]    <1> 	add 	[year], ax
   459                              <1> 	;mov 	al, [month]   ; Month
   460                              <1> 	; 18/04/2021
   461 00006E86 A0[53750100]        <1> 	mov	al, [month+1] ; Month
   462                              <1> 	   	; AL <-- BCD number
   463 00006E8B D410                <1>         db 	0D4h, 10h		; Undocumented inst. AAM
   464                              <1> 					; AH = AL / 10h
   465                              <1> 					; AL = AL MOD 10h
   466 00006E8D D50A                <1>         aad 	; AX= AH*10+AL
   467                              <1> 	;mov 	[month], al	
   468                              <1>         ;mov	al, [month+1] ; Day
   469                              <1> 	; 18/04/2021
   470 00006E8F 8605[52750100]      <1> 	xchg	al, [month]   ; [month] = month, al = day
   471                              <1> 	   	; AL <-- BCD number
   472 00006E95 D410                <1>         db 	0D4h, 10h		; Undocumented inst. AAM
   473                              <1> 					; AH = AL / 10h
   474                              <1> 					; AL = AL MOD 10h
   475 00006E97 D50A                <1>         aad 	; AX= AH*10+AL
   476 00006E99 A2[54750100]        <1>         mov     [day], al
   477                              <1> 	
   478 00006E9E C3                  <1> 	retn	; 30/12/2017
   479                              <1> 
   480                              <1> epoch:
   481 00006E9F E875FFFFFF          <1> 	call	get_rtc_date_time ; TRDOS 386 - 30/12/2017
   482                              <1> 
   483                              <1> convert_to_epoch:
   484                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
   485                              <1> 	; 31/12/2017 (TRDOS 386 = TRDOS v2.0)
   486                              <1> 	; 15/03/2015 (Retro UNIX 386 v1 - 32 bit modification)
   487                              <1> 	; 09/04/2013 (Retro UNIX 8086 v1)
   488                              <1> 	;
   489                              <1> 	; ((Modified registers: EAX, EDX, EBX)) 
   490                              <1> 	;
   491                              <1> 	; Derived from DALLAS Semiconductor
   492                              <1> 	; Application Note 31 (DS1602/DS1603)
   493                              <1> 	; 6 May 1998
   494 00006EA4 29C0                <1> 	sub 	eax, eax
   495 00006EA6 66A1[50750100]      <1> 	mov 	ax, [year]
   496 00006EAC 662DB207            <1> 	sub 	ax, 1970
   497 00006EB0 BA6D010000          <1> 	mov 	edx, 365
   498 00006EB5 F7E2                <1> 	mul 	edx
   499 00006EB7 31DB                <1> 	xor 	ebx, ebx
   500 00006EB9 8A1D[52750100]      <1> 	mov 	bl, [month]
   501 00006EBF FECB                <1> 	dec 	bl
   502 00006EC1 D0E3                <1> 	shl 	bl, 1
   503                              <1> 	;sub	edx, edx
   504 00006EC3 668B93[5C750100]    <1> 	mov 	dx, [EBX+DMonth]
   505 00006ECA 8A1D[54750100]      <1>         mov     bl, [day]
   506 00006ED0 FECB                <1> 	dec 	bl
   507 00006ED2 01D0                <1> 	add 	eax, edx
   508 00006ED4 01D8                <1> 	add 	eax, ebx
   509                              <1> 			; EAX = days since 1/1/1970
   510 00006ED6 668B15[50750100]    <1> 	mov 	dx, [year]
   511 00006EDD 6681EAB107          <1> 	sub 	dx, 1969
   512                              <1> 	;shr 	dx, 1
   513                              <1> 	;shr 	dx, 1
   514                              <1> 	; 25/07/2022
   515 00006EE2 C1EA02              <1> 	shr	edx, 2		
   516                              <1> 		; (year-1969)/4
   517 00006EE5 01D0                <1> 	add 	eax, edx
   518                              <1> 			; + leap days since 1/1/1970
   519 00006EE7 803D[52750100]02    <1> 	cmp 	byte [month], 2	; if past february
   520 00006EEE 760E                <1> 	jna 	short cte1
   521 00006EF0 668B15[50750100]    <1> 	mov 	dx, [year]
   522 00006EF7 6683E203            <1> 	and 	dx, 3 ; year mod 4
   523 00006EFB 7501                <1> 	jnz 	short cte1		
   524                              <1> 			; and if leap year
   525                              <1> 	;add 	eax, 1 	; add this year's leap day (february 29)
   526                              <1> 	; 25/07/2022
   527 00006EFD 40                  <1> 	inc	eax
   528                              <1> cte1: 			; compute seconds since 1/1/1970
   529 00006EFE BA18000000          <1> 	mov 	edx, 24
   530 00006F03 F7E2                <1> 	mul	edx
   531 00006F05 8A15[56750100]      <1> 	mov 	dl, [hour]
   532 00006F0B 01D0                <1> 	add 	eax, edx
   533                              <1> 		; EAX = hours since 1/1/1970 00:00:00
   534                              <1> 	;mov	ebx, 60
   535 00006F0D B33C                <1> 	mov	bl, 60
   536 00006F0F F7E3                <1> 	mul	ebx
   537 00006F11 8A15[58750100]      <1> 	mov 	dl, [minute]
   538 00006F17 01D0                <1> 	add 	eax, edx
   539                              <1> 		; EAX = minutes since 1/1/1970 00:00:00
   540                              <1> 	;mov 	ebx, 60
   541 00006F19 F7E3                <1> 	mul	ebx
   542 00006F1B 8A15[5A750100]      <1> 	mov 	dl, [second]
   543 00006F21 01D0                <1> 	add 	eax, edx
   544                              <1>  		; EAX -> seconds since 1/1/1970 00:00:00
   545 00006F23 C3                  <1> 	retn
   546                              <1> 
   547                              <1> ;set_date_time:
   548                              <1> convert_from_epoch:
   549                              <1> 	; 25/07/2022 (v2.0.5)
   550                              <1> 	; 18/04/2021 (v2.0.4)
   551                              <1> 	; 31/12/2017 (v2.0.0)
   552                              <1> 	; 30/12/2017 (TRDOS 386 = TRDOS v2.0)
   553                              <1> 	; 15/03/2015 (Retro UNIX 386 v1 - 32 bit version)
   554                              <1> 	; 20/06/2013 (Retro UNIX 8086 v1)
   555                              <1> 	; 'convert_from_epoch' procedure prototype: 
   556                              <1> 	; 	            UNIXCOPY.ASM, 10/03/2013
   557                              <1> 	;
   558                              <1> 	; ((Modified registers: EAX, EDX, ECX, EBX))	
   559                              <1> 	;
   560                              <1> 	; Derived from DALLAS Semiconductor
   561                              <1> 	; Application Note 31 (DS1602/DS1603)
   562                              <1> 	; 6 May 1998
   563                              <1> 	;
   564                              <1> 	; INPUT:
   565                              <1> 	; EAX = Unix (Epoch) Time
   566                              <1> 	;
   567 00006F24 31D2                <1> 	xor 	edx, edx
   568                              <1> 	;mov 	ecx, 60
   569                              <1> 	; 25/07/2022
   570 00006F26 29C9                <1> 	sub	ecx, ecx
   571 00006F28 B13C                <1> 	mov	cl, 60
   572 00006F2A F7F1                <1> 	div	ecx
   573                              <1> 	;mov 	[imin], eax   ; whole minutes
   574                              <1> 			  ; since 1/1/1970
   575 00006F2C 668915[5A750100]    <1> 	mov 	[second], dx  ; leftover seconds
   576 00006F33 29D2                <1> 	sub 	edx, edx
   577 00006F35 F7F1                <1> 	div	ecx
   578                              <1> 	;mov 	[ihrs], eax   ; whole hours
   579                              <1> 	;		      ; since 1/1/1970
   580 00006F37 668915[58750100]    <1> 	mov 	[minute], dx  ; leftover minutes
   581 00006F3E 31D2                <1> 	xor	edx, edx
   582                              <1> 	;mov 	cx, 24
   583 00006F40 B118                <1> 	mov 	cl, 24
   584 00006F42 F7F1                <1> 	div	ecx
   585                              <1> 	;mov 	[iday], ax   ; whole days
   586                              <1> 			     ; since 1/1/1970
   587 00006F44 668915[56750100]    <1> 	mov 	[hour], dx   ; leftover hours
   588 00006F4B 05DB020000          <1> 	add 	eax, 365+366 ; whole day since
   589                              <1> 			     ; 1/1/1968 	
   590                              <1> 	;mov 	[iday], ax
   591 00006F50 50                  <1> 	push 	eax
   592 00006F51 29D2                <1> 	sub	edx, edx
   593                              <1> 	;mov 	ecx, (4*365)+1 ; 4 years = 1461 days
   594                              <1> 	; 25/07/2022
   595 00006F53 66B9B505            <1> 	mov	cx, (4*365)+1
   596 00006F57 F7F1                <1> 	div	ecx
   597 00006F59 59                  <1> 	pop 	ecx
   598                              <1> 	;mov 	[lday], ax   ; count of quadyrs (4 years)
   599                              <1> 	;push 	dx
   600                              <1> 	; 18/04/2021
   601 00006F5A 52                  <1> 	push	edx
   602                              <1> 	;mov 	[qday], dx   ; days since quadyr began
   603 00006F5B 6683FA3C            <1> 	cmp 	dx, 31+29    ; if past feb 29 then
   604 00006F5F F5                  <1> 	cmc		     ; add this quadyr's leap day
   605 00006F60 83D000              <1> 	adc 	eax, 0	     ; to # of qadyrs (leap days)
   606                              <1> 	;mov 	[lday], ax   ; since 1968			  
   607                              <1> 	;mov 	cx, [iday]
   608 00006F63 91                  <1> 	xchg 	ecx, eax     ; ECX = lday, EAX = iday		  
   609 00006F64 29C8                <1> 	sub 	eax, ecx     ; iday - lday
   610                              <1> 	;mov 	ecx, 365
   611                              <1> 	; 25/07/2022
   612 00006F66 66B96D01            <1> 	mov	cx, 365
   613 00006F6A 31D2                <1> 	xor	edx, edx
   614                              <1> 	; EAX = iday-lday, EDX = 0
   615 00006F6C F7F1                <1> 	div	ecx
   616                              <1> 	;mov 	[iyrs], ax   ; whole years since 1968
   617                              <1> 	;jday = iday - (iyrs*365) - lday
   618                              <1> 	;mov	[jday], dx   ; days since 1/1 of current year
   619                              <1> 	;add	eax, 1968
   620 00006F6E 6605B007            <1> 	add 	ax, 1968     ; compute year
   621 00006F72 66A3[50750100]      <1> 	mov 	[year], ax
   622                              <1> 	;mov 	cx, dx
   623                              <1> 	; 25/07/2022
   624 00006F78 89D1                <1> 	mov	ecx, edx
   625                              <1> 	;;mov 	dx, [qday]
   626                              <1> 	;pop 	dx
   627                              <1> 	; 18/04/2021
   628 00006F7A 5A                  <1> 	pop	edx
   629 00006F7B 6681FA6D01          <1> 	cmp 	dx, 365	     ; if qday <= 365 and qday >= 60	
   630 00006F80 7708                <1> 	ja 	short cfe1   ; jday = jday +1
   631 00006F82 6683FA3C            <1> 	cmp 	dx, 60       ; if past 2/29 and leap year then
   632 00006F86 F5                  <1>         cmc		     ; add a leap day to the # of whole
   633                              <1> 	;adc 	cx, 0        ; days since 1/1 of current year
   634                              <1> 	; 25/07/2022
   635 00006F87 83D100              <1> 	adc	ecx, 0
   636                              <1> cfe1:			
   637                              <1> 	;mov 	[jday], cx
   638                              <1> 	;mov 	bx, 12       ; estimate month
   639                              <1> 	; 18/04/2021
   640 00006F8A 29DB                <1> 	sub	ebx, ebx
   641 00006F8C B30C                <1> 	mov	bl, 12
   642 00006F8E 66BA6E01            <1> 	mov 	dx, 366      ; mday, max. days since 1/1 is 365
   643 00006F92 6683E003            <1> 	and 	ax, 11b      ; year mod 4 (and dx, 3) 
   644                              <1> cfe2:	; Month calculation  ; 0 to 11  (11 to 0)	
   645                              <1> 	;cmp 	cx, dx       ; mday = # of days passed from 1/1
   646                              <1> 	; 25/07/2022
   647 00006F96 39D1                <1> 	cmp	ecx, edx 
   648 00006F98 731B                <1> 	jnb 	short cfe3
   649                              <1> 	;dec 	bx           ; month = month - 1
   650                              <1> 	;shl 	bx, 1
   651                              <1> 	; 18/04/2021
   652 00006F9A FECB                <1> 	dec	bl
   653 00006F9C D0E3                <1> 	shl	bl, 1 
   654 00006F9E 668B93[5C750100]    <1> 	mov 	dx, [EBX+DMonth] ; # elapsed days at 1st of month
   655                              <1> 	; 18/04/2021
   656                              <1> 	;shr 	bx, 1        ; bx = month - 1 (0 to 11)
   657 00006FA5 D0EB                <1> 	shr	bl, 1
   658                              <1> 	;cmp	bx, 1        ; if month > 2 and year mod 4  = 0	
   659 00006FA7 80FB01              <1> 	cmp	bl, 1
   660 00006FAA 76EA                <1> 	jna 	short cfe2   ; then mday = mday + 1
   661 00006FAC 76E8                <1> 	jna 	short cfe2   ; then mday = mday + 1
   662 00006FAE 08C0                <1> 	or 	al, al       ; if past 2/29 and leap year then
   663 00006FB0 75E4                <1> 	jnz 	short cfe2   ; add leap day (to mday)
   664                              <1> 	;inc 	dx           ; mday = mday + 1
   665                              <1> 	; 25/07/2022
   666 00006FB2 42                  <1> 	inc	edx
   667 00006FB3 EBE1                <1> 	jmp 	short cfe2
   668                              <1> cfe3:
   669                              <1> 	;inc 	bx	     ; -> bx = month, 1 to 12
   670                              <1> 	; 18/04/2021
   671 00006FB5 FEC3                <1> 	inc	bl
   672 00006FB7 66891D[52750100]    <1> 	mov 	[month], bx
   673                              <1> 	;sub 	cx, dx	     ; day = jday - mday + 1	
   674                              <1> 	; 25/07/2022
   675 00006FBE 29D1                <1> 	sub	ecx, edx
   676                              <1> 	;inc 	cx 			  
   677                              <1> 	; 18/04/2021
   678 00006FC0 FEC1                <1> 	inc	cl
   679                              <1> 	;mov 	[day], cx
   680 00006FC2 880D[54750100]      <1> 	mov	[day], cl	
   681                              <1> 
   682                              <1> 	; eax, ebx, ecx, edx is changed at return
   683                              <1> 	; output ->
   684                              <1> 	; [year], [month], [day], [hour], [minute], [second]
   685                              <1> 
   686 00006FC8 C3                  <1> 	retn	; 31/12/2017 (TRDOS 386)
   687                              <1> 
   688                              <1> set_rtc_date_time:
   689                              <1> 	; 31/12/2017 (v2.0.0)
   690                              <1> 	; 30/12/2017 (TRDOS 386)
   691                              <1> 	; 15/03/2015 (Retro UNIX 386 v1 - 32 bit version)
   692                              <1> 	; 20/06/2013 (Retro UNIX 8086 v1)
   693 00006FC9 E80F000000          <1> 	call	set_date_bcd
   694                              <1> 	; Set real-time clock date
   695 00006FCE E8A7F3FFFF          <1> 	call	set_rtc_date ; RTC_50
   696                              <1> 	; Set real-time clock time
   697 00006FD3 E832000000          <1> 	call	set_time_bcd
   698 00006FD8 E93AF3FFFF          <1> 	jmp	set_rtc_time ; RTC_30	
   699                              <1> 
   700                              <1> ; 31/12/2017
   701                              <1> set_date_bcd:
   702 00006FDD A0[51750100]        <1>         mov     al, [year+1]
   703 00006FE2 D40A                <1> 	aam 	; ah = al / 10, al = al mod 10
   704 00006FE4 D510                <1> 	db 	0D5h, 10h    ; Undocumented inst. AAD
   705                              <1> 			     ; AL = AH * 10h + AL
   706 00006FE6 88C5                <1> 	mov 	ch, al ; century (BCD)
   707 00006FE8 A0[50750100]        <1> 	mov 	al, [year]
   708 00006FED D40A                <1> 	aam 	; ah = al / 10, al = al mod 10
   709 00006FEF D510                <1> 	db 	0D5h, 10h    ; Undocumented inst. AAD
   710                              <1> 			     ; AL = AH * 10h + AL
   711 00006FF1 88C1                <1> 	mov 	cl, al ; year (BCD)
   712 00006FF3 A0[52750100]        <1>         mov 	al, [month]
   713 00006FF8 D40A                <1> 	aam 	; ah = al / 10, al = al mod 10
   714 00006FFA D510                <1> 	db 	0D5h, 10h    ; Undocumented inst. AAD
   715                              <1> 			     ; AL = AH * 10h + AL
   716 00006FFC 88C6                <1> 	mov 	dh, al ; month (BCD)
   717 00006FFE A0[54750100]        <1> 	mov 	al, [day]
   718 00007003 D40A                <1> 	aam 	; ah = al / 10, al = al mod 10
   719 00007005 D510                <1> 	db 	0D5h, 10h    ; Undocumented inst. AAD
   720                              <1> 			     ; AL = AH * 10h + AL
   721                              <1> 	; 18/04/2021
   722 00007007 88C2                <1> 	mov 	dl, al ; day (BCD)
   723 00007009 C3                  <1> 	retn	; 30/12/2017
   724                              <1> 
   725                              <1> ; 31/12/2017
   726                              <1> set_time_bcd:
   727                              <1>         ; Read real-time clock time 
   728                              <1> 	; (get day light saving time bit status)
   729 0000700A FA                  <1>  	cli
   730 0000700B E8A5F4FFFF          <1> 	call	UPD_IPR 		; CHECK FOR UPDATE IN PROCESS
   731                              <1> 	; cf = 1 -> al = 0
   732 00007010 7207                <1>         jc      short stime1
   733 00007012 B00B                <1> 	mov	al, CMOS_REG_B		; ADDRESS ALARM REGISTER
   734 00007014 E8D2F4FFFF          <1> 	call	CMOS_READ		; READ CURRENT VALUE OF DSE BIT
   735                              <1> stime1:
   736 00007019 FB                  <1> 	sti
   737 0000701A 2401                <1> 	and	al, 00000001b		; MASK FOR VALID DSE BIT
   738 0000701C 88C2                <1> 	mov	dl, al			; SET [DL] TO ZERO FOR NO DSE BIT
   739                              <1> 	; DL = 1 or 0 (day light saving time)
   740                              <1> 	;	
   741 0000701E A0[56750100]        <1> 	mov 	al, [hour]
   742 00007023 D40A                <1> 	aam 	; ah = al / 10, al = al mod 10
   743 00007025 D510                <1> 	db 	0D5h,10h     ; Undocumented inst. AAD
   744                              <1> 			     ; AL = AH * 10h + AL
   745 00007027 88C5                <1> 	mov 	ch, al ; hour (BCD)
   746 00007029 A0[58750100]        <1>         mov     al, [minute]
   747 0000702E D40A                <1> 	aam 	; ah = al / 10, al = al mod 10
   748 00007030 D510                <1> 	db 	0D5h,10h     ; Undocumented inst. AAD
   749                              <1> 			     ; AL = AH * 10h + AL
   750 00007032 88C1                <1> 	mov 	cl, al       ; minute (BCD)
   751 00007034 A0[5A750100]        <1>         mov     al, [second]
   752 00007039 D40A                <1> 	aam 	; ah = al / 10, al = al mod 10
   753 0000703B D510                <1> 	db 	0D5h,10h     ; Undocumented inst. AAD
   754                              <1> 			     ; AL = AH * 10h + AL
   755 0000703D 88C6                <1> 	mov 	dh, al	     ; second (BCD)
   756 0000703F C3                  <1> 	retn	; 30/12/2017
  3426                                  %include 'trdosk2.s' ; 04/01/2016
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.8) - DRV INIT : trdosk2.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 22/05/2024 (Previous: 29/08/2023)
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 04/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.14 (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> 	; 22/05/2024 (TRDOS 386 Kernel v2.0.8)
    18                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
    19                              <1> 	; 30/08/2020
    20                              <1> 	; 25/08/2020
    21                              <1> 	; 11/08/2020 - 13/08/2020
    22                              <1> 	; 17/07/2020 - 20/07/2020
    23                              <1> 	; 14/07/2020 - 15/07/2020
    24                              <1> 	; 30/01/2018
    25                              <1> 	; 27/12/2017
    26                              <1> 	; 12/02/2016
    27                              <1> 	; 06/01/2016
    28                              <1> 	;  	('diskinit.inc', 'diskio.inc' integration)
    29                              <1> 	; 04/01/2016 (TRDOS 386 = TRDOS v2.0)
    30                              <1> 	; 07/08/2011
    31                              <1> 	; 20/09/2009
    32                              <1> 	; 2005
    33                              <1> 
    34                              <1> 	; 15/07/2020
    35                              <1> 	;movzx	ecx, byte [HF_NUM] ; number of fixed disks
    36                              <1> 	;cmp	cl, 1
    37                              <1> 	;jnb	short load_hd_partition_tables
    38                              <1> 
    39 00007040 A0[20790100]        <1> 	mov	al, [HF_NUM] ; number of fixed disks
    40 00007045 20C0                <1> 	and 	al, al
    41 00007047 7501                <1> 	jnz	short load_hd_partition_tables
    42                              <1> 
    43                              <1> 	; no any hard disks
    44 00007049 C3                  <1> 	retn			
    45                              <1> 
    46                              <1> load_hd_partition_tables:
    47                              <1> 	;mov	esi, [HDPM_TBL_VEC] ; primary master disk FDPT
    48                              <1> 	; 15/07/2020
    49 0000704A BE[24790100]        <1> 	mov	esi, HDPM_TBL_VEC
    50 0000704F BF[4A7D0100]        <1> 	mov 	edi, PTable_hd0
    51 00007054 B280                <1> 	mov 	dl, 80h
    52                              <1> 	; 15/07/2020
    53 00007056 A2[1B660000]        <1> 	mov	[hdc], al
    54                              <1> 	;xor	ecx, ecx ; 0
    55                              <1> load_next_hd_partition_table:
    56                              <1> 	; 20/07/2020
    57 0000705B 31C9                <1> 	xor	ecx, ecx ; 0
    58                              <1> 	;push	ecx
    59 0000705D 57                  <1> 	push	edi ; *
    60                              <1> 	;push	esi ; FDPT (+ DPTE) address
    61                              <1> 	; 15/07/2020
    62 0000705E AD                  <1> 	lodsd
    63 0000705F 56                  <1> 	push	esi ; ** ; next FDPT (+ DPTE) address ptr
    64                              <1> 	
    65                              <1> 	;mov	al, [esi+20] ; DPTE offset 4
    66                              <1> 	;and	al, 40h ;  LBA bit (bit 6)
    67                              <1> 	;;shr	al, 6
    68                              <1> 	;mov 	[HD_LBA_yes], al
    69                              <1> 	
    70                              <1> 	; 15/07/2020
    71 00007060 8A4814              <1> 	mov	cl, [eax+20]
    72 00007063 80E140              <1> 	and	cl, 40h
    73                              <1> 	;mov	[HD_LBA_yes], cl
    74                              <1> 	; 22/05/2024 (BugFix)
    75 00007066 0FB6C2              <1> 	movzx	eax, dl
    76 00007069 05[CA7D0100]        <1> 	add	eax, HD_LBA_yes - 80h
    77 0000706E 8808                <1> 	mov	[eax], cl
    78                              <1> 
    79 00007070 E844040000          <1> 	call	load_masterboot
    80                              <1> 	;jc	short pass_pt_this_hard_disk
    81                              <1> 	; 13/08/2020
    82                              <1> 	;jc	pass_pt_this_hard_disk
    83                              <1> 	; 25/07/2022
    84 00007075 7305                <1> 	jnc	short load_mbr_ok
    85 00007077 E98A000000          <1> 	jmp	pass_pt_this_hard_disk
    86                              <1> 
    87                              <1> load_mbr_ok:
    88 0000707C BB[087D0100]        <1> 	mov	ebx, PartitionTable
    89 00007081 89DE                <1> 	mov	esi, ebx
    90                              <1> 	;mov	ecx, 16
    91 00007083 B110                <1> 	mov	cl, 16
    92 00007085 F3A5                <1> 	rep 	movsd
    93 00007087 89DE                <1> 	mov 	esi, ebx 
    94                              <1> 	;mov 	byte [hdc], 4 ; 4 - partition index
    95                              <1> 	; 15/07/2020
    96 00007089 C605[4F7E0100]04    <1> 	mov	byte [PP_Counter], 4
    97                              <1> loc_validate_hdp_partition:
    98                              <1> 	;cmp 	byte [esi+ptFileSystemID], 0
    99                              <1> 	;jna	short loc_validate_next_hdp_partition2
   100                              <1> 	; 13/08/2020
   101 00007090 8A4604              <1> 	mov	al, [esi+ptFileSystemID]
   102 00007093 20C0                <1> 	and	al, al
   103 00007095 7457                <1> 	jz	short loc_validate_next_hdp_partition2
   104                              <1> 
   105 00007097 56                  <1> 	push	esi ; *** ; Masterboot partition table offset
   106 00007098 52                  <1> 	push	edx ; **** ; dl = Physical drive number
   107                              <1> 
   108                              <1> 	; 13/08/2020
   109 00007099 3C05                <1> 	cmp	al, 05h  ; Extended partition CHS
   110 0000709B 7404                <1>  	je	short loc_set_ep_counter
   111 0000709D 3C0F                <1> 	cmp	al, 0Fh  ; Extended partition LBA
   112 0000709F 7511                <1>  	jne	short loc_validate_next_hdp_partition0
   113                              <1> 	
   114                              <1> 	;;inc	byte [PP_Counter]
   115                              <1> 	; 15/07/2020
   116                              <1> 	;inc 	byte [EP_Counter] ; disk has valid partition(s)
   117                              <1> 
   118                              <1> loc_set_ep_counter:
   119                              <1> 	; 13/08/2020
   120 000070A1 803D[507E0100]80    <1> 	cmp	byte [EP_Counter], 80h
   121 000070A8 7342                <1> 	jnb	short loc_validate_next_hdp_partition1
   122                              <1> 
   123 000070AA 8815[507E0100]      <1> 	mov	byte [EP_Counter], dl ; disk drv has extd. part.
   124                              <1> 
   125 000070B0 EB3A                <1> 	jmp	short loc_validate_next_hdp_partition1
   126                              <1> 
   127                              <1> loc_validate_next_hdp_partition0:
   128 000070B2 31FF                <1> 	xor	edi, edi ; 0  
   129                              <1> 	; Input -> ESI = PartitionTable offset
   130                              <1> 	; DL = Hard disk drive number 
   131                              <1> 	; EDI = 0 -> Primary Partition
   132                              <1> 	; EDI > 0 -> Extended Partition's Start Sector   
   133 000070B4 E88C010000          <1> 	call 	validate_hd_fat_partition
   134 000070B9 730E                <1> 	jnc 	short loc_set_valid_hdp_partition_entry
   135                              <1> 
   136                              <1> 	;pop	edx
   137                              <1> 	;push	edx
   138 000070BB 8B1424              <1> 	mov	edx, [esp]  ; ****
   139 000070BE 8B742404            <1> 	mov	esi, [esp+4] ; *** ; 30/01/2018
   140 000070C2 E8D1020000          <1> 	call	validate_hd_fs_partition
   141 000070C7 7223                <1> 	jc	short loc_validate_next_hdp_partition1
   142                              <1> loc_set_valid_hdp_partition_entry:
   143 000070C9 8A0D[BC300100]      <1> 	mov 	cl, [Last_DOS_DiskNo] 
   144 000070CF 80C141              <1> 	add 	cl, 'A'
   145                              <1> 	; ESI = Logical dos drive description table address
   146 000070D2 880E                <1> 	mov	[esi+LD_Name], cl
   147                              <1> 	; 15/07/2020
   148 000070D4 8A4602              <1> 	mov	al, [esi+LD_PhyDrvNo] ; Physical drive number
   149                              <1> 	;mov	al, [esp] ; ****
   150 000070D7 2C7F                <1> 	sub	al, 7Fh
   151                              <1> 		; AL = 1 to 4	
   152 000070D9 C0E002              <1> 	shl	al, 2 ; AL = 4 to 16
   153                              <1> 
   154 000070DC 8A15[4F7E0100]      <1> 	mov	dl, [PP_Counter]
   155                              <1> 
   156                              <1> 	;sub	al, [PP_Counter]
   157 000070E2 28D0                <1> 	sub	al, dl ; [PP_Counter] ; 4 - partition index
   158                              <1> 
   159                              <1> 	; AL = Partition entry/index, 0 based
   160                              <1> 	;  0 -> hd 0, Partition Table offset = 0
   161                              <1> 	; 15 -> hd 3, Partition Table offset = 3
   162                              <1> 
   163                              <1> 	;mov	[esi+LD_PartitionEntry], al 
   164                              <1> 	
   165                              <1> 	; 15/07/2020
   166 000070E4 B404                <1> 	mov	ah, 4
   167                              <1> 	;sub	ah, [PP_Counter]
   168 000070E6 28D4                <1> 	sub	ah, dl
   169                              <1> 
   170                              <1> 	; AH = Primary partition index, 0 to 3 ; pt entry
   171                              <1> 	;		(4 to 7 for logical disk partitions)
   172                              <1> 
   173                              <1> 	;mov 	[esi+LD_DParamEntry], ah 
   174 000070E8 6689467C            <1> 	mov 	[esi+LD_PartitionEntry], ax
   175                              <1> 
   176                              <1> loc_validate_next_hdp_partition1:
   177 000070EC 5A                  <1> 	pop 	edx ; **** ; dl = Physical drive number 
   178 000070ED 5E                  <1> 	pop	esi ; *** ; Masterboot partition table offset
   179                              <1> 
   180                              <1> loc_validate_next_hdp_partition2:
   181                              <1> 	; ESI = PartitionTable offset
   182                              <1> 	; DL = Hard/Fixed disk drive number
   183                              <1> 	
   184                              <1> 	;dec	byte [hdc] ; 4 - partition index
   185                              <1> 	;jz	short pass_pt_this_hard_disk
   186                              <1> 	; 15/07/2020
   187 000070EE FE0D[4F7E0100]      <1> 	dec	byte [PP_Counter] ; 4 - partition index
   188 000070F4 7410                <1> 	jz	short pass_pt_this_hard_disk
   189                              <1> 	
   190 000070F6 83C610              <1> 	add	esi, 16 ; 10h
   191 000070F9 EB95                <1> 	jmp	short loc_validate_hdp_partition
   192                              <1> 
   193                              <1> loc_not_any_extd_partitions:
   194                              <1> 	; 15/07/2020
   195 000070FB C3                  <1> 	retn	
   196                              <1> 
   197                              <1> loc_next_hd_partition_table:
   198 000070FC FEC2                <1> 	inc	dl
   199                              <1> 	; 15/07/2020
   200                              <1> 	;add	esi, 32 ; next FDPT address
   201 000070FE 83C740              <1> 	add	edi, 64 ; next partition table destination
   202 00007101 E955FFFFFF          <1>         jmp     load_next_hd_partition_table
   203                              <1> 
   204                              <1> pass_pt_this_hard_disk:
   205                              <1> 	;pop	esi ; FDPT (+ DPTE) address
   206                              <1> 	; 15/07/2020
   207 00007106 5E                  <1> 	pop	esi ; ** ; next FDPT (+ DPTE) address ptr
   208 00007107 5F                  <1> 	pop	edi ; * ; Ptable_hd?
   209                              <1> 	;pop	ecx
   210                              <1> 	;loop	loc_next_hd_partition_table
   211 00007108 FE0D[1B660000]      <1> 	dec	byte [hdc]
   212 0000710E 75EC                <1> 	jnz	short loc_next_hd_partition_table
   213                              <1> 
   214                              <1> 	;cmp	byte [PP_Counter], 1
   215                              <1> 	;jnb	short load_extended_dos_partitions
   216                              <1> 	;; Empty partition table
   217                              <1> 	;retn
   218                              <1> 
   219                              <1> 	; 11/08/2020
   220                              <1> 	; 17/07/2020
   221                              <1> check_extended_partitions:
   222                              <1> 	; 15/07/2020
   223                              <1> 	;cmp	byte [EP_Counter], 0
   224                              <1> 	;jna	short loc_not_any_extd_partitions
   225                              <1> 	; 13/08/2020
   226 00007110 A0[507E0100]        <1> 	mov	al, [EP_Counter] ; 1st disk drv has extd partition
   227 00007115 08C0                <1> 	or	al, al ; 0 ?
   228 00007117 74E2                <1> 	jz	short loc_not_any_extd_partitions
   229                              <1> 
   230                              <1> load_extended_dos_partitions:
   231                              <1> 	;mov	byte [hdc], 80h
   232                              <1> 	; 13/08/2020
   233 00007119 A2[1B660000]        <1> 	mov	byte [hdc], al ; 1st disk drv has extd partition
   234                              <1> 	; 25/08/2020
   235 0000711E 2C80                <1> 	sub	al, 80h
   236 00007120 740E                <1> 	jz	short loc_set_ext_ptable_hd0
   237 00007122 C0E006              <1> 	shl	al, 6 ; * 64
   238 00007125 0FB6F0              <1> 	movzx	esi, al
   239 00007128 81C6[4A7D0100]      <1> 	add	esi, PTable_hd0
   240 0000712E EB05                <1> 	jmp 	short next_hd_extd_partition
   241                              <1> 
   242                              <1> 	; 25/08/2020
   243                              <1> loc_set_ext_ptable_hd0:
   244 00007130 BE[4A7D0100]        <1> 	mov	esi, PTable_hd0
   245                              <1> 
   246                              <1> next_hd_extd_partition:
   247                              <1> 	; 17/07/2020
   248                              <1> 	;mov 	byte [EP_Counter], 0 ; Reset for each physical disk
   249                              <1> 	; 13/08/2020
   250                              <1> 	;mov	byte [LD_Counter], 0 ; Reset logical drive index
   251 00007135 66C705[507E0100]00- <1> 	mov 	word [EP_Counter], 0 ; Reset EP index and LD index	
   251 0000713D 00                  <1>
   252                              <1> 
   253 0000713E 56                  <1> 	push	esi ; **** ; PTable_hd? offset
   254                              <1> 	
   255 0000713F C605[4F7E0100]04    <1> 	mov 	byte [PP_Counter], 4 
   256                              <1> 				; set for each extd partition table
   257                              <1> 	;;mov	ecx, 4
   258                              <1> 	;mov	cl, 4
   259 00007146 8A15[1B660000]      <1> 	mov	dl, [hdc]
   260                              <1> hd_check_fs_id_05h:
   261 0000714C 8A4604              <1> 	mov	al, [esi+ptFileSystemID]
   262 0000714F 3C05                <1> 	cmp	al, 05h ; Is it an extended dos partition ?
   263 00007151 7411                <1> 	je	short loc_set_ep_start_sector ; yes
   264                              <1> hd_check_fs_id_0Fh:
   265 00007153 3C0F                <1> 	cmp	al, 0Fh ; Is it an extended win4 (LBA mode) partition ?
   266 00007155 740D                <1> 	je	short loc_set_ep_start_sector ; yes
   267                              <1> 
   268                              <1> continue_to_check_ep:
   269                              <1> 	;add	esi, 16
   270                              <1> 	;loop	hd_check_fs_id_05h
   271                              <1> 	; 15/07/2020
   272                              <1> 	;dec	cl
   273                              <1> 	;jz	short continue_check_ep_next_disk
   274 00007157 FE0D[4F7E0100]      <1> 	dec	byte [PP_Counter] ; 4 --> 0
   275 0000715D 7432                <1> 	jz	short continue_check_ep_next_disk
   276 0000715F 83C610              <1> 	add	esi, 16
   277 00007162 EBE8                <1> 	jmp	short hd_check_fs_id_05h
   278                              <1> 
   279                              <1> loc_set_ep_start_sector:
   280                              <1> 	; dl = [hdc] ; Drive number
   281                              <1> 	; 15/07/2020
   282 00007164 8B4E08              <1> 	mov	ecx, [esi+ptStartSector]
   283                              <1> 	; 30/08/2020
   284 00007167 890D[527E0100]      <1> 	mov	[MBR_EP_StartSector], ecx 
   285                              <1> 	; 20/07/2020
   286                              <1> loc_validate_hde_partition_next:
   287                              <1> 	; 22/05/2024 (BugFix)
   288 0000716D 0FB6FA              <1> 	movzx	edi, dl
   289 00007170 81C7[CA7D0100]      <1> 	add	edi, HD_LBA_yes - 80h
   290                              <1> 	;
   291 00007176 890D[567E0100]      <1> 	mov	[EP_StartSector], ecx ; Extended partition's start sector
   292 0000717C BB[4A7B0100]        <1>         mov	ebx, MasterBootBuff
   293                              <1> 	; 22/05/2024
   294 00007181 803F01              <1> 	cmp	byte [edi], 1 ; LBA ready = Yes
   295                              <1> 	;cmp	byte [HD_LBA_yes], 1 ; LBA ready = Yes
   296 00007184 7227                <1> 	jb	short loc_hd_load_ep_05h ; cf = 1 ; 20/07/2020 
   297                              <1> 	; 11/08/2020
   298                              <1> 	; (BugFix for extended partition type 05h beyond CHS limit)
   299                              <1> 	; (Infact if extended partition starts at the beyond of CHS limit,
   300                              <1> 	;  it's partition ID must be 0Fh but they/somebodies had used 05h.)
   301                              <1> 	;cmp	al, 05h
   302                              <1> 	;je	short loc_hd_load_ep_05h
   303                              <1> loc_hd_load_ep_0Fh:
   304                              <1> 	; 04/01/2016
   305                              <1> 	;push	ecx
   306                              <1> 	; 15/07/2020
   307                              <1> 	;mov	ecx, [esi+ptStartSector] ; sector number
   308                              <1> 	;mov	ebx, MasterBootBuff ; buffer address
   309                              <1> 	; LBA read/write (with private LBA function) 
   310                              <1> 	;((Retro UNIX 386 v1 - DISK I/O code by Erdogan Tan))
   311                              <1> 	; dl = physical drive number (0,1, 80h, 81h, 82h, 83h)
   312                              <1> 	;mov	ah, 1Bh ; LBA read
   313                              <1> 	;mov	al, 1 ; sector count
   314 00007186 66B8011B            <1> 	mov	ax, 1B01h
   315 0000718A E82CDEFFFF          <1> 	call	int13h
   316                              <1> 	;pop	ecx
   317                              <1> 	;jnc	short loc_hd_move_ep_table
   318                              <1> 	; 15/07/2020
   319 0000718F 732E                <1> 	jnc	short loc_validate_hde_partition
   320                              <1> 
   321                              <1> continue_check_ep_next_disk:
   322                              <1> 	; 15/07/2020
   323                              <1> 	;pop	edi ; PTable_ep?
   324 00007191 5E                  <1> 	pop	esi ; **** ; PTable_hd?
   325 00007192 A0[20790100]        <1> 	mov	al, [HF_NUM] ; number of hard disks
   326 00007197 047F                <1> 	add	al, 7Fh
   327 00007199 3805[1B660000]      <1> 	cmp	[hdc], al
   328 0000719F 730B                <1> 	jnb	short loc_validating_hd_partitions_ok
   329 000071A1 83C640              <1> 	add	esi, 64
   330                              <1> 	; 15/07/2020
   331                              <1> 	;add	edi, 64
   332 000071A4 FE05[1B660000]      <1> 	inc	byte [hdc]
   333 000071AA EB89                <1> 	jmp	short next_hd_extd_partition
   334                              <1> 
   335                              <1> loc_validating_hd_partitions_ok:
   336                              <1> 	; 15/07/2020
   337                              <1> 	;mov	al, [Last_DOS_DiskNo]
   338                              <1> loc_drv_init_retn:
   339 000071AC C3                  <1> 	retn
   340                              <1> 	
   341                              <1> loc_hd_load_ep_05h:
   342                              <1> 	; 20/07/2020 ('diskio.s', int13h, cf = 1 -> bugfix)
   343                              <1> 	;clc    ; (Bug: int13h would not clear carry flag bit, 
   344                              <1> 	;	; even if there would not be an error)
   345                              <1> 	;	; ((Fix: now, int13h procedure clears carry flag
   346                              <1> 	;	;  at the entrance of it.. 20/07/2020))
   347                              <1> 	; 15/07/2020
   348                              <1> 	;push	ecx 
   349 000071AD 8A7601              <1> 	mov	dh, [esi+ptBeginHead]
   350 000071B0 668B4E02            <1>         mov     cx, [esi+ptBeginSector]
   351 000071B4 66B80102            <1> 	mov	ax, 0201h ; Read 1 sector
   352                              <1> 	;mov	ebx, MasterBootBuff
   353 000071B8 E8FEDDFFFF          <1> 	call	int13h ; 20/07/2020
   354                              <1> 		       ; 'diskio.s' modification, 'clc'
   355                              <1> 	;pop	ecx  
   356 000071BD 72D2                <1> 	jc	short continue_check_ep_next_disk
   357                              <1> 	; 15/07/2020
   358                              <1> 	;jmp	short loc_validate_hde_partition
   359                              <1> 
   360                              <1> 	; 15/07/2020
   361                              <1> ;loc_hd_move_ep_table:
   362                              <1> 	;;pop	edi
   363                              <1> 	;;push	edi  ; PTable_ep?
   364                              <1> 	;mov	edi, [esp]
   365                              <1>         ;mov	esi, PartitionTable ; Extended
   366                              <1> 	;mov	ebx, esi
   367                              <1> 	;;mov	ecx, 16
   368                              <1> 	;mov	cl, 16
   369                              <1>        	;rep	movsd
   370                              <1> 	;mov	esi, ebx
   371                              <1> ;loc_set_hde_sub_partition_count:
   372                              <1> 	;mov	byte [PP_Counter], 4
   373                              <1> 	;mov	byte [EP_Counter], 0
   374                              <1> 
   375                              <1> loc_validate_hde_partition:
   376                              <1> 	; 13/08/2020
   377                              <1> 	; 15/07/2020
   378                              <1> 	;mov	byte [PP_Counter], 4
   379 000071BF BE[087D0100]        <1> 	mov	esi, PartitionTable ; (in MasterBootBuff)
   380                              <1> 	; 13/08/2020
   381                              <1> 	;jmp	short get_minidisk_partition_entry
   382                              <1> 
   383                              <1> ;get_minidisk_partition_entry:
   384                              <1> ;	; 20/07/2020
   385                              <1> ;	cmp	byte [esi+ptFileSystemID], 0
   386                              <1> ;	ja	short loc_validate_minidisk_partition
   387                              <1> ;	; 13/08/2020
   388                              <1> ;	jmp	short continue_check_ep_next_disk
   389                              <1> 
   390                              <1> ;	; 11/08/2020
   391                              <1> ;get_minidisk_partition_entry_next:
   392                              <1> ;	; 13/08/2020
   393                              <1> ;	;dec 	byte [PP_Counter]
   394                              <1> ;	;jz	short continue_check_ep_next_disk
   395                              <1> ;	; 20/07/2020
   396                              <1> ;;get_minidisk_partition_entry_next:
   397                              <1> ;	; 13/08/2020
   398                              <1> ;	cmp	esi, PartitionTable+64 
   399                              <1> ;	jnb	short continue_check_ep_next_disk
   400                              <1> ;	
   401                              <1> ;	add 	esi, 16 ; 10h
   402                              <1> ;	;jmp	short get_minidisk_partition_entry
   403                              <1> 
   404                              <1> 	; 13/08/2020
   405                              <1> get_minidisk_partition_entry:
   406                              <1> 	; 20/07/2020
   407 000071C4 807E0400            <1> 	cmp	byte [esi+ptFileSystemID], 0
   408 000071C8 76C7                <1> 	jna	short continue_check_ep_next_disk ; 13/08/2020
   409                              <1> 
   410                              <1> loc_validate_minidisk_partition:
   411                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
   412                              <1> 	; 13/08/2020
   413                              <1> 	; 20/07/2020
   414                              <1> 	;push	esi ; *** ; Extended partition table offset
   415                              <1> 
   416                              <1> 	; 13/08/2020
   417 000071CA FE05[507E0100]      <1> 	inc	byte [EP_Counter] ; current (sub partition) index 
   418                              <1> 				  ; in current extended partition
   419 000071D0 BF[567E0100]        <1> 	mov	edi, EP_StartSector
   420                              <1> 
   421                              <1> 	; Input -> ESI = PartitionTable offset
   422                              <1> 	; DL = Hard disk drive number   
   423                              <1> 	; EDI = Extended partition start sector pointer
   424 000071D5 E86B000000          <1> 	call	validate_hd_fat_partition
   425                              <1> 	;pop	ecx ; *
   426 000071DA 7308                <1> 	jnc	short loc_set_valid_hde_partition_entry
   427                              <1> 			 ; jump down to deep !!!
   428                              <1> 
   429                              <1> 	;pop	esi ; *** ; Extended partition table offset
   430                              <1> 	; 13/08/2020
   431                              <1> 	;mov	esi, PartitionTable
   432                              <1> 
   433                              <1> 	; 11/08/2020
   434                              <1> 	; ESI = Extended partition table offset
   435 000071DC 8A15[1B660000]      <1> 	mov	dl, [hdc]
   436                              <1> 
   437                              <1> 	;; DL = Hard disk drive number
   438                              <1> 	;dec	byte [PP_Counter]
   439                              <1> 	;jz	short continue_check_ep_next_disk
   440                              <1> 	;add 	esi, 16 ; 10h
   441                              <1> 	;mov	dl, [hdc]
   442                              <1> 	;jmp	short get_minidisk_partition_entry
   443                              <1> 
   444                              <1> 	; 11/08/2020
   445                              <1> 	;jmp	short get_minidisk_partition_entry_next
   446                              <1> 
   447                              <1> 	; 23/08/2020
   448 000071E2 EB3E                <1> 	jmp	short validate_next_minidisk_partition_ok
   449                              <1> 
   450                              <1> 	; 17/07/2020
   451                              <1> 	;; jumping down to deep levels !!!
   452                              <1> 	; ((That is a pitty microsoft preferred ep table chain
   453                              <1> 	; instead of a single table as mbr partition table!?))
   454                              <1> 
   455                              <1> loc_set_valid_hde_partition_entry:
   456                              <1> 	; 15/07/2020
   457 000071E4 A0[1B660000]        <1> 	mov	al, [hdc] ; Hard disk drive number (>=80h)
   458 000071E9 88C2                <1> 	mov	dl, al ; mov dl, [hdc]
   459 000071EB 2C7F                <1> 	sub	al, 7Fh
   460                              <1> 		    ; 1 to 4	
   461 000071ED C0E002              <1> 	shl	al, 2 ; 4 to 16
   462 000071F0 2A05[4F7E0100]      <1> 	sub	al, [PP_Counter] ; al - (4 - partition index)
   463                              <1> 			; (disk number * 4) + partition index
   464                              <1> 	
   465                              <1> 	; AL = Partition entry/index, 0 based
   466                              <1>         ;  0 -> hd 0, Partition Table offset = 0
   467                              <1>         ; 15 -> hd 3, Partition Table offset = 3
   468                              <1> 
   469                              <1> 	;mov	ah, 4 ; Logical dos partition (>= 4)
   470                              <1> 	;add	ah, [EP_Counter]
   471                              <1> 		; Logical disk partition index = 4 to 7
   472                              <1> 		; (Primary disk partition index = 0 to 3)
   473                              <1> 
   474                              <1> 	; 13/08/2020
   475 000071F6 8A25[517E0100]      <1> 	mov	ah, [LD_Counter] ; Logical drive index number
   476                              <1> 				; (in current extended partition)
   477 000071FC 80C404              <1> 	add	ah, 4 ; 4 to 7
   478                              <1> 	
   479                              <1> 	; 15/07/2020
   480                              <1> 	; CX -> AX
   481                              <1> 	;; 06/01/2016 (TRDOS v2.0)
   482                              <1> 	;; BUGFIX *
   483                              <1> 	;;mov	[esi+LD_PartitionEntry], cl 
   484                              <1> 	;;mov	[esi+LD_DParamEntry], ch 
   485                              <1> 	;mov	[esi+LD_PartitionEntry], cx 
   486 000071FF 6689467C            <1> 	mov	[esi+LD_PartitionEntry], ax 	
   487                              <1> 
   488 00007203 8A0D[BC300100]      <1> 	mov	cl, [Last_DOS_DiskNo] 
   489 00007209 80C141              <1> 	add	cl, 'A'
   490 0000720C 880E                <1> 	mov	[esi+LD_Name], cl
   491                              <1> 
   492                              <1> 	; 17/07/2020
   493                              <1> 	;cmp	cl, 'Z'
   494                              <1> 	;jb	short logical_drive_count_ok_for_next
   495                              <1> 	;pop	esi ; ***
   496                              <1> 	;pop	esi ; ****
   497                              <1> 	;retn
   498                              <1> 
   499                              <1> ;logical_drive_count_ok_for_next:
   500                              <1> 
   501                              <1> 	;; 15/07/2020
   502                              <1> 	;inc	byte [EP_Counter]
   503                              <1> 	; 13/08/2020
   504 0000720E FE05[517E0100]      <1> 	inc	byte [LD_Counter]	
   505                              <1> 
   506                              <1> 	;mov	dl, [hdc]
   507                              <1> 
   508                              <1> 	; 17/07/2020
   509                              <1> 	;; Now, 
   510                              <1> 	;; we are swimming in deep of an extended partition !!!
   511                              <1> 	; (! sub or chained extended partition tables !)
   512                              <1> 	; ((Logical dos partitions in extended partition were called
   513                              <1> 	;  as 'mini disk partition' in msdos 6.0 source code.))
   514                              <1> 
   515                              <1> validate_next_minidisk_partition:
   516                              <1> 	; 13/08/2020
   517                              <1> 	;pop	esi ; *** ; Extended partition table offset
   518                              <1> 
   519                              <1> 	; 17/07/2020
   520                              <1> 	;cmp	byte [EP_Counter], 4
   521                              <1> 	; 13/08/2020
   522 00007214 803D[517E0100]04    <1> 	cmp	byte [LD_Counter], 4 ; maximum 4 logical disks
   523                              <1> 				     ; per extended partition
   524                              <1> 	;jnb	continue_check_ep_next_disk
   525                              <1> 	; 25/07/2022
   526 0000721B 7205                <1> 	jb	short validate_next_minidisk_partition_ok
   527 0000721D E96FFFFFFF          <1> 	jmp	continue_check_ep_next_disk	
   528                              <1> 
   529                              <1> validate_next_minidisk_partition_ok:
   530                              <1> 	; 13/08/2020
   531                              <1> 	;dec	byte [PP_Counter] ; 4 --> 0
   532                              <1> 	;jz	continue_check_ep_next_disk
   533                              <1> 	
   534                              <1> 	;cmp	esi, PartitionTable+64 
   535                              <1> 	;jnb	continue_check_ep_next_disk
   536                              <1> 
   537                              <1> 	;add	esi, 16
   538                              <1> 	; 13/08/2020
   539 00007222 BE[187D0100]        <1> 	mov	esi, PartitionTable+16
   540                              <1> 
   541                              <1> 	; 20/07/2020
   542 00007227 8A4604              <1> 	mov	al, [esi+ptFileSystemID]
   543                              <1> 
   544                              <1> 	; 20/07/2020
   545 0000722A 3C05                <1> 	cmp	al, 05h ; Is it an extended dos partition ?
   546 0000722C 7409                <1> 	je	short loc_minidisk_next_ep_lba_chs ; 17/07/2020
   547 0000722E 3C0F                <1> 	cmp	al, 0Fh ; Is it an extended win4 (LBA mode) partition ?
   548                              <1> 	;jne	continue_check_ep_next_disk ; AL must be 0 here
   549                              <1> 					; (when it is not 05h or 0Fh)
   550                              <1> 					; If AL is not ZERO -> EP Bug!
   551                              <1> 					; (!Microsoft DOS convention!)
   552                              <1> 	; 25/07/2022
   553 00007230 7405                <1> 	je	short loc_minidisk_next_ep_lba_chs
   554 00007232 E95AFFFFFF          <1> 	jmp	continue_check_ep_next_disk	
   555                              <1> 
   556                              <1> loc_minidisk_next_ep_lba_chs:
   557                              <1> 	; 17/07/2020
   558 00007237 8B4E08              <1> 	mov	ecx, [esi+ptStartSector] ; relative start sector number
   559                              <1> 	;add	ecx, [EP_StartSector]
   560                              <1> 	; 30/08/2020	
   561 0000723A 030D[527E0100]      <1> 	add	ecx, [MBR_EP_StartSector] 
   562                              <1> 	; 20/07/2020
   563 00007240 E928FFFFFF          <1> 	jmp	loc_validate_hde_partition_next
   564                              <1> 
   565                              <1> validate_hd_fat_partition:
   566                              <1> 	; 17/07/2020
   567                              <1> 	; 15/07/2020
   568                              <1> 	;	(optimization)
   569                              <1> 	; 14/07/2020
   570                              <1> 	;	(fat16 -big- partition search bugfix)
   571                              <1> 	; 27/12/2017
   572                              <1> 	; 12/02/2016
   573                              <1> 	; 07/01/2016 (TRDOS 386 = TRDOS v2.0)
   574                              <1> 	; 07/08/2011
   575                              <1> 	; 23/07/2011
   576                              <1> 	; Input
   577                              <1> 	;   DL = Hard/Fixed Disk Drive Number
   578                              <1> 	;   ESI = PartitionTable offset
   579                              <1> 	;   EDI = Extend. Part. Start Sector Pointer
   580                              <1> 	;   EDI = 0 -> Primary Partition 
   581                              <1> 	;   byte [Last_DOS_DiskNo]
   582                              <1>  	; Output
   583                              <1> 	;  cf=0 -> Validated
   584                              <1> 	;   ESI = Logical dos drv desc. table
   585                              <1> 	;   EBX = FAT boot sector buffer
   586                              <1> 	;   byte [Last_DOS_DiskNo]
   587                              <1> 	;  cf=1 -> Not a valid FAT partition
   588                              <1> 	; EAX, EDX, ECX, EDI -> changed 
   589                              <1> 	
   590                              <1> 	;mov 	esi, PartitionTable
   591 00007245 8A6604              <1> 	mov 	ah, [esi+ptFileSystemID]
   592 00007248 B002                <1> 	mov	al, 2 ; 27/12/2017
   593 0000724A 80FC06              <1> 	cmp 	ah, 06h ; FAT16 CHS partition (>=32MB)
   594                              <1> 	; 12/02/2016
   595                              <1> 	;;jb	short loc_not_a_valid_fat_partition2
   596                              <1>  	;jnb	short vhdp_FAT16_32
   597                              <1> 	; 14/07/2020 (BugFix)
   598 0000724D 7711                <1> 	ja	short vhdp_FAT16_32
   599 0000724F 7425                <1> 	je	short loc_set_valid_hd_partition_params
   600                              <1> 
   601                              <1> vhdp_FAT12_16:
   602                              <1> 	; 27/12/2017
   603 00007251 FEC8                <1> 	dec	al ; mov al, 1
   604 00007253 38C4                <1> 	cmp	ah, al ; 1 ; FAT12 partition
   605 00007255 741F                <1> 	je	short loc_set_valid_hd_partition_params
   606                              <1> 	;
   607 00007257 FEC0                <1> 	inc	al ; mov al, 2
   608 00007259 80FC04              <1> 	cmp	ah, 04h ; FAT16 CHS partition (< 32MB)
   609 0000725C 7418                <1> 	je	short loc_set_valid_hd_partition_params
   610                              <1> 	
   611                              <1> 	; 15/07/2020
   612                              <1> 	; (ah = 05h, 02h or 03h)
   613                              <1> loc_not_a_valid_fat_partition1:
   614 0000725E F9                  <1> 	stc
   615                              <1> 	; cf=1
   616 0000725F C3                  <1> 	retn
   617                              <1> 
   618                              <1> vhdp_FAT16_32:
   619                              <1> 	; 15/07/2020
   620                              <1> 	;mov	al, 3
   621 00007260 FEC0                <1> 	inc	al
   622 00007262 80FC0C              <1> 	cmp	ah, 0Ch ; FAT32 LBA partition
   623 00007265 740F                <1> 	je	short loc_set_valid_hd_partition_params
   624 00007267 7706                <1> 	ja	short vhdp_check_FAT16_lba
   625                              <1> 
   626                              <1> vhdp_check_FAT32_chs:
   627 00007269 80FC0B              <1> 	cmp	ah, 0Bh ; FAT32 CHS partition 
   628 0000726C 7408                <1> 	je	short loc_set_valid_hd_partition_params
   629                              <1> 	;jne	short loc_not_a_valid_fat_partition1
   630                              <1> 
   631                              <1> 	;stc
   632                              <1> loc_not_a_valid_fat_partition2:
   633 0000726E C3                  <1> 	retn
   634                              <1> 
   635                              <1> vhdp_check_FAT16_lba:
   636 0000726F 80FC0E              <1> 	cmp	ah, 0Eh ; FAT16 LBA partition
   637 00007272 75EA                <1> 	jne	short loc_not_a_valid_fat_partition1
   638                              <1> 
   639                              <1> 	;mov	al, 2
   640 00007274 FEC8                <1> 	dec	al
   641                              <1> 
   642                              <1> loc_set_valid_hd_partition_params:
   643                              <1> 	; 30/07/2022
   644                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
   645                              <1> 	; 15/07/2020
   646                              <1> 	;inc 	byte [Last_DOS_DiskNo] ; > 1
   647                              <1> 	;
   648 00007276 31DB                <1> 	xor	ebx, ebx
   649 00007278 8A3D[BC300100]      <1> 	mov	bh, [Last_DOS_DiskNo] ; * 256	
   650 0000727E FEC7                <1> 	inc	bh ; 15/07/2020
   651 00007280 81C300010900        <1> 	add	ebx, Logical_DOSDisks
   652                              <1> 	;
   653 00007286 C6430102            <1> 	mov	byte [ebx+LD_DiskType], 2
   654 0000728A 885302              <1> 	mov	byte [ebx+LD_PhyDrvNo], dl
   655                              <1> 	;mov	byte [ebx+LD_FATType], al ; 2 or 3
   656                              <1> 	;mov	byte [ebx+LD_FSType], ah ; 06h, 0Eh, 0Bh, 0Ch
   657 0000728D 66894303            <1> 	mov	word [ebx+LD_FATType], ax
   658                              <1> 	;
   659 00007291 8B4E08              <1> 	mov	ecx, [esi+ptStartSector]
   660 00007294 09FF                <1> 	or	edi, edi 
   661 00007296 7402                <1> 	jz	short pass_hd_FAT_ep_start_sector_adding
   662                              <1> loc_add_hd_FAT_ep_start_sector:
   663                              <1> 	; 17/07/2020
   664 00007298 030F                <1> 	add	ecx, [edi]
   665                              <1> pass_hd_FAT_ep_start_sector_adding:
   666 0000729A 894B6C              <1> 	mov	[ebx+LD_StartSector], ecx
   667                              <1> loc_hd_FAT_logical_drv_init:
   668 0000729D 89DD                <1> 	mov	ebp, ebx
   669                              <1> 	;mov	dl, [ebx+LD_PhyDrvNo]
   670 0000729F A0[4A7E0100]        <1> 	mov	al, [HD_LBA_yes] ; 07/01/2016
   671 000072A4 884305              <1> 	mov	[ebx+LD_LBAYes], al
   672 000072A7 BB[5A7E0100]        <1> 	mov	ebx, DOSBootSectorBuff ; buffer address
   673 000072AC 08C0                <1> 	or	al, al
   674 000072AE 740C                <1> 	jz	short loc_hd_FAT_drv_init_load_bs_chs
   675                              <1> loc_hd_FAT_drv_init_load_bs_lba:
   676                              <1> 	; DL = Physical drive number
   677                              <1>    	;mov	ecx, [esi+ptStartSector] ; sector number
   678                              <1> 	;mov	ebx, DOSBootSectorBuff ; buffer address
   679                              <1> 	; LBA read/write (with private LBA function) 
   680                              <1> 	;((Retro UNIX 386 v1 - DISK I/O code by Erdogan Tan))
   681                              <1> 	; dl = physical drive number (0,1, 80h, 81h, 82h, 83h)
   682 000072B0 B41B                <1> 	mov	ah, 1Bh ; LBA read
   683 000072B2 B001                <1> 	mov	al, 1 ; sector count
   684 000072B4 E802DDFFFF          <1> 	call	int13h
   685 000072B9 7313                <1> 	jnc	short loc_hd_drv_FAT_boot_validation
   686                              <1> loc_not_a_valid_fat_partition3:
   687 000072BB C3                  <1> 	retn
   688                              <1> loc_hd_FAT_drv_init_load_bs_chs:
   689 000072BC 8A7601              <1> 	mov	dh, [esi+ptBeginHead]
   690 000072BF 668B4E02            <1> 	mov	cx, [esi+ptBeginSector]
   691 000072C3 66B80102            <1> 	mov	ax, 0201h ; Read 1 sector
   692                              <1> 	;mov	ebx, DOSBootSectorBuff
   693 000072C7 E8EFDCFFFF          <1> 	call	int13h
   694 000072CC 72ED                <1> 	jc	short loc_not_a_valid_fat_partition3
   695                              <1> loc_hd_drv_FAT_boot_validation:
   696                              <1> 	;mov	esi, DOSBootSectorBuff
   697 000072CE 89DE                <1> 	mov	esi, ebx
   698 000072D0 6681BEFE01000055AA  <1> 	cmp	word [esi+BS_Validation], 0AA55h
   699 000072D9 7514                <1> 	jne	short loc_not_a_valid_fat_partition4
   700 000072DB 807E15F8            <1> 	cmp	byte [esi+BPB_Media], 0F8h
   701 000072DF 750E                <1> 	jne	short loc_not_a_valid_fat_partition4
   702                              <1> 
   703                              <1> 	; 25/07/2022
   704 000072E1 31C9                <1> 	xor	ecx, ecx
   705                              <1> 
   706                              <1> 	; 27/12/2017
   707 000072E3 807D0303            <1> 	cmp	byte [ebp+LD_FATType], 3
   708 000072E7 7508                <1> 	jne	short loc_hd_FAT16_BPB
   709                              <1> 
   710                              <1> loc_hd_drv_FAT32_boot_validation:
   711 000072E9 807E4229            <1> 	cmp	byte [esi+BS_FAT32_BootSig], 29h
   712 000072ED 7413                <1> 	je	short loc_hd_FAT32_BPB
   713                              <1> 
   714                              <1> loc_not_a_valid_fat_partition4:
   715 000072EF F9                  <1> 	stc
   716 000072F0 C3                  <1> 	retn
   717                              <1> 
   718                              <1> loc_hd_FAT16_BPB:
   719 000072F1 807E2629            <1> 	cmp	byte [esi+BS_BootSig], 29h
   720 000072F5 75F8                <1> 	jne	short loc_not_a_valid_fat_partition4
   721                              <1> 
   722 000072F7 66837E1600          <1> 	cmp	word [esi+BPB_FATSz16], 0
   723 000072FC 7604                <1> 	jna	short loc_hd_big_FAT16_BPB
   724                              <1> 	;mov	ecx, 32
   725                              <1> 	; 25/07/2022
   726 000072FE B120                <1> 	mov	cl, 32
   727                              <1> 	; ecx = 32
   728 00007300 EB02                <1> 	jmp	short loc_hd_move_FAT_BPB
   729                              <1> 
   730                              <1> loc_hd_FAT32_BPB:
   731                              <1> 	;cmp	word [esi+BPB_FATSz16], 0
   732                              <1> 	;ja	short loc_not_a_valid_fat_partition4
   733                              <1> loc_hd_big_FAT16_BPB:
   734                              <1> 	;mov	ecx, 45
   735                              <1> 	; 25/07/2022
   736 00007302 B12D                <1> 	mov	cl, 45
   737                              <1> 	; ecx = 45
   738                              <1> loc_hd_move_FAT_BPB:
   739 00007304 89EF                <1> 	mov 	edi, ebp
   740                              <1> 	;mov	esi, ebx ; Boot sector
   741 00007306 57                  <1> 	push	edi
   742 00007307 83C706              <1> 	add	edi, LD_BPB
   743 0000730A F366A5              <1> 	rep	movsw 
   744 0000730D 5E                  <1> 	pop	esi
   745 0000730E 0FB74614            <1> 	movzx	eax, word [esi+LD_BPB+BPB_RsvdSecCnt]
   746 00007312 03466C              <1> 	add	eax, [esi+LD_StartSector]
   747 00007315 894660              <1> 	mov	[esi+LD_FATBegin], eax
   748 00007318 807E0303            <1> 	cmp	byte [esi+LD_FATType], 3
   749 0000731C 7223                <1> 	jb	short loc_set_FAT16_RootDirLoc
   750                              <1> loc_set_FAT32_RootDirLoc:
   751 0000731E 8B462A              <1> 	mov	eax, [esi+LD_BPB+BPB_FATSz32]
   752 00007321 0FB65E16            <1>         movzx	ebx, byte [esi+LD_BPB+BPB_NumFATs]
   753 00007325 F7E3                <1> 	mul	ebx
   754 00007327 034660              <1> 	add	eax, [esi+LD_FATBegin]
   755                              <1> loc_set_FAT32_data_begin:
   756 0000732A 894668              <1> 	mov	[esi+LD_DATABegin], eax
   757 0000732D 894664              <1> 	mov	[esi+LD_ROOTBegin], eax
   758                              <1> 	; If Root Directory Cluster <> 2 then
   759                              <1> 	; change the beginning sector value 
   760                              <1> 	; of the root dir by adding sector offset.
   761 00007330 8B4632              <1> 	mov	eax, [esi+LD_BPB+BPB_RootClus]
   762                              <1> 	;sub	eax, 2
   763                              <1> 	; 30/07/2022
   764 00007333 48                  <1> 	dec	eax ; 2 -> 1
   765 00007334 48                  <1> 	dec	eax ; 1 -> 0
   766 00007335 7433                <1> 	jz	short short loc_set_32bit_FAT_total_sectors  
   767                              <1> 	;movzx	ebx, byte [esi+LD_BPB+BPB_SecPerClust]
   768 00007337 8A5E13              <1> 	mov	bl, [esi+LD_BPB+BPB_SecPerClust] 
   769 0000733A F7E3                <1> 	mul	ebx
   770 0000733C 014664              <1> 	add	[esi+LD_ROOTBegin], eax
   771 0000733F EB29                <1> 	jmp	short loc_set_32bit_FAT_total_sectors
   772                              <1> 	;
   773                              <1> loc_set_FAT16_RootDirLoc:
   774 00007341 0FB64616            <1> 	movzx	eax, byte [esi+LD_BPB+BPB_NumFATs]
   775 00007345 0FB7561C            <1> 	movzx	edx, word [esi+LD_BPB+BPB_FATSz16]
   776 00007349 F7E2                <1> 	mul	edx
   777 0000734B 034660              <1> 	add	eax, [esi+LD_FATBegin]
   778 0000734E 894664              <1> 	mov	[esi+LD_ROOTBegin], eax
   779                              <1> loc_set_FAT16_data_begin:
   780 00007351 894668              <1> 	mov	[esi+LD_DATABegin], eax 
   781                              <1> 	;mov	eax, 20h  ; Size of a directory entry
   782                              <1> 	;;movzx	edx, word [esi+LD_BPB+BPB_RootEntCnt]
   783                              <1>         ;mov	dx, [esi+LD_BPB+BPB_RootEntCnt]
   784                              <1>         ;mul	edx
   785                              <1> 	;;mov	ecx, 511
   786                              <1> 	;mov	cx, 511
   787                              <1> 	;add	eax, ecx
   788                              <1> 	;inc	ecx ; 512
   789                              <1> 	;div	ecx
   790                              <1> 	; 14/07/2020
   791 00007354 0FB74617            <1> 	movzx	eax, word [esi+LD_BPB+BPB_RootEntCnt]
   792 00007358 6683C00F            <1> 	add	ax, 15
   793                              <1> 	;shr	ax, 4 ; / 16 ; (16 entries per sector)
   794                              <1> 	; 25/07/2022
   795 0000735C C1E804              <1> 	shr	eax, 4
   796 0000735F 014668              <1> 	add	[esi+LD_DATABegin], eax
   797                              <1> 	;movzx	eax, word [esi+LD_BPB+BPB_TotalSec16]
   798 00007362 668B4619            <1> 	mov	ax, [esi+LD_BPB+BPB_TotalSec16]
   799                              <1> 	;test	ax, ax
   800                              <1> 	; 25/07/2022
   801 00007366 85C0                <1> 	test	eax, eax
   802                              <1> 	;jz	short loc_set_32bit_FAT_total_sectors
   803                              <1> ;loc_set_16bit_FAT_total_sectors:
   804                              <1> 	;mov	[esi+LD_TotalSectors], eax
   805                              <1> 	;jmp	short loc_set_hd_FAT_cluster_count
   806                              <1> 	; 14/07/2020
   807 00007368 7503                <1> 	jnz	short loc_set_hd_FAT_cluster_count
   808                              <1> loc_set_32bit_FAT_total_sectors:
   809 0000736A 8B4626              <1> 	mov	eax, [esi+LD_BPB+BPB_TotalSec32]
   810                              <1> 	;mov	[esi+LD_TotalSectors], eax
   811                              <1> loc_set_hd_FAT_cluster_count:
   812 0000736D 894670              <1> 	mov	[esi+LD_TotalSectors], eax ; 14/07/2020
   813 00007370 8B5668              <1> 	mov	edx, [esi+LD_DATABegin]
   814 00007373 2B566C              <1> 	sub	edx, [esi+LD_StartSector]
   815 00007376 29D0                <1> 	sub	eax, edx
   816 00007378 31D2                <1> 	xor	edx, edx ; 0
   817 0000737A 0FB64E13            <1>         movzx   ecx, byte [esi+LD_BPB+BPB_SecPerClust]
   818 0000737E F7F1                <1>         div	ecx 
   819 00007380 894678              <1> 	mov	[esi+LD_Clusters], eax
   820                              <1> 	; Maximum Valid Cluster Number= EAX +1
   821                              <1> 	; with 2 reserved clusters= EAX +2
   822                              <1> loc_set_hd_FAT_fs_free_sectors:
   823                              <1> 	;mov	dword [esi+LD_FreeSectors], 0
   824 00007383 E852010000          <1> 	call	get_free_FAT_sectors
   825 00007388 720D                <1> 	jc	short loc_validate_hd_FAT_partition_retn
   826 0000738A 894674              <1> 	mov	[esi+LD_FreeSectors], eax
   827 0000738D C6467E06            <1> 	mov	byte [esi+LD_MediaChanged], 6  ; Volume Name Reset
   828                              <1> 
   829                              <1> 	; 15/07/2020
   830 00007391 FE05[BC300100]      <1> 	inc 	byte [Last_DOS_DiskNo] ; > 1
   831                              <1> 
   832                              <1> 	;mov	cl, [Last_DOS_DiskNo] 
   833                              <1> 	;add	cl, 'A'
   834                              <1> 	;mov	[esi+LD_FS_Name], cl
   835                              <1> 
   836                              <1> loc_validate_hd_FAT_partition_retn:         
   837 00007397 C3                  <1> 	retn
   838                              <1> 
   839                              <1> validate_hd_fs_partition:
   840                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
   841                              <1> 	; 03/02/2018
   842                              <1> 	; 09/12/2017
   843                              <1> 	; 13/02/2016
   844                              <1> 	; 10/01/2016 (TRDOS 386 = TRDOS v2.0)
   845                              <1> 	; 29/01/2011
   846                              <1> 	; 23/07/2011
   847                              <1> 	; Input
   848                              <1> 	;   DL = Hard/Fixed Disk Drive Number
   849                              <1> 	;   ESI = PartitionTable offset
   850                              <1> 	;   byte [Last_DOS_DiskNo]
   851                              <1> 	; Output
   852                              <1> 	;  cf=0 -> Validated
   853                              <1> 	;   ESI = Logical dos drv desc. table
   854                              <1> 	;   EBX = Singlix FS boot sector buffer
   855                              <1> 	;   byte [Last_DOS_DiskNo]
   856                              <1> 	;  cf=1 -> Not a valid 'Singlix FS' partition
   857                              <1> 	; EAX, EDX, ECX, EDI -> changed 
   858                              <1> 
   859                              <1> 	;mov	esi, PartitionTable
   860 00007398 8A6604              <1> 	mov	ah, [esi+ptFileSystemID]
   861 0000739B 80FCA1              <1> 	cmp	ah, 0A1h ; SINGLIX FS1 (trfs1) partition
   862 0000739E 7549                <1> 	jne	short loc_validate_hd_fs_partition_stc_retn
   863                              <1> loc_set_valid_hd_fs_partition_params:
   864 000073A0 FE05[BC300100]      <1> 	inc	byte [Last_DOS_DiskNo] ; > 1
   865 000073A6 30C0                <1> 	xor	al, al ; mov al, 0
   866                              <1> 	;mov	[drv], dl
   867 000073A8 29DB                <1> 	sub	ebx, ebx ; 0
   868 000073AA 8A3D[BC300100]      <1> 	mov	bh, [Last_DOS_DiskNo] 
   869 000073B0 81C300010900        <1> 	add	ebx, Logical_DOSDisks
   870 000073B6 C6430102            <1> 	mov	byte [ebx+LD_DiskType], 2
   871 000073BA 885302              <1> 	mov	[ebx+LD_PhyDrvNo], dl
   872                              <1> 	;mov	[ebx+LD_FATType], al ; 0
   873                              <1> 	;mov	[ebx+LD_FSType], ah
   874 000073BD 66894303            <1> 	mov	[ebx+LD_FATType], ax
   875                              <1> 	;mov	eax, [esi+ptStartSector]
   876                              <1> 	;mov	[ebx+LD_StartSector], eax
   877                              <1> loc_hd_fs_logical_drv_init:
   878 000073C1 89DD                <1> 	mov	ebp, ebx ; 10/01/2016
   879                              <1> 	;mov	dl, [ebx+LD_PhyDrvNo]
   880 000073C3 A0[4A7E0100]        <1> 	mov	al, [HD_LBA_yes] ; 10/01/2016
   881 000073C8 884305              <1> 	mov	[ebx+LD_LBAYes], al
   882 000073CB 89DE                <1> 	mov	esi, ebx
   883 000073CD BB[5A7E0100]        <1> 	mov	ebx, DOSBootSectorBuff ; buffer address
   884 000073D2 08C0                <1> 	or	al, al
   885 000073D4 7515                <1> 	jnz	short loc_hd_fs_drv_init_load_bs_lba
   886                              <1> loc_hd_fs_drv_init_load_bs_chs:
   887 000073D6 8A7601              <1> 	mov	dh, [esi+ptBeginHead]
   888 000073D9 668B4E02            <1> 	mov	cx, [esi+ptBeginSector]
   889 000073DD 66B80102            <1> 	mov	ax, 0201h ; Read 1 sector
   890                              <1> 	;mov	ebx, DOSBootSectorBuff
   891 000073E1 E8D5DBFFFF          <1> 	call	int13h
   892 000073E6 7311                <1> 	jnc	short loc_hd_drv_fs_boot_validation
   893                              <1> loc_validate_hd_fs_partition_err_retn:
   894 000073E8 C3                  <1> 	retn
   895                              <1> loc_validate_hd_fs_partition_stc_retn:
   896 000073E9 F9                  <1> 	stc
   897 000073EA C3                  <1> 	retn
   898                              <1> loc_hd_fs_drv_init_load_bs_lba:
   899                              <1> 	; DL = Physical drive number
   900                              <1> 	;mov	esi, ebx
   901 000073EB 8B4E08              <1>    	mov	ecx, [esi+ptStartSector] ; sector number
   902                              <1> 	;mov	ebx, DOSBootSectorBuff ; buffer address
   903                              <1> 	; LBA read/write (with private LBA function) 
   904                              <1> 	;((Retro UNIX 386 v1 - DISK I/O code by Erdogan Tan))
   905                              <1> 	; dl = physical drive number (0,1, 80h, 81h, 82h, 83h)
   906 000073EE B41B                <1> 	mov	ah, 1Bh ; LBA read
   907 000073F0 B001                <1> 	mov	al, 1 ; sector count
   908 000073F2 E8C4DBFFFF          <1> 	call	int13h
   909 000073F7 72EF                <1> 	jc	short loc_validate_hd_fs_partition_err_retn
   910                              <1> loc_hd_drv_fs_boot_validation:
   911                              <1> 	;mov	esi, DOSBootSectorBuff
   912 000073F9 89DE                <1> 	mov	esi, ebx ; Boot sector buffer
   913 000073FB 6681BEFE01000055AA  <1> 	cmp	word [esi+BS_Validation], 0AA55h
   914 00007404 75E3                <1> 	jne	short loc_validate_hd_fs_partition_stc_retn
   915                              <1>         ;
   916                              <1> 	;Singlix FS Extensions to TR-DOS (7/6/2009) 
   917 00007406 66817E034653        <1> 	cmp	word [esi+bs_FS_Identifier], 'FS' ; 03/02/2018
   918 0000740C 75DB                <1> 	jne	short loc_validate_hd_fs_partition_stc_retn
   919                              <1>         ;'A1h' check is not necessary
   920                              <1> 	;  if 'FS' check is passed as OK/Yes.
   921 0000740E 807E09A1            <1> 	cmp	byte [esi+bs_FS_PartitionID], 0A1h
   922 00007412 75D5                <1> 	jne	short loc_validate_hd_fs_partition_stc_retn
   923                              <1> 	;
   924 00007414 89EF                <1> 	mov	edi, ebp ; 10/01/2016
   925                              <1> 	;
   926 00007416 8A462D              <1> 	mov	al, byte [esi+bs_FS_LBA_Ready]
   927 00007419 884705              <1> 	mov	[edi+LD_FS_LBAYes], al
   928                              <1> 	;
   929                              <1> 	; 03/01/2010 CHS -> DOS FAT/BPB compatibility fix
   930 0000741C 8A4608              <1> 	mov	al, [esi+bs_FS_MediaAttrib]
   931 0000741F 884706              <1> 	mov	byte [edi+LD_FS_MediaAttrib], al
   932                              <1> 	;
   933 00007422 8A460A              <1> 	mov	al, [esi+bs_FS_VersionMaj]
   934 00007425 884707              <1> 	mov	[edi+LD_FS_VersionMajor], al
   935                              <1> 	;
   936 00007428 668B4606            <1> 	mov	ax, [esi+bs_FS_BytesPerSec]
   937 0000742C 66894711            <1> 	mov	[edi+LD_FS_BytesPerSec], ax
   938 00007430 8A462E              <1> 	mov	al, [esi+bs_FS_SecPerTrack]
   939 00007433 30E4                <1> 	xor	ah, ah ; 09/12/2017
   940 00007435 6689471E            <1> 	mov	[edi+LD_FS_SecPerTrack], ax
   941 00007439 8A462F              <1> 	mov	al, [esi+bs_FS_Heads]
   942 0000743C 66894720            <1> 	mov	[edi+LD_FS_NumHeads], ax
   943                              <1> 	;
   944 00007440 8B4628              <1> 	mov	eax, [esi+bs_FS_UnDelDirD]
   945 00007443 894722              <1> 	mov	[edi+LD_FS_UnDelDirD], eax
   946 00007446 8B5618              <1> 	mov	edx, [esi+bs_FS_MATLocation]
   947 00007449 89570C              <1> 	mov	[edi+LD_FS_MATLocation], edx
   948 0000744C 8B461C              <1> 	mov	eax, [esi+bs_FS_RootDirD]
   949 0000744F 894708              <1> 	mov	[edi+LD_FS_RootDirD], eax
   950 00007452 8B460C              <1> 	mov	eax, [esi+bs_FS_BeginSector]
   951 00007455 89476C              <1> 	mov	[edi+LD_FS_BeginSector], eax
   952 00007458 8B4710              <1> 	mov	eax, [edi+bs_FS_VolumeSize]
   953 0000745B 894770              <1> 	mov	[edi+LD_FS_VolumeSize], eax
   954                              <1> 	;
   955 0000745E 89D0                <1> 	mov	eax, edx ; [edi+LD_FS_MATLocation]
   956 00007460 03476C              <1> 	add	eax, [edi+LD_FS_BeginSector]
   957 00007463 89FE                <1> 	mov	esi, edi
   958                              <1> mread_hd_fs_MAT_sector:
   959                              <1>         ;mov	ebx, DOSBootSectorBuff
   960                              <1> 	;mov	ecx, 1
   961                              <1> 	; 25/07/2022
   962 00007465 29C9                <1> 	sub	ecx, ecx
   963 00007467 FEC1                <1> 	inc	cl
   964                              <1> 	; ecx = 1	
   965 00007469 E81FAA0000          <1> 	call	disk_read
   966 0000746E 7248                <1> 	jc	short loc_validate_hd_fs_partition_retn
   967                              <1> 	; EDI will not be changed
   968 00007470 89DE                <1> 	mov	esi, ebx
   969                              <1> use_hdfs_mat_sector_params:
   970 00007472 8B460C              <1> 	mov	eax, [esi+FS_MAT_DATLocation]
   971 00007475 894714              <1> 	mov	[edi+LD_FS_DATLocation], eax
   972 00007478 8B4610              <1> 	mov	eax, [esi+FS_MAT_DATScount]
   973 0000747B 894718              <1> 	mov	[edi+LD_FS_DATSectors], eax
   974 0000747E 8B4614              <1> 	mov	eax, [esi+FS_MAT_FreeSectors]
   975 00007481 894774              <1>         mov     [edi+LD_FS_FreeSectors], eax
   976 00007484 8B4618              <1> 	mov	eax, [esi+FS_MAT_FirstFreeSector]
   977 00007487 894778              <1> 	mov	[edi+LD_FS_FirstFreeSector], eax
   978 0000748A 8B4708              <1> 	mov	eax, [edi+LD_FS_RootDirD]
   979 0000748D 03476C              <1> 	add	eax, [edi+LD_FS_BeginSector]
   980 00007490 89FE                <1> 	mov	esi, edi   
   981                              <1> read_hd_fs_RDT_sector:
   982 00007492 BB[5A7E0100]        <1> 	mov	ebx, DOSBootSectorBuff
   983                              <1> 	;mov	ecx, 1
   984 00007497 B101                <1> 	mov	cl, 1
   985 00007499 E8EFA90000          <1> 	call	disk_read
   986 0000749E 7218                <1> 	jc	short loc_validate_hd_fs_partition_retn
   987                              <1> 	; EDI will not be changed
   988 000074A0 89DE                <1> 	mov	esi, ebx
   989                              <1> use_hdfs_RDT_sector_params:
   990 000074A2 8B461C              <1> 	mov	eax, [esi+FS_RDT_VolumeSerialNo]
   991 000074A5 894728              <1> 	mov	[edi+LD_FS_VolumeSerial], eax
   992 000074A8 57                  <1> 	push	edi
   993                              <1> 	;mov	ecx, 16
   994 000074A9 B110                <1> 	mov	cl, 16
   995 000074AB 83C640              <1> 	add	esi, FS_RDT_VolumeName
   996 000074AE 83C72C              <1> 	add	edi, LD_FS_VolumeName
   997 000074B1 F3A5                <1> 	rep	movsd ; 64 bytes
   998 000074B3 5E                  <1> 	pop	esi
   999                              <1> 		; Volume Name Reset
  1000 000074B4 C6467E06            <1>         mov     byte [esi+LD_FS_MediaChanged], 6
  1001                              <1> 	;
  1002                              <1>         ;mov	cl, [Last_DOS_DiskNo] 
  1003                              <1> 	;add	cl, 'A'
  1004                              <1> 	;mov	[esi+LD_FS_Name], cl
  1005                              <1> 
  1006                              <1> loc_validate_hd_fs_partition_retn:
  1007 000074B8 C3                  <1> 	retn
  1008                              <1> 
  1009                              <1> load_masterboot:
  1010                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
  1011                              <1> 	; 14/07/2020 (Reset function has been removed)
  1012                              <1> 	;
  1013                              <1> 	; 10/01/2016 (TRDOS 386 = TRDOS v2.0)
  1014                              <1> 	; 2005 - 2011
  1015                              <1> 	; input -> DL = drive number
  1016                              <1> ;	mov	ah, 0Dh ; Alternate disk reset
  1017                              <1> ;	call	int13h
  1018                              <1> ;	jnc	short pass_reset_error
  1019                              <1> ;harddisk_error:
  1020                              <1> ;  	retn
  1021                              <1> ;pass_reset_error:
  1022 000074B9 BB[4A7B0100]        <1> 	mov	ebx, MasterBootBuff
  1023                              <1> 	;mov	ax, 0201h
  1024                              <1> 	;mov	cx, 1
  1025                              <1> 	; 25/07/2022
  1026                              <1> 	;xor	ecx, ecx
  1027                              <1> 	;inc	cl
  1028 000074BE B101                <1> 	mov	cl, 1
  1029                              <1> 	; ecx = 1
  1030 000074C0 89C8                <1> 	mov	eax, ecx ; ch = cylinder = 0
  1031 000074C2 B402                <1> 	mov	ah, 2  ; chs read
  1032                              <1> 	; eax = 0201h
  1033 000074C4 30F6                <1> 	xor	dh, dh ; head = 0
  1034 000074C6 E8F0DAFFFF          <1> 	call	int13h
  1035 000074CB 720C                <1> 	jc	short harddisk_error
  1036                              <1> 	;
  1037 000074CD 66813D[487D0100]55- <1> 	cmp	word [MBIDCode], 0AA55h
  1037 000074D5 AA                  <1>
  1038 000074D6 7401                <1> 	je	short load_masterboot_ok
  1039 000074D8 F9                  <1> 	stc
  1040                              <1> harddisk_error:
  1041                              <1> load_masterboot_ok:
  1042 000074D9 C3                  <1> 	retn
  1043                              <1> 
  1044                              <1> get_free_FAT_sectors:
  1045                              <1> 	; 29/08/2023
  1046                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
  1047                              <1> 	; 21/12/2017
  1048                              <1> 	; 29/02/2016
  1049                              <1> 	; 13/02/2016
  1050                              <1> 	; 04/02/2016
  1051                              <1> 	; 07/01/2016 (TRDOS 386 = TRDOS v2.0)
  1052                              <1> 	; 11/07/2010
  1053                              <1> 	; 21/06/2009
  1054                              <1> 	; INPUT: ESI = Logical DOS Drive Description Table address
  1055                              <1> 	; OUTPUT: STC => Error
  1056                              <1>         ;	cf = 0 and EAX = Free FAT sectors
  1057                              <1> 	; Also, related parameters and FAT buffer will be reset and updated
  1058                              <1> 
  1059 000074DA 31C0                <1> 	xor	eax, eax
  1060                              <1> 	;mov	[esi+LD_FreeSectors], eax ; Reset
  1061                              <1> 	
  1062 000074DC 807E0302            <1>         cmp     byte [esi+LD_FATType], 2
  1063 000074E0 7653                <1> 	jna	short loc_gfc_get_fat_free_clusters
  1064                              <1> 
  1065                              <1> 	; 29/02/2016
  1066 000074E2 48                  <1> 	dec	eax ; 0FFFFFFFFh
  1067 000074E3 89463A              <1> 	mov	[esi+LD_BPB+BPB_Reserved], eax ; Free cluster count (reset)
  1068 000074E6 89463E              <1> 	mov	[esi+LD_BPB+BPB_Reserved+4], eax ; First Free Cluster (reset)
  1069 000074E9 40                  <1> 	inc	eax ; 0
  1070                              <1> 	;
  1071 000074EA 668B4636            <1> 	mov	ax, [esi+LD_BPB+BPB_FSInfo]
  1072 000074EE 03466C              <1> 	add	eax, [esi+LD_StartSector]
  1073                              <1> 
  1074 000074F1 BB[5A7E0100]        <1> 	mov	ebx, DOSBootSectorBuff
  1075                              <1> 	;mov	ecx, 1
  1076                              <1> 	; 25/07/2022
  1077 000074F6 31C9                <1> 	xor	ecx, ecx
  1078 000074F8 FEC1                <1> 	inc	cl
  1079                              <1> 	; ecx = 1
  1080 000074FA E88EA90000          <1>  	call	disk_read
  1081 000074FF 7301                <1> 	jnc	short loc_gfc_check_fsinfo_signs
  1082                              <1> retn_gfc_get_fsinfo_sec:
  1083 00007501 C3                  <1> 	retn
  1084                              <1> 
  1085                              <1> loc_gfc_check_fsinfo_signs:
  1086 00007502 BB[5A7E0100]        <1> 	mov 	ebx, DOSBootSectorBuff ; 13/02/2016
  1087 00007507 813B52526141        <1>         cmp     dword [ebx], 41615252h
  1088 0000750D 7524                <1> 	jne	short retn_gfc_get_fsinfo_stc
  1089                              <1> 	;add	ebx, 484
  1090                              <1> 	;cmp	dword [ebx], 61417272h
  1091 0000750F 81BBE4010000727241- <1> 	cmp	dword [ebx+484], 61417272h
  1091 00007518 61                  <1>
  1092 00007519 7518                <1> 	jne	short retn_gfc_get_fsinfo_stc
  1093                              <1> 	;add	ebx, 4
  1094                              <1> 	;mov	eax, [ebx]
  1095 0000751B 8B83E8010000        <1> 	mov	eax, [ebx+488]
  1096                              <1> 	; 29/02/2016
  1097 00007521 89463A              <1> 	mov	[esi+LD_BPB+BPB_Reserved], eax ; Free cluster count
  1098 00007524 8B93EC010000        <1> 	mov	edx, [ebx+492] 
  1099                              <1> 	; 29/08/2023 (BugFix)
  1100 0000752A 89563E              <1> 	mov	[esi+LD_BPB+BPB_Reserved+4], edx ; First Free Cluster
  1101                              <1> 	; 21/12/2017
  1102 0000752D 89C3                <1> 	mov	ebx, eax ; (initial value = 0FFFFFFFFh)
  1103 0000752F 43                  <1> 	inc	ebx ; 0FFFFFFFFh -> 0  
  1104 00007530 7513                <1> 	jnz	short short retn_from_get_free_fat32_clusters
  1105 00007532 C3                  <1> 	retn
  1106                              <1> 
  1107                              <1> retn_gfc_get_fsinfo_stc:
  1108 00007533 F9                  <1> 	stc
  1109 00007534 C3                  <1> 	retn
  1110                              <1> 
  1111                              <1> loc_gfc_get_fat_free_clusters:
  1112                              <1> 	;mov	eax, 2
  1113 00007535 B002                <1> 	mov	al, 2
  1114                              <1> 	;mov	[FAT_CurrentCluster], eax
  1115                              <1> loc_gfc_loop_get_next_cluster:
  1116 00007537 E8B34D0000          <1> 	call	get_next_cluster
  1117 0000753C 730E                <1> 	jnc	short loc_gfc_free_fat_clusters_cont
  1118 0000753E 21C0                <1> 	and	eax, eax
  1119 00007540 7411                <1> 	jz	short loc_gfc_pass_inc_free_cluster_count
  1120                              <1>  
  1121                              <1> retn_from_get_free_fat_clusters:
  1122 00007542 8B4674              <1> 	mov	eax, [esi+LD_FreeSectors] ; Free clusters !
  1123                              <1> retn_from_get_free_fat32_clusters:
  1124 00007545 0FB65E13            <1>         movzx	ebx, byte [esi+LD_BPB+BPB_SecPerClust]
  1125 00007549 F7E3                <1>       	mul	ebx
  1126                              <1> 	;mov	[esi+LD_FreeSectors], eax ; Free sectors
  1127                              <1> retn_get_free_sectors_calc:
  1128 0000754B C3                  <1> 	retn
  1129                              <1> 
  1130                              <1> loc_gfc_free_fat_clusters_cont:
  1131 0000754C 09C0                <1> 	or	eax, eax
  1132 0000754E 7503                <1> 	jnz	short loc_gfc_pass_inc_free_cluster_count
  1133 00007550 FF4674              <1> 	inc	dword [esi+LD_FreeSectors] ; Free clusters !
  1134                              <1>    
  1135                              <1> loc_gfc_pass_inc_free_cluster_count:
  1136                              <1> 	;mov	eax, [FAT_CurrentCluster]
  1137 00007553 89C8                <1> 	mov	eax, ecx ; [FAT_CurrentCluster]
  1138 00007555 3B4678              <1> 	cmp	eax, [esi+LD_Clusters]
  1139 00007558 77E8                <1> 	ja	short retn_from_get_free_fat_clusters
  1140 0000755A 40                  <1> 	inc	eax
  1141                              <1> 	;mov	[FAT_CurrentCluster], eax
  1142 0000755B EBDA                <1> 	jmp	short loc_gfc_loop_get_next_cluster
  1143                              <1> 
  1144                              <1> floppy_drv_init:
  1145                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
  1146                              <1> 	; 09/12/2017
  1147                              <1> 	; 06/07/2016
  1148                              <1> 	; 10/01/2016 (TRDOS 386 = TRDOS v2.0)
  1149                              <1> 	; 24/07/2011
  1150                              <1> 	; 04/07/2009
  1151                              <1> 	; INPUT ->
  1152                              <1> 	;	DL = Drive number (0,1)
  1153                              <1> 	; OUTPUT ->
  1154                              <1> 	;	BL = drive name
  1155                              <1> 	;	BH = drive number
  1156                              <1> 	;	ESI = Logical DOS drv description table
  1157                              <1> 	;	EAX = Volume serial number
  1158                              <1>  
  1159 0000755D BE[1C660000]        <1> 	mov	esi, fd0_type ; 10/01/2016
  1160 00007562 BF00010900          <1> 	mov	edi, Logical_DOSDisks
  1161 00007567 08D2                <1> 	or	dl, dl
  1162 00007569 7407                <1> 	jz	short loc_drv_init_fd0_fd1
  1163 0000756B 81C700010000        <1> 	add	edi, 100h
  1164 00007571 46                  <1> 	inc	esi ; fd1_type ; 10/01/2016
  1165                              <1> loc_drv_init_fd0_fd1:
  1166 00007572 C6477E00            <1> 	mov	byte [edi+LD_MediaChanged], 0
  1167 00007576 803E01              <1> 	cmp	byte [esi], 1 ; type (>0 if it is existing) 
  1168                              <1> 		; 4 = 1.44 MB, 80 track, 3 1/2"
  1169 00007579 7221                <1> 	jb	short read_fd_boot_sector_retn
  1170 0000757B 885702              <1> 	mov	[edi+LD_PhyDrvNo], dl
  1171                              <1> read_fd_boot_sector:
  1172 0000757E 30F6                <1> 	xor	dh, dh
  1173 00007580 B904000000          <1> 	mov	ecx, 4 ; Retry Count
  1174                              <1> read_fd_boot_sector_again:
  1175 00007585 51                  <1> 	push 	ecx
  1176                              <1> 	;mov	cx, 1
  1177 00007586 B101                <1> 	mov	cl, 1
  1178 00007588 66B80102            <1> 	mov	ax, 0201h ; Read 1 sector
  1179 0000758C BB[5A7E0100]        <1> 	mov	ebx, DOSBootSectorBuff
  1180 00007591 E825DAFFFF          <1> 	call	int13h
  1181 00007596 59                  <1> 	pop	ecx
  1182 00007597 7304                <1> 	jnc	short use_fd_boot_sector_params
  1183 00007599 E2EA                <1> 	loop	read_fd_boot_sector_again
  1184                              <1> 
  1185                              <1> read_fd_boot_sector_stc_retn:
  1186 0000759B F9                  <1> 	stc
  1187                              <1> read_fd_boot_sector_retn:
  1188 0000759C C3                  <1> 	retn
  1189                              <1> 
  1190                              <1> use_fd_boot_sector_params:
  1191                              <1> 	;mov	esi, DOSBootSectorBuff
  1192 0000759D 89DE                <1> 	mov	esi, ebx
  1193 0000759F 6681BEFE01000055AA  <1> 	cmp	word [esi+BS_Validation], 0AA55h
  1194 000075A8 75F1                <1> 	jne	short read_fd_boot_sector_stc_retn
  1195 000075AA 66817E035346        <1>         cmp     word [esi+bs_FS_Identifier], 'SF'
  1196                              <1> 	;jne	use_fd_fatfs_boot_sector_params
  1197                              <1> 	; 25/07/2022
  1198 000075B0 7405                <1> 	je	short use_fdfs_boot_sector_params
  1199 000075B2 E9A1000000          <1> 	jmp	use_fd_fatfs_boot_sector_params	
  1200                              <1> use_fdfs_boot_sector_params:
  1201 000075B7 8A462D              <1> 	mov	al, [esi+bs_FS_LBA_Ready]
  1202 000075BA 884705              <1> 	mov	[edi+LD_FS_LBAYes], al
  1203                              <1> 	;
  1204                              <1> 	; 03/01/2010 CHS -> DOS FAT/BPB compatibility fix
  1205 000075BD 8A4608              <1> 	mov	al, [esi+bs_FS_MediaAttrib]
  1206 000075C0 884706              <1> 	mov	[edi+LD_FS_MediaAttrib], al
  1207                              <1> 	;
  1208 000075C3 8A460A              <1>         mov	al, [esi+bs_FS_VersionMaj]
  1209 000075C6 884707              <1> 	mov	byte [edi+LD_FS_VersionMajor], al
  1210 000075C9 668B4606            <1> 	mov	ax, [esi+bs_FS_BytesPerSec]
  1211 000075CD 66894711            <1> 	mov	[edi+LD_FS_BytesPerSec], ax
  1212 000075D1 8A462E              <1> 	mov	al, [esi+bs_FS_SecPerTrack]
  1213 000075D4 28E4                <1> 	sub	ah, ah ; 09/12/2017
  1214 000075D6 6689471E            <1> 	mov	[edi+LD_FS_SecPerTrack], ax
  1215 000075DA 8A462F              <1> 	mov	al, [esi+bs_FS_Heads]
  1216 000075DD 66894720            <1> 	mov	[edi+LD_FS_NumHeads], ax
  1217                              <1> 	;
  1218 000075E1 8B4628              <1> 	mov	eax, [esi+bs_FS_UnDelDirD]
  1219 000075E4 894722              <1> 	mov	[edi+LD_FS_UnDelDirD], eax
  1220 000075E7 8B4618              <1> 	mov	eax, [esi+bs_FS_MATLocation]
  1221 000075EA 89470C              <1> 	mov	[edi+LD_FS_MATLocation], eax
  1222 000075ED 8B461C              <1> 	mov	eax, [esi+bs_FS_RootDirD]
  1223 000075F0 894708              <1> 	mov	[edi+LD_FS_RootDirD], eax
  1224 000075F3 8B460C              <1> 	mov	eax, [esi+bs_FS_BeginSector]
  1225 000075F6 89476C              <1> 	mov	[edi+LD_FS_BeginSector], eax
  1226 000075F9 8B4610              <1> 	mov	eax, [esi+bs_FS_VolumeSize]
  1227 000075FC 894770              <1> 	mov	[edi+LD_FS_VolumeSize], eax
  1228                              <1> 	;		
  1229 000075FF 89FE                <1> 	mov	esi, edi
  1230 00007601 8B460C              <1>  	mov	eax, [esi+LD_FS_MATLocation]
  1231                              <1> 	;add	eax, [edi+LD_FS_BeginSector]
  1232                              <1> read_fd_MAT_sector_again:
  1233                              <1> 	;mov	ebx, DOSBootSectorBuff
  1234                              <1> 	;mov	ecx, 1
  1235 00007604 B101                <1> 	mov	cl, 1
  1236 00007606 E888A80000          <1> 	call	chs_read
  1237 0000760B 89DE                <1> 	mov	esi, ebx
  1238                              <1> 	;jnc	short use_fdfs_mat_sector_params
  1239                              <1> 	;jmp	short read_fd_boot_sector_retn
  1240                              <1> 	;retn
  1241                              <1> 	; 25/07/2022
  1242 0000760D 7248                <1> 	jc	short read_fd_RDT_sector_retn
  1243                              <1> use_fdfs_mat_sector_params:
  1244 0000760F 8B460C              <1> 	mov	eax, [esi+FS_MAT_DATLocation]
  1245 00007612 894714              <1> 	mov	[edi+LD_FS_DATLocation], eax
  1246 00007615 8B4610              <1> 	mov	eax, [esi+FS_MAT_DATScount]
  1247 00007618 894718              <1> 	mov	[edi+LD_FS_DATSectors], eax
  1248 0000761B 8B4714              <1> 	mov	eax, [edi+FS_MAT_FreeSectors]
  1249 0000761E 894774              <1> 	mov	[edi+LD_FS_FreeSectors], eax
  1250 00007621 8B4618              <1> 	mov	eax, [esi+FS_MAT_FirstFreeSector]
  1251 00007624 894778              <1> 	mov	[edi+LD_FS_FirstFreeSector], eax
  1252                              <1> 	;
  1253 00007627 89FE                <1> 	mov	esi, edi
  1254 00007629 8B4608              <1>  	mov	eax, [esi+LD_FS_RootDirD]
  1255                              <1> read_fd_RDT_sector_again:
  1256                              <1> 	;mov	ebx, DOSBootSectorBuff
  1257                              <1> 	;mov	cx, 1
  1258 0000762C B101                <1> 	mov	cl, 1
  1259 0000762E E860A80000          <1> 	call	chs_read
  1260 00007633 89DE                <1> 	mov	esi, ebx
  1261 00007635 7220                <1> 	jc	short read_fd_RDT_sector_retn
  1262                              <1> use_fdfs_RDT_sector_params:
  1263 00007637 8B461C              <1> 	mov	eax, [esi+FS_RDT_VolumeSerialNo]
  1264 0000763A 894728              <1> 	mov	[edi+LD_FS_VolumeSerial], eax
  1265 0000763D 57                  <1> 	push	edi
  1266                              <1> 	;mov	ecx, 16
  1267 0000763E B110                <1> 	mov	cl, 16	
  1268 00007640 83C640              <1> 	add	esi, FS_RDT_VolumeName
  1269 00007643 83C72C              <1> 	add	edi, LD_FS_VolumeName
  1270 00007646 F3A5                <1> 	rep	movsd ; 64 bytes
  1271 00007648 5E                  <1> 	pop	esi
  1272 00007649 C6460300            <1> 	mov	byte [esi+LD_FATType], 0
  1273 0000764D C64604A1            <1> 	mov	byte [esi+LD_FSType], 0A1h  
  1274 00007651 E9A2000000          <1>         jmp     loc_cont_use_fd_boot_sector_params
  1275                              <1> 
  1276                              <1> read_fd_RDT_sector_stc_retn:
  1277 00007656 F9                  <1> 	stc
  1278                              <1> read_fd_RDT_sector_retn:
  1279 00007657 C3                  <1> 	retn
  1280                              <1> 
  1281                              <1> use_fd_fatfs_boot_sector_params:
  1282 00007658 807E2629            <1> 	cmp	byte [esi+BS_BootSig], 29h
  1283 0000765C 75F8                <1> 	jne	short read_fd_RDT_sector_stc_retn
  1284 0000765E 807E15F0            <1> 	cmp	byte [esi+BPB_Media], 0F0h
  1285 00007662 72F3                <1> 	jb	short read_fd_RDT_sector_retn
  1286 00007664 57                  <1> 	push	edi
  1287 00007665 83C706              <1> 	add	edi, LD_BPB
  1288                              <1> 	;mov	ecx, 16
  1289 00007668 B110                <1> 	mov	cl, 16
  1290 0000766A F3A5                <1> 	rep	movsd ; 64 bytes 
  1291 0000766C 5E                  <1> 	pop	esi
  1292 0000766D 31C0                <1> 	xor	eax, eax
  1293 0000766F 89466C              <1> 	mov	[esi+LD_StartSector], eax ; 0
  1294 00007672 668B461C            <1> 	mov	ax, [esi+LD_BPB+BPB_FATSz16]
  1295 00007676 8A4E16              <1> 	mov	cl, [esi+LD_BPB+BPB_NumFATs] 
  1296 00007679 F7E1                <1>   	mul	ecx
  1297                              <1> 	; edx = 0 !
  1298 0000767B 668B5614            <1> 	mov	dx, [esi+LD_BPB+BPB_RsvdSecCnt]
  1299 0000767F 66895660            <1> 	mov	[esi+LD_FATBegin], dx
  1300                              <1> 	; 25/07/2022
  1301 00007683 01D0                <1> 	add	eax, edx
  1302                              <1> 	;add	ax, dx
  1303 00007685 894664              <1> 	mov	[esi+LD_ROOTBegin], eax
  1304 00007688 894668              <1> 	mov	[esi+LD_DATABegin], eax 
  1305 0000768B 668B5617            <1> 	mov	dx, [esi+LD_BPB+BPB_RootEntCnt]
  1306                              <1> 	;;shl	edx, 5 ; * 32 (Size of a directory entry)
  1307                              <1> 	;shl	dx, 5
  1308                              <1> 	;;add	edx, 511
  1309                              <1> 	;add	dx, 511
  1310                              <1> 	;;shr	edx, 9 ; edx = ((edx*32)+511) / 512
  1311                              <1> 	;shr	dx, 9
  1312 0000768F 6683C20F            <1> 	add	dx, 15 ; 06/07/2016 (+(512/32)-1)
  1313                              <1> 	;shr	dx, 4 ; / 16 (==16 entries per sector)
  1314                              <1> 	; 25/07/2022
  1315 00007693 C1EA04              <1> 	shr	edx, 4
  1316 00007696 015668              <1> 	add 	[esi+LD_DATABegin], edx ; + rd sectors
  1317                              <1> 	;movzx	eax, word [esi+LD_BPB+BPB_TotalSec16]
  1318 00007699 668B4619            <1> 	mov	ax, [esi+LD_BPB+BPB_TotalSec16]
  1319 0000769D 894670              <1> 	mov	[esi+LD_TotalSectors], eax
  1320 000076A0 2B4668              <1> 	sub	eax, [esi+LD_DATABegin]
  1321                              <1>   	;movzx	ecx, byte [esi+LD_BPB+BPB_SecPerClust]
  1322 000076A3 8A4E13              <1> 	mov	cl, [esi+LD_BPB+BPB_SecPerClust]  
  1323 000076A6 80F901              <1> 	cmp	cl, 1
  1324 000076A9 7604                <1> 	jna	short save_fd_fatfs_cluster_count
  1325                              <1> 	; 25/07/2022
  1326 000076AB 29D2                <1> 	sub	edx, edx
  1327                              <1> 	;sub	dx, dx ; 0
  1328                              <1> 	;sub	dl, dl ; 06/07/2016
  1329 000076AD F7F1                <1> 	div	ecx
  1330                              <1> save_fd_fatfs_cluster_count:
  1331 000076AF 894678              <1> 	mov	[esi+LD_Clusters], eax
  1332                              <1> 
  1333                              <1>       ; Maximum Valid Cluster Number = EAX +1
  1334                              <1>       ; with 2 reserved clusters= EAX +2
  1335                              <1>  
  1336                              <1> reset_FAT_buffer_decriptors:
  1337 000076B2 29C0                <1> 	sub	eax, eax ; 0  
  1338 000076B4 A2[5E800100]        <1> 	mov	[FAT_BuffValidData], al ; 0
  1339 000076B9 A2[5F800100]        <1> 	mov	[FAT_BuffDrvName], al ; 0
  1340 000076BE A3[62800100]        <1> 	mov	[FAT_BuffSector], eax ; 0
  1341                              <1> 
  1342                              <1> read_fd_FAT_sectors:
  1343 000076C3 BB001C0900          <1>   	mov	ebx, FAT_Buffer
  1344 000076C8 668B4614            <1> 	mov	ax, [esi+LD_BPB+BPB_RsvdSecCnt]
  1345                              <1> 	;mov	ecx, 3
  1346 000076CC B103                <1> 	mov	cl, 3 ; 3 sectors
  1347 000076CE E8C0A70000          <1> 	call	chs_read
  1348 000076D3 7240                <1> 	jc	short read_fd_FAT_sectors_retn
  1349                              <1> use_fd_FAT_sectors:
  1350 000076D5 8A4602              <1> 	mov	al, [esi+LD_PhyDrvNo]
  1351 000076D8 0441                <1> 	add	al, 'A' 
  1352 000076DA A2[5F800100]        <1> 	mov	[FAT_BuffDrvName], al 
  1353 000076DF C605[5E800100]01    <1>  	mov	byte [FAT_BuffValidData], 1
  1354 000076E6 E82B000000          <1> 	call	fd_init_calculate_free_clusters
  1355 000076EB 7228                <1> 	jc	short read_fd_FAT_sectors_retn
  1356                              <1>   
  1357                              <1> loc_use_fd_boot_sector_params_FAT:
  1358 000076ED C6460301            <1> 	mov	byte [esi+LD_FATType], 1 ; FAT 12
  1359 000076F1 C6460401            <1> 	mov	byte [esi+LD_FSType], 1
  1360 000076F5 8B462D              <1>         mov     eax, [esi+LD_BPB+VolumeID]
  1361                              <1> loc_cont_use_fd_boot_sector_params:
  1362 000076F8 8A7E02              <1> 	mov	bh, [esi+LD_PhyDrvNo]
  1363 000076FB 887E7D              <1> 	mov	[esi+LD_DParamEntry], bh
  1364 000076FE 88FB                <1> 	mov	bl, bh
  1365 00007700 80C341              <1> 	add	bl, 'A'
  1366 00007703 881E                <1> 	mov	byte [esi+LD_Name], bl
  1367 00007705 C6460101            <1> 	mov	byte [esi+LD_DiskType], 1
  1368 00007709 C6460500            <1> 	mov	byte [esi+LD_LBAYes], 0
  1369 0000770D C6467C00            <1> 	mov	byte [esi+LD_PartitionEntry], 0
  1370 00007711 C6467E06            <1> 	mov	byte [esi+LD_MediaChanged], 6 ; Volume Name Reset
  1371                              <1> 
  1372                              <1> read_fd_FAT_sectors_retn:
  1373 00007715 C3                  <1> 	retn   
  1374                              <1> 
  1375                              <1> fd_init_calculate_free_clusters:
  1376                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
  1377                              <1> 	; 09/12/2017
  1378                              <1> 	; 10/01/2016 (TRDOS 386 = TRDOS v2.0)
  1379                              <1> 	; 04/07/2009
  1380                              <1> 	; INPUT ->
  1381                              <1> 	;     ESI = Logical DOS drive description table address
  1382                              <1> 	; OUTPUT ->
  1383                              <1> 	;    [ESI+LD_FreeSectors] will be set
  1384                              <1> 	
  1385 00007716 29C0                <1> 	sub	eax, eax
  1386 00007718 894674              <1> 	mov	[esi+LD_FreeSectors], eax ; 0
  1387 0000771B B002                <1> 	mov	al, 2 ; eax = 2
  1388                              <1> 
  1389                              <1> fd_init_loop_get_next_cluster:
  1390 0000771D E828000000          <1> 	call	fd_init_get_next_cluster
  1391 00007722 7225                <1> 	jc	short fd_init_calculate_free_clusters_retn
  1392                              <1> 
  1393                              <1> fd_init_free_fat_clusters:
  1394                              <1> 	;cmp 	eax, 0
  1395                              <1> 	;ja	short fd_init_pass_inc_free_cluster_count
  1396                              <1> 	;and	eax, eax
  1397                              <1> 	;jnz	short fd_init_pass_inc_free_cluster_count
  1398                              <1> 	;and	ax, ax
  1399 00007724 21C0                <1> 	and	eax, eax ; 25/07/2022
  1400 00007726 7503                <1> 	jnz	short fd_init_pass_inc_free_cluster_count
  1401                              <1> 	; 25/07/2022
  1402 00007728 FF4674              <1> 	inc	dword [esi+LD_FreeSectors]
  1403                              <1>         ;inc	word [esi+LD_FreeSectors]
  1404                              <1>     
  1405                              <1> fd_init_pass_inc_free_cluster_count:
  1406                              <1>   	; 25/07/2022
  1407 0000772B A1[5A800100]        <1> 	mov	eax, [FAT_CurrentCluster]
  1408                              <1> 	;mov	ax, [FAT_CurrentCluster]
  1409 00007730 3B4678              <1> 	cmp	eax, [esi+LD_Clusters]
  1410                              <1> 	;cmp	ax, [esi+LD_Clusters]
  1411 00007733 7703                <1> 	ja	short short retn_from_fd_init_calculate_free_clusters
  1412 00007735 40                  <1> 	inc	eax
  1413                              <1> 	;inc	ax
  1414 00007736 EBE5                <1> 	jmp	short fd_init_loop_get_next_cluster
  1415                              <1> 
  1416                              <1> retn_from_fd_init_calculate_free_clusters:
  1417                              <1> 	; 25/07/2022
  1418                              <1> 	;xor	eax, eax
  1419 00007738 30E4                <1> 	xor	ah, ah
  1420 0000773A 8A4613              <1>   	mov	al, [esi+LD_BPB+BPB_SecPerClust]
  1421 0000773D 3C01                <1>   	cmp	al, 1
  1422 0000773F 7608                <1> 	jna	short fd_init_calculate_free_clusters_retn
  1423                              <1> 	;;movzx	eax, al
  1424                              <1> 	;xor	ah, ah ; 09/12/2017
  1425                              <1> 	; 25/07/2022
  1426 00007741 8B4E74              <1> 	mov	ecx, [esi+LD_FreeSectors]
  1427                              <1> 	;mov	cx, [esi+LD_FreeSectors] ; Count of free clusters
  1428 00007744 F7E1                <1>   	mul	ecx
  1429                              <1> 	;mul	cx
  1430 00007746 894674              <1> 	mov	[esi+LD_FreeSectors], eax
  1431                              <1> 	;mov	[esi+LD_FreeSectors], ax
  1432                              <1> fd_init_calculate_free_clusters_retn:
  1433 00007749 C3                  <1> 	retn
  1434                              <1> 
  1435                              <1> fd_init_get_next_cluster:
  1436                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
  1437                              <1> 	; 04/02/2016
  1438                              <1> 	; 02/02/2016
  1439                              <1> 	; 10/01/2016 (TRDOS 386 = TRDOS v2.0)
  1440                              <1> 	; 04/07/2009
  1441                              <1> 	; INPUT ->
  1442                              <1> 	;    EAX = Current cluster
  1443                              <1> 	;    ESI = Logical DOS drive description table address
  1444                              <1> 	;    EDX = 0
  1445                              <1> 	; OUTPUT ->
  1446                              <1> 	;    EAX = Next cluster
  1447                              <1> 
  1448 0000774A A3[5A800100]        <1> 	mov	[FAT_CurrentCluster], eax
  1449                              <1> fd_init_get_next_cluster_readnext:
  1450 0000774F 29D2                <1> 	sub	edx, edx ; 0
  1451 00007751 BB00040000          <1>   	mov	ebx, 1024 ; 400h
  1452 00007756 F7F3                <1>   	div	ebx
  1453                              <1>   	; EAX = Count of 3 FAT sectors
  1454                              <1>   	; EDX = Buffer entry index
  1455 00007758 89C1                <1> 	mov	ecx, eax
  1456                              <1> 	;mov	eax, 3
  1457 0000775A B003                <1> 	mov	al, 3
  1458 0000775C F7E2                <1> 	mul	edx ; Multiply by 3
  1459                              <1> 	;shr	ax, 1 ; Divide by 2
  1460                              <1> 	; 25/07/2022
  1461 0000775E D1E8                <1> 	shr	eax, 1
  1462 00007760 89C3                <1> 	mov	ebx, eax ; Buffer byte offset
  1463 00007762 81C3001C0900        <1> 	add	ebx, FAT_Buffer
  1464 00007768 89C8                <1> 	mov	eax, ecx
  1465                              <1> 	;mov	edx, 3
  1466 0000776A 66BA0300            <1> 	mov	dx, 3
  1467 0000776E F7E2                <1> 	mul	edx 
  1468                              <1>   	; EAX = FAT Beginning Sector
  1469                              <1> 	; EDX = 0
  1470 00007770 8A0E                <1> 	mov	cl, [esi+LD_Name]
  1471                              <1> 	;cmp	byte [FAT_BuffValidData], 0
  1472                              <1> 	;jna	short fd_init_load_FAT_sectors0
  1473 00007772 3A0D[5F800100]      <1> 	cmp	cl, [FAT_BuffDrvName]
  1474 00007778 751D                <1> 	jne	short fd_init_load_FAT_sectors0
  1475 0000777A 3B05[62800100]      <1> 	cmp	eax, [FAT_BuffSector]
  1476 00007780 751B                <1> 	jne	short fd_init_load_FAT_sectors1
  1477                              <1> 	; 25/07/2022
  1478 00007782 A1[5A800100]        <1> 	mov	eax, [FAT_CurrentCluster]
  1479                              <1> 	;mov	al, [FAT_CurrentCluster]
  1480 00007787 D1E8                <1> 	shr	eax, 1
  1481                              <1> 	;shr	al, 1
  1482 00007789 668B03              <1> 	mov	ax, [ebx]
  1483 0000778C 7305                <1>   	jnc	short fd_init_gnc_even
  1484                              <1> 	;shr	ax, 4
  1485                              <1> 	; 25/04/2022
  1486 0000778E C1E804              <1> 	shr	eax, 4
  1487                              <1> fd_init_gnc_clc_retn:
  1488 00007791 F8                  <1> 	clc
  1489 00007792 C3                  <1> 	retn
  1490                              <1> 
  1491                              <1> fd_init_gnc_even:
  1492 00007793 80E40F              <1> 	and	ah, 0Fh
  1493 00007796 C3                  <1> 	retn
  1494                              <1> 
  1495                              <1> fd_init_load_FAT_sectors0:
  1496 00007797 880D[5F800100]      <1> 	mov 	[FAT_BuffDrvName], cl
  1497                              <1> fd_init_load_FAT_sectors1:
  1498 0000779D C605[5E800100]00    <1> 	mov	byte [FAT_BuffValidData], 0
  1499 000077A4 A3[62800100]        <1> 	mov	[FAT_BuffSector], eax
  1500 000077A9 034660              <1> 	add	eax, [esi+LD_FATBegin]
  1501 000077AC BB001C0900          <1>  	mov	ebx, FAT_Buffer
  1502                              <1> 	;movzx	ecx, word [esi+LD_BPB+BPB_FATSz16]
  1503 000077B1 668B4E1C            <1> 	mov	cx, [esi+LD_BPB+BPB_FATSz16]
  1504                              <1> 	;sub	cx, [FAT_BuffSector]
  1505                              <1>         ; 25/07/2022
  1506 000077B5 2B0D[62800100]      <1> 	sub	ecx, [FAT_BuffSector] 
  1507                              <1> 	;sub	edx, edx
  1508 000077BB B203                <1> 	mov	dl, 3
  1509                              <1> 	; edx = 3 
  1510                              <1> 	;;cmp	ecx, 3
  1511                              <1> 	;cmp	cx, 3
  1512 000077BD 39D1                <1> 	cmp	ecx, edx ; 3
  1513 000077BF 7602                <1> 	jna	short fdinit_pass_fix_sector_count_3
  1514                              <1> 	;;mov	ecx, 3
  1515                              <1> 	;mov	ecx, 3
  1516 000077C1 89D1                <1> 	mov	ecx, edx ; 3
  1517                              <1> fdinit_pass_fix_sector_count_3:  
  1518 000077C3 E8CBA60000          <1> 	call	chs_read
  1519 000077C8 730D                <1> 	jnc	short fd_init_FAT_sectors_no_load_error
  1520 000077CA C605[5E800100]00    <1> 	mov	byte [FAT_BuffValidData], 0
  1521                              <1> 		; Drv not ready or read Error !
  1522 000077D1 B80F000000          <1> 	mov	eax, ERR_DRV_NOT_RDY ; 15
  1523                              <1> 	;xor	edx, edx
  1524 000077D6 C3                  <1> 	retn
  1525                              <1> 
  1526                              <1> fd_init_FAT_sectors_no_load_error:
  1527 000077D7 C605[5E800100]01    <1> 	mov	byte [FAT_BuffValidData], 1
  1528 000077DE A1[5A800100]        <1> 	mov	eax, [FAT_CurrentCluster]
  1529 000077E3 E967FFFFFF          <1>         jmp     fd_init_get_next_cluster_readnext
  1530                              <1> 
  1531                              <1> get_FAT_volume_name:
  1532                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
  1533                              <1> 	; 10/01/2016 (TRDOS 386 = TRDOS v2.0)
  1534                              <1> 	; 12/09/2009
  1535                              <1> 	; INPUT ->
  1536                              <1> 	;	BH = Logical DOS drive number (0,1,2,3,4 ...)
  1537                              <1> 	;       BL = 0
  1538                              <1> 	; OUTPUT ->
  1539                              <1> 	;	CF = 0 -> ESI = Volume name address
  1540                              <1> 	; 	CF = 1 -> Root volume name not found
  1541                              <1> 
  1542                              <1> 	;mov 	ah, 0FFh
  1543                              <1> 	;mov 	al, [Last_Dos_DiskNo]
  1544                              <1> 	;cmp 	al, bh
  1545                              <1> 	;jb     short loc_gfvn_dir_load_err
  1546                              <1> 
  1547 000077E8 89DE                <1> 	mov	esi, ebx
  1548 000077EA 81E600FF0000        <1> 	and	esi, 0FF00h ; esi = bh
  1549 000077F0 81C600010900        <1> 	add	esi, Logical_DOSDisks
  1550 000077F6 8A06                <1> 	mov     al, [esi+LD_Name]
  1551 000077F8 8A6603              <1> 	mov     ah, [esi+LD_FATType]
  1552 000077FB 80FC01              <1> 	cmp     ah, 1
  1553 000077FE 7210                <1> 	jb    	short loc_gfvn_dir_load_err
  1554 00007800 3C41                <1> 	cmp 	al, 'A'
  1555 00007802 720C                <1> 	jb      short loc_gfvn_dir_load_err
  1556 00007804 80FC02              <1> 	cmp 	ah, 2 
  1557 00007807 7708                <1> 	ja      short get_FAT32_root_cluster
  1558                              <1> 	
  1559 00007809 E81F4C0000          <1> 	call    load_FAT_root_directory
  1560 0000780E 730B                <1> 	jnc     short loc_get_volume_name
  1561                              <1> 
  1562                              <1> loc_gfvn_dir_load_err:
  1563                              <1> loc_get_volume_name_retn: ; 29/08/2023
  1564 00007810 C3                  <1> 	retn
  1565                              <1> 
  1566                              <1> get_FAT32_root_cluster:
  1567 00007811 8B4632              <1> 	mov	eax, [esi+LD_BPB+BPB_RootClus]
  1568 00007814 E8924C0000          <1> 	call    load_FAT_sub_directory
  1569 00007819 72F5                <1> 	jc	short loc_get_volume_name_retn
  1570                              <1> 
  1571                              <1> loc_get_volume_name:
  1572 0000781B BE00000800          <1>         mov     esi, Directory_Buffer
  1573                              <1> 	;xor	cx, cx ; 0
  1574                              <1> 	; 25/07/2022
  1575 00007820 31C9                <1> 	xor	ecx, ecx ; 0
  1576                              <1> check_root_volume_name:
  1577 00007822 8A06                <1> 	mov	al, [esi]
  1578 00007824 08C0                <1> 	or      al, al
  1579 00007826 74E8                <1> 	jz      short loc_get_volume_name_retn
  1580 00007828 807E0B08            <1> 	cmp     byte [esi+0Bh], 08h
  1581 0000782C 74E2                <1> 	je      short loc_get_volume_name_retn
  1582 0000782E 663B0D[74800100]    <1> 	cmp     cx, [DirBuff_LastEntry]
  1583 00007835 7306                <1> 	jnb     short pass_check_root_volume_name
  1584                              <1> 	;inc	cx
  1585                              <1> 	; 25/07/2022
  1586 00007837 41                  <1> 	inc	ecx
  1587 00007838 83C620              <1> 	add     esi, 32
  1588 0000783B EBE5                <1> 	jmp     short check_root_volume_name
  1589                              <1> 
  1590                              <1> 	; 29/08/2023
  1591                              <1> ;loc_get_volume_name_retn:
  1592                              <1> 	;retn
  1593                              <1>     
  1594                              <1> pass_check_root_volume_name:
  1595 0000783D 803D[70800100]03    <1> 	cmp	byte [DirBuff_FATType], 3
  1596 00007844 7230                <1> 	jb	short loc_get_volume_name_retn_xor
  1597                              <1> 
  1598 00007846 BB001C0900          <1> 	mov	ebx, FAT_Buffer
  1599 0000784B BE00010900          <1> 	mov	esi, Logical_DOSDisks
  1600 00007850 31C0                <1> 	xor	eax, eax
  1601 00007852 8A25[6F800100]      <1> 	mov	ah, [DirBuff_DRV]
  1602 00007858 80EC41              <1> 	sub	ah, 'A' 
  1603 0000785B 01C6                <1> 	add	esi, eax
  1604 0000785D A1[76800100]        <1> 	mov	eax, [DirBuff_Cluster]
  1605 00007862 E8884A0000          <1> 	call	get_next_cluster
  1606 00007867 7305                <1> 	jnc 	short loc_gfvn_load_FAT32_dir_cluster
  1607                              <1>   	
  1608 00007869 83F801              <1> 	cmp     eax, 1
  1609 0000786C F5                  <1> 	cmc
  1610 0000786D C3                  <1> 	retn
  1611                              <1>   
  1612                              <1> loc_gfvn_load_FAT32_dir_cluster:
  1613 0000786E E8384C0000          <1> 	call	load_FAT_sub_directory
  1614 00007873 73A6                <1> 	jnc	short loc_get_volume_name
  1615 00007875 C3                  <1> 	retn
  1616                              <1> 
  1617                              <1> loc_get_volume_name_retn_xor:
  1618 00007876 31C0                <1> 	xor 	eax, eax
  1619 00007878 C3                  <1> 	retn
  1620                              <1> 
  1621                              <1> get_media_change_status:
  1622                              <1> 	; 10/01/2016 (TRDOS 386 = TRDOS v2.0)
  1623                              <1> 	; 09/09/2009
  1624                              <1> 	; INPUT:
  1625                              <1> 	;     DL = Drive number (physical)
  1626                              <1> 	; OUTPUT: clc & AH = 6 media changed
  1627                              <1> 	;     clc & AH = 0 media not changed         
  1628                              <1> 	;     stc -> Drive not ready or an error 
  1629                              <1>   
  1630 00007879 B416                <1> 	mov	ah, 16h
  1631 0000787B E83BD7FFFF          <1>   	call	int13h
  1632 00007880 80FC06              <1> 	cmp	ah, 06h
  1633 00007883 7405                <1> 	je	short loc_gmc_status_retn
  1634 00007885 08E4                <1> 	or	ah, ah
  1635 00007887 7401                <1> 	jz	short loc_gmc_status_retn
  1636                              <1> loc_gmc_status_stc_retn:    
  1637 00007889 F9                  <1> 	stc
  1638                              <1> loc_gmc_status_retn:
  1639 0000788A C3                  <1> 	retn
  3427                                  %include 'trdosk3.s' ; 06/01/2016
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.7) - MAIN PROGRAM : trdosk3.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 02/12/2023  (Previous: 30/08/2023, TRDOS 386 v2.0.6)
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 06/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.15 (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> 	; 26/07/2022 (TRDOS 386 Kernel v2.0.5)
    21                              <1> 	; 16/10/2016
    22                              <1> 	; 02/02/2016
    23                              <1> 	; 15/01/2016 (TRDOS 386 = TRDOS v2.0)
    24                              <1> 	; 18/08/2011
    25                              <1> 	; 09/09/2009
    26                              <1> 	; INPUT:
    27                              <1> 	;   DL = Logical DOS Drive Number
    28                              <1> 	; OUTPUT:
    29                              <1> 	;  cf=1 -> Not successful
    30                              <1> 	;   EAX = Error code
    31                              <1> 	;  cf=0 ->
    32                              <1> 	;   EAX = 0 (successful)
    33                              <1> 
    34 0000788B 31DB                <1> 	xor	ebx, ebx
    35 0000788D 88D7                <1> 	mov	bh, dl
    36                              <1> 
    37                              <1> 	;cmp	dl, 1
    38                              <1> 	;jna	short loc_ccdrv_initial_media_change_check
    39                              <1> 	;cmp	bh, [Last_Dos_DiskNo]
    40                              <1> 	;ja	short loc_ccdrv_drive_not_ready_err
    41                              <1> 
    42                              <1> loc_ccdrv_initial_media_change_check:
    43 0000788F BE00010900          <1> 	mov	esi, Logical_DOSDisks
    44 00007894 01DE                <1> 	add	esi, ebx
    45                              <1> loc_ccdrv_dos_drive_name_check:
    46 00007896 80FA02              <1> 	cmp	dl, 2
    47 00007899 720E                <1> 	jb	short loc_ccdrv_dos_drive_name_check_ok
    48                              <1> 
    49 0000789B 8A06                <1> 	mov	al, [esi+LD_Name]
    50 0000789D 2C41                <1> 	sub	al, 'A'
    51 0000789F 38D0                <1> 	cmp	al, dl
    52 000078A1 7406                <1> 	je	short loc_ccdrv_dos_drive_name_check_ok
    53                              <1> 
    54                              <1> loc_ccdrv_drive_not_ready_err:
    55                              <1> 	; 16/10/2016 (15h -> 15)
    56                              <1> 	;mov	eax, 15 ; Drive not ready
    57                              <1> 	; 26/07/2022
    58 000078A3 29C0                <1> 	sub	eax, eax
    59 000078A5 B00F                <1> 	mov	al, 15
    60                              <1> loc_change_current_drive_stc_retn:
    61 000078A7 F9                  <1> 	stc
    62 000078A8 C3                  <1> 	retn  
    63                              <1> 
    64                              <1> loc_ccdrv_dos_drive_name_check_ok:
    65 000078A9 8A667E              <1> 	mov	ah, [esi+LD_MediaChanged]
    66 000078AC 80FC06              <1> 	cmp	ah, 6  ; VOLUME NAME CHECK/MOVE SIGN
    67 000078AF 7455                <1> 	je	short loc_ccdrv_get_FAT_volume_name_0
    68                              <1> 
    69 000078B1 80FA01              <1> 	cmp	dl, 1
    70 000078B4 777D                <1> 	ja	short loc_gmcs_init_drv_hd
    71                              <1> 
    72                              <1> loc_gmcs_init_drv_fd:
    73 000078B6 08E4                <1> 	or	ah, ah 
    74                              <1> 	; AH = 1 is initialization sign (invalid_fd_parameter)
    75 000078B8 7517                <1> 	jnz	short loc_ccdrv_call_fd_init
    76                              <1> 
    77 000078BA E8BAFFFFFF          <1> 	call	get_media_change_status
    78 000078BF 72E2                <1> 	jc	short loc_ccdrv_drive_not_ready_err
    79                              <1> 
    80 000078C1 20E4                <1> 	and	ah, ah
    81 000078C3 7476                <1> 	jz	short loc_change_current_drv3
    82                              <1> 
    83 000078C5 80F406              <1> 	xor	ah, 6
    84 000078C8 75D9                <1> 	jnz	short loc_ccdrv_drive_not_ready_err
    85                              <1> 
    86                              <1> loc_ccdrv_call_fd_init_check_vol_id:
    87 000078CA E86D090000          <1> 	call	get_volume_serial_number
    88 000078CF 730D                <1> 	jnc	short loc_ccdrv_check_vol_serial
    89                              <1> 
    90                              <1> loc_ccdrv_call_fd_init:
    91 000078D1 E887FCFFFF          <1> 	call	floppy_drv_init
    92 000078D6 731A                <1> 	jnc	short loc_reset_drv_fd_current_dir
    93                              <1> 
    94                              <1> loc_ccdrv_fdinit_fail_retn:
    95                              <1> 	; 16/10/2016
    96 000078D8 B80F000000          <1> 	mov	eax, 15 ; Drive not ready
    97 000078DD C3                  <1> 	retn
    98                              <1> 
    99                              <1> loc_ccdrv_check_vol_serial:
   100 000078DE A3[40790100]        <1> 	mov	[Current_VolSerial], eax
   101                              <1> 	;mov	dl, bh
   102 000078E3 E875FCFFFF          <1> 	call	floppy_drv_init
   103 000078E8 72EE                <1> 	jc	short loc_ccdrv_fdinit_fail_retn
   104                              <1> 
   105 000078EA 3B05[40790100]      <1> 	cmp	eax, [Current_VolSerial]
   106 000078F0 7445                <1> 	je	short loc_change_current_drv2
   107                              <1> 
   108                              <1> loc_reset_drv_fd_current_dir:
   109 000078F2 31C0                <1> 	xor	eax, eax              
   110 000078F4 88467F              <1>         mov	[esi+LD_CDirLevel], al
   111 000078F7 89F7                <1> 	mov	edi, esi
   112 000078F9 81C780000000        <1> 	add	edi, LD_CurrentDirectory
   113 000078FF B920000000          <1> 	mov	ecx, 32
   114 00007904 F3AB                <1> 	rep	stosd   
   115                              <1>  
   116                              <1> loc_ccdrv_get_FAT_volume_name_0:
   117 00007906 8A4603              <1> 	mov	al, [esi+LD_FATType]
   118 00007909 08C0                <1> 	or	al, al
   119 0000790B 742A                <1> 	jz	short loc_change_current_drv2
   120                              <1> 
   121 0000790D 56                  <1> 	push	esi 
   122 0000790E 3C02                <1> 	cmp	al, 2
   123 00007910 7705                <1> 	ja	short loc_ccdrv_get_FAT32_vol_name
   124                              <1>              
   125                              <1> loc_ccdrv_get_FAT2_16_vol_name:
   126 00007912 83C631              <1> 	add	esi, LD_BPB + VolumeLabel
   127 00007915 EB03                <1> 	jmp	short loc_ccdrv_get_FAT_volume_name_1
   128                              <1> 
   129                              <1> loc_ccdrv_get_FAT32_vol_name:
   130 00007917 83C64D              <1> 	add	esi, LD_BPB + FAT32_VolLab
   131                              <1> loc_ccdrv_get_FAT_volume_name_1:
   132 0000791A 53                  <1> 	push	ebx
   133 0000791B 56                  <1> 	push	esi
   134 0000791C E8C7FEFFFF          <1> 	call	get_FAT_volume_name
   135 00007921 5F                  <1> 	pop	edi
   136 00007922 5B                  <1> 	pop	ebx
   137                              <1> 	; BL = 0
   138 00007923 720B                <1> 	jc	short loc_change_current_drv1
   139 00007925 20C0                <1> 	and	al, al
   140 00007927 7407                <1> 	jz	short loc_change_current_drv1
   141                              <1> 
   142                              <1> loc_ccdrv_move_FAT_volume_name:
   143 00007929 B90B000000          <1> 	mov	ecx, 11
   144 0000792E F3A4                <1> 	rep	movsb
   145                              <1> 
   146                              <1> loc_change_current_drv1:
   147 00007930 5E                  <1> 	pop	esi
   148 00007931 EB04                <1> 	jmp	short loc_change_current_drv2
   149                              <1> 
   150                              <1> loc_gmcs_init_drv_hd:
   151 00007933 08E4                <1> 	or	ah, ah
   152 00007935 7404                <1> 	jz	short loc_change_current_drv3
   153                              <1> 	; BL = 0, BH = Logical DOS drive number
   154                              <1> loc_change_current_drv2:
   155 00007937 C6467E00            <1> 	mov	byte [esi+LD_MediaChanged], 0
   156                              <1> loc_change_current_drv3:
   157 0000793B 883D[4A790100]      <1> 	mov	[Current_Drv], bh
   158                              <1> 
   159                              <1> 	;call	restore_current_directory
   160                              <1> 	;retn
   161                              <1> 
   162                              <1> restore_current_directory:
   163                              <1> 	; 26/07/2022 (TRDOS 386 Kernel v2.0.5)
   164                              <1> 	; 11/02/2016
   165                              <1> 	; 15/01/2016 (TRDOS 386 = TRDOS v2.0)
   166                              <1> 	; 25/01/2010
   167                              <1> 	; 12/10/2009
   168                              <1> 	;
   169                              <1> 	; INPUT:
   170                              <1> 	;   ESI = Logical DOS Drive Description Table
   171                              <1> 	;
   172                              <1> 	; OUTPUT:
   173                              <1> 	;   ESI = Logical DOS Drive Description Table
   174                              <1> 	;   EDI = offset Current_Dir_Drv 
   175                              <1> 
   176 00007941 8A4603              <1> 	mov	al, [esi+LD_FATType]
   177 00007944 A2[49790100]        <1> 	mov	[Current_FATType], al
   178                              <1> 
   179 00007949 8A26                <1> 	mov	ah, [esi+LD_Name] 
   180 0000794B 8825[4B790100]      <1> 	mov	[Current_Dir_Drv], ah
   181                              <1> 
   182 00007951 20C0                <1> 	and	al, al
   183 00007953 741D                <1> 	jz	short loc_restore_FS_current_directory
   184                              <1> 
   185                              <1> loc_restore_FAT_current_directory:
   186 00007955 8A667F              <1> 	mov	ah, [esi+LD_CDirLevel]
   187 00007958 8825[48790100]      <1> 	mov	[Current_Dir_Level], ah
   188 0000795E 08E4                <1> 	or	ah, ah
   189 00007960 7415                <1>         jz	short loc_ccdrv_reset_cdir_FAT_12_16_32_fcluster
   190                              <1> 
   191 00007962 0FB6D4              <1> 	movzx	edx, ah
   192 00007965 C0E204              <1> 	shl	dl, 4 ; * 16
   193 00007968 01F2                <1>         add	edx, esi
   194 0000796A 8B828C000000        <1> 	mov	eax, [edx+LD_CurrentDirectory+12]
   195 00007970 EB29                <1> 	jmp	short loc_ccdrv_reset_cdir_FAT_fcluster
   196                              <1> 
   197                              <1> loc_restore_FS_current_directory:
   198                              <1> 	;call	load_current_FS_directory
   199                              <1> 	;retn
   200                              <1> 	; 26/07/2022
   201 00007972 E96E4B0000          <1> 	jmp	load_current_FS_directory
   202                              <1> 
   203                              <1> loc_ccdrv_reset_cdir_FAT_12_16_32_fcluster:
   204 00007977 3C03                <1> 	cmp	al, 3
   205 00007979 7205                <1> 	jb	short loc_ccdrv_reset_cdir_FAT_12_16_fcluster
   206                              <1> loc_ccdrv_reset_cdir_FAT32_fcluster:
   207 0000797B 8B4632              <1> 	mov	eax, [esi+LD_BPB+FAT32_RootFClust]
   208 0000797E EB02                <1> 	jmp	short loc_ccdrv_check_rootdir_sign
   209                              <1> loc_ccdrv_reset_cdir_FAT_12_16_fcluster:   
   210                              <1> 	;xor	al, al  ; xor eax, eax
   211                              <1> 	; 26/07/2022
   212 00007980 31C0                <1> 	xor	eax, eax
   213                              <1> 	;xor	edx, edx
   214                              <1> loc_ccdrv_check_rootdir_sign:
   215 00007982 80BE8000000000      <1> 	cmp	byte [esi+LD_CurrentDirectory], 0
   216 00007989 7510                <1> 	jne	short loc_ccdrv_reset_cdir_FAT_fcluster
   217                              <1> loc_ccdrv_set_rootdir_FAT_fcluster:
   218 0000798B 89868C000000        <1>         mov     [esi+LD_CurrentDirectory+12], eax
   219 00007991 C78680000000524F4F- <1> 	mov	dword [esi+LD_CurrentDirectory], 'ROOT'
   219 0000799A 54                  <1>
   220                              <1> 
   221                              <1> loc_ccdrv_reset_cdir_FAT_fcluster:
   222 0000799B A3[44790100]        <1> 	mov	[Current_Dir_FCluster], eax
   223                              <1> 
   224 000079A0 BF[A8800100]        <1> 	mov	edi, PATH_Array
   225 000079A5 89F2                <1> 	mov	edx, esi
   226 000079A7 81C680000000        <1> 	add	esi, LD_CurrentDirectory
   227 000079AD B920000000          <1> 	mov	ecx, 32
   228 000079B2 F3A5                <1> 	rep	movsd
   229                              <1> 
   230 000079B4 E8C02B0000          <1> 	call	change_prompt_dir_string
   231                              <1> 	
   232 000079B9 89D6                <1> 	mov	esi, edx
   233                              <1> 	
   234 000079BB 29C0                <1>         sub	eax, eax
   235                              <1>        ;sub	edx, edx
   236 000079BD BF[4B790100]        <1> 	mov	edi, Current_Dir_Drv
   237                              <1> 
   238 000079C2 A2[BD300100]        <1> 	mov	[Restore_CDIR], al ; 0
   239 000079C7 C3                  <1> 	retn
   240                              <1> 
   241                              <1> dos_prompt:
   242                              <1> 	; 26/07/2022 (TRDOS 386 Kernel v2.0.5)
   243                              <1> 	; 06/05/2016
   244                              <1> 	; 30/01/2016
   245                              <1> 	; 29/01/2016
   246                              <1> 	; 16/01/2016 (TRDOS 386 = TRDOS v2.0)
   247                              <1> 	; 15/09/2011
   248                              <1> 	; 13/09/2009
   249                              <1> 	; 2004-2005
   250                              <1> 
   251                              <1> 	; 06/05/2016
   252 000079C8 C705[04850100]-     <1> 	mov	dword [mainprog_return_addr], return_from_cmd_interpreter
   252 000079CE [7A7A0000]          <1>
   253                              <1> 
   254                              <1> loc_TRDOS_prompt:
   255 000079D2 BF[4A7A0100]        <1> 	mov	edi, TextBuffer
   256 000079D7 C6075B              <1> 	mov	byte [edi], "["
   257 000079DA 47                  <1> 	inc	edi
   258 000079DB BE[18310100]        <1> 	mov	esi, TRDOSPromptLabel
   259                              <1> get_next_prompt_label_char:
   260 000079E0 803E20              <1> 	cmp	byte [esi], 20h
   261 000079E3 7203                <1> 	jb	short pass_prompt_label
   262 000079E5 A4                  <1> 	movsb
   263 000079E6 EBF8                <1> 	jmp	short get_next_prompt_label_char
   264                              <1> pass_prompt_label:
   265 000079E8 C6075D              <1> 	mov	byte [edi], "]"
   266 000079EB 47                  <1> 	inc	edi
   267 000079EC C60720              <1> 	mov	byte [edi], 20h
   268 000079EF 47                  <1> 	inc	edi
   269 000079F0 BE[4B790100]        <1> 	mov	esi, Current_Dir_Drv
   270 000079F5 66A5                <1> 	movsw
   271 000079F7 A4                  <1> 	movsb 
   272                              <1> loc_prompt_current_directory:
   273 000079F8 803E20              <1> 	cmp	byte [esi], 20h
   274 000079FB 7203                <1> 	jb	short pass_prompt_current_directory
   275 000079FD A4                  <1> 	movsb
   276 000079FE EBF8                <1> 	jmp	short loc_prompt_current_directory  
   277                              <1> pass_prompt_current_directory:
   278 00007A00 C6073E              <1> 	mov	byte [edi], '>'
   279 00007A03 47                  <1> 	inc	edi
   280 00007A04 C60700              <1> 	mov	byte [edi], 0  
   281 00007A07 BE[4A7A0100]        <1> 	mov	esi, TextBuffer
   282 00007A0C E839F3FFFF          <1> 	call	print_msg
   283                              <1>         
   284                              <1> 	;sub	bh, bh ; video page = 0
   285                              <1> 	;call	get_cpos ; get cursor position
   286 00007A11 668B15[A6780100]    <1> 	mov	dx, [CURSOR_POSN] ; video page 0
   287 00007A18 8815[AA790100]      <1> 	mov	[CursorColumn], dl
   288                              <1> 
   289                              <1> 	; 30/01/2016 (to show cursor on the row, again)
   290                              <1> 	; (Initial color attributes of video page 0 is 0)
   291                              <1> 	; (see: 'StartPMP' in trdos386.s)
   292                              <1> 	; 
   293                              <1> 	;mov	edi, 0B8000h ; start of video page 0
   294                              <1> 	;movzx	ecx, dl ; column	 
   295                              <1> 	;mov	al, 80
   296                              <1> 	;mul	dh
   297                              <1> 	;add	ax, cx
   298                              <1> 	;shl	ax, 1 ; character + attribute
   299                              <1> 	;add	di, ax ; (2*80*row) + (2*column)
   300                              <1> 	;neg	cl
   301                              <1> 	;add	cl, 80
   302                              <1> 	;mov	ax, 700h ;  ah = 7 (color attribute)
   303                              <1> 	;rep	stosw	
   304                              <1> 
   305                              <1> loc_rw_char:
   306 00007A1E E8AB000000          <1> 	call	rw_char
   307                              <1> loc_move_command:
   308 00007A23 BE[FA790100]        <1> 	mov	esi, CommandBuffer
   309 00007A28 89F7                <1> 	mov	edi, esi
   310 00007A2A 31C9                <1> 	xor	ecx, ecx
   311                              <1> first_command_char:
   312 00007A2C AC                  <1> 	lodsb
   313 00007A2D 3C20                <1> 	cmp	al, 20h
   314 00007A2F 770C                <1> 	ja	short pass_space_control
   315 00007A31 723F                <1> 	jb	short loc_move_cmd_arguments_ok
   316 00007A33 81FE[497A0100]      <1> 	cmp	esi, CommandBuffer + 79
   317 00007A39 72F1                <1> 	jb	short first_command_char
   318 00007A3B EB35                <1> 	jmp	short loc_move_cmd_arguments_ok
   319                              <1> 
   320                              <1> 	; 26/07/2022
   321                              <1> pass_space_control:
   322 00007A3D 3C61                <1> 	cmp	al, 61h
   323 00007A3F 7206                <1> 	jb	short pass_capitalize
   324 00007A41 3C7A                <1> 	cmp	al, 7Ah
   325 00007A43 7702                <1> 	ja	short pass_capitalize
   326 00007A45 24DF                <1> 	and	al, 0DFh
   327                              <1> pass_capitalize:
   328 00007A47 AA                  <1> 	stosb   
   329 00007A48 FEC1                <1> 	inc     cl
   330 00007A4A 81FE[497A0100]      <1> 	cmp     esi, CommandBuffer + 79
   331                              <1> 	;jb	short next_command_char
   332                              <1> 	; 26/07/2022
   333 00007A50 7320                <1> 	jnb	short loc_move_cmd_arguments_ok
   334                              <1> 
   335                              <1> next_command_char:
   336 00007A52 AC                  <1> 	lodsb
   337 00007A53 3C20                <1> 	cmp	al, 20h
   338 00007A55 77E6                <1> 	ja	short pass_space_control
   339 00007A57 7219                <1> 	jb	short loc_move_cmd_arguments_ok
   340                              <1> 
   341                              <1> loc_1st_cmd_arg: ; 30/01/2016
   342 00007A59 AC                  <1> 	lodsb
   343 00007A5A 3C20                <1> 	cmp	al, 20h
   344 00007A5C 74FB                <1> 	je	short loc_1st_cmd_arg
   345 00007A5E 7212                <1> 	jb	short loc_move_cmd_arguments_ok
   346                              <1> 	
   347 00007A60 C60700              <1>         mov     byte [edi], 0
   348 00007A63 47                  <1> 	inc	edi
   349                              <1> 
   350                              <1> loc_move_cmd_arguments:
   351 00007A64 AA                  <1> 	stosb
   352 00007A65 81FE[497A0100]      <1> 	cmp	esi, CommandBuffer + 79
   353 00007A6B 7305                <1> 	jnb	short loc_move_cmd_arguments_ok
   354 00007A6D AC                  <1>         lodsb
   355 00007A6E 3C20                <1> 	cmp	al, 20h
   356 00007A70 73F2                <1> 	jnb	short loc_move_cmd_arguments
   357                              <1> 	; 26/07/2022
   358                              <1> 	;jmp	short loc_move_cmd_arguments_ok
   359                              <1> 
   360                              <1> ; 26/07/2022
   361                              <1> ;pass_space_control:
   362                              <1> ;	cmp	al, 61h
   363                              <1> ;	jb	short pass_capitalize
   364                              <1> ;	cmp	al, 7Ah
   365                              <1> ;	ja	short pass_capitalize
   366                              <1> ;	and	al, 0DFh
   367                              <1> ;pass_capitalize:
   368                              <1> ;	stosb   
   369                              <1> ;	inc     cl
   370                              <1> ;	cmp     esi, CommandBuffer + 79
   371                              <1> ;	jb      short next_command_char 
   372                              <1> 
   373                              <1> loc_move_cmd_arguments_ok:
   374 00007A72 C60700              <1>         mov     byte [edi], 0
   375                              <1> 
   376                              <1> call_command_interpreter:
   377 00007A75 E8FD070000          <1> 	call    command_interpreter
   378                              <1> 
   379                              <1> return_from_cmd_interpreter:
   380 00007A7A B950000000          <1>         mov	ecx, 80
   381                              <1> 	;mov	cx, 80
   382 00007A7F BF[FA790100]        <1> 	mov	edi, CommandBuffer
   383 00007A84 30C0                <1> 	xor	al, al
   384 00007A86 F3AA                <1> 	rep	stosb
   385                              <1> 	;cmp	byte [Program_Exit], 0
   386                              <1> 	;ja	short loc_terminate_trdos
   387                              <1>         
   388                              <1> 	; 16/01/2016
   389 00007A88 803D[BE670000]03    <1> 	cmp	byte [CRT_MODE], 3 ; 80*25 color
   390 00007A8F 7419                <1> 	je	short pass_set_txt_mode
   391                              <1> 
   392 00007A91 E8A2A0FFFF          <1> 	call	set_txt_mode ; set vide mode to 03h
   393                              <1> 	; 07/01/2017
   394 00007A96 30C0                <1> 	xor	al, al
   395                              <1> 
   396                              <1> loc_check_active_page:
   397                              <1> 	;xor	al, al
   398 00007A98 3805[B6780100]      <1> 	cmp	[ACTIVE_PAGE], al ; 0
   399                              <1>         ;je	loc_TRDOS_prompt
   400                              <1> 	; 26/07/2022
   401 00007A9E 7405                <1> 	je	short loc_prompt_again
   402                              <1> 
   403                              <1> 	; AL = 0 = video page 0
   404 00007AA0 E8BBA4FFFF          <1> 	call	set_active_page
   405                              <1> loc_prompt_again: ; 26/07/2022		
   406 00007AA5 E928FFFFFF          <1>         jmp     loc_TRDOS_prompt ; infinitive loop
   407                              <1> 
   408                              <1> pass_set_txt_mode: 
   409 00007AAA BE[473B0100]        <1> 	mov	esi, nextline
   410 00007AAF E896F2FFFF          <1> 	call	print_msg
   411 00007AB4 EBE2                <1> 	jmp     short loc_check_active_page
   412                              <1> 
   413                              <1> ;rw_char:
   414                              <1> 	; 26/07/2022 (TRDOS 386 Kernel v2.0.5)
   415                              <1> loc_arrow:    
   416 00007AB6 80FC4B              <1> 	cmp	ah, 4Bh
   417 00007AB9 7426                <1> 	je	short loc_back
   418 00007ABB 80FC53              <1> 	cmp	ah, 53h
   419 00007ABE 7421                <1> 	je      short loc_back
   420 00007AC0 80FC4D              <1> 	cmp	ah, 4Dh
   421 00007AC3 7509                <1> 	jne	short readnextchar
   422 00007AC5 80FA4F              <1> 	cmp	dl, 79
   423 00007AC8 7304                <1> 	jnb	short readnextchar
   424 00007ACA FEC2                <1> 	inc	dl
   425 00007ACC EB1D                <1> 	jmp	short set_cursor_pos
   426                              <1> 
   427                              <1> rw_char: 
   428                              <1> 	; 26/07/2022 (TRDOS 386 Kernel v2.0.5)
   429                              <1> 	; 13/05/2016
   430                              <1> 	; 30/01/2016
   431                              <1> 	; 29/01/2016
   432                              <1> 	; 17/01/2016 (TRDOS 386 = TRDOS v2.0)
   433                              <1> 	; 2004-2005
   434                              <1> 	
   435                              <1> 	; DH = cursor row, DL = cursor column
   436                              <1> 	; BH = 0 = video page number (active page)
   437                              <1> 
   438                              <1> 	;xor	bh, bh ; 0 = video page 0
   439                              <1> 
   440                              <1> readnextchar:
   441 00007ACE 30E4                <1> 	xor     ah, ah
   442 00007AD0 E83E94FFFF          <1> 	call	int16h
   443 00007AD5 20C0                <1> 	and	al, al
   444 00007AD7 74DD                <1> 	jz	short loc_arrow    
   445 00007AD9 3CE0                <1> 	cmp	al, 0E0h          
   446 00007ADB 74D9                <1> 	je	short loc_arrow
   447 00007ADD 3C08                <1> 	cmp	al, 08h             
   448 00007ADF 752A                <1> 	jne	short char_return
   449                              <1> loc_back:
   450 00007AE1 3A15[AA790100]      <1> 	cmp	dl, [CursorColumn]
   451 00007AE7 76E5                <1> 	jna     short readnextchar
   452                              <1> prev_column:
   453 00007AE9 FECA                <1> 	dec	dl
   454                              <1> set_cursor_pos:
   455                              <1> 	;push	dx
   456 00007AEB 52                  <1> 	push	edx ; 29/12/2017
   457                              <1> 	;xor	bh, bh ; 0 = video page 0
   458                              <1> 	; DH = Row, DL = Column
   459 00007AEC E833A8FFFF          <1> 	call	_set_cpos ; 17/01/2016
   460 00007AF1 5A                  <1>         pop	edx ; 29/12/2017
   461                              <1> 	;pop	dx
   462                              <1> 	;movzx	ebx, dl
   463 00007AF2 88D3                <1> 	mov	bl, dl
   464 00007AF4 2A1D[AA790100]      <1> 	sub	bl, [CursorColumn] 
   465 00007AFA B020                <1> 	mov	al, 20h
   466 00007AFC 8883[FA790100]      <1> 	mov	[CommandBuffer+ebx], al
   467                              <1> 	;sub	bh, bh ; video page 0
   468                              <1> 	;mov	cx, 1
   469 00007B02 B307                <1> 	mov	bl, 7 ; color attribute
   470                              <1> 	; bh = 0 ; 26/07/2022
   471 00007B04 E802A7FFFF          <1> 	call	_write_c_current ; 17/01/2016
   472                              <1> 	;mov	dx, [CURSOR_POSN]
   473 00007B09 EBC3                <1> 	jmp	short readnextchar
   474                              <1> 
   475                              <1> 	; 26/07/2022
   476                              <1> ;loc_arrow:    
   477                              <1> ;	cmp	ah, 4Bh
   478                              <1> ;	je	short loc_back
   479                              <1> ;	cmp	ah, 53h
   480                              <1> ;	je      short loc_back
   481                              <1> ;	cmp	ah, 4Dh
   482                              <1> ;	jne	short readnextchar
   483                              <1> ;	cmp	dl, 79
   484                              <1> ;	jnb	short readnextchar
   485                              <1> ;	inc	dl
   486                              <1> ;	jmp	short set_cursor_pos
   487                              <1> 
   488                              <1> char_return:
   489 00007B0B 0FB6DA              <1> 	movzx	ebx, dl
   490 00007B0E 2A1D[AA790100]      <1> 	sub	bl, [CursorColumn] 
   491 00007B14 3C20                <1> 	cmp	al, 20h
   492 00007B16 721D                <1> 	jb	short loc_escape
   493 00007B18 8883[FA790100]      <1> 	mov	[CommandBuffer+ebx], al
   494 00007B1E 80FA4F              <1> 	cmp	dl, 79
   495 00007B21 73AB                <1> 	jnb	short readnextchar
   496 00007B23 66BB0700            <1> 	mov	bx, 7 ; color attribute
   497 00007B27 E860A7FFFF          <1> 	call	_write_tty
   498 00007B2C 668B15[A6780100]    <1> 	mov	dx, [CURSOR_POSN] ; video page 0
   499 00007B33 EB99                <1>         jmp	short readnextchar ; 26/07/2022
   500                              <1> 
   501                              <1> loc_escape:
   502 00007B35 3C1B                <1> 	cmp	al, 1Bh
   503 00007B37 7414                <1> 	je	short rw_char_retn
   504                              <1> 	;
   505 00007B39 3C0D                <1> 	cmp	al, 0Dh ; CR
   506 00007B3B 7591                <1>         jne	short readnextchar ; 26/07/2022
   507                              <1> 
   508                              <1> 	; 13/05/2016
   509 00007B3D 66BB0700            <1> 	mov	bx, 7 ; attribute/color (bl)
   510                              <1> 		      ; video page 0 (bh=0)	
   511 00007B41 E846A7FFFF          <1> 	call	_write_tty
   512                              <1> 	;mov	bx, 7  ; attribute/color
   513                              <1> 		      ; video page 0 (bh=0)
   514 00007B46 B00A                <1> 	mov	al, 0Ah ; LF
   515 00007B48 E83FA7FFFF          <1> 	call	_write_tty
   516                              <1> rw_char_retn:
   517 00007B4D C3                  <1> 	retn
   518                              <1> 
   519                              <1> show_date:
   520                              <1> 	; 26/07/2022 (TRDOS 386 Kernel v2.0.5)
   521                              <1> 	; 18/01/2016 (TRDOS 386 = TRDOS v2.0)
   522                              <1>         ; 2004-2005
   523                              <1> 
   524                              <1> 	;mov	ah, 04h
   525                              <1> 	;call	int1Ah
   526 00007B4E E801E8FFFF          <1> 	call	RTC_40	; GET RTC DATE
   527                              <1> 
   528 00007B53 88D0                <1> 	mov	al, dl
   529 00007B55 E8AC93FFFF          <1>   	call	bcd_to_ascii
   530 00007B5A 66A3[04320100]      <1> 	mov	[Day], ax
   531                              <1> 
   532 00007B60 88F0                <1> 	mov	al, dh
   533 00007B62 E89F93FFFF          <1>   	call	bcd_to_ascii
   534 00007B67 66A3[07320100]      <1> 	mov	[Month], ax
   535                              <1> 
   536 00007B6D 88E8                <1> 	mov	al, ch
   537 00007B6F E89293FFFF          <1>   	call	bcd_to_ascii
   538 00007B74 66A3[0A320100]      <1> 	mov	[Century], ax
   539                              <1> 
   540 00007B7A 88C8                <1> 	mov	al, cl
   541 00007B7C E88593FFFF          <1>   	call	bcd_to_ascii
   542 00007B81 66A3[0C320100]      <1> 	mov	[Year], ax
   543                              <1> 
   544 00007B87 BE[F4310100]        <1> 	mov	esi, Msg_Show_Date
   545                              <1> 	;call	print_msg
   546                              <1> 	;retn
   547                              <1> 	; 26/07/2022
   548 00007B8C E9B9F1FFFF          <1> 	jmp	print_msg
   549                              <1> 
   550                              <1> set_date:
   551                              <1> 	; 26/07/2022 (TRDOS 386 Kernel v2.0.5)
   552                              <1> 	; 13/05/2016
   553                              <1> 	; 18/01/2016 (TRDOS 386 = TRDOS v2.0)
   554                              <1>         ; 2004-2005
   555                              <1> 
   556 00007B91 BE[D8310100]        <1> 	mov	esi, Msg_Enter_Date
   557 00007B96 E8AFF1FFFF          <1> 	call	print_msg
   558                              <1> 
   559                              <1> loc_enter_day_1:
   560 00007B9B 30E4                <1> 	xor     ah, ah
   561 00007B9D E87193FFFF          <1> 	call	int16h
   562                              <1> 	; AL = ASCII Code of the Character
   563 00007BA2 3C0D                <1> 	cmp	al, 13
   564                              <1> 	;je	loc_set_date_retn
   565                              <1> 	; 26/07/2022
   566 00007BA4 7404                <1> 	je	short set_date_0
   567 00007BA6 3C1B                <1> 	cmp	al, 27
   568                              <1> 	;je	loc_set_date_retn
   569                              <1> 	; 26/07/2022
   570 00007BA8 7511                <1> 	jne	short set_date_1
   571                              <1> 
   572                              <1> set_date_0:
   573                              <1> ;loc_set_date_retn:
   574 00007BAA BE[473B0100]        <1> 	mov	esi, nextline
   575                              <1> 	;call	print_msg
   576                              <1> 	;retn
   577                              <1> 	; 26/07/2022
   578 00007BAF E996F1FFFF          <1> 	jmp	print_msg
   579                              <1> 
   580                              <1> 	; 26/07/2022
   581                              <1> loc_set_date_stc_0:
   582                              <1> 	;xor	bh, bh ; video page 0
   583 00007BB4 E8BDA7FFFF          <1> 	call	beeper ; BEEP !
   584 00007BB9 EBE0                <1> 	jmp	short loc_enter_day_1
   585                              <1> 
   586                              <1> 	; 26/07/2022
   587                              <1> set_date_1:
   588 00007BBB A2[04320100]        <1> 	mov	[Day], al
   589 00007BC0 3C30                <1> 	cmp	al, '0'
   590 00007BC2 72F0                <1> 	jb	short loc_set_date_stc_0
   591 00007BC4 3C33                <1> 	cmp	al, '3'
   592 00007BC6 77EC                <1> 	ja	short loc_set_date_stc_0
   593                              <1> 	; 13/05/2016
   594                              <1> 	;mov	bx, 7 ; attribute/color (bl)
   595                              <1> 		      ; video page 0 (bh)	
   596 00007BC8 B307                <1> 	mov	bl, 7
   597 00007BCA E8BDA6FFFF          <1> 	call	_write_tty
   598                              <1> loc_enter_day_2:
   599 00007BCF 30E4                <1> 	xor     ah, ah
   600 00007BD1 E83D93FFFF          <1> 	call	int16h
   601                              <1> 	; AL = ASCII Code of the Character
   602 00007BD6 3C1B                <1> 	cmp	al, 27
   603                              <1>         ;je	loc_set_date_retn
   604                              <1> 	; 26/07/2022
   605 00007BD8 74D0                <1> 	je	short set_date_0
   606 00007BDA A2[05320100]        <1> 	mov	[Day+1], al
   607 00007BDF 3C30                <1> 	cmp	al, '0'
   608 00007BE1 7211                <1>         jb      short loc_set_date_stc_1
   609 00007BE3 3C39                <1> 	cmp	al, '9'
   610 00007BE5 770D                <1>         ja      short loc_set_date_stc_1
   611 00007BE7 803D[04320100]33    <1> 	cmp	byte [Day], '3'
   612 00007BEE 7219                <1> 	jb	short pass_set_day_31
   613 00007BF0 3C31                <1> 	cmp	al, '1'
   614                              <1>         ;ja	loc_set_date_stc_1
   615                              <1> 	; 26/07/2022
   616 00007BF2 7615                <1> 	jna	short pass_set_day_31
   617                              <1> 
   618                              <1> 	; 26/07/2022
   619                              <1> loc_set_date_stc_1:
   620 00007BF4 E8E4010000          <1> 	call	check_for_backspace
   621 00007BF9 7407                <1> 	je	short loc_set_date_bs_1
   622                              <1> 	;xor	bh, bh ; video page 0
   623 00007BFB E876A7FFFF          <1> 	call	beeper ; BEEP !
   624 00007C00 EBCD                <1> 	jmp	short loc_enter_day_2
   625                              <1> loc_set_date_bs_1:
   626 00007C02 E8C4010000          <1> 	call	write_backspace
   627 00007C07 EB92                <1> 	jmp     short loc_enter_day_1
   628                              <1> 
   629                              <1> pass_set_day_31:
   630                              <1> 	; 13/05/2016
   631                              <1> 	;mov	bx, 7 ; attribute/color (bl)
   632                              <1> 		      ; video page 0 (bh)	
   633 00007C09 B307                <1> 	mov	bl, 7
   634 00007C0B E87CA6FFFF          <1> 	call	_write_tty
   635                              <1> loc_enter_separator_1:
   636 00007C10 28E4                <1> 	sub     ah, ah ; 0
   637 00007C12 E8FC92FFFF          <1> 	call	int16h
   638                              <1> 	; AL = ASCII Code of the Character
   639 00007C17 3C1B                <1> 	cmp	al, 27
   640                              <1>         ;je	loc_set_date_retn
   641                              <1> 	; 26/07/2022
   642 00007C19 748F                <1> 	je	short set_date_0
   643 00007C1B 3C2D                <1> 	cmp	al, '-'
   644 00007C1D 7443                <1> 	je	short pass_set_date_separator_1
   645 00007C1F 3C2F                <1> 	cmp	al, '/'
   646                              <1> 	;jne	loc_set_date_stc_2
   647                              <1> 	; 26/07/2022
   648 00007C21 743F                <1> 	je	short pass_set_date_separator_1
   649                              <1> 
   650                              <1> 	; 26/07/2022
   651                              <1> loc_set_date_stc_2:
   652 00007C23 E8B5010000          <1> 	call	check_for_backspace
   653 00007C28 7407                <1> 	je	short loc_set_date_bs_2
   654                              <1> 	;xor	bh, bh ; video page 0
   655 00007C2A E847A7FFFF          <1> 	call	beeper ; BEEP !
   656 00007C2F EBDF                <1> 	jmp	short loc_enter_separator_1
   657                              <1> loc_set_date_bs_2:
   658 00007C31 E895010000          <1> 	call	write_backspace
   659 00007C36 EB97                <1> 	jmp	short loc_enter_day_2
   660                              <1> 
   661                              <1> 	; 26/07/2022
   662                              <1> loc_set_date_stc_3:
   663 00007C38 E8A0010000          <1> 	call	check_for_backspace
   664 00007C3D 7407                <1> 	je	short loc_set_date_bs_3
   665                              <1> 	;xor	bh, bh ; video page 0
   666 00007C3F E832A7FFFF          <1> 	call	beeper ; BEEP !
   667 00007C44 EB23                <1> 	jmp	short loc_enter_month_1
   668                              <1> loc_set_date_bs_3:
   669 00007C46 E880010000          <1> 	call	write_backspace
   670 00007C4B EBC3                <1> 	jmp	short loc_enter_separator_1
   671                              <1> 
   672                              <1> 	; 26/07/2022
   673                              <1> loc_set_date_stc_4:
   674 00007C4D E88B010000          <1> 	call	check_for_backspace
   675 00007C52 7407                <1> 	je	short loc_set_date_bs_4
   676                              <1> 	;xor	bh, bh ; video page 0
   677 00007C54 E81DA7FFFF          <1> 	call	beeper ; BEEP !
   678 00007C59 EB2D                <1> 	jmp	short loc_enter_month_2
   679                              <1> loc_set_date_bs_4:
   680 00007C5B E86B010000          <1> 	call	write_backspace
   681 00007C60 EB07                <1> 	jmp	short loc_enter_month_1
   682                              <1> 	
   683                              <1> pass_set_date_separator_1:
   684                              <1> 	; 13/05/2016
   685                              <1> 	;mov	bx, 7 ; attribute/color (bl)
   686                              <1> 		      ; video page 0 (bh)
   687 00007C62 B307                <1> 	mov	bl, 7	
   688 00007C64 E823A6FFFF          <1> 	call	_write_tty
   689                              <1> loc_enter_month_1:
   690 00007C69 30E4                <1> 	xor     ah, ah ; 0
   691 00007C6B E8A392FFFF          <1> 	call	int16h
   692                              <1> 	; AL = ASCII Code of the Character
   693 00007C70 3C1B                <1> 	cmp	al, 27
   694                              <1>         ;je	loc_set_date_retn
   695                              <1> 	; 26/07/2022
   696                              <1> 	;je	short loc_set_date_ok
   697                              <1> 	; 07/08/2022
   698 00007C72 741F                <1> 	je	short jmp_loc_set_date_ok
   699 00007C74 A2[07320100]        <1> 	mov	[Month], al
   700 00007C79 3C30                <1> 	cmp	al, '0'
   701 00007C7B 72BB                <1>         jb      short loc_set_date_stc_3
   702 00007C7D 3C31                <1> 	cmp	al, '1'
   703 00007C7F 77B7                <1>         ja	short loc_set_date_stc_3
   704                              <1> 	; 13/05/2016
   705                              <1> 	;mov	bx, 7 ; attribute/color (bl)
   706                              <1> 		      ; video page 0 (bh)	
   707 00007C81 B307                <1> 	mov	bl, 7
   708 00007C83 E804A6FFFF          <1> 	call	_write_tty
   709                              <1> loc_enter_month_2:
   710 00007C88 30E4                <1> 	xor     ah, ah
   711 00007C8A E88492FFFF          <1> 	call	int16h
   712                              <1> 	; AL = ASCII Code of the Character
   713 00007C8F 3C1B                <1> 	cmp	al, 27
   714                              <1>         ;;je	loc_set_date_retn
   715                              <1> 	; 26/07/2022
   716                              <1> 	;je	short loc_set_date_ok
   717                              <1> 	; 07/08/2022
   718 00007C91 7505                <1> 	jne	short loc_enter_month_3
   719                              <1> jmp_loc_set_date_ok:	
   720 00007C93 E996000000          <1> 	jmp	loc_set_date_ok 
   721                              <1> loc_enter_month_3:
   722 00007C98 A2[08320100]        <1> 	mov	[Month+1], al
   723 00007C9D 3C30                <1> 	cmp	al, '0'
   724 00007C9F 72AC                <1>         jb	short loc_set_date_stc_4
   725 00007CA1 3C39                <1> 	cmp	al, '9'
   726 00007CA3 77A8                <1>         ja	short loc_set_date_stc_4
   727 00007CA5 803D[07320100]31    <1> 	cmp	byte [Month], '1'
   728 00007CAC 7204                <1> 	jb	short pass_set_month_12
   729 00007CAE 3C32                <1> 	cmp	al, '2'
   730 00007CB0 779B                <1>         ja	short loc_set_date_stc_4
   731                              <1> pass_set_month_12:
   732                              <1> 	; 13/05/2016
   733                              <1> 	;mov	bx, 7 ; attribute/color (bl)
   734                              <1> 		      ; video page 0 (bh)
   735 00007CB2 B307                <1> 	mov	bl, 7	
   736 00007CB4 E8D3A5FFFF          <1> 	call	_write_tty
   737                              <1> loc_enter_separator_2:
   738 00007CB9 28E4                <1> 	sub     ah, ah
   739 00007CBB E85392FFFF          <1> 	call	int16h
   740                              <1> 	; AL = ASCII Code of the Character
   741 00007CC0 3C1B                <1> 	cmp	al, 27
   742                              <1>         ;je	loc_set_date_retn
   743                              <1> 	; 26/07/2022
   744 00007CC2 746A                <1> 	je	short loc_set_date_ok
   745 00007CC4 3C2D                <1> 	cmp	al, '-'
   746 00007CC6 7404                <1> 	je	short pass_set_date_separator_2
   747 00007CC8 3C2F                <1> 	cmp	al, '/'
   748 00007CCA 756C                <1>         jne	short loc_set_date_stc_5
   749                              <1> pass_set_date_separator_2:
   750                              <1> 	; 13/05/2016
   751                              <1> 	;mov	bx, 7 ; attribute/color (bl)
   752                              <1> 		      ; video page 0 (bh)	
   753 00007CCC B307                <1> 	mov	bl, 7
   754 00007CCE E8B9A5FFFF          <1> 	call	_write_tty
   755                              <1> loc_enter_year_1:
   756 00007CD3 30E4                <1> 	xor    ah, ah
   757 00007CD5 E83992FFFF          <1> 	call	int16h
   758                              <1> 	; AL = ASCII Code of the Character
   759 00007CDA 3C1B                <1> 	cmp	al, 27
   760                              <1>         ;je	loc_set_date_retn
   761                              <1> 	; 26/07/2022
   762 00007CDC 7450                <1> 	je	short loc_set_date_ok
   763 00007CDE A2[0C320100]        <1> 	mov	[Year], al
   764 00007CE3 3C30                <1> 	cmp	al, '0'
   765 00007CE5 726C                <1>         jb	short loc_set_date_stc_6
   766 00007CE7 3C39                <1> 	cmp	al, '9'
   767 00007CE9 7768                <1>         ja	short loc_set_date_stc_6
   768                              <1> 	; 13/05/2016
   769                              <1> 	;mov	bx, 7 ; attribute/color (bl)
   770                              <1> 		      ; video page 0 (bh)
   771 00007CEB B307                <1> 	mov	bl, 7	
   772 00007CED E89AA5FFFF          <1> 	call	_write_tty
   773                              <1> loc_enter_year_2:
   774 00007CF2 30E4                <1> 	xor	ah, ah
   775 00007CF4 E81A92FFFF          <1> 	call	int16h
   776                              <1> 	; AL = ASCII Code of the Character
   777 00007CF9 3C1B                <1> 	cmp	al, 27
   778                              <1> 	;je	short loc_set_date_retn
   779                              <1> 	; 26/07/2022
   780 00007CFB 7431                <1> 	je	short loc_set_date_ok
   781 00007CFD A2[0D320100]        <1> 	mov	byte [Year+1], al
   782 00007D02 3C30                <1> 	cmp	al, '0'
   783 00007D04 7268                <1>         jb 	short loc_set_date_stc_7
   784 00007D06 3C39                <1> 	cmp	al, '9'
   785 00007D08 7764                <1>         ja	short loc_set_date_stc_7
   786                              <1> 	; 13/05/2016
   787                              <1> 	;mov	bx, 7 ; attribute/color (bl)
   788                              <1> 		      ; video page 0 (bh)
   789 00007D0A B307                <1> 	mov	bl, 7	
   790 00007D0C E87BA5FFFF          <1> 	call	_write_tty
   791                              <1> loc_set_date_get_lchar_again:
   792 00007D11 28E4                <1> 	sub	ah, ah ; 0
   793 00007D13 E8FB91FFFF          <1> 	call	int16h
   794                              <1> 	; AL = ASCII Code of the Character
   795 00007D18 3C0D                <1> 	cmp	al, 13 ; ENTER key
   796 00007D1A 746D                <1> 	je	short loc_set_date_progress
   797 00007D1C 3C1B                <1> 	cmp	al, 27 ; ESC key
   798                              <1> 	;je	short loc_set_date_retn
   799                              <1> 	; 26/07/2022
   800 00007D1E 740E                <1> 	je	short loc_set_date_ok
   801                              <1> 	;
   802 00007D20 E8B8000000          <1> 	call	check_for_backspace
   803 00007D25 75EA                <1> 	jne	short loc_set_date_get_lchar_again
   804                              <1> 
   805                              <1> loc_set_date_bs_8:
   806 00007D27 E89F000000          <1> 	call	write_backspace
   807 00007D2C EBC4                <1> 	jmp	short loc_enter_year_2
   808                              <1> 
   809                              <1> loc_set_date_ok:
   810                              <1> ;loc_set_date_retn:
   811 00007D2E BE[473B0100]        <1> 	mov	esi, nextline
   812                              <1> 	;call	print_msg
   813                              <1> 	;retn
   814                              <1> 	; 26/07/2022
   815 00007D33 E912F0FFFF          <1> 	jmp	print_msg
   816                              <1> 
   817                              <1> 	; 26/07/2022
   818                              <1> ;loc_set_date_stc_0:
   819                              <1> ;	;xor	bh, bh ; video page 0
   820                              <1> ;	call	beeper ; BEEP !
   821                              <1> ;	jmp	loc_enter_day_1
   822                              <1> ;loc_set_date_stc_1:
   823                              <1> ;	call	check_for_backspace
   824                              <1> ;	je	short loc_set_date_bs_1
   825                              <1> ;	;xor	bh, bh ; video page 0
   826                              <1> ;	call	beeper ; BEEP !
   827                              <1> ;	jmp	loc_enter_day_2
   828                              <1> ;loc_set_date_bs_1:
   829                              <1> ;	call	write_backspace
   830                              <1> ;	jmp     loc_enter_day_1
   831                              <1> ;loc_set_date_stc_2:
   832                              <1> ;	call	check_for_backspace
   833                              <1> ;	je	short loc_set_date_bs_2
   834                              <1> ;	;xor	bh, bh ; video page 0
   835                              <1> ;	call	beeper ; BEEP !
   836                              <1> ;	jmp	loc_enter_separator_1
   837                              <1> ;loc_set_date_bs_2:
   838                              <1> ;	call	write_backspace
   839                              <1> ;	jmp	loc_enter_day_2
   840                              <1> ;loc_set_date_stc_3:
   841                              <1> ;	call	check_for_backspace
   842                              <1> ;	je	short loc_set_date_bs_3
   843                              <1> ;	;xor	bh, bh ; video page 0
   844                              <1> ;	call	beeper ; BEEP !
   845                              <1> ;	jmp	loc_enter_month_1
   846                              <1> ;loc_set_date_bs_3:
   847                              <1> ;	call	write_backspace
   848                              <1> ;	jmp	loc_enter_separator_1
   849                              <1> ;loc_set_date_stc_4:
   850                              <1> ;	call	check_for_backspace
   851                              <1> ;	je	short loc_set_date_bs_4
   852                              <1> ;	;xor	bh, bh ; video page 0
   853                              <1> ;	call	beeper ; BEEP !
   854                              <1> ;	jmp	loc_enter_month_2
   855                              <1> ;loc_set_date_bs_4:
   856                              <1> ;	call	write_backspace
   857                              <1> ;	jmp	loc_enter_month_1
   858                              <1> 
   859                              <1> 	; 26/07/2022
   860                              <1> loc_set_date_stc_5:
   861 00007D38 E8A0000000          <1> 	call	check_for_backspace
   862 00007D3D 740A                <1> 	je	short loc_set_date_bs_5
   863                              <1> 	;xor	bh, bh ; video page 0
   864 00007D3F E832A6FFFF          <1> 	call	beeper ; BEEP !
   865 00007D44 E970FFFFFF          <1> 	jmp	loc_enter_separator_2
   866                              <1> loc_set_date_bs_5:
   867 00007D49 E87D000000          <1> 	call	write_backspace
   868 00007D4E E935FFFFFF          <1> 	jmp	loc_enter_month_2
   869                              <1> loc_set_date_stc_6:
   870 00007D53 E885000000          <1> 	call	check_for_backspace
   871 00007D58 740A                <1>         je      short loc_set_date_bs_6
   872                              <1> 	;xor	bh, bh ; video page 0
   873 00007D5A E817A6FFFF          <1> 	call	beeper ; BEEP !
   874 00007D5F E96FFFFFFF          <1> 	jmp	loc_enter_year_1
   875                              <1> loc_set_date_bs_6:
   876 00007D64 E862000000          <1> 	call	write_backspace
   877 00007D69 E94BFFFFFF          <1> 	jmp	loc_enter_separator_2
   878                              <1> loc_set_date_stc_7:
   879 00007D6E E86A000000          <1> 	call	check_for_backspace
   880 00007D73 740A                <1> 	je	short loc_set_date_bs_7
   881                              <1> 	;xor	bh, bh ; video page 0
   882 00007D75 E8FCA5FFFF          <1> 	call	beeper ; BEEP !
   883 00007D7A E973FFFFFF          <1> 	jmp	loc_enter_year_2
   884                              <1> loc_set_date_bs_7:
   885 00007D7F E847000000          <1> 	call	write_backspace
   886 00007D84 E94AFFFFFF          <1> 	jmp	loc_enter_year_1
   887                              <1> 
   888                              <1> loc_set_date_progress:
   889                              <1> 	; Get Current Date
   890                              <1> 	;mov	ah, 04h
   891                              <1> 	;call	int1Ah
   892 00007D89 E8C6E5FFFF          <1> 	call	RTC_40	; GET RTC DATE
   893                              <1> 	; CH = century (in BCD)
   894                              <1> 
   895 00007D8E 66A1[0C320100]      <1> 	mov	ax, [Year]
   896 00007D94 662D3030            <1> 	sub	ax, '00'
   897 00007D98 C0E004              <1> 	shl	al, 4 ; * 16
   898 00007D9B 88C1                <1> 	mov	cl, al
   899 00007D9D 00E1                <1> 	add	cl, ah
   900 00007D9F 66A1[07320100]      <1> 	mov	ax, [Month]
   901 00007DA5 662D3030            <1> 	sub	ax, '00'
   902 00007DA9 C0E004              <1> 	shl	al, 4 ; * 16
   903 00007DAC 88C6                <1> 	mov	dh, al
   904 00007DAE 00E6                <1> 	add	dh, ah
   905 00007DB0 66A1[04320100]      <1> 	mov	ax, [Day]
   906 00007DB6 662D3030            <1> 	sub	ax, '00'
   907 00007DBA C0E004              <1> 	shl	al, 4 ; * 16
   908 00007DBD 88C2                <1> 	mov	dl, al
   909 00007DBF 00E2                <1> 	add	dl, ah
   910                              <1> 
   911                              <1> 	;mov	ah, 05h
   912                              <1> 	;call	int1Ah
   913 00007DC1 E8B4E5FFFF          <1> 	call	RTC_50	; SET RTC DATE
   914                              <1> 
   915                              <1> ;loc_set_date_retn:
   916                              <1> ;	mov	esi, nextline
   917                              <1> ;	;call	print_msg
   918                              <1> ;	;retn
   919                              <1> ;	; 26/07/2022
   920                              <1> ;	jmp	print_msg
   921                              <1> 
   922                              <1> 	; 26/07/2022
   923 00007DC6 E963FFFFFF          <1> 	jmp	loc_set_date_ok 
   924                              <1> 
   925                              <1> write_backspace:
   926                              <1> 	; 18/01/2016 (TRDOS 386 = TRDOS v2.0)
   927 00007DCB B008                <1> 	mov	al, 08h ; BACKSPACE
   928                              <1> 	; 13/05/2016
   929 00007DCD 66BB0700            <1> 	mov	bx, 7 ; bl = attribute/color
   930                              <1> 		      ; bh = video page = 0	
   931 00007DD1 E8B6A4FFFF          <1> 	call	_write_tty
   932 00007DD6 B020                <1> 	mov	al, 20h ; BLANK/SPACE char 
   933                              <1> 	;mov	bx, 7 ; attribute/color
   934                              <1> 	;call	_write_c_current
   935                              <1> 	;retn
   936 00007DD8 E92EA4FFFF          <1> 	jmp	_write_c_current
   937                              <1> 
   938                              <1> check_for_backspace:
   939                              <1> 	; 18/01/2016 (TRDOS 386 = TRDOS v2.0)
   940 00007DDD 663D080E            <1> 	cmp	ax, 0E08h
   941 00007DE1 7410                <1> 	je	short cfbs_retn
   942 00007DE3 663DE04B            <1> 	cmp	ax, 4BE0h
   943 00007DE7 740A                <1> 	je	short cfbs_retn
   944 00007DE9 663D004B            <1> 	cmp	ax, 4B00h
   945 00007DED 7404                <1> 	je	short cfbs_retn
   946 00007DEF 663DE053            <1> 	cmp	ax, 53E0h
   947                              <1> cfbs_retn:
   948 00007DF3 C3                  <1> 	retn
   949                              <1> 
   950                              <1> show_time:
   951                              <1> 	; 26/07/2022 (TRDOS 386 Kernel v2.0.5)
   952                              <1> 	; 18/01/2016 (TRDOS 386 = TRDOS v2.0)
   953                              <1>         ; 2004-2005
   954                              <1> 
   955                              <1> 	;mov	ah, 02h
   956                              <1> 	;call	int1Ah
   957 00007DF4 E8F0E4FFFF          <1> 	call	RTC_20	; GET RTC TIME
   958                              <1> 	
   959 00007DF9 88E8                <1> 	mov	al, ch
   960 00007DFB E80691FFFF          <1> 	call	bcd_to_ascii
   961 00007E00 66A3[32320100]      <1> 	mov	[Hour], ax
   962                              <1> 
   963 00007E06 88C8                <1> 	mov	al, cl
   964 00007E08 E8F990FFFF          <1> 	call	bcd_to_ascii
   965 00007E0D 66A3[35320100]      <1> 	mov	[Minute], ax
   966                              <1> 
   967 00007E13 88F0                <1> 	mov	al, dh
   968 00007E15 E8EC90FFFF          <1> 	call	bcd_to_ascii
   969 00007E1A 66A3[38320100]      <1> 	mov	[Second], ax
   970                              <1> 
   971 00007E20 BE[22320100]        <1> 	mov	esi, Msg_Show_Time
   972                              <1> 	;call	print_msg
   973                              <1> 	;retn
   974                              <1> 	; 26/07/2022
   975 00007E25 E920EFFFFF          <1> 	jmp	print_msg
   976                              <1> 
   977                              <1> set_time:
   978                              <1> 	; 26/07/2022 (TRDOS 386 Kernel v2.0.5)
   979                              <1> 	; 13/05/2016
   980                              <1> 	; 18/01/2016 (TRDOS 386 = TRDOS v2.0)
   981                              <1>         ; 2004-2005
   982                              <1> 
   983 00007E2A BE[11320100]        <1> 	mov 	esi, Msg_Enter_Time
   984 00007E2F E816EFFFFF          <1> 	call	print_msg
   985                              <1> 
   986                              <1> loc_enter_hour_1:
   987 00007E34 30E4                <1> 	xor     ah, ah
   988 00007E36 E8D890FFFF          <1> 	call	int16h
   989                              <1> 	; AL = ASCII Code of the Character
   990 00007E3B 3C0D                <1> 	cmp	al, 13 ; ENTER key
   991 00007E3D 742D                <1>         je	short loc_set_time_retn
   992 00007E3F 3C1B                <1> 	cmp	al, 27 ; ESC key
   993 00007E41 7429                <1>         je	short loc_set_time_retn
   994                              <1> set_time_0:
   995 00007E43 A2[32320100]        <1> 	mov	[Hour], al
   996 00007E48 3C30                <1> 	cmp	al, '0'
   997 00007E4A 7204                <1>         jb	short loc_set_time_stc_0
   998 00007E4C 3C32                <1> 	cmp	al, '2'
   999                              <1>  	;ja	loc_set_time_stc_0
  1000                              <1> 	; 26/07/2022
  1001 00007E4E 7626                <1> 	jna	short set_time_1
  1002                              <1> 
  1003                              <1> 	; 26/07/2022
  1004                              <1> loc_set_time_stc_0:
  1005                              <1> 	;xor	bh, bh ; video page 0
  1006 00007E50 E821A5FFFF          <1> 	call	beeper ; BEEP !
  1007 00007E55 EBDD                <1> 	jmp	short loc_enter_hour_1
  1008                              <1> 
  1009                              <1> loc_set_time_stc_1:
  1010 00007E57 E881FFFFFF          <1> 	call	check_for_backspace
  1011 00007E5C 7407                <1> 	je	short loc_set_time_bs_1
  1012                              <1> 	;xor	bh, bh ; video page 0
  1013 00007E5E E813A5FFFF          <1> 	call	beeper ; BEEP !
  1014 00007E63 EB18                <1> 	jmp	short loc_enter_hour_2
  1015                              <1> loc_set_time_bs_1:
  1016 00007E65 E861FFFFFF          <1> 	call	write_backspace
  1017 00007E6A EBC8                <1> 	jmp	short loc_enter_hour_1
  1018                              <1> 
  1019                              <1> 	; 26/07/2022
  1020                              <1> loc_set_time_retn:
  1021 00007E6C BE[473B0100]        <1> 	mov 	esi, nextline
  1022                              <1> 	;call	print_msg
  1023                              <1> 	;retn
  1024 00007E71 E9D4EEFFFF          <1> 	jmp	print_msg
  1025                              <1> 
  1026                              <1> set_time_1:
  1027                              <1> 	; 13/05/2016
  1028                              <1> 	;mov	bx, 7 ; attribute/color (bl)
  1029                              <1> 		      ; video page 0 (bh)
  1030 00007E76 B307                <1> 	mov	bl, 7	
  1031 00007E78 E80FA4FFFF          <1> 	call	_write_tty
  1032                              <1> loc_enter_hour_2:
  1033 00007E7D 30E4                <1> 	xor     ah, ah
  1034 00007E7F E88F90FFFF          <1> 	call	int16h
  1035                              <1> 	; AL = ASCII Code of the Character
  1036 00007E84 3C1B                <1> 	cmp	al, 27
  1037 00007E86 74E4                <1> 	je	short loc_set_time_retn
  1038 00007E88 A2[33320100]        <1> 	mov	[Hour+1], al
  1039 00007E8D 3C30                <1> 	cmp	al, '0'
  1040 00007E8F 72C6                <1> 	jb	short loc_set_time_stc_1
  1041 00007E91 3C39                <1> 	cmp	al, '9'
  1042 00007E93 77C2                <1> 	ja	short loc_set_time_stc_1
  1043 00007E95 803D[32320100]32    <1>         cmp     byte [Hour], '2'
  1044 00007E9C 7204                <1> 	jb	short pass_set_time_24
  1045 00007E9E 3C34                <1> 	cmp	al, '4'
  1046 00007EA0 77B5                <1> 	ja	short loc_set_time_stc_1
  1047                              <1> pass_set_time_24:
  1048                              <1> 	; 13/05/2016
  1049                              <1> 	;mov	bx, 7 ; attribute/color (bl)
  1050                              <1> 		      ; video page 0 (bh)
  1051 00007EA2 B307                <1> 	mov	bl, 7	
  1052 00007EA4 E8E3A3FFFF          <1> 	call	_write_tty
  1053                              <1> loc_enter_time_separator_1:
  1054 00007EA9 28E4                <1> 	sub    ah, ah ; 0
  1055 00007EAB E86390FFFF          <1> 	call	int16h
  1056                              <1> 	; AL = ASCII Code of the Character
  1057 00007EB0 3C1B                <1> 	cmp	al, 27
  1058 00007EB2 74B8                <1> 	je	short loc_set_time_retn
  1059 00007EB4 3C3A                <1> 	cmp	al, ':'
  1060                              <1> 	;jne	loc_set_time_stc_2
  1061                              <1> 	; 26/07/2022
  1062 00007EB6 7415                <1> 	je	short set_time_2
  1063                              <1> 	
  1064                              <1> 	; 26/07/2022
  1065                              <1> loc_set_time_stc_2:
  1066 00007EB8 E820FFFFFF          <1> 	call	check_for_backspace
  1067 00007EBD 7407                <1> 	je	short loc_set_time_bs_2
  1068                              <1> 	;xor	bh, bh ; video page 0
  1069 00007EBF E8B2A4FFFF          <1> 	call	beeper ; BEEP !
  1070 00007EC4 EBE3                <1> 	jmp	short loc_enter_time_separator_1
  1071                              <1> loc_set_time_bs_2:
  1072 00007EC6 E800FFFFFF          <1> 	call	write_backspace
  1073 00007ECB EBB0                <1> 	jmp	short loc_enter_hour_2
  1074                              <1> 
  1075                              <1> set_time_2:
  1076                              <1> 	; 13/05/2016
  1077                              <1> 	;mov	bx, 7 ; attribute/color (bl)
  1078                              <1> 		      ; video page 0 (bh)
  1079 00007ECD B307                <1> 	mov	bl, 7	
  1080 00007ECF E8B8A3FFFF          <1> 	call	_write_tty
  1081                              <1> loc_enter_minute_1:
  1082 00007ED4 30E4                <1> 	xor     ah, ah
  1083 00007ED6 E83890FFFF          <1> 	call	int16h
  1084                              <1> 	; AL = ASCII Code of the Character
  1085 00007EDB 3C1B                <1> 	cmp	al, 27
  1086 00007EDD 748D                <1> 	je	short loc_set_time_retn
  1087 00007EDF A2[35320100]        <1> 	mov	[Minute], al
  1088 00007EE4 3C30                <1> 	cmp	al, '0'
  1089 00007EE6 7204                <1> 	jb	short loc_set_time_stc_3
  1090 00007EE8 3C35                <1> 	cmp	al, '5'
  1091                              <1> 	;ja	loc_set_time_stc_3
  1092                              <1> 	; 26/07/2022
  1093 00007EEA 7615                <1> 	jna	short set_time_3
  1094                              <1> 
  1095                              <1> 	; 26/07/2022
  1096                              <1> loc_set_time_stc_3:
  1097 00007EEC E8ECFEFFFF          <1> 	call	check_for_backspace
  1098 00007EF1 7407                <1> 	je	short loc_set_time_bs_3
  1099                              <1> 	;xor	bh, bh ; video page 0
  1100 00007EF3 E87EA4FFFF          <1> 	call	beeper ; BEEP !6
  1101 00007EF8 EBDA                <1> 	jmp	short loc_enter_minute_1
  1102                              <1> loc_set_time_bs_3:
  1103 00007EFA E8CCFEFFFF          <1> 	call	write_backspace
  1104 00007EFF EBA8                <1> 	jmp	short loc_enter_time_separator_1
  1105                              <1> 
  1106                              <1> set_time_3:
  1107                              <1> 	; 13/05/2016
  1108                              <1> 	;mov	bx, 7 ; attribute/color (bl)
  1109                              <1> 		      ; video page 0 (bh)
  1110 00007F01 B307                <1> 	mov	bl, 7	
  1111 00007F03 E884A3FFFF          <1> 	call	_write_tty
  1112                              <1> loc_enter_minute_2:
  1113 00007F08 30E4                <1> 	xor     ah, ah
  1114 00007F0A E80490FFFF          <1> 	call	int16h
  1115                              <1> 	; AL = ASCII Code of the Character
  1116 00007F0F 3C1B                <1> 	cmp	al, 27
  1117                              <1> 	;je	short loc_set_time_retn
  1118                              <1> 	; 07/08/2022
  1119 00007F11 7505                <1> 	jne	short loc_enter_minute_3
  1120 00007F13 E954FFFFFF          <1> 	jmp	loc_set_time_retn
  1121                              <1> loc_enter_minute_3:	
  1122 00007F18 A2[36320100]        <1> 	mov	[Minute+1], al
  1123 00007F1D 3C30                <1> 	cmp	al, '0'
  1124 00007F1F 7204                <1> 	jb	short loc_set_time_stc_4
  1125 00007F21 3C39                <1> 	cmp	al, '9'
  1126                              <1> 	;ja	loc_set_time_stc_4
  1127                              <1> 	; 26/07/2022
  1128 00007F23 7615                <1> 	jna	short set_time_4
  1129                              <1> 
  1130                              <1> 	; 26/07/2022
  1131                              <1> loc_set_time_stc_4:
  1132 00007F25 E8B3FEFFFF          <1> 	call	check_for_backspace
  1133 00007F2A 7407                <1> 	je	short loc_set_time_bs_4
  1134                              <1> 	;xor	bh, bh ; video page 0
  1135 00007F2C E845A4FFFF          <1> 	call	beeper ; BEEP !
  1136 00007F31 EBD5                <1> 	jmp	short loc_enter_minute_2
  1137                              <1> loc_set_time_bs_4:
  1138 00007F33 E893FEFFFF          <1> 	call	write_backspace
  1139 00007F38 EB9A                <1> 	jmp	short loc_enter_minute_1
  1140                              <1> 
  1141                              <1> set_time_4:
  1142                              <1> 	; 13/05/2016
  1143                              <1> 	;mov	bx, 7 ; attribute/color (bl)
  1144                              <1> 		      ; video page 0 (bh)
  1145 00007F3A B307                <1> 	mov	bl, 7	
  1146 00007F3C E84BA3FFFF          <1> 	call	_write_tty
  1147                              <1> loc_enter_time_separator_2:
  1148 00007F41 66C705[38320100]30- <1> 	mov	word [Second], 3030h
  1148 00007F49 30                  <1>
  1149 00007F4A 28E4                <1> 	sub     ah, ah
  1150 00007F4C E8C28FFFFF          <1> 	call	int16h
  1151                              <1> 	; AL = ASCII Code of the Character
  1152 00007F51 3C0D                <1> 	cmp	al, 13
  1153                              <1>         ;je	short loc_set_time_progress
  1154                              <1> 	; 07/08/2022
  1155 00007F53 7505                <1> 	jne	short loc_enter_time_separator_3
  1156                              <1> jmp_loc_set_time_progress:
  1157 00007F55 E9D4000000          <1> 	jmp	loc_set_time_progress
  1158                              <1> loc_enter_time_separator_3:
  1159 00007F5A 3C1B                <1> 	cmp	al, 27
  1160                              <1> 	;;je	loc_set_time_retn
  1161                              <1> 	; 26/07/2022
  1162                              <1> 	;je	short loc_set_time_ok
  1163                              <1> 	; 07/08/2022
  1164 00007F5C 7505                <1> 	jne	short loc_enter_time_separator_4
  1165 00007F5E E982000000          <1> 	jmp	loc_set_time_ok
  1166                              <1> loc_enter_time_separator_4:
  1167 00007F63 3C3A                <1> 	cmp	al, ':'
  1168 00007F65 7563                <1>         jne	short loc_set_time_stc_5
  1169                              <1> 
  1170                              <1> 	; 13/05/2016
  1171                              <1> 	;mov	bx, 7 ; attribute/color (bl)
  1172                              <1> 		      ; video page 0 (bh)
  1173 00007F67 B307                <1> 	mov	bl, 7	
  1174 00007F69 E81EA3FFFF          <1> 	call	_write_tty
  1175                              <1> loc_enter_second_1:
  1176 00007F6E 30E4                <1> 	xor     ah, ah
  1177 00007F70 E89E8FFFFF          <1> 	call	int16h
  1178                              <1> 	; AL = ASCII Code of the Character
  1179 00007F75 3C0D                <1> 	cmp	al, 13
  1180                              <1> 	;je	short loc_set_time_progress
  1181                              <1> 	; 07/08/2022
  1182 00007F77 74DC                <1> 	je	short jmp_loc_set_time_progress
  1183 00007F79 3C1B                <1> 	cmp	al, 27
  1184                              <1> 	;;je	loc_set_time_retn
  1185                              <1> 	; 26/07/2022
  1186                              <1> 	;je	short loc_set_time_ok
  1187                              <1> 	; 07/08/2022
  1188 00007F7B 7502                <1> 	jne	short loc_enter_second_2
  1189 00007F7D EB66                <1> 	jmp	loc_set_time_ok
  1190                              <1> loc_enter_second_2:
  1191 00007F7F A2[38320100]        <1> 	mov	[Second], al
  1192 00007F84 3C30                <1> 	cmp	al, '0'
  1193 00007F86 7267                <1> 	jb	short loc_set_time_stc_6
  1194 00007F88 3C35                <1> 	cmp	al, '5'
  1195 00007F8A 7763                <1> 	ja	short loc_set_time_stc_6
  1196                              <1> 	; 13/05/2016
  1197                              <1> 	;mov	bx, 7 ; attribute/color (bl)
  1198                              <1> 		      ; video page 0 (bh)
  1199 00007F8C B307                <1> 	mov	bl, 7	
  1200 00007F8E E8F9A2FFFF          <1> 	call	_write_tty
  1201                              <1> loc_enter_second_3:
  1202 00007F93 30E4                <1> 	xor     ah, ah
  1203 00007F95 E8798FFFFF          <1> 	call	int16h
  1204                              <1> 	; AL = ASCII Code of the Character
  1205 00007F9A 3C1B                <1> 	cmp	al, 27
  1206                              <1> 	;je	short loc_set_time_retn
  1207                              <1> 	; 26/07/2022
  1208 00007F9C 7447                <1> 	je	short loc_set_time_ok
  1209 00007F9E 3C30                <1> 	cmp	al, '0'
  1210 00007FA0 7271                <1>         jb	short loc_set_time_stc_7
  1211 00007FA2 3C39                <1> 	cmp	al, '9'
  1212 00007FA4 776D                <1>         ja	short loc_set_time_stc_7
  1213                              <1> 	; 13/05/2016
  1214                              <1> 	;mov	bx, 7 ; attribute/color (bl)
  1215                              <1> 		      ; video page 0 (bh)
  1216 00007FA6 B307                <1> 	mov	bl, 7	
  1217 00007FA8 E8DFA2FFFF          <1> 	call	_write_tty
  1218                              <1> loc_set_time_get_lchar_again:
  1219 00007FAD 28E4                <1> 	sub	ah, ah ; 0
  1220 00007FAF E85F8FFFFF          <1> 	call	int16h
  1221                              <1> 	; AL = ASCII Code of the Character
  1222 00007FB4 3C0D                <1> 	cmp	al, 13
  1223 00007FB6 7476                <1> 	je	short loc_set_time_progress
  1224 00007FB8 3C1B                <1> 	cmp	al, 27
  1225                              <1> 	;je	short loc_set_time_retn
  1226                              <1> 	; 07/08/2022
  1227 00007FBA 7429                <1> 	je	short loc_set_time_ok
  1228                              <1> 	;
  1229 00007FBC E81CFEFFFF          <1> 	call	check_for_backspace
  1230 00007FC1 75EA                <1> 	jne	short loc_set_time_get_lchar_again
  1231                              <1> 
  1232                              <1> loc_set_time_bs_8:
  1233 00007FC3 E803FEFFFF          <1> 	call	write_backspace
  1234 00007FC8 EBC9                <1> 	jmp	short loc_enter_second_3
  1235                              <1> 
  1236                              <1> ;	; 26/07/2022
  1237                              <1> ;loc_set_time_retn:
  1238                              <1> ;	mov 	esi, nextline
  1239                              <1> ;	;call	print_msg
  1240                              <1> ;	;retn
  1241                              <1> ;	jmp	print_msg
  1242                              <1> 
  1243                              <1> 	; 26/07/2022
  1244                              <1> ;loc_set_time_stc_0:
  1245                              <1> ;	;xor	bh, bh ; video page 0
  1246                              <1> ;	call	beeper ; BEEP !
  1247                              <1> ;	jmp	loc_enter_hour_1
  1248                              <1> ;loc_set_time_stc_1:
  1249                              <1> ;	call	check_for_backspace
  1250                              <1> ;	je	short loc_set_time_bs_1
  1251                              <1> ;	;xor	bh, bh ; video page 0
  1252                              <1> ;	call	beeper ; BEEP !
  1253                              <1> ;	jmp	loc_enter_hour_2
  1254                              <1> ;loc_set_time_bs_1:
  1255                              <1> ;	call	write_backspace
  1256                              <1> ;	jmp	loc_enter_hour_1
  1257                              <1> ;loc_set_time_stc_2:
  1258                              <1> ;	call	check_for_backspace
  1259                              <1> ;	je	short loc_set_time_bs_2
  1260                              <1> ;	;xor	bh, bh ; video page 0
  1261                              <1> ;	call	beeper ; BEEP !
  1262                              <1> ;	jmp	loc_enter_time_separator_1
  1263                              <1> ;loc_set_time_bs_2:
  1264                              <1> ;	call	write_backspace
  1265                              <1> ;	jmp	loc_enter_hour_2
  1266                              <1> ;loc_set_time_stc_3:
  1267                              <1> ;	call	check_for_backspace
  1268                              <1> ;	je	short loc_set_time_bs_3
  1269                              <1> ;	;xor	bh, bh ; video page 0
  1270                              <1> ;	call	beeper ; BEEP !6
  1271                              <1> ;	jmp	loc_enter_minute_1
  1272                              <1> ;loc_set_time_bs_3:
  1273                              <1> ;	call	write_backspace
  1274                              <1> ;	jmp	loc_enter_time_separator_1
  1275                              <1> ;loc_set_time_stc_4:
  1276                              <1> ;	call	check_for_backspace
  1277                              <1> ;	je	short loc_set_time_bs_4
  1278                              <1> ;	;xor	bh, bh ; video page 0
  1279                              <1> ;	call	beeper ; BEEP !
  1280                              <1> ;	jmp	loc_enter_minute_2
  1281                              <1> ;loc_set_time_bs_4:
  1282                              <1> ;	call	write_backspace
  1283                              <1> ;	jmp	loc_enter_minute_1
  1284                              <1> 
  1285                              <1> 	; 26/07/2022
  1286                              <1> loc_set_time_stc_5:
  1287 00007FCA E80EFEFFFF          <1> 	call	check_for_backspace
  1288 00007FCF 740A                <1> 	je	short loc_set_time_bs_5
  1289                              <1> 	;xor	bh, bh ; video page 0
  1290 00007FD1 E8A0A3FFFF          <1> 	call	beeper ; BEEP !
  1291 00007FD6 E966FFFFFF          <1> 	jmp	loc_enter_time_separator_2
  1292                              <1> loc_set_time_bs_5:
  1293 00007FDB E8EBFDFFFF          <1> 	call	write_backspace
  1294 00007FE0 E923FFFFFF          <1> 	jmp	loc_enter_minute_2
  1295                              <1> 
  1296                              <1> 	; 26/07/2022
  1297                              <1> loc_set_time_ok:
  1298 00007FE5 BE[473B0100]        <1> 	mov 	esi, nextline
  1299                              <1> 	;call	print_msg
  1300                              <1> 	;retn
  1301 00007FEA E95BEDFFFF          <1> 	jmp	print_msg
  1302                              <1> 
  1303                              <1> 	; 07/08/2022
  1304                              <1> loc_set_time_stc_6:
  1305 00007FEF E8E9FDFFFF          <1> 	call	check_for_backspace
  1306 00007FF4 7413                <1> 	je	short loc_set_time_bs_6
  1307                              <1> 	;xor	bh, bh ; video page 0
  1308 00007FF6 E87BA3FFFF          <1> 	call	beeper ; BEEP !
  1309 00007FFB 66C705[38320100]30- <1> 	mov	word [Second], 3030h
  1309 00008003 30                  <1>
  1310 00008004 E965FFFFFF          <1> 	jmp	loc_enter_second_1
  1311                              <1> loc_set_time_bs_6:
  1312 00008009 E8BDFDFFFF          <1> 	call	write_backspace
  1313 0000800E E92EFFFFFF          <1> 	jmp	loc_enter_time_separator_2
  1314                              <1> loc_set_time_stc_7:
  1315 00008013 E8C5FDFFFF          <1> 	call	check_for_backspace
  1316 00008018 740A                <1> 	je	short loc_set_time_bs_7
  1317                              <1> 	;xor	bh, bh ; video page 0
  1318 0000801A E857A3FFFF          <1> 	call	beeper ; BEEP !
  1319 0000801F E96FFFFFFF          <1> 	jmp	loc_enter_second_3
  1320                              <1> loc_set_time_bs_7:
  1321 00008024 E8A2FDFFFF          <1> 	call	write_backspace
  1322 00008029 E940FFFFFF          <1> 	jmp	loc_enter_second_1
  1323                              <1> 
  1324                              <1> loc_set_time_progress:
  1325                              <1> 	; Get Current Time
  1326                              <1> 	;mov 	ah, 02h
  1327                              <1> 	;call	int1Ah
  1328 0000802E E8B6E2FFFF          <1> 	call	RTC_20	; GET RTC TIME
  1329                              <1> 	;DL = Daylight Savings Enable option (0-1)	
  1330                              <1> 
  1331 00008033 66A1[32320100]      <1> 	mov	ax, [Hour]
  1332 00008039 662D3030            <1> 	sub	ax, '00'
  1333 0000803D C0E004              <1> 	shl	al, 4 ; * 16
  1334 00008040 88C5                <1> 	mov	ch, al
  1335 00008042 00E5                <1> 	add	ch, ah
  1336 00008044 66A1[35320100]      <1> 	mov	ax, [Minute]
  1337 0000804A 662D3030            <1> 	sub	ax, '00'
  1338 0000804E C0E004              <1> 	shl	al, 4 ; * 16
  1339 00008051 88C1                <1> 	mov	cl, al
  1340 00008053 00E1                <1> 	add	cl, ah
  1341 00008055 66A1[38320100]      <1> 	mov	ax, [Second]
  1342 0000805B 662D3030            <1> 	sub	ax, '00'
  1343 0000805F C0E004              <1> 	shl	al, 4 ; * 16
  1344 00008062 88C6                <1> 	mov	dh, al
  1345 00008064 00E6                <1> 	add	dh, ah
  1346                              <1> 	
  1347                              <1> 	;mov	ah, 03h
  1348                              <1> 	;call	int1Ah
  1349 00008066 E8ACE2FFFF          <1> 	call	RTC_30	; SET RTC TIME
  1350                              <1> 
  1351                              <1> 	; 26/07/2022
  1352 0000806B E975FFFFFF          <1> 	jmp	loc_set_time_ok
  1353                              <1> 
  1354                              <1> print_volume_info:
  1355                              <1> 	; 01/03/2016
  1356                              <1> 	; 08/02/2016
  1357                              <1> 	; 06/02/2016
  1358                              <1> 	; 04/02/2016
  1359                              <1> 	; 18/01/2016 (TRDOS 386 = TRDOS v2.0)
  1360                              <1> 	; 25/10/2009
  1361                              <1> 	;
  1362                              <1> 	; "Volume Serial No: "
  1363                              <1>  	;
  1364                              <1> 	; INPUT  : AL = DOS Drive Number
  1365                              <1> 	; OUTPUT : AH = FS Type
  1366                              <1> 	;          AL = DOS Drive Name
  1367                              <1> 	; CF = 0 -> OK
  1368                              <1> 	; CF = 1 -> Drive not ready 
  1369                              <1> 
  1370 00008070 88C4                <1> 	mov	ah, al
  1371 00008072 28C0                <1> 	sub	al, al
  1372 00008074 0FB7F0              <1> 	movzx	esi, ax	
  1373 00008077 81C600010900        <1> 	add	esi, Logical_DOSDisks
  1374 0000807D 8A06                <1> 	mov	al, [esi]
  1375 0000807F 3C41                <1> 	cmp	al, 'A'  
  1376 00008081 7304                <1> 	jnb	short loc_pvi_set_vol_name
  1377 00008083 8A6604              <1> 	mov	ah, [esi+LD_FSType]
  1378 00008086 C3                  <1> 	retn
  1379                              <1> 
  1380                              <1> loc_pvi_set_vol_name:
  1381 00008087 A2[6C320100]        <1> 	mov	[Vol_Drv_Name], al
  1382 0000808C 56                  <1> 	push	esi
  1383 0000808D E858010000          <1> 	call	move_volume_name_and_serial_no ;;;
  1384 00008092 7302                <1> 	jnc	short loc_pvi_mvn_ok
  1385 00008094 5E                  <1> 	pop	esi
  1386 00008095 C3                  <1> 	retn
  1387                              <1> 
  1388                              <1> loc_pvi_mvn_ok:
  1389 00008096 8B3424              <1> 	mov	esi, [esp]
  1390 00008099 807E04A1            <1> 	cmp	byte [esi+LD_FSType], 0A1h
  1391 0000809D 7509                <1> 	jne	short loc_pvi_fat_vol_size
  1392 0000809F 8B4670              <1> 	mov	eax, [esi+LD_FS_VolumeSize]
  1393 000080A2 0FB75E11            <1> 	movzx	ebx, word [esi+LD_FS_BytesPerSec]
  1394 000080A6 EB07                <1> 	jmp	short loc_vol_size_mul32
  1395                              <1> loc_pvi_fat_vol_size:
  1396 000080A8 8B4670              <1> 	mov	eax, [esi+LD_TotalSectors]
  1397 000080AB 0FB75E11            <1> 	movzx	ebx, word [esi+LD_BPB+BPB_BytsPerSec]
  1398                              <1> loc_vol_size_mul32:
  1399 000080AF F7E3                <1> 	mul	ebx
  1400 000080B1 09D2                <1> 	or	edx, edx
  1401 000080B3 7507                <1> 	jnz	short loc_vol_size_in_kbytes
  1402                              <1> loc_vol_size_in_bytes:
  1403 000080B5 B9[4A320100]        <1> 	mov	ecx, VolSize_Bytes
  1404 000080BA EB0D                <1> 	jmp	short loc_write_vol_size_str
  1405                              <1> loc_vol_size_in_kbytes:
  1406 000080BC 66BB0004            <1> 	mov	bx, 1024
  1407 000080C0 F7F3                <1> 	div	ebx
  1408 000080C2 B9[3D320100]        <1> 	mov 	ecx, VolSize_KiloBytes
  1409 000080C7 31D2                <1> 	xor	edx, edx ; 0
  1410                              <1> loc_write_vol_size_str:
  1411 000080C9 890D[80800100]      <1> 	mov	[VolSize_Unit1], ecx
  1412                              <1> 	; 
  1413 000080CF BF[96800100]        <1> 	mov	edi, Vol_Tot_Sec_Str_End
  1414                              <1>         ;mov	byte [edi], 0
  1415 000080D4 B90A000000          <1> 	mov	ecx, 10
  1416                              <1> loc_write_vol_size_chr:
  1417 000080D9 F7F1                <1> 	div	ecx
  1418 000080DB 80C230              <1> 	add	dl, '0'
  1419 000080DE 4F                  <1> 	dec	edi	
  1420 000080DF 8817                <1> 	mov	[edi], dl
  1421 000080E1 85C0                <1> 	test	eax, eax
  1422 000080E3 7404                <1> 	jz	short loc_write_vol_size_str_ok
  1423 000080E5 28D2                <1> 	sub	dl, dl ; 0
  1424 000080E7 EBF0                <1> 	jmp	short loc_write_vol_size_chr
  1425                              <1> 
  1426                              <1> loc_write_vol_size_str_ok:
  1427 000080E9 893D[88800100]      <1> 	mov	[Vol_Tot_Sec_Str_Start], edi
  1428                              <1> 	;
  1429 000080EF BF[55320100]        <1> 	mov	edi, Vol_FS_Name
  1430 000080F4 8A4E03              <1> 	mov	cl, [esi+LD_FATType]
  1431 000080F7 20C9                <1> 	and	cl, cl ; 0 ?
  1432 000080F9 7515                <1> 	jnz	short loc_write_vol_FAT_str_1
  1433 000080FB 66C7075452          <1> 	mov	word [edi], 'TR'
  1434 00008100 C7470420465331      <1> 	mov	dword [edi+4], ' FS1'
  1435                              <1> 	;movzx	ebx, word [esi+LD_FS_BytesPerSec]
  1436 00008107 668B5E11            <1> 	mov	bx, [esi+LD_FS_BytesPerSec]
  1437 0000810B 8B4674              <1> 	mov	eax, [esi+LD_FS_FreeSectors]
  1438 0000810E EB36                <1> 	jmp	short loc_vol_freespace_mul32
  1439                              <1> 
  1440                              <1> loc_write_vol_FAT_str_1:
  1441 00008110 66B83332            <1> 	mov	ax, '32' ; FAT32
  1442 00008114 80F902              <1> 	cmp	cl, 2 ; [esi+LD_FATType]
  1443 00008117 7708                <1> 	ja	short loc_write_vol_FAT_str_2
  1444 00008119 66B83132            <1> 	mov	ax, '12' ; FAT12
  1445 0000811D 7202                <1> 	jb	short loc_write_vol_FAT_str_2
  1446 0000811F B436                <1> 	mov	ah, '6'  ; FAT16
  1447                              <1> loc_write_vol_FAT_str_2:
  1448 00008121 C70746415420        <1> 	mov	dword [edi], 'FAT '
  1449 00008127 66894704            <1> 	mov	word [edi+4], ax
  1450                              <1> 	;
  1451                              <1> 	;movzx	ebx, word [esi+LD_BPB+BPB_BytsPerSec]
  1452 0000812B 668B5E11            <1> 	mov	bx, [esi+LD_BPB+BPB_BytsPerSec]
  1453 0000812F 8B4674              <1> 	mov	eax, [esi+LD_FreeSectors]
  1454                              <1> 
  1455                              <1> loc_vol_freespace_recalc0:
  1456                              <1> 	; 01/03/2016
  1457 00008132 83F8FF              <1> 	cmp	eax, 0FFFFFFFFh
  1458 00008135 720F                <1> 	jb	short loc_vol_freespace_mul32
  1459                              <1> 	;inc	eax ; 0
  1460 00008137 20C9                <1> 	and	cl, cl ; byte [esi+LD_FATType]
  1461 00008139 740B                <1> 	jz	short loc_vol_freespace_mul32 	
  1462 0000813B 53                  <1> 	push	ebx
  1463 0000813C 66BB00FF            <1> 	mov	bx, 0FF00h ; recalculate free sectors
  1464 00008140 E8AD470000          <1> 	call	calculate_fat_freespace
  1465 00008145 5B                  <1> 	pop	ebx
  1466                              <1> 
  1467                              <1> loc_vol_freespace_mul32:
  1468 00008146 F7E3                <1> 	mul	ebx
  1469 00008148 09D2                <1> 	or	edx, edx
  1470 0000814A 7507                <1> 	jnz	short loc_vol_fspace_in_kbytes
  1471                              <1> loc_vol_fspace_in_bytes:
  1472 0000814C B9[4A320100]        <1> 	mov	ecx, VolSize_Bytes
  1473 00008151 EB0D                <1> 	jmp	short loc_write_vol_fspace_str
  1474                              <1> loc_vol_fspace_in_kbytes:
  1475 00008153 66BB0004            <1> 	mov	bx, 1024
  1476 00008157 F7F3                <1> 	div	ebx
  1477 00008159 B9[3D320100]        <1> 	mov 	ecx, VolSize_KiloBytes
  1478 0000815E 31D2                <1> 	xor	edx, edx ; 0
  1479                              <1> loc_write_vol_fspace_str:
  1480 00008160 890D[84800100]      <1> 	mov	[VolSize_Unit2], ecx
  1481                              <1> 	;	
  1482 00008166 BF[A6800100]        <1> 	mov	edi, Vol_Free_Sectors_Str_End
  1483                              <1>         ;mov	byte [edi], 0
  1484 0000816B B90A000000          <1> 	mov	ecx, 10
  1485                              <1> loc_write_vol_fspace_chr:
  1486 00008170 F7F1                <1> 	div	ecx
  1487 00008172 80C230              <1> 	add	dl, '0'
  1488 00008175 4F                  <1> 	dec	edi	
  1489 00008176 8817                <1> 	mov	[edi], dl
  1490 00008178 85C0                <1> 	test	eax, eax
  1491 0000817A 7404                <1> 	jz	short loc_write_vol_fspace_str_ok
  1492 0000817C 28D2                <1> 	sub	dl, dl ; 0
  1493 0000817E EBF0                <1> 	jmp	short loc_write_vol_fspace_chr
  1494                              <1> 
  1495                              <1> loc_write_vol_fspace_str_ok:
  1496 00008180 893D[98800100]      <1> 	mov	[Vol_Free_Sectors_Str_Start], edi
  1497                              <1> 	;
  1498 00008186 BE[53320100]        <1> 	mov	esi, Volume_in_drive
  1499 0000818B E8BAEBFFFF          <1> 	call	print_msg
  1500 00008190 BE[93320100]        <1> 	mov	esi, Vol_Name
  1501 00008195 E8B0EBFFFF          <1> 	call	print_msg
  1502 0000819A BE[473B0100]        <1> 	mov	esi, nextline
  1503 0000819F E8A6EBFFFF          <1> 	call	print_msg
  1504                              <1> 	;
  1505 000081A4 BE[F4320100]        <1> 	mov	esi, Vol_Total_Sector_Header
  1506 000081A9 E89CEBFFFF          <1> 	call	print_msg
  1507 000081AE 8B35[88800100]      <1> 	mov	esi, [Vol_Tot_Sec_Str_Start]
  1508 000081B4 E891EBFFFF          <1> 	call	print_msg
  1509 000081B9 8B35[80800100]      <1> 	mov	esi, [VolSize_Unit1]
  1510 000081BF E886EBFFFF          <1> 	call	print_msg
  1511                              <1> 	;
  1512 000081C4 BE[05330100]        <1> 	mov	esi, Vol_Free_Sectors_Header
  1513 000081C9 E87CEBFFFF          <1> 	call	print_msg
  1514 000081CE 8B35[98800100]      <1> 	mov	esi, [Vol_Free_Sectors_Str_Start]
  1515 000081D4 E871EBFFFF          <1> 	call	print_msg
  1516 000081D9 8B35[84800100]      <1> 	mov	esi, [VolSize_Unit2]
  1517 000081DF E866EBFFFF          <1> 	call	print_msg
  1518                              <1> 	;
  1519 000081E4 5E                  <1> 	pop	esi
  1520                              <1> 	
  1521                              <1> 	;mov	ah, [esi+LD_FSType]
  1522                              <1> 	;mov	al, [esi+LD_FATType]
  1523 000081E5 668B4603            <1> 	mov	ax, [esi+LD_FATType]
  1524                              <1> 
  1525 000081E9 C3                  <1> 	retn
  1526                              <1> 
  1527                              <1> move_volume_name_and_serial_no:
  1528                              <1> 	; 26/07/2022 (TRDOS 386 Kernel v2.0.5)
  1529                              <1> 	; 08/02/2016  (TRDOS 386 = TRDOS v2.0)
  1530                              <1> 	; this routine will be called by
  1531                              <1> 	; "print_volume_info" and "print_directory"
  1532                              <1> 	; INPUT ->
  1533                              <1> 	;	ESI = Logical DOS drv descripton table address
  1534                              <1> 	; OUTPUT ->
  1535                              <1> 	;	*Volume name will be moved to text area
  1536                              <1> 	;	*Volume serial number will be converted to
  1537                              <1> 	;	 text and will be moved to text area
  1538                              <1> 	;   cf = 1 -> invalid/unknown dos drive
  1539                              <1> 	;   cf = 0 -> ecx = 0
  1540                              <1> 	;
  1541                              <1> 	; (eax, edx, ecx, esi, edi will be changed)
  1542                              <1> 
  1543                              <1> 	; 26/07/2022
  1544 000081EA 31C9                <1> 	xor	ecx, ecx
  1545                              <1> 
  1546 000081EC BF[93320100]        <1> 	mov 	edi, Vol_Name
  1547                              <1> 
  1548                              <1> 	;mov	ah, [esi+LD_FSType]
  1549                              <1> 	;mov	al, [esi+LD_FATType]
  1550 000081F1 668B4603            <1> 	mov	ax, [esi+LD_FATType]
  1551 000081F5 80FCA1              <1> 	cmp	ah, 0A1h
  1552 000081F8 7418                <1> 	je	short mvn_2
  1553 000081FA 08E4                <1> 	or	ah, ah
  1554 000081FC 7404                <1> 	jz	short mvn_0
  1555 000081FE 08C0                <1> 	or	al, al
  1556 00008200 7504                <1> 	jnz	short mvn_1
  1557                              <1> mvn_0:
  1558 00008202 8A06                <1> 	mov	al, [esi]
  1559 00008204 F9                  <1> 	stc
  1560 00008205 C3                  <1> 	retn
  1561                              <1> mvn_1:
  1562 00008206 3C02                <1> 	cmp	al, 2
  1563 00008208 7714                <1> 	ja	short mvn_3 
  1564                              <1> 	;or	al, al
  1565                              <1> 	;jz	short mvn_2
  1566 0000820A 8B462D              <1> 	mov	eax, [esi+LD_BPB+VolumeID]
  1567 0000820D 83C631              <1> 	add	esi, LD_BPB+VolumeLabel
  1568 00008210 EB12                <1> 	jmp	short mvn_4
  1569                              <1> mvn_2:
  1570 00008212 8B4628              <1> 	mov	eax, [esi+LD_FS_VolumeSerial]
  1571 00008215 83C62C              <1> 	add	esi, LD_FS_VolumeName
  1572                              <1> 	;mov	ecx, 16
  1573                              <1> 	; 26/07/2022
  1574 00008218 B110                <1> 	mov	cl, 16
  1575 0000821A F3A5                <1> 	rep	movsd
  1576 0000821C EB0D                <1> 	jmp	short mvn_5
  1577                              <1> mvn_3:
  1578 0000821E 8B4649              <1> 	mov	eax, [esi+LD_BPB+FAT32_VolID]
  1579 00008221 83C64D              <1> 	add	esi, LD_BPB+FAT32_VolLab
  1580                              <1> mvn_4:
  1581                              <1> 	;mov	ecx, 11
  1582                              <1> 	; 26/07/2022
  1583 00008224 B10B                <1> 	mov	cl, 11
  1584 00008226 F3A4                <1> 	rep	movsb
  1585 00008228 C60700              <1> 	mov	byte [edi], 0
  1586                              <1> mvn_5:
  1587                              <1> 	;mov	[Current_VolSerial], eax  
  1588 0000822B E87CBFFFFF          <1> 	call	dwordtohex
  1589 00008230 8915[E8320100]      <1> 	mov	[Vol_Serial1], edx
  1590 00008236 A3[ED320100]        <1> 	mov	[Vol_Serial2], eax
  1591                              <1> 	; ecx = 0
  1592 0000823B C3                  <1> 	retn
  1593                              <1> 
  1594                              <1> get_volume_serial_number:
  1595                              <1> 	; 19/01/2016 (TRDOS 386 = TRDOS v2.0)
  1596                              <1> 	; 08/08/2010
  1597                              <1> 	;
  1598                              <1> 	; INPUT -> DL = Logical DOS Drive number
  1599                              <1> 	; OUTPUT -> EAX = Volume serial number
  1600                              <1> 	;          BL= FAT Type	    
  1601                              <1> 	;          BH = Logical DOS drv Number (DL input)
  1602                              <1> 	; cf = 1 -> Drive not ready
  1603                              <1> 
  1604 0000823C 31DB                <1> 	xor	ebx, ebx
  1605 0000823E 88D7                <1> 	mov	bh, dl
  1606 00008240 3815[BC300100]      <1> 	cmp	[Last_DOS_DiskNo], dl
  1607 00008246 7304                <1> 	jnb	short loc_gvsn_start
  1608                              <1> loc_gvsn_stc_retn:
  1609 00008248 31C0                <1> 	xor	eax, eax
  1610 0000824A F9                  <1> 	stc 
  1611 0000824B C3                  <1>         retn 
  1612                              <1> loc_gvsn_start:
  1613 0000824C 56                  <1> 	push	esi
  1614 0000824D BE00010900          <1> 	mov	esi, Logical_DOSDisks
  1615 00008252 01DE                <1> 	add	esi, ebx
  1616 00008254 8A5E03              <1> 	mov	bl, [esi+LD_FATType]
  1617 00008257 20DB                <1> 	and	bl, bl
  1618 00008259 740F                <1> 	jz	short loc_gvsn_fs
  1619 0000825B 80FB02              <1> 	cmp	bl, 2
  1620 0000825E 7705                <1> 	ja	short loc_gvsn_fat32
  1621                              <1> loc_gvsn_fat:
  1622 00008260 83C62D              <1> 	add	esi, LD_BPB + VolumeID
  1623 00008263 EB0E                <1> 	jmp	short loc_gvsn_return
  1624                              <1> loc_gvsn_fat32: 
  1625 00008265 83C649              <1> 	add	esi, LD_BPB + FAT32_VolID
  1626 00008268 EB09                <1> 	jmp	short loc_gvsn_return 
  1627                              <1> loc_gvsn_fs:
  1628 0000826A 807E04A1            <1> 	cmp	byte [esi+LD_FSType], 0A1h
  1629 0000826E 75D8                <1> 	jne	short loc_gvsn_stc_retn 
  1630 00008270 83C628              <1> 	add	esi, LD_FS_VolumeSerial
  1631                              <1> loc_gvsn_return:
  1632 00008273 8B06                <1> 	mov	eax, [esi]
  1633 00008275 5E                  <1> 	pop	esi
  1634 00008276 C3                  <1> 	retn
  1635                              <1> 
  1636                              <1> ; CMD_INTR.ASM [ TRDOS Command Interpreter Procedure ]
  1637                              <1> ; 09/11/2011
  1638                              <1> ; 29/01/2005
  1639                              <1> 
  1640                              <1> command_interpreter:
  1641                              <1> 	; 26/07/2022 (TRDOS 386 Kernel v2.0.5)
  1642                              <1> 	; 16/10/2016
  1643                              <1> 	; 12/10/2016
  1644                              <1> 	; 13/05/2016
  1645                              <1> 	; 07/05/2016
  1646                              <1> 	; 04/03/2016
  1647                              <1> 	; 04/02/2016
  1648                              <1> 	; 03/02/2016
  1649                              <1> 	; 30/01/2016
  1650                              <1> 	; 29/01/2016 (TRDOS 386 = TRDOS 2.0)
  1651                              <1> 	; 15/09/2011         
  1652                              <1> 	; 29/01/2005
  1653                              <1>         
  1654                              <1> 	; Input: ecx = command word length (CL)
  1655                              <1> 	;	 CommandBuffer = Command string offset
  1656                              <1>  
  1657 00008277 C605[38810100]00    <1> 	mov	byte [Program_Exit], 0
  1658                              <1> 
  1659                              <1> 	;cmp	cl, 4
  1660                              <1> 	;ja	c_6
  1661                              <1> 	;jb	c_2
  1662                              <1> 
  1663                              <1> 	; 26/07/2022
  1664 0000827E 80F903              <1> 	cmp	cl, 3
  1665 00008281 777C                <1> 	ja	short c_4
  1666 00008283 7405                <1> 	je	short c_3
  1667 00008285 E9D2010000          <1> 	jmp	c_2
  1668                              <1> c_3:
  1669                              <1> cmp_cmd_dir:
  1670 0000828A BF[24310100]        <1> 	mov	edi, Cmd_Dir
  1671 0000828F E8D1030000          <1> 	call	cmp_cmd	
  1672                              <1> 	;jnc	print_directory_list
  1673                              <1> 	; 26/07/2022
  1674 00008294 7205                <1> 	jc	short cmp_cmd_cls
  1675 00008296 E97D040000          <1> 	jmp	print_directory_list
  1676                              <1> 
  1677                              <1> cmp_cmd_cls:
  1678 0000829B B103                <1> 	mov	cl, 3
  1679 0000829D BF[60310100]        <1> 	mov	edi, Cmd_Cls
  1680 000082A2 E8BE030000          <1> 	call	cmp_cmd	
  1681                              <1>         ;jnc	clear_screen
  1682                              <1> 	; 26/07/2022
  1683 000082A7 7205                <1> 	jc	short cmp_cmd_ver
  1684 000082A9 E9B2EAFFFF          <1> 	jmp	clear_screen
  1685                              <1> 
  1686                              <1> cmp_cmd_ver:
  1687 000082AE B103                <1> 	mov	cl, 3
  1688 000082B0 BF[2E310100]        <1> 	mov	edi, Cmd_Ver
  1689 000082B5 E8AB030000          <1> 	call	cmp_cmd	
  1690 000082BA 720A                <1> 	jc	short cmp_cmd_mem
  1691                              <1> 
  1692 000082BC BE[C4300100]        <1> 	mov	esi, mainprog_Version
  1693                              <1> 	;call	print_msg
  1694 000082C1 E984EAFFFF          <1> 	jmp	print_msg
  1695                              <1> 	;retn
  1696                              <1> 
  1697                              <1> cmp_cmd_mem:
  1698 000082C6 B103                <1> 	mov	cl, 3
  1699 000082C8 BF[96310100]        <1> 	mov	edi, Cmd_Mem
  1700 000082CD E893030000          <1> 	call	cmp_cmd	
  1701                              <1> 	;jnc	memory_info
  1702                              <1> 	; 26/07/2022
  1703 000082D2 7205                <1> 	jc	short cmp_cmd_del
  1704 000082D4 E900BEFFFF          <1> 	jmp	memory_info
  1705                              <1> 
  1706                              <1> cmp_cmd_del:
  1707 000082D9 B103                <1> 	mov	cl, 3
  1708 000082DB BF[69310100]        <1> 	mov	edi, Cmd_Del
  1709 000082E0 E880030000          <1> 	call	cmp_cmd	
  1710                              <1>         ;jnc	delete_file
  1711                              <1> 	; 26/07/2022
  1712 000082E5 7205                <1> 	jc	short cmp_cmd_set
  1713 000082E7 E901110000          <1> 	jmp	delete_file
  1714                              <1> 
  1715                              <1> cmp_cmd_set:
  1716 000082EC B103                <1> 	mov	cl, 3
  1717 000082EE BF[5C310100]        <1> 	mov	edi, Cmd_Set
  1718 000082F3 E86D030000          <1> 	call	cmp_cmd	
  1719                              <1> 	;jnc	set_get_env
  1720                              <1> 	; 26/07/2022
  1721 000082F8 720F                <1> 	jc	short cmp_cmd_run
  1722 000082FA E95C190000          <1> 	jmp	set_get_env
  1723                              <1> 
  1724                              <1> 	; 07/08/2022
  1725                              <1> c_4:
  1726                              <1> 	; 26/07/2022
  1727 000082FF 80F904              <1> 	cmp	cl, 4
  1728 00008302 741D                <1> 	je	short cmp_cmd_4
  1729 00008304 E937020000          <1> 	jmp	c_6
  1730                              <1> 
  1731                              <1> cmp_cmd_run:
  1732 00008309 B103                <1> 	mov	cl, 3
  1733 0000830B BF[58310100]        <1> 	mov	edi, Cmd_Run
  1734 00008310 E850030000          <1> 	call	cmp_cmd	
  1735                              <1> 	; 07/05/2016
  1736                              <1>         ;jc	cmp_cmd_external
  1737                              <1> 	; 26/07/2022
  1738 00008315 7305                <1> 	jnc	short c3_run
  1739 00008317 E92C030000          <1> 	jmp	cmp_cmd_external
  1740                              <1> c3_run:
  1741 0000831C E95B1F0000          <1> 	jmp	load_and_execute_file
  1742                              <1> 
  1743                              <1> cmp_cmd_4:
  1744                              <1> 	; 26/07/2022
  1745                              <1> cmp_cmd_exit:
  1746 00008321 BF[32310100]        <1> 	mov	edi, Cmd_Exit
  1747 00008326 E83A030000          <1> 	call	cmp_cmd	
  1748 0000832B 7208                <1> 	jc	short cmp_cmd_date
  1749                              <1> 
  1750 0000832D C605[38810100]01    <1>         mov     byte [Program_Exit], 1
  1751 00008334 C3                  <1>         retn
  1752                              <1> 
  1753                              <1> cmp_cmd_date:
  1754 00008335 B104                <1> 	mov	cl, 4
  1755 00008337 BF[4E310100]        <1> 	mov	edi, Cmd_Date
  1756 0000833C E824030000          <1> 	call	cmp_cmd	
  1757 00008341 720A                <1>         jc	short cmp_cmd_time
  1758                              <1> 	
  1759 00008343 E806F8FFFF          <1> 	call	show_date
  1760                              <1> 	;call	set_date
  1761                              <1> 	;retn
  1762                              <1> 	; 26/07/2022
  1763 00008348 E944F8FFFF          <1> 	jmp	set_date
  1764                              <1> 
  1765                              <1> cmp_cmd_time:
  1766 0000834D B104                <1> 	mov	cl, 4
  1767 0000834F BF[53310100]        <1> 	mov	edi, Cmd_Time
  1768 00008354 E80C030000          <1>    	call	cmp_cmd	
  1769 00008359 720A                <1> 	jc	short cmp_cmd_show
  1770                              <1> 
  1771 0000835B E894FAFFFF          <1> 	call	show_time
  1772                              <1> 	;call	set_time
  1773                              <1> 	;retn
  1774                              <1> 	; 26/07/2022
  1775 00008360 E9C5FAFFFF          <1> 	jmp	set_time
  1776                              <1> 
  1777                              <1> cmp_cmd_show:
  1778 00008365 B104                <1> 	mov	cl, 4
  1779 00008367 BF[64310100]        <1> 	mov	edi, Cmd_Show
  1780 0000836C E8F4020000          <1>    	call	cmp_cmd	
  1781                              <1>         ;jnc	show_file
  1782                              <1> 	; 26/07/2022
  1783 00008371 7205                <1> 	jc	short cmp_cmd_echo
  1784 00008373 E985090000          <1> 	jmp	show_file
  1785                              <1> 
  1786                              <1> cmp_cmd_echo:
  1787 00008378 B104                <1> 	mov	cl, 4
  1788 0000837A BF[A0310100]        <1> 	mov	edi, Cmd_Echo
  1789 0000837F E8E1020000          <1>    	call	cmp_cmd	
  1790 00008384 7224                <1> 	jc	short cmp_cmd_copy
  1791                              <1> 	
  1792                              <1> 	; 22/11/2017
  1793                              <1> 	; AL = 0
  1794 00008386 803E20              <1> 	cmp	byte [esi], 20h
  1795 00008389 7215                <1> 	jb	short cmd_echo_nextline
  1796                              <1> 	; 14/04/2016
  1797 0000838B 56                  <1> 	push	esi
  1798                              <1> cmd_echo_asciiz:
  1799                              <1> 	;inc	esi
  1800                              <1> 	;mov	al, [esi]
  1801                              <1> 	; 22/11/2017
  1802 0000838C AC                  <1> 	lodsb
  1803 0000838D 3C20                <1> 	cmp	al, 20h
  1804 0000838F 73FB                <1> 	jnb	short cmd_echo_asciiz
  1805 00008391 4E                  <1> 	dec	esi
  1806 00008392 C60600              <1> 	mov	byte [esi], 0
  1807 00008395 5E                  <1> 	pop	esi
  1808 00008396 89F7                <1> 	mov	edi, esi
  1809 00008398 E8ADE9FFFF          <1> 	call	print_msg
  1810 0000839D C60700              <1> 	mov	byte [edi], 0	
  1811                              <1> cmd_echo_nextline:
  1812 000083A0 BE[B53B0100]        <1> 	mov	esi, NextLine
  1813                              <1> 	;call	print_msg   
  1814                              <1> 	;retn
  1815 000083A5 E9A0E9FFFF          <1> 	jmp	print_msg
  1816                              <1> 
  1817                              <1> cmp_cmd_copy:
  1818 000083AA B104                <1> 	mov	cl, 4
  1819 000083AC BF[87310100]        <1> 	mov	edi, Cmd_Copy
  1820 000083B1 E8AF020000          <1>    	call	cmp_cmd	
  1821                              <1> 	;jnc	copy_file
  1822                              <1> 	; 26/07/2022
  1823 000083B6 7205                <1> 	jc	short cmp_cmd_move
  1824 000083B8 E9E9160000          <1> 	jmp	copy_file
  1825                              <1> 
  1826                              <1> cmp_cmd_move:
  1827 000083BD B104                <1> 	mov	cl, 4
  1828 000083BF BF[8C310100]        <1> 	mov	edi, Cmd_Move
  1829 000083C4 E89C020000          <1>    	call	cmp_cmd	
  1830                              <1> 	;jnc	move_file
  1831                              <1> 	; 26/07/2022
  1832 000083C9 7205                <1> 	jc	short cmp_cmd_path
  1833 000083CB E994150000          <1> 	jmp	move_file
  1834                              <1> 
  1835                              <1> cmp_cmd_path:
  1836 000083D0 B104                <1> 	mov	cl, 4
  1837 000083D2 BF[91310100]        <1> 	mov	edi, Cmd_Path
  1838 000083D7 E889020000          <1>    	call	cmp_cmd	
  1839                              <1> 	;jnc	set_get_path
  1840                              <1> 	; 26/07/2022
  1841 000083DC 7205                <1> 	jc	short cmp_cmd_beep
  1842 000083DE E900190000          <1> 	jmp	set_get_path
  1843                              <1> 
  1844                              <1> cmp_cmd_beep:
  1845 000083E3 B104                <1> 	mov	cl, 4
  1846 000083E5 BF[BE310100]        <1> 	mov	edi, Cmd_Beep
  1847 000083EA E876020000          <1>    	call	cmp_cmd	
  1848 000083EF 720B                <1> 	jc	short cmp_cmd_find
  1849                              <1> 	; 13/05/2016
  1850 000083F1 8A3D[B6780100]      <1> 	mov	bh, [ptty] ; [ACTIVE_PAGE]
  1851 000083F7 E97A9FFFFF          <1> 	jmp	beeper
  1852                              <1> 
  1853                              <1> cmp_cmd_find:
  1854 000083FC B104                <1> 	mov	cl, 4
  1855 000083FE BF[9B310100]        <1> 	mov	edi, Cmd_Find
  1856 00008403 E85D020000          <1>    	call	cmp_cmd	
  1857                              <1>         ;jc	cmp_cmd_external
  1858                              <1> 	; 26/07/2022
  1859 00008408 7305                <1> 	jnc	short c4_find
  1860 0000840A E939020000          <1> 	jmp	cmp_cmd_external
  1861                              <1> c4_find:
  1862                              <1> 	;call	find_and_list_files
  1863 0000840F E961210000          <1> 	jmp	find_and_list_files
  1864                              <1> 	;retn
  1865                              <1> 
  1866                              <1> c_1:
  1867 00008414 AD                  <1> 	lodsd
  1868                              <1> cmp_cmd_help:
  1869 00008415 3C3F                <1> 	cmp	al, '?'
  1870 00008417 751D                <1>         jne     short cmp_cmd_remark
  1871                              <1> 
  1872 00008419 BE[24310100]        <1> 	mov	esi, Command_List
  1873                              <1> cmd_help_next_w:
  1874 0000841E E827E9FFFF          <1> 	call	print_msg
  1875                              <1> 
  1876 00008423 803E20              <1> 	cmp	byte [esi], 20h ; 0
  1877 00008426 7233                <1> 	jb	short cmd_help_retn
  1878                              <1> 	
  1879 00008428 56                  <1> 	push	esi
  1880 00008429 BE[473B0100]        <1> 	mov	esi, nextline
  1881 0000842E E817E9FFFF          <1> 	call	print_msg
  1882 00008433 5E                  <1> 	pop	esi
  1883 00008434 EBE8                <1> 	jmp	short cmd_help_next_w	
  1884                              <1> 
  1885                              <1> cmp_cmd_remark:
  1886 00008436 3C2A                <1> 	cmp	al, '*'
  1887                              <1> 	;jne	cmp_cmd_external
  1888                              <1> 	; 26/07/2022
  1889 00008438 7405                <1> 	je	short cmp_cmd_rem
  1890 0000843A E909020000          <1> 	jmp	cmp_cmd_external
  1891                              <1> cmp_cmd_rem:
  1892 0000843F 46                  <1> 	inc	esi
  1893 00008440 BF[AC790100]        <1> 	mov	edi, Remark
  1894 00008445 8A06                <1> 	mov	al, [esi]
  1895 00008447 3C20                <1> 	cmp	al, 20h
  1896 00008449 7707                <1> 	ja	short cmd_remark_write
  1897 0000844B 89FE                <1> 	mov	esi, edi ; Remark
  1898 0000844D E9F8E8FFFF          <1> 	jmp	print_msg
  1899                              <1> 
  1900                              <1> cmd_remark_write:
  1901 00008452 AA                  <1> 	stosb
  1902 00008453 AC                  <1> 	lodsb
  1903 00008454 3C20                <1> 	cmp	al, 20h
  1904 00008456 73FA                <1> 	jnb	short cmd_remark_write
  1905 00008458 C60700              <1> 	mov	byte [edi], 0
  1906                              <1> 
  1907                              <1> cmd_help_retn:
  1908                              <1> cmd_remark_retn:
  1909                              <1> cd_retn:
  1910 0000845B C3                  <1> 	retn
  1911                              <1> c_2:
  1912                              <1> 	; 26/07/2022
  1913 0000845C BE[FA790100]        <1> 	mov	esi, CommandBuffer
  1914 00008461 80F902              <1> 	cmp	cl, 2
  1915                              <1> 	;ja	c_3
  1916                              <1> 	;mov	esi, CommandBuffer
  1917 00008464 72AE                <1> 	jb	short c_1
  1918                              <1> 	; 26/07/2022
  1919                              <1> 	;jne	short c_1
  1920                              <1> 
  1921                              <1> cmp_cmd_cd:
  1922 00008466 66AD                <1> 	lodsw
  1923 00008468 663D4344            <1> 	cmp	ax, 'CD'
  1924 0000846C 754E                <1> 	jne	short cmp_cmd_drive
  1925 0000846E 46                  <1>         inc	esi
  1926                              <1> cd_0:
  1927 0000846F 668B06              <1> 	mov	ax, [esi]	
  1928 00008472 3C20                <1> 	cmp	al, 20h
  1929 00008474 76E5                <1> 	jna	short cd_retn
  1930                              <1> 	; 10/02/2016
  1931 00008476 80FC3A              <1> 	cmp	ah, ':'
  1932 00008479 7504                <1> 	jne	short cd_1
  1933 0000847B 46                  <1> 	inc	esi
  1934 0000847C 46                  <1> 	inc	esi
  1935 0000847D EB47                <1> 	jmp	short cd_2
  1936                              <1> 
  1937                              <1> cd_1:	; change current directory
  1938                              <1> 	; 29/11/2009
  1939                              <1> 	; AH = CDh	; to separate 'CD' command from others
  1940                              <1> 			; for restoring current directory
  1941                              <1> 			; 0CDh sign is for saving cdir into 
  1942                              <1> 			; DOS drv description table cdir area
  1943                              <1> 	
  1944 0000847F B4CD                <1> 	mov	ah, 0CDh ; mov byte [CD_COMMAND], 0CDh 
  1945                              <1> 
  1946 00008481 E8CA210000          <1> 	call	change_current_directory
  1947                              <1> 	;jnc	change_prompt_dir_string
  1948                              <1> 	; 26/07/2022
  1949 00008486 7205                <1> 	jc	short cd_error_messages
  1950 00008488 E9EC200000          <1> 	jmp	change_prompt_dir_string
  1951                              <1> 
  1952                              <1> cd_error_messages:
  1953 0000848D 3C03                <1> 	cmp	al, 3
  1954 0000848F 740C                <1> 	je	short cd_path_not_found
  1955                              <1> 	; 16/10/2016 (15h -> 15)
  1956 00008491 3C0F                <1> 	cmp	al, 15 ; drive not ready error 
  1957 00008493 7453                <1> 	je	short cd_drive_not_ready
  1958 00008495 3C11                <1> 	cmp	al, 17 ; read error
  1959 00008497 744F                <1> 	je	short cd_drive_not_ready	
  1960 00008499 3C13                <1> 	cmp	al, 19 ; ; Bad directory/path name 
  1961 0000849B 7460                <1> 	je	short cd_command_failed
  1962                              <1> 
  1963                              <1> cd_path_not_found:
  1964 0000849D 50                  <1> 	push	eax ; 29/12/2017
  1965                              <1> 	;push	ax	
  1966 0000849E BE[C7330100]        <1> 	mov	esi, Msg_Dir_Not_Found
  1967 000084A3 E8A2E8FFFF          <1> 	call	print_msg
  1968                              <1> 	;pop	ax
  1969 000084A8 58                  <1> 	pop	eax ; 29/12/2017
  1970 000084A9 3A25[48790100]      <1> 	cmp	ah, [Current_Dir_Level]
  1971                              <1>         ;jnb	change_prompt_dir_string
  1972                              <1> 	; 26/07/2022
  1973 000084AF 7306                <1> 	jnb	short cd_cpds
  1974 000084B1 8825[48790100]      <1> 	mov	[Current_Dir_Level], ah
  1975                              <1> cd_cpds:
  1976 000084B7 E9BD200000          <1>         jmp     change_prompt_dir_string
  1977                              <1> 
  1978                              <1> cmp_cmd_drive: ; change current drive
  1979                              <1> 	; C:, D:, E: etc.
  1980 000084BC 80FC3A              <1> 	cmp	ah, ':'
  1981                              <1> 	;jne	cmp_cmd_external
  1982                              <1> 	; 26/07/2022
  1983 000084BF 7405                <1> 	je	short cd_2
  1984                              <1> cmd_ext:
  1985 000084C1 E982010000          <1> 	jmp	cmp_cmd_external
  1986                              <1> 
  1987                              <1> cd_2:	; 'CD C:', 'CD D:' ...
  1988 000084C6 803E20              <1> 	cmp	byte [esi], 20h
  1989                              <1> 	;ja	loc_cmd_failed
  1990                              <1> 	; 26/07/2022
  1991 000084C9 7706                <1> 	ja	short cd_failed
  1992 000084CB 24DF                <1> 	and	al, 0DFh
  1993 000084CD 2C41                <1> 	sub	al, 'A'
  1994                              <1> 	;jc	loc_cmd_failed
  1995                              <1> 	; 26/07/2022
  1996 000084CF 7305                <1> 	jnc	short cd_3
  1997                              <1> cd_failed:
  1998 000084D1 E97C010000          <1> 	jmp	loc_cmd_failed
  1999                              <1> cd_3:
  2000 000084D6 3A05[BC300100]      <1>         cmp     al, [Last_DOS_DiskNo]
  2001 000084DC 770A                <1>         ja	short cd_drive_not_ready
  2002                              <1> 	
  2003 000084DE 88C2                <1> 	mov	dl, al
  2004 000084E0 E8A6F3FFFF          <1> 	call 	change_current_drive
  2005 000084E5 7201                <1> 	jc	short cd_drive_not_ready	
  2006 000084E7 C3                  <1> 	retn
  2007                              <1> 
  2008                              <1> cd_drive_not_ready:
  2009 000084E8 BE[84330100]        <1> 	mov	esi, Msg_Not_Ready_Read_Err
  2010 000084ED E858E8FFFF          <1> 	call	print_msg
  2011                              <1> 
  2012                              <1> cd_fail_drive_restart:
  2013 000084F2 8A15[4A790100]      <1> 	mov	dl, [Current_Drv]
  2014                              <1> 	;call 	change_current_drive
  2015 000084F8 E98EF3FFFF          <1>         jmp     change_current_drive
  2016                              <1> 	;retn
  2017                              <1> 
  2018                              <1> cd_command_failed:
  2019 000084FD BE[65330100]        <1> 	mov	esi, Msg_Bad_Command
  2020 00008502 E843E8FFFF          <1> 	call	print_msg
  2021 00008507 EBE9                <1> 	jmp	short cd_fail_drive_restart
  2022                              <1> 
  2023                              <1> c_5:
  2024                              <1> cmp_cmd_mkdir:
  2025 00008509 BF[81310100]        <1> 	mov	edi, Cmd_Mkdir
  2026 0000850E E852010000          <1> 	call	cmp_cmd	
  2027                              <1> 	;jnc	make_directory
  2028                              <1> 	; 26/07/2022
  2029 00008513 7205                <1> 	jc	short cmp_cmd_rmdir
  2030 00008515 E99B0A0000          <1> 	jmp	make_directory
  2031                              <1> 
  2032                              <1> cmp_cmd_rmdir:
  2033 0000851A B105                <1> 	mov	cl, 5
  2034 0000851C BF[7B310100]        <1> 	mov	edi, Cmd_Rmdir
  2035 00008521 E83F010000          <1> 	call	cmp_cmd	
  2036                              <1> 	;jnc	delete_directory
  2037                              <1> 	; 26/07/2022
  2038 00008526 7205                <1> 	jc	short cmp_cmd_chdir
  2039 00008528 E9A40B0000          <1> 	jmp	delete_directory
  2040                              <1> 
  2041                              <1> cmp_cmd_chdir:
  2042 0000852D B105                <1> 	mov	cl, 5
  2043 0000852F BF[B8310100]        <1> 	mov	edi, Cmd_Chdir
  2044 00008534 E82C010000          <1> 	call	cmp_cmd	
  2045                              <1> 	;jc	cmp_cmd_external
  2046                              <1> 	; 26/07/2022
  2047 00008539 7286                <1> 	jc	short cmd_ext
  2048                              <1> 
  2049 0000853B E92FFFFFFF          <1> 	jmp	cd_0
  2050                              <1> 
  2051                              <1> c_6:
  2052 00008540 80F906              <1> 	cmp	cl, 6
  2053                              <1> 	;ja	c_8
  2054                              <1> 	; 26/07/2022
  2055 00008543 72C4                <1> 	jb	short c_5
  2056 00008545 7405                <1> 	je	short cmd_6
  2057 00008547 E9E4000000          <1> 	jmp	c_8
  2058                              <1> 
  2059                              <1> cmd_6:
  2060                              <1> cmp_cmd_prompt:
  2061 0000854C BF[37310100]        <1> 	mov	edi, Cmd_Prompt
  2062 00008551 E80F010000          <1> 	call	cmp_cmd	
  2063 00008556 722F                <1>         jc	short cmp_cmd_volume
  2064                              <1> get_prompt_name_fchar:
  2065 00008558 AC                  <1> 	lodsb
  2066 00008559 3C20                <1> 	cmp	al, 20h
  2067 0000855B 74FB                <1> 	je	short get_prompt_name_fchar
  2068 0000855D 7713                <1> 	ja	short loc_change_prompt_label
  2069                              <1> default_command_prompt: ; 31/12/2017 ('sysprompt')
  2070 0000855F BE[18310100]        <1> 	mov	esi, TRDOSPromptLabel
  2071 00008564 C7065452444F        <1> 	mov	dword [esi], "TRDO"
  2072 0000856A 66C746045300        <1>        	mov	word [esi+4], "S" 
  2073                              <1> loc_cmd_prompt_return:
  2074 00008570 C3                  <1> 	retn
  2075                              <1> 
  2076                              <1> set_command_prompt: ; 31/12/2017 ('sysprompt')
  2077 00008571 AC                  <1> 	lodsb
  2078                              <1> loc_change_prompt_label:
  2079                              <1> 	;mov	cx, 11
  2080                              <1> 	; 26/07/2022
  2081 00008572 29C9                <1> 	sub	ecx, ecx
  2082 00008574 B10B                <1> 	mov	cl, 11
  2083 00008576 BF[18310100]        <1> 	mov	edi, TRDOSPromptLabel
  2084                              <1> put_char_new_prompt_label:
  2085 0000857B AA                  <1> 	stosb
  2086 0000857C AC                  <1> 	lodsb
  2087 0000857D 3C20                <1> 	cmp	al, 20h
  2088 0000857F 7202                <1> 	jb	short pass_put_new_prompt_label
  2089 00008581 E2F8                <1> 	loop	put_char_new_prompt_label
  2090                              <1> pass_put_new_prompt_label:
  2091 00008583 C60700              <1> 	mov	byte [edi], 0
  2092 00008586 C3                  <1> 	retn
  2093                              <1> 
  2094                              <1> cmp_cmd_volume:
  2095 00008587 B106                <1> 	mov	cl, 6
  2096 00008589 BF[3E310100]        <1> 	mov	edi, Cmd_Volume
  2097 0000858E E8D2000000          <1> 	call	cmp_cmd	
  2098 00008593 7259                <1>         jc	short cmp_cmd_attrib
  2099                              <1> 
  2100                              <1> cmd_vol1:
  2101 00008595 AC                  <1> 	lodsb
  2102 00008596 3C20                <1> 	cmp	al, 20h
  2103 00008598 7707                <1> 	ja	short cmd_vol2
  2104 0000859A A0[4A790100]        <1> 	mov	al, [Current_Drv]
  2105 0000859F EB41                <1> 	jmp	short cmd_vol4
  2106                              <1> cmd_vol2:
  2107 000085A1 3C41                <1> 	cmp	al, 'A'
  2108                              <1> 	;jb	loc_cmd_failed
  2109                              <1> 	; 26/07/2022
  2110 000085A3 722D                <1> 	jb	short cmd_vol_failed_1
  2111 000085A5 3C7A                <1> 	cmp	al, 'z'
  2112                              <1> 	;ja	loc_cmd_failed
  2113                              <1> 	; 26/07/2022
  2114 000085A7 7731                <1> 	ja	short cmd_vol_failed_2
  2115 000085A9 3C5A                <1> 	cmp	al, 'Z'
  2116 000085AB 7606                <1> 	jna	short cmd_vol3
  2117 000085AD 3C61                <1> 	cmp	al, 'a'
  2118                              <1>         ;jb	loc_cmd_failed
  2119                              <1> 	; 26/07/2022
  2120 000085AF 722B                <1> 	jb	short cmd_vol_failed_3
  2121 000085B1 24DF                <1> 	and	al, 0DFh
  2122                              <1> cmd_vol3:
  2123 000085B3 8A26                <1> 	mov	ah, [esi]
  2124 000085B5 80FC3A              <1> 	cmp	ah, ':'
  2125 000085B8 0F8594000000        <1>         jne     loc_cmd_failed
  2126 000085BE 2C41                <1> 	sub	al, 'A'
  2127 000085C0 3A05[BC300100]      <1>         cmp     al, [Last_DOS_DiskNo]
  2128 000085C6 761A                <1> 	jna	short cmd_vol4
  2129                              <1> 
  2130 000085C8 BE[84330100]        <1> 	mov	esi, Msg_Not_Ready_Read_Err
  2131 000085CD E978E7FFFF          <1> 	jmp	print_msg
  2132                              <1> 
  2133                              <1> 	; 26/07/2022
  2134                              <1> 	; (numeric characters and underscore are allowed)
  2135                              <1> cmd_vol_failed_1:
  2136                              <1> 	; check for numeric characters
  2137 000085D2 3C30                <1> 	cmp	al, '0'
  2138 000085D4 7204                <1> 	jb	short cmd_vol_failed_2
  2139 000085D6 3C39                <1> 	cmp	al, '9'
  2140 000085D8 76D9                <1> 	jna	short cmd_vol3
  2141                              <1> cmd_vol_failed_2:		
  2142 000085DA EB76                <1> 	jmp	loc_cmd_failed
  2143                              <1> cmd_vol_failed_3:
  2144 000085DC 3C5F                <1> 	cmp	al, '_' ; underline ?
  2145 000085DE 74D3                <1> 	je	short cmd_vol3 ; is ok..
  2146 000085E0 EBF8                <1> 	jmp	short cmd_vol_failed_2
  2147                              <1> 
  2148                              <1> cmd_vol4:
  2149 000085E2 E889FAFFFF          <1> 	call	print_volume_info
  2150                              <1> 	;jc	cd_drive_not_ready
  2151                              <1> 	; 26/07/2022
  2152 000085E7 7339                <1> 	jnc	short cmd_vol5
  2153 000085E9 E9FAFEFFFF          <1> 	jmp	cd_drive_not_ready	
  2154                              <1> ;cmd_vol5:
  2155                              <1> ;	retn
  2156                              <1> 
  2157                              <1> cmp_cmd_attrib:
  2158 000085EE B106                <1> 	mov	cl, 6
  2159 000085F0 BF[6D310100]        <1> 	mov	edi, Cmd_Attrib
  2160 000085F5 E86B000000          <1> 	call	cmp_cmd	
  2161                              <1> 	;jnc	set_file_attributes
  2162                              <1> 	; 26/07/2022
  2163 000085FA 7205                <1> 	jc	short cmp_cmd_rename
  2164 000085FC E9F70E0000          <1> 	jmp	set_file_attributes
  2165                              <1> 
  2166                              <1> cmp_cmd_rename:
  2167 00008601 B106                <1> 	mov	cl, 6
  2168 00008603 BF[74310100]        <1> 	mov	edi, Cmd_Rename
  2169 00008608 E858000000          <1> 	call	cmp_cmd	
  2170                              <1> 	;jnc	rename_file
  2171                              <1> 	; 26/07/2022
  2172 0000860D 7205                <1> 	jc	short cmp_cmd_device
  2173 0000860F E915110000          <1> 	jmp	rename_file
  2174                              <1> 
  2175                              <1> cmp_cmd_device:
  2176 00008614 B106                <1> 	mov	cl, 6
  2177 00008616 BF[A9310100]        <1> 	mov	edi, Cmd_Device
  2178 0000861B E845000000          <1> 	call	cmp_cmd	
  2179 00008620 7226                <1> 	jc	short cmp_cmd_external
  2180                              <1> 	; 26/07/2022
  2181                              <1> cmd_vol5:
  2182                              <1> cmd_dev:
  2183 00008622 C3                  <1> 	retn
  2184                              <1> 
  2185                              <1> c_7:
  2186                              <1> cmp_cmd_devlist:
  2187 00008623 BF[B0310100]        <1> 	mov	edi, Cmd_DevList
  2188 00008628 E838000000          <1> 	call	cmp_cmd	
  2189 0000862D 7219                <1>         jc	short cmp_cmd_external
  2190                              <1> 
  2191                              <1> loc_cmd_return:
  2192 0000862F C3                  <1> 	retn
  2193                              <1> 
  2194                              <1> c_8:
  2195 00008630 80F908              <1>         cmp	cl, 8
  2196 00008633 7713                <1> 	ja	short cmp_cmd_external
  2197 00008635 72EC                <1> 	jb	short c_7
  2198                              <1> 
  2199                              <1> cmp_cmd_longname:
  2200 00008637 BF[45310100]        <1> 	mov	edi, Cmd_LongName
  2201 0000863C E824000000          <1> 	call	cmp_cmd	
  2202                              <1> 	;jnc	get_and_print_longname
  2203                              <1> 	; 26/07/2022
  2204 00008641 7205                <1> 	jc	short cmp_cmd_external
  2205 00008643 E962060000          <1> 	jmp	get_and_print_longname
  2206                              <1> 
  2207                              <1> cmp_cmd_external:
  2208                              <1> 	; 07/05/2016
  2209                              <1> 	; 22/04/2016
  2210 00008648 BE[FA790100]        <1> 	mov	esi, CommandBuffer
  2211 0000864D E92A1C0000          <1> 	jmp	loc_run_check_filename 
  2212                              <1> 
  2213                              <1> loc_cmd_failed:
  2214 00008652 803D[FA790100]20    <1> 	cmp	byte [CommandBuffer], 20h
  2215 00008659 76D4                <1> 	jna	short loc_cmd_return
  2216 0000865B BE[65330100]        <1> 	mov	esi, Msg_Bad_Command
  2217                              <1> ;	call	print_msg
  2218                              <1> ;loc_cmd_return:
  2219                              <1> ;	retn
  2220 00008660 E9E5E6FFFF          <1> 	jmp	print_msg
  2221                              <1> 
  2222                              <1> cmp_cmd:
  2223                              <1> 	; 26/07/2022 (TRDOS 386 Kernel v2.0.5)
  2224                              <1> 	; 29/01/2016 (TRDOS 386 = TRDOS v2.0)
  2225 00008665 BE[FA790100]        <1>         mov	esi, CommandBuffer
  2226                              <1>         ; edi = internal command word (ASCIIZ)
  2227                              <1> 	; ecx = command length (<=8)
  2228                              <1> cmp_cmd_1:
  2229 0000866A AC                  <1> 	lodsb
  2230 0000866B AE                  <1> 	scasb
  2231 0000866C 750D                <1> 	jne	short cmp_cmd_3
  2232 0000866E E2FA                <1> 	loop	cmp_cmd_1
  2233 00008670 AC                  <1>  	lodsb
  2234 00008671 3C20                <1> 	cmp	al, 20h
  2235 00008673 7703                <1> 	ja	short cmp_cmd_2
  2236 00008675 30C0                <1> 	xor	al, al
  2237                              <1> 	; ZF = 1 -> internal command word matches
  2238 00008677 C3                  <1> 	retn
  2239                              <1> cmp_cmd_2:
  2240                              <1> 	; ZF = 0 (CF = 0) -> external command word 	
  2241 00008678 58                  <1> 	pop	eax ; no return to the caller from here 
  2242 00008679 EBCD                <1> 	jmp	short cmp_cmd_external  ; 26/07/2022	
  2243                              <1> cmp_cmd_3:
  2244 0000867B F9                  <1> 	stc
  2245                              <1> 	; CF = 1 -> internal command word does not match
  2246 0000867C C3                  <1> 	retn
  2247                              <1> 
  2248                              <1> loc_run_cmd_failed:
  2249                              <1> 	; 26/07/2022 (TRDOS 386 Kernel v2.0.5)
  2250                              <1> 	; 15/03/2016
  2251                              <1> 	; 15/02/2016 (TRDOS 386 = TRDOS v2.0)
  2252                              <1> 	; 07/12/2009 (CMD_INTR.ASM)	
  2253                              <1> 	; 29/11/2009
  2254                              <1> 
  2255 0000867D E863000000          <1> 	call	restore_cdir_after_cmd_fail
  2256                              <1> 
  2257                              <1> loc_run_cmd_failed_cmp_al:
  2258                              <1> 	; End of Restore_CDIR code (29/11/2009)
  2259                              <1> 
  2260 00008682 3C01                <1> 	cmp	al, 1 ; Bad command or file name
  2261 00008684 74CC                <1> 	je	short loc_cmd_failed ; 26/07/2022
  2262                              <1> loc_run_dir_not_found:
  2263 00008686 3C03                <1> 	cmp	al, 3
  2264 00008688 750A                <1> 	jne	short loc_run_file_notfound_msg
  2265                              <1> 	; Path not found (MS-DOS Error Code = 3)
  2266 0000868A BE[C7330100]        <1> 	mov	esi, Msg_Dir_Not_Found
  2267 0000868F E9B6E6FFFF          <1> 	jmp	print_msg
  2268                              <1> 
  2269                              <1> loc_run_file_notfound_msg:
  2270 00008694 3C02                <1> 	cmp	al, 2 ; File not found
  2271 00008696 750A                <1> 	jne	short loc_run_file_drv_read_err
  2272                              <1> 
  2273                              <1> loc_print_file_notfound_msg: 
  2274 00008698 BE[DE330100]        <1>         mov     esi, Msg_File_Not_Found
  2275                              <1> 	;call	proc_printmsg
  2276                              <1> 	;retn
  2277 0000869D E9A8E6FFFF          <1> 	jmp	print_msg
  2278                              <1> 
  2279                              <1> loc_run_file_drv_read_err:
  2280                              <1> 	; Err: 17 (Read fault)
  2281 000086A2 3C11                <1> 	cmp	al, 17 ; Drive not ready or read error
  2282 000086A4 7404                <1> 	je	short loc_run_file_print_drv_read_err
  2283                              <1> 	;
  2284 000086A6 3C0F                <1> 	cmp	al, 15 ; Drive not ready (or read error)
  2285 000086A8 750A                <1> 	jne	short loc_run_file_toobig
  2286                              <1> 
  2287                              <1> loc_run_file_print_drv_read_err:
  2288 000086AA BE[84330100]        <1> 	mov	esi, Msg_Not_Ready_Read_Err
  2289 000086AF E996E6FFFF          <1> 	jmp	print_msg
  2290                              <1> 
  2291                              <1> loc_run_file_toobig:
  2292 000086B4 3C08                <1> 	cmp	al, 8 ; Not enough free memory to load&run file
  2293 000086B6 750A                <1> 	jne	short loc_run_file_perm_denied
  2294 000086B8 BE[29340100]        <1> 	mov	esi, Msg_Insufficient_Memory
  2295 000086BD E988E6FFFF          <1> 	jmp	print_msg
  2296                              <1> 
  2297                              <1> loc_run_file_perm_denied:
  2298                              <1> 	; 29/12/2017
  2299 000086C2 3C0B                <1> 	cmp	al, ERR_PERM_DENIED ; 11 ; Permission denied
  2300 000086C4 750A                <1> 	jne	short loc_run_misc_error
  2301 000086C6 BE[BE350100]        <1> 	mov	esi, Msg_Permission_Denied
  2302 000086CB E97AE6FFFF          <1> 	jmp	print_msg	
  2303                              <1> 
  2304                              <1> 	; 15/03/2016
  2305                              <1> print_misc_error_msg:
  2306                              <1> loc_run_misc_error:
  2307                              <1> 	; AL = Error code
  2308 000086D0 E897BAFFFF          <1> 	call	bytetohex
  2309 000086D5 66A3[5D340100]      <1>         mov     [error_code_hex], ax
  2310                              <1> 	
  2311 000086DB BE[40340100]        <1> 	mov	esi, Msg_Error_Code 
  2312                              <1> 	;call	print_msg 
  2313                              <1> 	;retn
  2314 000086E0 E965E6FFFF          <1> 	jmp	print_msg
  2315                              <1> 
  2316                              <1> restore_cdir_after_cmd_fail:
  2317                              <1> 	; 15/02/2016 (TRDOS 386 = TRDOS v2.0)
  2318 000086E5 50                  <1> 	push	eax
  2319 000086E6 8A3D[A7800100]      <1> 	mov	bh, [RUN_CDRV] ; it is set at the beginning
  2320                              <1> 				; of the 'run' command.
  2321 000086EC 3A3D[4A790100]      <1> 	cmp	bh, [Current_Drv]
  2322 000086F2 7409                <1> 	je	short loc_run_restore_cdir
  2323 000086F4 88FA                <1> 	mov	dl, bh
  2324 000086F6 E890F1FFFF          <1> 	call	change_current_drive 
  2325 000086FB EB19                <1> 	jmp	short loc_run_err_pass_restore_cdir
  2326                              <1> 
  2327                              <1> loc_run_restore_cdir:
  2328 000086FD 803D[BD300100]00    <1> 	cmp	byte [Restore_CDIR], 0
  2329 00008704 7610                <1> 	jna	short loc_run_err_pass_restore_cdir
  2330 00008706 30DB                <1> 	xor	bl, bl
  2331 00008708 0FB7F3              <1> 	movzx	esi, bx
  2332 0000870B 81C600010900        <1> 	add	esi, Logical_DOSDisks
  2333 00008711 E82BF2FFFF          <1> 	call	restore_current_directory
  2334                              <1> 
  2335                              <1> loc_run_err_pass_restore_cdir:
  2336 00008716 58                  <1> 	pop	eax
  2337 00008717 C3                  <1> 	retn
  2338                              <1> 
  2339                              <1> print_directory_list:
  2340                              <1> 	; 02/12/2023 (TRDOS 386 v2.0.7) 
  2341                              <1> 	; 07/08/2022
  2342                              <1> 	; 27/07/2022 (TRDOS 386 Kernel v2.0.5)
  2343                              <1> 	; 10/02/2016
  2344                              <1> 	; 08/02/2016 (TRDOS 386 = TRDOS v2.0)
  2345                              <1> 	; 06/12/2009 ('cmp_cmd_dir')	
  2346                              <1> 	;
  2347 00008718 66C705[E8810100]00- <1> 	mov	word [AttributesMask], 0800h ; ..except volume names..
  2347 00008720 08                  <1>
  2348 00008721 A0[4A790100]        <1> 	mov	al, [Current_Drv]
  2349 00008726 A2[A7800100]        <1> 	mov	[RUN_CDRV], al
  2350                              <1> 	; 02/12/2023
  2351 0000872B 3C02                <1> 	cmp	al, 2
  2352 0000872D 733A                <1> 	jnb	short get_dfname_fchar
  2353 0000872F A0[09790100]        <1> 	mov	al, [TIMER_LOW+1]
  2354 00008734 D0E8                <1> 	shr	al, 1	; 512/18.2 (>= 28 seconds)
  2355 00008736 8605[6E800100]      <1> 	xchg	al, [P_TIMER]  ; 28 seconds
  2356 0000873C 3A05[6E800100]      <1> 	cmp	al, [P_TIMER]
  2357 00008742 7425                <1> 	je	short get_dfname_fchar
  2358 00008744 E830F1FFFF          <1> 	call	get_media_change_status
  2359 00008749 7205                <1> 	jc	short pdl_chdrv
  2360 0000874B 80FC06              <1> 	cmp	ah, 6
  2361 0000874E 7519                <1> 	jne	short get_dfname_fchar
  2362                              <1> pdl_chdrv:
  2363 00008750 56                  <1> 	push	esi
  2364 00008751 8A15[A7800100]      <1> 	mov	dl, [RUN_CDRV]
  2365 00008757 E82FF1FFFF          <1> 	call	change_current_drive
  2366 0000875C 5E                  <1> 	pop	esi
  2367 0000875D 730A                <1> 	jnc	short get_dfname_fchar
  2368 0000875F BE[84330100]        <1> 	mov	esi, Msg_Not_Ready_Read_Err
  2369                              <1> 	;call	print_msg
  2370                              <1> 	;retn
  2371 00008764 E9E1E5FFFF          <1> 	jmp	print_msg		
  2372                              <1> 
  2373                              <1> get_dfname_fchar:
  2374 00008769 AC                  <1> 	lodsb
  2375 0000876A 3C20                <1> 	cmp	al, 20h
  2376 0000876C 74FB                <1> 	je	short get_dfname_fchar
  2377                              <1> 	;jb	loc_print_dir_call_all
  2378                              <1> 	; 02/12/2023
  2379 0000876E 7705                <1> 	ja	short get_dfname_fchar_2
  2380 00008770 E9E0000000          <1> 	jmp	loc_print_dir_call_all
  2381                              <1> get_dfname_fchar_2:
  2382 00008775 3C2D                <1> 	cmp	al, '-'
  2383 00008777 753C                <1> 	jne	short loc_print_dir_call_flt
  2384                              <1> get_next_attr_char:
  2385 00008779 AC                  <1> 	lodsb
  2386 0000877A 3C20                <1> 	cmp	al, 20h
  2387 0000877C 74FB                <1> 	je	short get_next_attr_char
  2388                              <1> 	;jb	loc_cmd_failed
  2389                              <1> 	; 27/07/2022
  2390 0000877E 7305                <1> 	jnb	short pdl_1
  2391                              <1> pdl_0:
  2392 00008780 E9CDFEFFFF          <1> 	jmp	loc_cmd_failed
  2393                              <1> pdl_1:
  2394 00008785 24DF                <1> 	and	al, 0DFh
  2395 00008787 3C44                <1> 	cmp	al, 'D' ; directories only ?
  2396 00008789 750E                <1> 	jne	short pass_only_directories
  2397 0000878B AC                  <1> 	lodsb
  2398 0000878C 3C20                <1> 	cmp	al, 20h
  2399                              <1> 	;ja	loc_cmd_failed
  2400                              <1> 	; 27/07/2022
  2401 0000878E 77F0                <1> 	ja	short pdl_0
  2402 00008790 800D[E8810100]10    <1> 	or	byte [AttributesMask], 10h ; ..directory..
  2403 00008797 EB10                <1> 	jmp	short get_dfname_fchar_attr
  2404                              <1> pass_only_directories:
  2405 00008799 3C46                <1> 	cmp	al, 'F'	; files only ?
  2406 0000879B 7530                <1> 	jne	short check_attr_s ; 27/07/2022
  2407 0000879D AC                  <1> 	lodsb
  2408 0000879E 3C20                <1> 	cmp	al, 20h
  2409                              <1> 	;ja	loc_cmd_failed
  2410                              <1> 	; 27/07/2022
  2411 000087A0 77DE                <1> 	ja	short pdl_0
  2412 000087A2 800D[E9810100]10    <1> 	or	byte [AttributesMask+1], 10h ; ..except directories..
  2413                              <1> get_dfname_fchar_attr:
  2414 000087A9 AC                  <1> 	lodsb
  2415 000087AA 3C20                <1> 	cmp	al, 20h
  2416 000087AC 74FB                <1> 	je	short get_dfname_fchar_attr
  2417                              <1> 	;jb	short loc_print_dir_call_all
  2418                              <1> 	; 07/08/2022
  2419 000087AE 7305                <1> 	jnb	short loc_print_dir_call_flt
  2420 000087B0 E9A0000000          <1> 	jmp	loc_print_dir_call_all
  2421                              <1> loc_print_dir_call_flt:
  2422 000087B5 4E                  <1> 	dec	esi
  2423 000087B6 BF[EA810100]        <1> 	mov	edi, FindFile_Drv
  2424 000087BB E87C240000          <1> 	call	parse_path_name
  2425 000087C0 7352                <1>  	jnc	short loc_print_dir_change_drv_1
  2426 000087C2 3C01                <1> 	cmp	al, 1
  2427                              <1> 	;ja	loc_run_cmd_failed
  2428                              <1> 	; 27/07/2022
  2429 000087C4 764E                <1> 	jna	short loc_print_dir_change_drv_1
  2430                              <1> pdl_2:
  2431 000087C6 E9B2FEFFFF          <1> 	jmp	loc_run_cmd_failed
  2432                              <1> 
  2433                              <1> 	; 27/07/2022
  2434                              <1> check_attr_s_cap:
  2435 000087CB 24DF                <1> 	and	al, 0DFh
  2436                              <1> check_attr_s:
  2437 000087CD 3C53                <1> 	cmp	al, 'S'
  2438 000087CF 7510                <1> 	jne	short pass_attr_s
  2439 000087D1 800D[E8810100]04    <1> 	or	byte [AttributesMask], 4 ; system
  2440 000087D8 AC                  <1> 	lodsb
  2441 000087D9 3C20                <1> 	cmp	al, 20h
  2442 000087DB 74CC                <1> 	je	short get_dfname_fchar_attr
  2443 000087DD 7276                <1> 	jb	short loc_print_dir_call_all
  2444 000087DF 24DF                <1> 	and	al, 0DFh
  2445                              <1> pass_attr_s:
  2446 000087E1 3C48                <1> 	cmp	al, 'H'
  2447 000087E3 7510                <1> 	jne	short pass_attr_h
  2448 000087E5 800D[E8810100]02    <1> 	or	byte [AttributesMask], 2 ; hidden
  2449                              <1> pass_attr_shr:
  2450 000087EC AC                  <1> 	lodsb
  2451 000087ED 3C20                <1> 	cmp	al, 20h
  2452 000087EF 74B8                <1> 	je	short get_dfname_fchar_attr
  2453 000087F1 7262                <1> 	jb	short loc_print_dir_call_all
  2454 000087F3 EBD6                <1> 	jmp	short check_attr_s_cap
  2455                              <1> pass_attr_h:
  2456 000087F5 3C52                <1> 	cmp	al, 'R'
  2457 000087F7 7509                <1> 	jne	short pass_attr_r
  2458 000087F9 800D[E8810100]01    <1> 	or	byte [AttributesMask], 1 ; read only
  2459 00008800 EBEA                <1> 	jmp	short pass_attr_shr
  2460                              <1> pass_attr_r:
  2461 00008802 3C41                <1> 	cmp	al, 'A'
  2462                              <1> 	;jne	loc_cmd_failed
  2463                              <1> 	; 27/07/2022
  2464 00008804 7405                <1> 	je	short pass_attr_a
  2465 00008806 E947FEFFFF          <1> 	jmp	loc_cmd_failed
  2466                              <1> pass_attr_a:
  2467 0000880B 800D[E8810100]20    <1> 	or	byte [AttributesMask], 20h ; archive
  2468 00008812 EBD8                <1> 	jmp	short pass_attr_shr
  2469                              <1> 
  2470                              <1> 	; 07/08/2022
  2471                              <1> loc_print_dir_change_drv_1:
  2472 00008814 8A15[EA810100]      <1> 	mov	dl, [FindFile_Drv]
  2473                              <1> loc_print_dir_change_drv_2:
  2474 0000881A 3A15[A7800100]      <1> 	cmp	dl, [RUN_CDRV]
  2475 00008820 7407                <1> 	je	short loc_print_dir_change_directory 
  2476 00008822 E864F0FFFF          <1> 	call	change_current_drive
  2477                              <1>         ;jc	loc_run_cmd_failed
  2478                              <1> 	; 27/07/2022
  2479 00008827 729D                <1> 	jc	short pdl_2
  2480                              <1> loc_print_dir_change_directory:
  2481 00008829 803D[EB810100]20    <1> 	cmp	byte [FindFile_Directory], 20h ; 0 or 20h ?
  2482 00008830 7619                <1> 	jna	short pass_print_dir_change_directory
  2483                              <1> 
  2484 00008832 FE05[BD300100]      <1> 	inc	byte [Restore_CDIR]
  2485 00008838 BE[EB810100]        <1> 	mov	esi, FindFile_Directory
  2486 0000883D 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0 
  2487 0000883F E80C1E0000          <1> 	call	change_current_directory
  2488                              <1>         ;jc	loc_run_cmd_failed
  2489                              <1> 	; 27/07/2022
  2490 00008844 7280                <1> 	jc	short pdl_2
  2491                              <1> 
  2492                              <1> loc_print_dir_change_prompt_dir_string:
  2493 00008846 E82E1D0000          <1> 	call	change_prompt_dir_string
  2494                              <1> 
  2495                              <1> pass_print_dir_change_directory:
  2496 0000884B BE[2C820100]        <1> 	mov	esi, FindFile_Name
  2497 00008850 803E20              <1> 	cmp	byte [esi], 20h ; ; 0 or 20h ?
  2498 00008853 7706                <1> 	ja	short loc_print_dir_call
  2499                              <1> 
  2500                              <1> loc_print_dir_call_all:
  2501 00008855 C7062A2E2A00        <1> 	mov	dword [esi], '*.*'
  2502                              <1> loc_print_dir_call:
  2503 0000885B E82D000000          <1> 	call	print_directory
  2504                              <1> 
  2505 00008860 8A15[A7800100]      <1> 	mov	dl, [RUN_CDRV]  ; it is set at the beginning
  2506 00008866 3A15[4A790100]      <1> 	cmp	dl, [Current_Drv]
  2507 0000886C 7405                <1> 	je	short loc_print_dir_call_restore_cdir_retn
  2508                              <1> 	;call	change_current_drive
  2509                              <1> 	;retn
  2510                              <1> 	; 27/07/2022
  2511 0000886E E918F0FFFF          <1> 	jmp	change_current_drive	
  2512                              <1> 
  2513                              <1> loc_print_dir_call_restore_cdir_retn:
  2514 00008873 803D[BD300100]00    <1> 	cmp	byte [Restore_CDIR], 0
  2515 0000887A 7610                <1> 	jna	short pass_print_dir_call_restore_cdir_retn
  2516                              <1> 
  2517 0000887C BE00010900          <1> 	mov	esi, Logical_DOSDisks
  2518 00008881 31C0                <1> 	xor	eax, eax
  2519 00008883 88D4                <1> 	mov	ah, dl
  2520 00008885 01C6                <1> 	add	esi, eax
  2521                              <1> 
  2522                              <1> 	;call	restore_current_directory
  2523                              <1> 	; 27/07/2022
  2524 00008887 E9B5F0FFFF          <1> 	jmp	restore_current_directory
  2525                              <1> 
  2526                              <1> pass_print_dir_call_restore_cdir_retn:
  2527 0000888C C3                  <1> 	retn
  2528                              <1> 
  2529                              <1> print_directory:
  2530                              <1> 	; 27/07/2022 (TRDOS 386 Kernel v2.0.5)
  2531                              <1> 	; 13/05/2016
  2532                              <1> 	; 11/02/2016
  2533                              <1> 	; 10/02/2016
  2534                              <1> 	; 08/02/2016 (TRDOS 386 = TRDOS v2.0)
  2535                              <1> 	; 30/10/2010 ('proc_print_directory')	
  2536                              <1> 	; 19/09/2009
  2537                              <1> 	; 2005 
  2538                              <1> 	; INPUT ->
  2539                              <1> 	;	ESI = Asciiz File/Dir Name Address
  2540                              <1> 
  2541 0000888D 56                  <1> 	push	esi
  2542                              <1> 
  2543 0000888E 29C0                <1> 	sub	eax, eax
  2544                              <1> 
  2545 00008890 66A3[74820100]      <1> 	mov	[Dir_Count], ax ; 0
  2546 00008896 66A3[72820100]      <1> 	mov 	[File_Count], ax ; 0
  2547 0000889C A3[76820100]        <1> 	mov 	[Total_FSize], eax ; 0
  2548                              <1> 
  2549 000088A1 E8BAE4FFFF          <1> 	call    clear_screen
  2550                              <1> 	
  2551 000088A6 31C9                <1> 	xor	ecx, ecx	
  2552 000088A8 8A2D[4A790100]      <1> 	mov     ch, [Current_Drv] ; DirBuff_Drv - 'A'
  2553 000088AE A0[4B790100]        <1> 	mov     al, [Current_Dir_Drv] 
  2554 000088B3 A2[82320100]        <1> 	mov     [Dir_Drive_Name], al
  2555 000088B8 BE00010900          <1> 	mov	esi, Logical_DOSDisks
  2556 000088BD 01CE                <1> 	add	esi, ecx
  2557                              <1> 
  2558 000088BF E826F9FFFF          <1> 	call	move_volume_name_and_serial_no
  2559 000088C4 730C                <1> 	jnc	short print_dir_strlen_check
  2560                              <1> 
  2561 000088C6 5E                  <1> 	pop	esi
  2562 000088C7 8A3D[B6780100]      <1> 	mov	bh, [ptty] ; [ACTIVE_PAGE]
  2563                              <1> 	;call	beeper
  2564                              <1> 	;retn
  2565 000088CD E9A49AFFFF          <1> 	jmp	beeper  ; beep ! and return
  2566                              <1> 
  2567                              <1> print_dir_strlen_check:
  2568 000088D2 BE[4D790100]        <1> 	mov	esi, Current_Dir_Root
  2569 000088D7 BF[1F330100]        <1> 	mov	edi, Dir_Str_Root
  2570                              <1> 	
  2571                              <1> 	;xor	ecx, ecx
  2572 000088DC 8A0D[A9790100]      <1>         mov     cl, [Current_Dir_StrLen]
  2573 000088E2 FEC1                <1> 	inc	cl
  2574 000088E4 80F940              <1> 	cmp	cl, 64
  2575 000088E7 760D                <1> 	jna	short pass_print_dir_strlen_shorting
  2576 000088E9 46                  <1> 	inc	esi
  2577 000088EA 01CE                <1> 	add	esi, ecx
  2578 000088EC 83EE40              <1> 	sub	esi, 64 
  2579 000088EF 47                  <1> 	inc	edi
  2580 000088F0 B82E2E2E20          <1> 	mov	eax, '... ' 
  2581 000088F5 AB                  <1> 	stosd
  2582                              <1>  
  2583                              <1> pass_print_dir_strlen_shorting:
  2584 000088F6 F3A4                <1> 	rep	movsb
  2585                              <1> 
  2586 000088F8 BE[75320100]        <1> 	mov	esi, Dir_Drive_Str
  2587 000088FD E848E4FFFF          <1> 	call	print_msg
  2588                              <1> 
  2589 00008902 BE[D4320100]        <1> 	mov	esi, Vol_Serial_Header
  2590 00008907 E83EE4FFFF          <1> 	call	print_msg
  2591                              <1> 
  2592 0000890C BE[14330100]        <1> 	mov	esi, Dir_Str_Header
  2593 00008911 E834E4FFFF          <1> 	call	print_msg
  2594                              <1> 	
  2595 00008916 BE[453B0100]        <1> 	mov	esi, next2line
  2596 0000891B E82AE4FFFF          <1> 	call	print_msg
  2597                              <1> 
  2598                              <1> loc_print_dir_first_file:
  2599 00008920 C605[89820100]10    <1> 	mov	byte [PrintDir_RowCounter], 16
  2600 00008927 66A1[E8810100]      <1> 	mov	ax, [AttributesMask]
  2601 0000892D 5E                  <1> 	pop	esi
  2602                              <1> 
  2603 0000892E E845020000          <1> 	call	find_first_file
  2604                              <1> 	;jc	loc_dir_ok
  2605                              <1> 	; 27/07/2022
  2606 00008933 7305                <1> 	jnc	short loc_dfname_use_this
  2607 00008935 E97B010000          <1> 	jmp	loc_dir_ok
  2608                              <1> 	 
  2609                              <1> loc_dfname_use_this:
  2610                              <1> 	; bl =	File Attributes (bh = Long Name Entry Length)
  2611 0000893A F6C310              <1> 	test	bl, 10h  ; Is it a directory?
  2612 0000893D 741B                <1> 	jz	short loc_not_dir
  2613                              <1> 
  2614 0000893F 66FF05[74820100]    <1> 	inc	word [Dir_Count]
  2615 00008946 89F2                <1> 	mov	edx, esi 	; FindFile_DirEntry address
  2616 00008948 BE[64340100]        <1>  	mov	esi, Type_Dir	; '<DIR>     '
  2617 0000894D BF[7B340100]        <1> 	mov	edi, Dir_Or_FileSize
  2618                              <1> 	; move 10 bytes
  2619 00008952 A5                  <1> 	movsd
  2620 00008953 A5                  <1> 	movsd
  2621 00008954 66A5                <1> 	movsw	    	
  2622 00008956 89D6                <1> 	mov	esi, edx
  2623 00008958 EB36                <1> 	jmp     short loc_dir_attribute
  2624                              <1> 
  2625                              <1> loc_not_dir:
  2626 0000895A 66FF05[72820100]    <1> 	inc	word [File_Count]
  2627 00008961 0105[76820100]      <1> 	add	[Total_FSize], eax
  2628                              <1> 
  2629 00008967 B90A000000          <1> 	mov	ecx, 10  ; 32 bit divisor
  2630 0000896C 89CF                <1> 	mov	edi, ecx
  2631 0000896E 81C7[7B340100]      <1> 	add	edi, Dir_Or_FileSize
  2632                              <1> loc_dir_rdivide:
  2633 00008974 29D2                <1> 	sub	edx, edx
  2634 00008976 F7F1                <1> 	div	ecx 	 ; remainder in dl (< 10)
  2635 00008978 80C230              <1> 	add     dl, '0'	 ; to make visible (ascii)
  2636 0000897B 4F                  <1> 	dec	edi
  2637 0000897C 8817                <1> 	mov     [edi], dl
  2638 0000897E 21C0                <1> 	and	eax, eax
  2639 00008980 75F2                <1> 	jnz	short loc_dir_rdivide
  2640                              <1> 
  2641                              <1> loc_dir_fill_space:
  2642 00008982 81FF[7B340100]      <1> 	cmp     edi, Dir_Or_FileSize
  2643 00008988 7606                <1> 	jna     short loc_dir_attribute
  2644 0000898A 4F                  <1> 	dec     edi
  2645 0000898B C60720              <1> 	mov     byte [edi], 20h
  2646 0000898E EBF2                <1> 	jmp     short loc_dir_fill_space
  2647                              <1> 
  2648                              <1> loc_dir_attribute:
  2649 00008990 C705[86340100]2020- <1> 	mov	dword [File_Attribute], 20202020h
  2649 00008998 2020                <1>
  2650                              <1> 
  2651 0000899A 80FB20              <1> 	cmp	bl, 20h  ; Is it an archive file?
  2652 0000899D 7207                <1> 	jb	short loc_dir_pass_arch
  2653 0000899F C605[89340100]41    <1> 	mov	byte [File_Attribute+3], 'A'
  2654                              <1> 
  2655                              <1> loc_dir_pass_arch:
  2656 000089A6 80E307              <1> 	and	bl, 7
  2657 000089A9 7428                <1> 	jz	short loc_dir_file_name
  2658 000089AB 88DF                <1> 	mov	bh, bl
  2659 000089AD 80E303              <1> 	and	bl, 3
  2660 000089B0 38DF                <1> 	cmp	bh, bl
  2661 000089B2 7607                <1> 	jna	short loc_dir_pass_s
  2662 000089B4 C605[86340100]53    <1> 	mov	byte [File_Attribute], 'S'
  2663                              <1> 
  2664                              <1> loc_dir_pass_s:
  2665 000089BB 80E302              <1> 	and     bl,2
  2666 000089BE 7407                <1> 	jz      short loc_dir_pass_h
  2667 000089C0 C605[87340100]48    <1> 	mov     byte [File_Attribute+1], 'H'
  2668                              <1> loc_dir_pass_h:
  2669 000089C7 80E701              <1> 	and     bh,1
  2670 000089CA 7407                <1> 	jz      short loc_dir_file_name
  2671 000089CC C605[88340100]52    <1> 	mov     byte [File_Attribute+2], 'R'
  2672                              <1> loc_dir_file_name:
  2673                              <1> 	;mov	bx, [esi+18h] ; Date
  2674                              <1> 	;mov	dx, [esi+16h] ; Time
  2675 000089D3 8B5E16              <1> 	mov	ebx, [esi+16h]
  2676 000089D6 89F1                <1> 	mov	ecx, esi ; FindFile_DirEntry address
  2677 000089D8 BF[6E340100]        <1> 	mov     edi, File_Name
  2678                              <1> 	; move 8 bytes
  2679 000089DD A5                  <1> 	movsd
  2680 000089DE A5                  <1> 	movsd
  2681 000089DF C60720              <1> 	mov	byte [edi], 20h
  2682 000089E2 47                  <1> 	inc	edi
  2683                              <1> 	; move 3 bytes
  2684 000089E3 66A5                <1> 	movsw
  2685 000089E5 A4                  <1> 	movsb
  2686 000089E6 89CE                <1> 	mov	esi, ecx
  2687                              <1> 
  2688                              <1> Dir_Time_start:
  2689                              <1> 	;mov	ax, dx		; Time
  2690 000089E8 6689D8              <1> 	mov	ax, bx
  2691 000089EB 66C1E805            <1> 	shr	ax, 5		; shift right 5 times
  2692 000089EF 6683E03F            <1> 	and	ax, 0000111111b	; Minute Mask
  2693 000089F3 D40A                <1> 	aam			; Q([AL]/10)->AH
  2694                              <1> 				; R([AL]/10)->AL
  2695                              <1> 				; [AL]+[AH]= Minute as BCD
  2696 000089F5 660D3030            <1> 	or	ax, '00'	; Convert to ASCII
  2697 000089F9 86E0                <1> 	xchg	ah, al
  2698 000089FB 66A3[99340100]      <1> 	mov	[File_Minute], ax
  2699                              <1> 
  2700                              <1> 	;mov	al, dh
  2701 00008A01 88F8                <1> 	mov	al, bh
  2702 00008A03 C0E803              <1> 	shr	al, 3		; shift right 3 times
  2703 00008A06 D40A                <1> 	aam			; [AL]+[AH]= Hours as BCD
  2704 00008A08 660D3030            <1> 	or	ax, '00'
  2705 00008A0C 86E0                <1> 	xchg	ah, al
  2706 00008A0E 66A3[96340100]      <1> 	mov     [File_Hour], ax
  2707                              <1> 
  2708 00008A14 C1EB10              <1> 	shr	ebx, 16		; BX = Date
  2709                              <1> 	
  2710                              <1> Dir_Date_start:
  2711                              <1> 	;mov	ax, bx		; Date
  2712                              <1> 	; 27/07/2022
  2713 00008A17 89D8                <1> 	mov	eax, ebx
  2714 00008A19 6683E01F            <1> 	and	ax, 00011111b	; Day Mask
  2715 00008A1D D40A                <1> 	aam			; Q([AL]/10)->AH
  2716                              <1> 				; R([AL]/10)->AL
  2717                              <1> 				; [AL]+[AH]= Day as BCD
  2718 00008A1F 660D3030            <1> 	or	ax, '00'	; Convert to ASCII
  2719 00008A23 86C4                <1> 	xchg	al, ah
  2720                              <1> 
  2721 00008A25 66A3[8B340100]      <1> 	mov	[File_Day], ax
  2722                              <1> 
  2723                              <1> 	;mov	ax, bx
  2724                              <1> 	; 27/07/2022
  2725 00008A2B 89D8                <1> 	mov	eax, ebx
  2726                              <1> 	;shr	ax, 5		; shift right 5 times
  2727 00008A2D C1E805              <1> 	shr	eax, 5
  2728 00008A30 6683E00F            <1> 	and	ax, 00001111b	; Month Mask
  2729 00008A34 D40A                <1> 	aam
  2730 00008A36 660D3030            <1> 	or	ax, '00'
  2731 00008A3A 86E0                <1> 	xchg	ah, al
  2732 00008A3C 66A3[8E340100]      <1> 	mov	[File_Month], ax
  2733                              <1> 
  2734                              <1> 	;mov	ax, bx
  2735                              <1> 	; 27/07/2022
  2736 00008A42 89D8                <1> 	mov	eax, ebx
  2737                              <1> 	;shr	ax, 9
  2738 00008A44 C1E809              <1> 	shr	eax, 9
  2739 00008A47 6683E07F            <1> 	and	ax, 01111111b	; Result = Year - 1980
  2740 00008A4B 6605BC07            <1> 	add	ax, 1980
  2741                              <1> 
  2742 00008A4F B10A                <1> 	mov	cl, 10
  2743 00008A51 F6F1                <1> 	div	cl		; Q -> AL, R -> AH 
  2744 00008A53 80CC30              <1> 	or	ah, '0'
  2745 00008A56 8825[94340100]      <1> 	mov	[File_Year+3], ah
  2746 00008A5C D40A                <1> 	aam
  2747 00008A5E 86E0                <1> 	xchg	ah, al
  2748 00008A60 80CC30              <1> 	or	ah, '0'	  ; Convert to ASCII
  2749 00008A63 8825[93340100]      <1> 	mov	[File_Year+2], ah
  2750 00008A69 D40A                <1> 	aam
  2751 00008A6B 86C4                <1> 	xchg	al, ah
  2752 00008A6D 660D3030            <1> 	or	ax, '00'
  2753 00008A71 66A3[91340100]      <1> 	mov	[File_Year], ax
  2754                              <1> 
  2755                              <1> loc_show_line:
  2756 00008A77 56                  <1> 	push	esi
  2757 00008A78 BE[6E340100]        <1> 	mov     esi, File_Name
  2758 00008A7D E8C8E2FFFF          <1> 	call	print_msg
  2759 00008A82 BE[473B0100]        <1> 	mov	esi, nextline
  2760 00008A87 E8BEE2FFFF          <1> 	call	print_msg
  2761 00008A8C 5E                  <1> 	pop	esi
  2762                              <1> 
  2763 00008A8D FE0D[89820100]      <1> 	dec	byte [PrintDir_RowCounter]
  2764 00008A93 740C                <1> 	jz	short pause_dir_scroll ; 27/07/2022
  2765                              <1> 
  2766                              <1> loc_next_entry:
  2767 00008A95 E88B010000          <1> 	call	find_next_file
  2768                              <1> 	;jnc	loc_dfname_use_this
  2769                              <1> 	; 27/07/2022
  2770 00008A9A 7219                <1> 	jc	short loc_dir_ok
  2771 00008A9C E999FEFFFF          <1> 	jmp	loc_dfname_use_this
  2772                              <1> 
  2773                              <1> 	; 27/07/2022
  2774                              <1> pause_dir_scroll:
  2775 00008AA1 28E4                <1> 	sub	ah, ah           
  2776 00008AA3 E86B84FFFF          <1> 	call	int16h
  2777 00008AA8 3C1B                <1> 	cmp	al, 1Bh
  2778 00008AAA 7409                <1> 	je	short loc_dir_ok
  2779 00008AAC C605[89820100]10    <1> 	mov	byte [PrintDir_RowCounter], 16 ; Reset counter
  2780 00008AB3 EBE0                <1>         jmp     short loc_next_entry
  2781                              <1> 
  2782                              <1> loc_dir_ok:
  2783 00008AB5 B90A000000          <1> 	mov     ecx, 10
  2784                              <1> 	;mov	ax, [Dir_Count]
  2785                              <1> 	; 27/07/2022
  2786 00008ABA 0FB705[74820100]    <1> 	movzx	eax, word [Dir_Count]
  2787 00008AC1 BF[AF340100]        <1> 	mov	edi, Decimal_Dir_Count
  2788                              <1> 	;cmp	ax, cx ; 10
  2789                              <1> 	; 27/07/2022
  2790 00008AC6 39C8                <1> 	cmp	eax, ecx
  2791 00008AC8 7216                <1> 	jb	short pass_ddc
  2792 00008ACA 47                  <1> 	inc	edi
  2793 00008ACB 6683F864            <1> 	cmp	ax, 100
  2794 00008ACF 720F                <1> 	jb	short pass_ddc
  2795 00008AD1 47                  <1> 	inc	edi
  2796 00008AD2 663DE803            <1> 	cmp	ax, 1000
  2797 00008AD6 7208                <1> 	jb	short pass_ddc
  2798 00008AD8 47                  <1> 	inc	edi
  2799 00008AD9 663D1027            <1> 	cmp	ax, 10000
  2800 00008ADD 7201                <1> 	jb	short pass_ddc
  2801 00008ADF 47                  <1> 	inc	edi
  2802                              <1> pass_ddc:
  2803 00008AE0 886F01              <1> 	mov     [edi+1], ch ; 0
  2804                              <1> loc_ddc_rediv:
  2805 00008AE3 31D2                <1> 	xor     edx, edx
  2806                              <1> 	;div	cx  ; 10
  2807                              <1> 	; 27/07/2022
  2808 00008AE5 F7F1                <1> 	div	ecx
  2809 00008AE7 80C230              <1> 	add     dl, '0'
  2810 00008AEA 8817                <1> 	mov     [edi], dl
  2811 00008AEC 4F                  <1> 	dec     edi
  2812                              <1> 	;or	ax, ax
  2813                              <1> 	; 27/07/2022
  2814 00008AED 09C0                <1> 	or	eax, eax
  2815 00008AEF 75F2                <1> 	jnz	short loc_ddc_rediv
  2816                              <1> 
  2817 00008AF1 66A1[72820100]      <1> 	mov     ax, [File_Count]
  2818 00008AF7 BF[9E340100]        <1> 	mov     edi, Decimal_File_Count
  2819                              <1> 	;cmp	ax, cx ; 10
  2820                              <1> 	; 27/07/2022
  2821 00008AFC 39C8                <1> 	cmp	eax, ecx ; 10
  2822 00008AFE 7216                <1> 	jb      short pass_dfc
  2823 00008B00 47                  <1> 	inc     edi
  2824 00008B01 6683F864            <1> 	cmp     ax, 100
  2825 00008B05 720F                <1> 	jb      short pass_dfc
  2826 00008B07 47                  <1> 	inc     edi
  2827 00008B08 663DE803            <1> 	cmp     ax, 1000
  2828 00008B0C 7208                <1> 	jb      short pass_dfc
  2829 00008B0E 47                  <1> 	inc     edi
  2830 00008B0F 663D1027            <1> 	cmp     ax, 10000
  2831 00008B13 7201                <1> 	jb      short pass_dfc
  2832 00008B15 47                  <1> 	inc     edi
  2833                              <1> pass_dfc:
  2834                              <1> 	;mov    cx, 10
  2835 00008B16 886F01              <1> 	mov     [edi+1], ch ; 00
  2836                              <1> loc_dfc_rediv:
  2837                              <1> 	;;xor	dx, dx
  2838                              <1> 	;xor	dl, dl
  2839                              <1> 	;div	cx
  2840                              <1> 	; 27/07/022
  2841 00008B19 31D2                <1> 	xor	edx, edx
  2842 00008B1B F7F1                <1> 	div	ecx
  2843 00008B1D 80C230              <1> 	add	dl, '0'
  2844 00008B20 8817                <1> 	mov	[edi], dl
  2845 00008B22 4F                  <1> 	dec	edi
  2846                              <1> 	;or	ax, ax
  2847                              <1> 	; 27/07/2022
  2848 00008B23 09C0                <1> 	or	eax, eax
  2849 00008B25 75F2                <1> 	jnz	short loc_dfc_rediv
  2850                              <1> 
  2851 00008B27 BF[88820100]        <1> 	mov     edi, TFS_Dec_End
  2852                              <1>         ;mov    byte [edi], 0
  2853 00008B2C A1[76820100]        <1> 	mov     eax, [Total_FSize]
  2854                              <1> 	;mov    ecx, 10
  2855                              <1> rediv_tfs_hex:
  2856 00008B31 29D2                <1> 	sub	edx, edx ; 27/07/2022
  2857                              <1> 	;sub	dl, dl
  2858 00008B33 F7F1                <1> 	div	ecx
  2859 00008B35 80C230              <1> 	add	dl, '0'
  2860 00008B38 4F                  <1> 	dec     edi
  2861 00008B39 8817                <1> 	mov     [edi], dl
  2862 00008B3B 21C0                <1> 	and	eax, eax
  2863 00008B3D 75F2                <1> 	jnz	short rediv_tfs_hex
  2864                              <1> 	
  2865 00008B3F 893D[7A820100]      <1> 	mov	[TFS_Dec_Begin], edi
  2866 00008B45 BE[9C340100]        <1> 	mov	esi, Decimal_File_Count_Header
  2867 00008B4A E8FBE1FFFF          <1> 	call	print_msg
  2868 00008B4F BE[A4340100]        <1> 	mov	esi, str_files
  2869 00008B54 E8F1E1FFFF          <1> 	call	print_msg
  2870 00008B59 BE[B5340100]        <1> 	mov	esi, str_dirs
  2871 00008B5E E8E7E1FFFF          <1> 	call	print_msg
  2872 00008B63 8B35[7A820100]      <1> 	mov	esi, [TFS_Dec_Begin]
  2873 00008B69 E8DCE1FFFF          <1> 	call	print_msg
  2874 00008B6E BE[C6340100]        <1> 	mov	esi, str_bytes
  2875                              <1> 	;call	print_msg
  2876                              <1> 	;retn
  2877                              <1> 	; 27/07/2022
  2878 00008B73 E9D2E1FFFF          <1> 	jmp	print_msg
  2879                              <1> 
  2880                              <1> find_first_file:
  2881                              <1> 	; 28/07/2022 (TRDOS 386 Kernel v2.0.5)
  2882                              <1> 	; 11/02/2016
  2883                              <1> 	; 10/02/2016
  2884                              <1> 	; 08/02/2016 (TRDOS 386 = TRDOS v2.0)
  2885                              <1> 	; 09/10/2011
  2886                              <1> 	; 17/09/2009
  2887                              <1> 	; 2005
  2888                              <1> 	; INPUT ->
  2889                              <1> 	;	ESI = ASCIIZ File/Dir Name Address (in Current Directory)
  2890                              <1> 	;	AL = Attributes AND mask (The AND result must be equal to AL)
  2891                              <1> 	;	      bit 0 = Read Only
  2892                              <1> 	;	      bir 1 = Hidden
  2893                              <1> 	;	      bit 2 = System
  2894                              <1> 	;	      bit 3 = Volume Label
  2895                              <1> 	;	      bit 4 = Directory
  2896                              <1> 	;	      bit 5 = Archive
  2897                              <1> 	;	      bit 6 = Reserved, must be 0
  2898                              <1> 	;	      bit 7 = Reserved, must be 0
  2899                              <1> 	;       AH = Attributes Negative AND mask (The AND result must be ZERO)
  2900                              <1> 	;
  2901                              <1> 	; OUTPUT ->
  2902                              <1> 	;	CF = 1 -> Error, Error Code in EAX (AL)
  2903                              <1> 	;	CF = 0 ->
  2904                              <1> 	;	     ESI = Directory Entry (FindFile_DirEntry) Location
  2905                              <1> 	;	     EDI = Directory Buffer Directory Entry Location
  2906                              <1> 	;	     EAX = File Size
  2907                              <1> 	;	      BL = Attributes of The File/Directory
  2908                              <1> 	;	      BH = Long Name Yes/No Status (>0 is YES)
  2909                              <1> 	;             DX > 0 : Ambiguous filename chars are used
  2910                              <1> 	;
  2911                              <1> 	; (EAX, EBX, ECX, EDX, ESI, EDI will be changed)
  2912                              <1> 
  2913 00008B78 66A3[3A820100]      <1> 	mov	[FindFile_AttributesMask], ax
  2914 00008B7E BF[3C820100]        <1> 	mov	edi, FindFile_DirEntry ; TR-DOS Fullfilename formatted buffer
  2915 00008B83 31C0                <1> 	xor	eax, eax
  2916                              <1> 	;mov	ecx, 11
  2917                              <1> 	; 28/07/2022
  2918 00008B85 31C9                <1> 	xor	ecx, ecx
  2919 00008B87 B10B                <1> 	mov	cl, 11
  2920 00008B89 F3AB                <1> 	rep	stosd	; 44 bytes
  2921                              <1> 	;stosw		; +2 bytes 
  2922                              <1> 	    
  2923 00008B8B BF[2C820100]        <1> 	mov	edi, FindFile_Name ; FFF structure, offset 66
  2924 00008B90 39FE                <1> 	cmp	esi, edi
  2925 00008B92 7408                <1> 	je	short loc_fff_mfn_ok
  2926 00008B94 89FA                <1> 	mov	edx, edi 
  2927                              <1> 	; move 13 bytes
  2928 00008B96 A5                  <1> 	movsd
  2929 00008B97 A5                  <1> 	movsd
  2930 00008B98 A5                  <1> 	movsd
  2931 00008B99 AA                  <1> 	stosb
  2932 00008B9A 89D6                <1> 	mov	esi, edx
  2933                              <1> loc_fff_mfn_ok:
  2934 00008B9C BF[DB810100]        <1> 	mov	edi, Dir_Entry_Name ; Dir Entry Format File Name
  2935 00008BA1 E8CC1F0000          <1> 	call	convert_file_name
  2936 00008BA6 89FE                <1> 	mov	esi, edi ; offset Dir_Entry_Name
  2937                              <1> 
  2938 00008BA8 66A1[3A820100]      <1> 	mov	ax, [FindFile_AttributesMask]
  2939                              <1> 	;xor	ecx, ecx
  2940 00008BAE 30C9                <1> 	xor	cl, cl  
  2941 00008BB0 E8EE1C0000          <1> 	call	locate_current_dir_file
  2942 00008BB5 726D                <1> 	jc	short loc_fff_retn
  2943                              <1> 	; EDI = Directory Entry
  2944                              <1> 	; EBX = Directory Buffer Entry Index/Number
  2945                              <1> 
  2946                              <1> loc_fff_fnf_ln_check:
  2947 00008BB7 30ED                <1> 	xor	ch, ch 
  2948 00008BB9 80F60F              <1> 	xor	dh, 0Fh
  2949 00008BBC 7408                <1> 	jz	short loc_fff_longname_yes
  2950 00008BBE 882D[39820100]      <1> 	mov	[FindFile_LongNameYes], ch ; 0
  2951 00008BC4 EB0C                <1> 	jmp	short loc_fff_longname_no
  2952                              <1> 
  2953                              <1> loc_fff_longname_yes:
  2954                              <1> 	;inc	byte [FindFile_LongNameYes]
  2955 00008BC6 8A0D[46810100]      <1> 	mov	cl, [LFN_EntryLength]  
  2956 00008BCC 880D[39820100]      <1> 	mov	[FindFile_LongNameEntryLength], cl ; FindFile_LongNameYes
  2957                              <1> 
  2958                              <1> loc_fff_longname_no:
  2959                              <1> 	;mov	bx, [DirBuff_CurrentEntry]
  2960 00008BD2 66891D[64820100]    <1> 	mov	[FindFile_DirEntryNumber], bx
  2961                              <1> 	;mov	dx, ax ; Ambiguous Filename chars used sign > 0
  2962                              <1> 	; 28/07/2022
  2963 00008BD9 89C2                <1> 	mov	edx, eax
  2964                              <1> 
  2965 00008BDB A0[4A790100]        <1> 	mov	al, [Current_Drv]
  2966 00008BE0 A2[EA810100]        <1> 	mov	[FindFile_Drv], al 
  2967                              <1> 
  2968 00008BE5 A1[44790100]        <1> 	mov	eax, [Current_Dir_FCluster]
  2969 00008BEA A3[5C820100]        <1> 	mov	[FindFile_DirFirstCluster], eax
  2970                              <1> 
  2971 00008BEF A1[76800100]        <1> 	mov	eax, [DirBuff_Cluster]
  2972 00008BF4 A3[60820100]        <1> 	mov	[FindFile_DirCluster], eax
  2973                              <1> 
  2974 00008BF9 66FF05[66820100]    <1> 	inc	word [FindFile_MatchCounter]
  2975                              <1> 
  2976 00008C00 89FB                <1> 	mov	ebx, edi
  2977 00008C02 89FE                <1> 	mov	esi, edi
  2978 00008C04 BF[3C820100]        <1> 	mov	edi, FindFile_DirEntry
  2979 00008C09 89F8                <1> 	mov	eax, edi
  2980 00008C0B B108                <1> 	mov	cl, 8
  2981 00008C0D F3A5                <1> 	rep	movsd
  2982 00008C0F 89C6                <1> 	mov	esi, eax
  2983 00008C11 89DF                <1> 	mov	edi, ebx
  2984                              <1> 
  2985 00008C13 A1[58820100]        <1> 	mov	eax, [FindFile_DirEntry+28] ; File Size
  2986                              <1> 
  2987 00008C18 8A1D[47820100]      <1> 	mov	bl, [FindFile_DirEntry+11] ; File Attributes 
  2988 00008C1E 8A3D[39820100]      <1> 	mov	bh, [FindFile_LongNameYes]
  2989                              <1> 
  2990                              <1> 	;mov	cx, [DirBuff_EntryCounter]
  2991                              <1> 	;mov	[FindFile_DirEntryNumber], cx
  2992                              <1> 	;mov	cx, [FindFile_DirEntryNumber]
  2993                              <1> 	; ecx = 0
  2994                              <1> 
  2995                              <1> loc_fff_retn:
  2996 00008C24 C3                  <1> 	retn
  2997                              <1> 
  2998                              <1> find_next_file:
  2999                              <1> 	; 28/07/2022 (TRDOS 386 Kernel v2.0.5)
  3000                              <1> 	; 15/10/2016
  3001                              <1> 	; 10/02/2016
  3002                              <1> 	; 08/02/2016 (TRDOS 386 = TRDOS v2.0)
  3003                              <1> 	; 06/02/2011
  3004                              <1> 	; 17/09/2009
  3005                              <1> 	; 2005
  3006                              <1> 	; INPUT ->
  3007                              <1> 	;	NONE, Find First File Parameters
  3008                              <1> 	; OUTPUT ->
  3009                              <1> 	;	CF = 1 -> Error, Error Code in EAX (AL)
  3010                              <1> 	;	CF = 0 -> 
  3011                              <1> 	;	    ESI = Directory Entry (FindFile_DirEntry) Location
  3012                              <1> 	;	    EDI = Directory Buffer Directory Entry Location
  3013                              <1> 	;	    EAX = File Size
  3014                              <1> 	;	      BL = Attributes of The File/Directory
  3015                              <1> 	;	      BH = Long Name Yes/No Status (>0 is YES)
  3016                              <1> 	;             DX > 0 : Ambiguous filename chars are used 
  3017                              <1> 	;
  3018                              <1> 	; (EAX, EBX, ECX, EDX, ESI, EDI will be changed)
  3019                              <1> 
  3020 00008C25 66833D[66820100]00  <1> 	cmp	word [FindFile_MatchCounter], 0
  3021 00008C2D 7707                <1> 	ja	short loc_start_search_next_file
  3022                              <1> 
  3023                              <1> loc_fnf_stc_retn:
  3024 00008C2F F9                  <1> 	stc
  3025                              <1> loc_fnf_ax12h_retn:
  3026 00008C30 B80C000000          <1> 	mov	eax, 12 ; No More files
  3027                              <1> ;loc_fnf_retn:
  3028 00008C35 C3                  <1> 	retn
  3029                              <1> 
  3030                              <1> loc_start_search_next_file:
  3031 00008C36 668B1D[64820100]    <1> 	mov	bx, [FindFile_DirEntryNumber]
  3032                              <1> 	;inc	bx
  3033                              <1> 	; 28/07/2022
  3034 00008C3D 43                  <1> 	inc	ebx
  3035 00008C3E 663B1D[74800100]    <1> 	cmp	bx, [DirBuff_LastEntry]
  3036 00008C45 7719                <1> 	ja	short loc_cont_search_next_file
  3037                              <1> 
  3038                              <1> loc_fnf_search:
  3039 00008C47 BE[DB810100]        <1> 	mov	esi, Dir_Entry_Name
  3040 00008C4C 66A1[3A820100]      <1> 	mov	ax, [FindFile_AttributesMask]
  3041                              <1> 	;xor	cx, cx
  3042                              <1> 	; 28/07/2022
  3043 00008C52 31C9                <1> 	xor	ecx, ecx
  3044 00008C54 E8481D0000          <1> 	call	find_directory_entry
  3045                              <1> 	;jnc	loc_fff_fnf_ln_check
  3046                              <1> 	; 28/07/2022
  3047 00008C59 7205                <1> 	jc	short loc_cont_search_next_file
  3048 00008C5B E957FFFFFF          <1> 	jmp	loc_fff_fnf_ln_check
  3049                              <1> 
  3050                              <1> loc_cont_search_next_file:
  3051 00008C60 31DB                <1> 	xor	ebx, ebx
  3052 00008C62 8A3D[4A790100]      <1> 	mov	bh, [Current_Drv]
  3053 00008C68 BE00010900          <1> 	mov	esi, Logical_DOSDisks
  3054 00008C6D 01DE                <1> 	add	esi, ebx
  3055                              <1> 
  3056 00008C6F 803D[48790100]00    <1> 	cmp	byte [Current_Dir_Level], 0
  3057 00008C76 7608                <1> 	jna	short loc_fnf_check_FAT_type
  3058 00008C78 807E0301            <1> 	cmp	byte [esi+LD_FATType], 1
  3059 00008C7C 72B2                <1> 	jb	short loc_fnf_ax12h_retn
  3060 00008C7E EB06                <1> 	jmp	short loc_fnf_check_next_cluster
  3061                              <1>  
  3062                              <1> loc_fnf_check_FAT_type:
  3063 00008C80 807E0303            <1> 	cmp	byte [esi+LD_FATType], 3
  3064 00008C84 72AA                <1> 	jb	short loc_fnf_ax12h_retn
  3065                              <1> 
  3066                              <1> loc_fnf_check_next_cluster:
  3067 00008C86 A1[76800100]        <1> 	mov	eax, [DirBuff_Cluster]
  3068 00008C8B E85F360000          <1> 	call	get_next_cluster
  3069 00008C90 7306                <1> 	jnc	short loc_fnf_load_next_dir_cluster
  3070 00008C92 09C0                <1> 	or	eax, eax
  3071 00008C94 7499                <1> 	jz	short loc_fnf_stc_retn
  3072                              <1> 	;mov	eax, 17 ;Drive not ready or read error
  3073 00008C96 F5                  <1>  	cmc	;stc
  3074                              <1> loc_fnf_retn:
  3075 00008C97 C3                  <1> 	retn
  3076                              <1> 
  3077                              <1> loc_fnf_load_next_dir_cluster:
  3078 00008C98 E80E380000          <1> 	call	load_FAT_sub_directory
  3079 00008C9D 72F8                <1> 	jc	short loc_fnf_retn
  3080                              <1> 	;xor	bx, bx
  3081                              <1> 	; 28/07/2022
  3082 00008C9F 31DB                <1> 	xor	ebx, ebx
  3083 00008CA1 66891D[64820100]    <1> 	mov	[FindFile_DirEntryNumber], bx
  3084 00008CA8 EB9D                <1> 	jmp	short loc_fnf_search
  3085                              <1> 
  3086                              <1> get_and_print_longname:
  3087                              <1> 	; 28/07/2022 (TRDOS 386 Kernel v2.0.5)
  3088                              <1> 	; 16/10/2016
  3089                              <1> 	; 13/02/2016 (TRDOS 386 = TRDOS v2.0)
  3090                              <1> 	; 24/01/2010
  3091                              <1> 	; 17/10/2009 (CMD_INTR.ASM, 'cmp_cmd_longname')
  3092                              <1> get_longname_fchar:
  3093 00008CAA 803E20              <1> 	cmp	byte [esi], 20h
  3094 00008CAD 7701                <1> 	ja	short loc_find_longname
  3095                              <1> 	;jb	short loc_longname_retn
  3096                              <1> 	;inc	esi
  3097                              <1> 	;je	short get_longname_fchar
  3098                              <1> ;loc_longname_retn:
  3099 00008CAF C3                  <1> 	retn
  3100                              <1> loc_find_longname:
  3101 00008CB0 E82A200000          <1> 	call	find_longname
  3102 00008CB5 731D                <1> 	jnc	short loc_print_longname
  3103                              <1> 	
  3104 00008CB7 08C0                <1> 	or	al, al
  3105 00008CB9 7412                <1> 	jz	short loc_longname_not_found
  3106                              <1> 	  
  3107                              <1> 	; 16/10/2016 (15h -> 15, 17)
  3108 00008CBB 3C0F                <1> 	cmp	al, 15
  3109                              <1> 	;je	cd_drive_not_ready ; drive not ready
  3110                              <1> 	; 28/07/2022
  3111 00008CBD 7505                <1> 	jne	short loc_fln_err2
  3112                              <1> loc_fln_err1:
  3113 00008CBF E924F8FFFF          <1> 	jmp	cd_drive_not_ready	
  3114                              <1> loc_fln_err2:
  3115                              <1> 				   ; or
  3116 00008CC4 3C11                <1> 	cmp	al, 17		   ; read error	
  3117                              <1> 	;je	cd_drive_not_ready
  3118                              <1> 	; 28/07/2022
  3119                              <1> 	;je	short loc_fln_err1 
  3120                              <1> 
  3121                              <1> loc_ln_file_dir_not_found:
  3122 00008CC6 BE[F0330100]        <1> 	mov	esi, Msg_File_Directory_Not_Found
  3123                              <1> 	;;call	print_msg
  3124                              <1>         ;;retn
  3125                              <1> 	;jmp	print_msg
  3126                              <1> 	; 28/07/2022
  3127 00008CCB EB2B                <1> 	jmp	short loc_lfn_err3
  3128                              <1> 
  3129                              <1> loc_longname_not_found:
  3130 00008CCD BE[0F340100]        <1>         mov     esi, Msg_LongName_Not_Found
  3131                              <1> 	;;call	print_msg
  3132                              <1>         ;;retn
  3133                              <1> 	;jmp	print_msg
  3134                              <1> 	; 28/07/2022
  3135 00008CD2 EB24                <1> 	jmp	short loc_lfn_err3
  3136                              <1> 
  3137                              <1> loc_print_longname:
  3138                              <1> 	;mov	esi, LongFileName
  3139 00008CD4 BF[4A7A0100]        <1> 	mov	edi, TextBuffer
  3140 00008CD9 57                  <1> 	push	edi 
  3141 00008CDA 3C00                <1> 	cmp	al, 0
  3142 00008CDC 7708                <1> 	ja	short loc_print_longname_1
  3143                              <1> loc_print_FS_longname: ; Singlix FS (64 byte ASCIIZ file name)
  3144 00008CDE AC                  <1> 	lodsb
  3145 00008CDF AA                  <1> 	stosb  
  3146 00008CE0 08C0                <1> 	or	al, al
  3147 00008CE2 75FA                <1> 	jnz	short loc_print_FS_longname
  3148 00008CE4 EB07                <1> 	jmp	short loc_print_longname_2
  3149                              <1> 	;
  3150                              <1> loc_print_longname_1: ; MS Windows long name (UNICODE chars)
  3151 00008CE6 66AD                <1> 	lodsw
  3152 00008CE8 AA                  <1> 	stosb  
  3153 00008CE9 08C0                <1> 	or	al, al
  3154 00008CEB 75F9                <1> 	jnz	short loc_print_longname_1
  3155                              <1> 	;
  3156                              <1> loc_print_longname_2:	
  3157 00008CED 5E                  <1> 	pop	esi
  3158 00008CEE E857E0FFFF          <1> 	call	print_msg
  3159 00008CF3 BE[473B0100]        <1>   	mov	esi, nextline
  3160                              <1> loc_lfn_err3:
  3161                              <1> 	;call	print_msg
  3162                              <1> 	;retn
  3163 00008CF8 E94DE0FFFF          <1> 	jmp	print_msg	
  3164                              <1> 
  3165                              <1> show_file:
  3166                              <1> 	; 07/08/2022
  3167                              <1> 	; 28/07/2022 (TRDOS 386 Kernel v2.0.5)
  3168                              <1> 	; 18/02/2016
  3169                              <1> 	; 17/02/2016
  3170                              <1> 	; 15/02/2016 (TRDOS 386 = TRDOS v2.0)
  3171                              <1> 	; 13/09/2011 (CMD_INTR.ASM, 'cmp_cmd_show')
  3172                              <1> 	; 08/11/2009
  3173                              <1> 
  3174                              <1> loc_show_parse_path_name:
  3175 00008CFD BF[EA810100]        <1> 	mov	edi, FindFile_Drv
  3176 00008D02 E8351F0000          <1> 	call	parse_path_name
  3177                              <1> 	;jc	loc_cmd_failed
  3178                              <1> 	; 28/07/2022
  3179 00008D07 7305                <1> 	jnc	short loc_show_check_filename_exists
  3180                              <1> show_file_err1:
  3181 00008D09 E944F9FFFF          <1> 	jmp	loc_cmd_failed
  3182                              <1> 
  3183                              <1> loc_show_check_filename_exists:
  3184 00008D0E BE[2C820100]        <1> 	mov	esi, FindFile_Name
  3185 00008D13 803E20              <1> 	cmp	byte [esi], 20h
  3186                              <1> 	;jna	loc_cmd_failed
  3187                              <1> 	; 28/07/2022
  3188 00008D16 76F1                <1> 	jna	short show_file_err1
  3189                              <1> 
  3190                              <1> 	; 15/02/2016 (invalid file name check)
  3191 00008D18 E800020000          <1> 	call	check_filename 	
  3192 00008D1D 730A                <1> 	jnc	short loc_show_change_drv
  3193                              <1> 
  3194 00008D1F BE[DC340100]        <1> 	mov	esi, Msg_invalid_name_chars
  3195 00008D24 E921E0FFFF          <1> 	jmp	print_msg
  3196                              <1>    
  3197                              <1> loc_show_change_drv:
  3198 00008D29 8A35[4A790100]      <1> 	mov	dh, [Current_Drv]
  3199 00008D2F 8835[A7800100]      <1> 	mov	[RUN_CDRV], dh
  3200 00008D35 8A15[EA810100]      <1> 	mov	dl, [FindFile_Drv]
  3201 00008D3B 38F2                <1> 	cmp	dl, dh
  3202 00008D3D 740C                <1> 	je	short loc_show_change_directory
  3203 00008D3F E847EBFFFF          <1> 	call	change_current_drive
  3204                              <1> 	;;jc	loc_file_rw_cmd_failed
  3205                              <1> 	;jc	loc_run_cmd_failed
  3206                              <1> 	; 28/07/2022
  3207 00008D44 7305                <1> 	jnc	short loc_show_change_directory
  3208                              <1> show_file_err2:
  3209 00008D46 E932F9FFFF          <1> 	jmp	loc_run_cmd_failed
  3210                              <1> 
  3211                              <1> loc_show_change_directory:
  3212 00008D4B 803D[EB810100]20    <1> 	cmp	byte [FindFile_Directory], 20h
  3213 00008D52 7614                <1> 	jna	short loc_findload_showfile
  3214                              <1> 
  3215 00008D54 FE05[BD300100]      <1> 	inc	byte [Restore_CDIR]
  3216 00008D5A BE[EB810100]        <1> 	mov	esi, FindFile_Directory
  3217 00008D5F 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0 
  3218 00008D61 E8EA180000          <1> 	call	change_current_directory
  3219                              <1> 	;;jc	loc_file_rw_cmd_failed
  3220                              <1> 	;jc	loc_run_cmd_failed
  3221                              <1> 	; 28/07/2022
  3222 00008D66 72DE                <1> 	jc	short show_file_err2
  3223                              <1> 
  3224                              <1> ;loc_show_change_prompt_dir_string:
  3225                              <1> 	;call	change_prompt_dir_string
  3226                              <1> 
  3227                              <1> loc_findload_showfile:
  3228                              <1> 	; 15/02/2016
  3229 00008D68 BE[2C820100]        <1> 	mov	esi, FindFile_Name
  3230 00008D6D BF[DB810100]        <1> 	mov	edi, Dir_Entry_Name ; Dir Entry Format File Name
  3231 00008D72 E8FB1D0000          <1> 	call	convert_file_name
  3232 00008D77 89FE                <1> 	mov	esi, edi ; offset Dir_Entry_Name
  3233                              <1> 
  3234 00008D79 28C0                <1> 	sub	al, al	; Attrib AND mask = 0
  3235                              <1> 	; Directory attribute : 10h
  3236                              <1> 	; Volume name attribute: 8h
  3237 00008D7B B418                <1> 	mov	ah, 00011000b ; 18h (Attrib NAND, AND --> zero mask)
  3238                              <1> 	;
  3239                              <1> 	;xor	cx, cx  
  3240                              <1> 	; 28/07/2022
  3241 00008D7D 31C9                <1> 	xor	ecx, ecx
  3242 00008D7F E81F1B0000          <1> 	call	locate_current_dir_file
  3243                              <1> 	;;jc	loc_file_rw_cmd_failed
  3244                              <1> 	;jc	loc_run_cmd_failed
  3245                              <1> 	; 28/07/2022
  3246 00008D84 72C0                <1> 	jc	short show_file_err2
  3247                              <1> 
  3248                              <1> loc_show_load_file:
  3249                              <1> 	; EDI = Directory Entry
  3250 00008D86 668B4714            <1> 	mov	ax, [edi+DirEntry_FstClusHI] ; First Cluster High Word
  3251 00008D8A C1E010              <1> 	shl	eax, 16
  3252 00008D8D 668B471A            <1> 	mov	ax, [edi+DirEntry_FstClusLO] ; First Cluster Low Word
  3253 00008D91 A3[94820100]        <1> 	mov	[Show_Cluster], eax
  3254 00008D96 8B471C              <1> 	mov	eax, [edi+DirEntry_FileSize] ; File Size
  3255 00008D99 21C0                <1> 	and	eax, eax ; Empty file !
  3256                              <1> 	;jz	end_of_show_file
  3257                              <1> 	; 28/07/2022
  3258 00008D9B 7505                <1> 	jnz	short loc_show_load_file_set_size
  3259 00008D9D E904010000          <1> 	jmp	end_of_show_file 
  3260                              <1> 
  3261                              <1> loc_show_load_file_set_size: ; 28/07/2022
  3262 00008DA2 A3[98820100]        <1> 	mov	[Show_FileSize], eax
  3263 00008DA7 31C0                <1> 	xor	eax, eax
  3264 00008DA9 A3[9C820100]        <1> 	mov	[Show_FilePointer], eax ; 0
  3265 00008DAE 66A3[A0820100]      <1> 	mov	[Show_ClusterPointer], ax ; 0
  3266 00008DB4 29DB                <1> 	sub	ebx, ebx
  3267 00008DB6 8A3D[4A790100]      <1> 	mov	bh, [Current_Drv]
  3268 00008DBC BE00010900          <1> 	mov	esi, Logical_DOSDisks
  3269 00008DC1 01DE                <1> 	add	esi, ebx
  3270 00008DC3 8935[90820100]      <1> 	mov	[Show_LDDDT], esi ; Logical DOS Drv Description Table addr
  3271                              <1> 
  3272 00008DC9 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0	
  3273 00008DCD 7713                <1> 	ja	short loc_show_calculate_cluster_size
  3274                              <1> 	; Singlix FS
  3275                              <1> 	; First Cluster Number is FDT number (in compatibility buffer)
  3276 00008DCF 8B15[94820100]      <1> 	mov	edx, [Show_Cluster] ; Compatibility dir. buffer value (FDT)	
  3277 00008DD5 8915[8C820100]      <1> 	mov	[Show_FDT], edx
  3278 00008DDB 31C0                <1> 	xor	eax, eax
  3279 00008DDD A3[94820100]        <1> 	mov	[Show_Cluster], eax ; Sector index  = 0
  3280                              <1> 				    ; (next time it will be 1)			
  3281                              <1> loc_show_calculate_cluster_size:
  3282 00008DE2 668B5E11            <1> 	mov	bx, [esi+LD_BPB+BPB_BytsPerSec] ; FAT 12-16-32 (512)
  3283                              <1> 	; BX = 512 = [esi+LD_FS_BytesPerSec] ; Singlix FS	
  3284 00008DE6 8A4613              <1> 	mov	al, [esi+LD_BPB+BPB_SecPerClust] ; FAT 12-16-32 (<= 128)
  3285                              <1> 	; AL = 1 = [esi+LD_FS_Reserved2] ; SectPerClust for Singlix FS
  3286 00008DE9 F7E3                <1> 	mul	ebx	
  3287                              <1> 
  3288                              <1> 	;cmp	eax, 65536 ; non-compatible (very big) cluster size
  3289                              <1> 	;ja	short end_of_show_file	
  3290 00008DEB 66A3[A2820100]      <1> 	mov	[Show_ClusterSize], ax
  3291                              <1> 
  3292                              <1> loc_start_show_file:
  3293 00008DF1 BE[473B0100]        <1> 	mov	esi, nextline
  3294 00008DF6 E84FDFFFFF          <1> 	call	print_msg
  3295                              <1> 
  3296 00008DFB A1[94820100]        <1> 	mov	eax, [Show_Cluster]
  3297 00008E00 C605[A4820100]17    <1> 	mov	byte [Show_RowCount], 23
  3298                              <1> 
  3299                              <1> 	; 17/02/2016
  3300 00008E07 8B35[90820100]      <1> 	mov	esi, [Show_LDDDT]
  3301                              <1> 
  3302                              <1> 	; 07/08/2022
  3303                              <1> loc_show_next_cluster:
  3304                              <1> 	; 15/02/2016
  3305 00008E0D BB00000700          <1> 	mov	ebx, Cluster_Buffer ; 70000h (for current TRDOS 386 version)
  3306                              <1> 	; ESI = Logical DOS drv description table address
  3307 00008E12 E8CF360000          <1> 	call	read_cluster
  3308                              <1> 	;;jc	loc_file_rw_cmd_failed
  3309                              <1> 	;jc	loc_run_cmd_failed
  3310                              <1> 	; 07/08/2022
  3311 00008E17 7305                <1> 	jnc	short loc_show_nc_rc_ok
  3312 00008E19 E95FF8FFFF          <1> 	jmp	loc_run_cmd_failed
  3313                              <1> loc_show_nc_rc_ok:
  3314 00008E1E 31DB                <1> 	xor 	ebx, ebx
  3315                              <1> loc_show_next_byte:
  3316 00008E20 803D[A4820100]00    <1> 	cmp	byte [Show_RowCount], 0
  3317 00008E27 7512                <1> 	jne	short pass_show_wait_for_key
  3318 00008E29 30E4                <1> 	xor	ah, ah
  3319 00008E2B E8E380FFFF          <1> 	call	int16h
  3320 00008E30 3C1B                <1> 	cmp	al, 1Bh
  3321                              <1> 	;jne	short pass_exit_show
  3322                              <1> 	; 28/07/2022
  3323 00008E32 7472                <1> 	je	short end_of_show_file
  3324                              <1> 
  3325                              <1> ;end_of_show_file:
  3326                              <1> ;pass_show_file:
  3327                              <1> ;	mov	esi, nextline
  3328                              <1> ;	call	print_msg
  3329                              <1> ;	jmp	loc_file_rw_restore_retn
  3330                              <1> 
  3331                              <1> pass_exit_show:
  3332 00008E34 C605[A4820100]14    <1> 	mov	byte [Show_RowCount], 20
  3333                              <1> pass_show_wait_for_key:
  3334 00008E3B 81C300000700        <1> 	add	ebx, Cluster_Buffer
  3335 00008E41 8A03                <1> 	mov	al, [ebx]
  3336 00008E43 3C0D                <1> 	cmp	al, 0Dh
  3337                              <1>  	;jne	loc_show_check_tab_space
  3338                              <1> 	; 28/07/2022
  3339 00008E45 740B                <1> 	je	short loc_show_dec_row_count
  3340 00008E47 E991000000          <1> 	jmp	loc_show_check_tab_space
  3341                              <1> 
  3342                              <1> 	; 07/08/2022
  3343                              <1> loc_show_next:
  3344                              <1> 	;and	bx, bx ; 65536 -> 0
  3345                              <1> 	; 28/07/2022
  3346 00008E4C 21DB                <1> 	and	ebx, ebx
  3347 00008E4E 75D0                <1> 	jnz	short loc_show_next_byte
  3348 00008E50 EBBB                <1> 	jmp     short loc_show_next_cluster
  3349                              <1> 
  3350                              <1> loc_show_dec_row_count:	; 28/07/2022
  3351 00008E52 FE0D[A4820100]      <1> 	dec	byte [Show_RowCount]
  3352                              <1> pass_show_dec_rowcount:
  3353 00008E58 B307                <1> 	mov	bl, 7 ; (light gray character color, black background)
  3354 00008E5A 8A3D[B6780100]      <1> 	mov	bh, [ACTIVE_PAGE] ; [ptty]
  3355 00008E60 E82794FFFF          <1> 	call	_write_tty
  3356                              <1> loc_show_check_eof:
  3357 00008E65 FF05[9C820100]      <1> 	inc	dword [Show_FilePointer]
  3358 00008E6B A1[9C820100]        <1> 	mov	eax, [Show_FilePointer]
  3359 00008E70 3B05[98820100]      <1> 	cmp	eax, [Show_FileSize]
  3360 00008E76 732E                <1> 	jnb	short end_of_show_file
  3361 00008E78 66FF05[A0820100]    <1> 	inc	word [Show_ClusterPointer]
  3362 00008E7F 0FB71D[A0820100]    <1> 	movzx	ebx, word [Show_ClusterPointer]
  3363                              <1> 
  3364                              <1> 	; 17/02/2016
  3365                              <1> 	; (sector boundary -9 bits- check, 512 = 0)
  3366 00008E86 66F7C3FF01          <1>         test    bx, 1FFh ; 1 to 511
  3367 00008E8B 7593                <1> 	jnz	short loc_show_next_byte
  3368                              <1> 
  3369                              <1> 	; 16/02/2016
  3370 00008E8D 8B35[90820100]      <1> 	mov	esi, [Show_LDDDT]
  3371                              <1> 	;
  3372 00008E93 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  3373 00008E97 771C                <1> 	ja	short loc_show_check_fat_cluster_size
  3374                              <1> 
  3375                              <1> 	; Singlix FS
  3376                              <1> 	; 1 sector, more... (cluster size = 1 sector)
  3377 00008E99 A1[94820100]        <1> 	mov	eax, [Show_Cluster]
  3378 00008E9E 40                  <1> 	inc	eax
  3379 00008E9F A3[94820100]        <1> 	mov	[Show_Cluster], eax
  3380                              <1> 
  3381                              <1> 	; 07/08/2022
  3382 00008EA4 EBA6                <1> 	jmp	short loc_show_next
  3383                              <1> 
  3384                              <1> 	; 28/07/2022
  3385                              <1> end_of_show_file:
  3386                              <1> pass_show_file:
  3387 00008EA6 BE[473B0100]        <1> 	mov	esi, nextline
  3388 00008EAB E89ADEFFFF          <1> 	call	print_msg
  3389 00008EB0 E9D7000000          <1> 	jmp	loc_file_rw_restore_retn
  3390                              <1> 	 
  3391                              <1> loc_show_check_fat_cluster_size:
  3392                              <1> 	; 17/02/2016
  3393 00008EB5 663B1D[A2820100]    <1> 	cmp	bx, [Show_ClusterSize] ; cluster size in bytes
  3394                              <1>         ;jb	short loc_show_next_byte ; 28/07/2022
  3395                              <1> 	; 07/08/2022
  3396 00008EBC 7305                <1> 	jnb	short loc_show_file_cluster_ok
  3397 00008EBE E95DFFFFFF          <1> 	jmp	loc_show_next_byte
  3398                              <1> 
  3399                              <1> loc_show_file_cluster_ok:
  3400 00008EC3 66C705[A0820100]00- <1> 	mov	word [Show_ClusterPointer], 0
  3400 00008ECB 00                  <1>
  3401                              <1> 
  3402 00008ECC A1[94820100]        <1> 	mov	eax, [Show_Cluster]
  3403                              <1> 	;mov	esi, [Show_LDDDT]
  3404                              <1> loc_show_get_next_cluster:
  3405 00008ED1 E819340000          <1> 	call	get_next_cluster
  3406                              <1> 	;;jc	loc_file_rw_cmd_failed
  3407                              <1> 	;jc	loc_run_cmd_failed
  3408                              <1> 	; 28/07/2022
  3409 00008ED6 733B                <1> 	jnc	short loc_show_update_ccluster
  3410 00008ED8 E9A0F7FFFF          <1> 	jmp	loc_run_cmd_failed
  3411                              <1> 
  3412                              <1> loc_show_check_tab_space:
  3413 00008EDD 3C09                <1> 	cmp	al, 09h
  3414                              <1> 	;jne	short pass_show_dec_rowcount ; 28/07/2022
  3415                              <1> 	; 07/08/2022
  3416 00008EDF 7405                <1> 	je	short loc_show_put_tab_space
  3417 00008EE1 E972FFFFFF          <1> 	jmp	pass_show_dec_rowcount
  3418                              <1> loc_show_put_tab_space:
  3419 00008EE6 8A3D[B6780100]      <1> 	mov	bh, [ACTIVE_PAGE] ; [ptty]
  3420 00008EEC E83990FFFF          <1> 	call	get_cpos
  3421                              <1> 	; dl = cursor column
  3422 00008EF1 80E207              <1> 	and	dl, 7 ; 18/02/2016
  3423                              <1> 	;shr	bh, 1 ; [ACTIVE_PAGE]
  3424 00008EF4 8A3D[B6780100]      <1> 	mov	bh, [ACTIVE_PAGE]
  3425 00008EFA B307                <1> 	mov	bl, 7 ; color attribute
  3426                              <1> loc_show_put_space_chars:
  3427 00008EFC B020                <1> 	mov	al, 20h ; space
  3428                              <1> 	;mov	bh, [ACTIVE_PAGE] ; [ptty]
  3429                              <1> 	;mov	bl, 7 ; color attribute
  3430                              <1> 	;push	dx
  3431 00008EFE 52                  <1> 	push	edx ; 29/12/2017
  3432 00008EFF E88893FFFF          <1> 	call	_write_tty
  3433 00008F04 5A                  <1> 	pop	edx ; 29/12/2017
  3434                              <1> 	;pop	dx
  3435                              <1> 	; 18/02/2016
  3436 00008F05 80FA07              <1> 	cmp	dl, 7
  3437                              <1> 	;jnb	short loc_show_check_eof ; 28/07/2022
  3438                              <1> 	; 07/08/2022
  3439 00008F08 7205                <1> 	jb	short loc_show_next_tab_space
  3440 00008F0A E956FFFFFF          <1> 	jmp	loc_show_check_eof
  3441                              <1> loc_show_next_tab_space:
  3442 00008F0F FEC2                <1> 	inc	dl
  3443 00008F11 EBE9                <1> 	jmp	short loc_show_put_space_chars
  3444                              <1> 
  3445                              <1> loc_show_update_ccluster:
  3446 00008F13 A3[94820100]        <1> 	mov	[Show_Cluster], eax
  3447 00008F18 E9F0FEFFFF          <1>         jmp     loc_show_next_cluster
  3448                              <1> 
  3449                              <1> check_filename:
  3450                              <1> 	; 28/07/2022 (TRDOS 386 Kernel v2.0.5)
  3451                              <1> 	; 10/10/2016
  3452                              <1> 	; 15/02/2016 (TRDOS 386 = TRDOS v2.0)
  3453                              <1> 	; 07/08/2010 (FILE.ASM, 'proc_check_filename')
  3454                              <1> 	; 10/07/2010
  3455                              <1> 	; Derived from 'proc_check_filename'
  3456                              <1> 	; in the old TRDOS.ASM (09/02/2005).
  3457                              <1> 	;
  3458                              <1> 	; INPUT -> 
  3459                              <1> 	;	ESI = Dot File Name Location
  3460                              <1> 	; OUTPUT ->
  3461                              <1> 	;	cf = 1 -> error code in AL
  3462                              <1> 	;	     AL = ERR_INV_FILE_NAME (=26)
  3463                              <1> 	;		  Invalid file name chars   
  3464                              <1> 	;	cf = 0 -> valid file name
  3465                              <1> 	; 
  3466                              <1> 	; (EAX, ECX, EDI will be changed)
  3467                              <1> 
  3468                              <1> check_invalid_filename_chars:
  3469                              <1> 	; 28/07/2022 (TRDOS 386 Kernel v2.0.5)
  3470                              <1> 	; 15/02/2016 (TRDOS 386 = TRDOS v2.0)
  3471                              <1> 	; 10/07/2010 (FILE.ASM, 'proc_check_invalid_filename_chars')
  3472                              <1> 	; 10/02/2010
  3473                              <1> 	; Derived from 'proc_check_invalid_filename_chars'
  3474                              <1> 	; in the old TRDOS.ASM (09/02/2005).
  3475                              <1> 	;
  3476                              <1> 	; INPUT -> 
  3477                              <1> 	;	ESI = ASCIIZ FileName
  3478                              <1> 	; OUTPUT ->
  3479                              <1> 	;	cf = 1 -> invalid
  3480                              <1> 	;	cf = 0 -> valid
  3481                              <1> 	; 
  3482                              <1> 	;(EAX, ECX, EDI will be changed)
  3483                              <1>   
  3484 00008F1D 56                  <1> 	push	esi
  3485                              <1> 
  3486 00008F1E BF[C4310100]        <1>         mov     edi, invalid_fname_chars
  3487 00008F23 AC                  <1> 	lodsb
  3488                              <1> check_filename_next_char:
  3489 00008F24 B914000000          <1> 	mov	ecx, sizeInvFnChars
  3490 00008F29 BF[C4310100]        <1> 	mov	edi, invalid_fname_chars
  3491                              <1> loc_scan_invalid_filename_char:
  3492 00008F2E AE                  <1> 	scasb 
  3493 00008F2F 741E                <1> 	je	short loc_invalid_filename_stc 
  3494 00008F31 E2FB                <1> 	loop	loc_scan_invalid_filename_char
  3495 00008F33 AC                  <1> 	lodsb
  3496 00008F34 3C1F                <1> 	cmp	al, 1Fh  ; 20h and above 
  3497 00008F36 77EC                <1> 	ja	short check_filename_next_char
  3498                              <1> 
  3499                              <1> check_filename_dot:
  3500 00008F38 8B3424              <1> 	mov	esi, [esp]
  3501                              <1> 
  3502 00008F3B B421                <1> 	mov	ah, 21h
  3503                              <1> 	;mov	ecx, 8
  3504                              <1> 	; 28/07/2022
  3505 00008F3D 29C9                <1> 	sub	ecx, ecx
  3506 00008F3F B108                <1> 	mov	cl, 8
  3507                              <1> loc_check_filename_next_char:
  3508 00008F41 AC                  <1> 	lodsb
  3509 00008F42 3C2E                <1> 	cmp	al, 2Eh
  3510 00008F44 7511                <1> 	jne	short pass_check_fn_dot_check
  3511                              <1> loc_check_filename_ext_0:
  3512 00008F46 AC                  <1> 	lodsb
  3513 00008F47 38E0                <1> 	cmp	al, ah ; 21h
  3514 00008F49 7205                <1> 	jb	short loc_invalid_filename
  3515 00008F4B 3C2E                <1> 	cmp	al, 2Eh
  3516 00008F4D 7519                <1> 	jne	short loc_check_filename_ext_1
  3517                              <1> 
  3518                              <1> loc_invalid_filename_stc:
  3519                              <1> loc_check_fn_stc_rtn:
  3520 00008F4F F9                  <1> 	stc
  3521                              <1> loc_invalid_filename:
  3522                              <1> 	; 10/10/2016 (0Bh -> 26)
  3523 00008F50 B81A000000          <1> 	mov	eax, ERR_INV_FILE_NAME ; (=26)
  3524                              <1> 	; Invalid file name chars
  3525                              <1> loc_check_fn_rtn:
  3526 00008F55 5E                  <1> 	pop	esi
  3527 00008F56 C3                  <1> 	retn
  3528                              <1> 
  3529                              <1> pass_check_fn_dot_check:
  3530 00008F57 38E0                <1> 	cmp	al, ah ; 21h
  3531 00008F59 7224                <1> 	jb	short loc_check_fn_clc_rtn
  3532 00008F5B E2E4                <1> 	loop	loc_check_filename_next_char
  3533 00008F5D AC                  <1> 	lodsb
  3534 00008F5E 38E0                <1> 	cmp	al, ah ; 21h
  3535 00008F60 721D                <1> 	jb	short loc_check_fn_clc_rtn
  3536 00008F62 3C2E                <1> 	cmp	al, 2Eh
  3537 00008F64 75E9                <1> 	jne	short loc_check_fn_stc_rtn
  3538 00008F66 EBDE                <1> 	jmp	short loc_check_filename_ext_0
  3539                              <1> 
  3540                              <1> loc_check_filename_ext_1:
  3541 00008F68 AC                  <1> 	lodsb
  3542 00008F69 38E0                <1> 	cmp	al, ah ; 21h
  3543 00008F6B 7212                <1> 	jb	short loc_check_fn_clc_rtn
  3544 00008F6D 3C2E                <1> 	cmp	al, 2Eh
  3545 00008F6F 74DE                <1> 	je	short loc_check_fn_stc_rtn
  3546 00008F71 AC                  <1> 	lodsb
  3547 00008F72 38E0                <1> 	cmp	al, ah ; 21h
  3548 00008F74 7209                <1> 	jb	short loc_check_fn_clc_rtn
  3549 00008F76 3C2E                <1> 	cmp	al, 2Eh
  3550 00008F78 74D5                <1> 	je	short loc_check_fn_stc_rtn
  3551 00008F7A AC                  <1> 	lodsb
  3552 00008F7B 38E0                <1> 	cmp	al, ah ; 21h
  3553 00008F7D 73D0                <1> 	jnb	short loc_check_fn_stc_rtn
  3554                              <1> 
  3555                              <1> loc_check_fn_clc_rtn:
  3556 00008F7F 5E                  <1> 	pop	esi
  3557 00008F80 F8                  <1> 	clc
  3558 00008F81 C3                  <1> 	retn
  3559                              <1> 
  3560                              <1> loc_print_deleted_message:
  3561 00008F82 BE[B1350100]        <1> 	mov	esi, Msg_Deleted
  3562 00008F87 E8BEDDFFFF          <1> 	call	print_msg
  3563                              <1> 
  3564                              <1> 	;clc
  3565                              <1> 
  3566                              <1> loc_file_rw_restore_retn:
  3567                              <1> 	; 15/02/2016 (TRDOS 386 = TRDOS v2.0)
  3568                              <1> 	; 28/02/2010 (CMD_INTR.ASM)
  3569                              <1> loc_file_rw_cmd_failed:
  3570 00008F8C 9C                  <1> 	pushf 
  3571 00008F8D E853F7FFFF          <1> 	call	restore_cdir_after_cmd_fail	
  3572 00008F92 9D                  <1> 	popf
  3573 00008F93 720D                <1> 	jc	short loc_file_rw_check_write_fault
  3574 00008F95 C3                  <1> 	retn
  3575                              <1> 
  3576                              <1> loc_permission_denied:
  3577                              <1> 	; 27/02/2016
  3578 00008F96 BE[BE350100]        <1> 	mov	esi, Msg_Permission_Denied
  3579 00008F9B E8AADDFFFF          <1> 	call	print_msg
  3580 00008FA0 EBEA                <1> 	jmp	short loc_file_rw_restore_retn
  3581                              <1> 
  3582                              <1> loc_file_rw_check_write_fault:
  3583                              <1> 	;cmp	al, 1Dh ; Write Fault
  3584 00008FA2 3C12                <1>         cmp	al, 18 ; 05/11/2016
  3585                              <1> 	;jne	loc_run_cmd_failed_cmp_al
  3586                              <1> 	; 28/07/2022
  3587 00008FA4 7405                <1> 	je	short loc_file_rw_fault
  3588 00008FA6 E9D7F6FFFF          <1> 	jmp	loc_run_cmd_failed_cmp_al
  3589                              <1> 
  3590                              <1> loc_file_rw_fault:
  3591 00008FAB BE[A5330100]        <1> 	mov	esi, Msg_Not_Ready_Write_Err
  3592                              <1> 	;call	print_msg
  3593                              <1> 	;retn
  3594 00008FB0 E995DDFFFF          <1> 	jmp	print_msg
  3595                              <1> 
  3596                              <1> make_directory:
  3597                              <1> 	; 28/07/2022 (TRDOS 386 Kernel v2.0.5)
  3598                              <1> 	; 21/02/2016 (TRDOS 386 = TRDOS v2.0)
  3599                              <1> 	; 12/03/2011 (CMD_INTR.ASM, 'cmp_cmd_mkdir')
  3600                              <1> 	; 14/08/2010
  3601                              <1> 	; 10/07/2010
  3602                              <1> 	; 29/11/2009
  3603                              <1> 	;
  3604                              <1> get_mkdir_fchar:
  3605                              <1> 	; esi = directory name
  3606 00008FB5 803E20              <1> 	cmp	byte [esi], 20h
  3607 00008FB8 7701                <1>         ja	short loc_mkdir_parse_path_name
  3608                              <1> 
  3609                              <1> loc_mkdir_nodirname_retn:
  3610 00008FBA C3                  <1> 	retn
  3611                              <1> 
  3612                              <1> loc_mkdir_parse_path_name:
  3613 00008FBB BF[EA810100]        <1> 	mov	edi, FindFile_Drv
  3614 00008FC0 E8771C0000          <1>         call    parse_path_name
  3615                              <1> 	;jc	loc_cmd_failed
  3616                              <1> 	; 28/07/2022
  3617 00008FC5 7305                <1> 	jnc	short loc_mkdir_check_dirname_exists
  3618                              <1> loc_mkdir_cmd_failed:
  3619 00008FC7 E986F6FFFF          <1> 	jmp	loc_cmd_failed
  3620                              <1> 
  3621                              <1> loc_mkdir_check_dirname_exists:
  3622 00008FCC BE[2C820100]        <1> 	mov	esi, FindFile_Name
  3623 00008FD1 803E20              <1> 	cmp	byte [esi], 20h
  3624                              <1> 	;jna	loc_cmd_failed
  3625                              <1> 	; 28/07/2022
  3626 00008FD4 76F1                <1> 	jna	short loc_mkdir_cmd_failed
  3627 00008FD6 8935[A8820100]      <1> 	mov	[DelFile_FNPointer], esi
  3628 00008FDC E83CFFFFFF          <1> 	call	check_filename
  3629 00008FE1 725B                <1> 	jc	short loc_mkdir_invalid_dir_name_chars
  3630                              <1> 
  3631                              <1> loc_mkdir_drv:
  3632 00008FE3 8A35[4A790100]      <1> 	mov	dh, [Current_Drv]
  3633 00008FE9 8835[A7800100]      <1> 	mov	[RUN_CDRV], dh
  3634                              <1> 	
  3635 00008FEF 8A15[EA810100]      <1> 	mov	dl, [FindFile_Drv]
  3636 00008FF5 38F2                <1> 	cmp	dl, dh
  3637 00008FF7 7409                <1> 	je	short loc_mkdir_change_directory
  3638                              <1> 
  3639 00008FF9 E88DE8FFFF          <1> 	call	change_current_drive
  3640                              <1> 	;jc	loc_file_rw_cmd_failed
  3641                              <1> 	; 28/07/2022
  3642 00008FFE 7302                <1> 	jnc	short loc_mkdir_change_directory
  3643 00009000 EB8A                <1> 	jmp	loc_file_rw_cmd_failed
  3644                              <1> 
  3645                              <1> loc_mkdir_change_directory:
  3646 00009002 803D[EB810100]20    <1> 	cmp	byte [FindFile_Directory], 20h
  3647 00009009 7614                <1> 	jna	short loc_mkdir_find_directory
  3648                              <1> 
  3649 0000900B FE05[BD300100]      <1> 	inc	byte [Restore_CDIR]
  3650 00009011 BE[EB810100]        <1> 	mov	esi, FindFile_Directory
  3651 00009016 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0 
  3652 00009018 E833160000          <1> 	call	change_current_directory
  3653 0000901D 7226                <1> 	jc	short loc_mkdir_check_error_code
  3654                              <1> 
  3655                              <1> ;loc_mkdir_change_prompt_dir_string:
  3656                              <1> 	;call	change_prompt_dir_string
  3657                              <1> 
  3658                              <1> loc_mkdir_find_directory:
  3659                              <1> 	;mov	esi, FindFile_Name
  3660 0000901F 8B35[A8820100]      <1> 	mov	esi, [DelFile_FNPointer]
  3661                              <1> 	;xor	eax, eax
  3662 00009025 6631C0              <1> 	xor	ax, ax ; any name (dir, file, volume)
  3663 00009028 E84BFBFFFF          <1> 	call	find_first_file
  3664 0000902D 7216                <1> 	jc	short loc_mkdir_check_error_code
  3665                              <1> 
  3666                              <1> loc_mkdir_directory_found:
  3667 0000902F BE[09350100]        <1> 	mov	esi, Msg_Name_Exists
  3668                              <1> loc_mkdir_inv_dname_chrs_msg:
  3669 00009034 E811DDFFFF          <1> 	call	print_msg
  3670 00009039 E94EFFFFFF          <1> 	jmp	loc_file_rw_restore_retn
  3671                              <1> 
  3672                              <1> loc_mkdir_invalid_dir_name_chars:
  3673 0000903E BE[DC340100]        <1> 	mov	esi, Msg_invalid_name_chars
  3674                              <1> 	;call	print_msg
  3675                              <1>         ;jmp	loc_file_rw_restore_retn
  3676                              <1> 	; 28/07/2022
  3677 00009043 EBEF                <1> 	jmp	short loc_mkdir_inv_dname_chrs_msg
  3678                              <1> 
  3679                              <1> loc_mkdir_check_error_code:
  3680 00009045 3C02                <1> 	cmp	al, 2
  3681                              <1> 	;je	short loc_mkdir_directory_not_found
  3682 00009047 7406                <1> 	je	short loc_mkdir_ask_for_yes_no
  3683 00009049 F9                  <1> 	stc
  3684 0000904A E93DFFFFFF          <1>         jmp     loc_file_rw_cmd_failed
  3685                              <1> 
  3686                              <1> loc_mkdir_directory_not_found:
  3687                              <1> loc_mkdir_ask_for_yes_no:
  3688 0000904F BE[2A350100]        <1> 	mov	esi, Msg_DoYouWantMkdir
  3689 00009054 E8F1DCFFFF          <1> 	call	print_msg
  3690 00009059 8B35[A8820100]      <1> 	mov	esi, [DelFile_FNPointer]
  3691 0000905F E8E6DCFFFF          <1> 	call	print_msg
  3692 00009064 BE[49350100]        <1> 	mov	esi, Msg_YesNo
  3693 00009069 E8DCDCFFFF          <1> 	call	print_msg
  3694                              <1> 
  3695 0000906E C605[53350100]20    <1> 	mov	byte [Y_N_nextline], 20h
  3696                              <1> 
  3697                              <1> loc_mkdir_ask_again:
  3698 00009075 30E4                <1> 	xor	ah, ah
  3699 00009077 E8977EFFFF          <1> 	call	int16h
  3700 0000907C 3C1B                <1> 	cmp	al, 1Bh
  3701                              <1> 	;je	short loc_do_not_make_directory
  3702 0000907E 743B                <1> 	je	short loc_mkdir_y_n_escape
  3703 00009080 24DF                <1> 	and	al, 0DFh ; y -> Y, n -> N
  3704 00009082 3C59                <1> 	cmp	al, 'Y' ; 'yes'
  3705 00009084 7404                <1> 	je	short loc_mkdir_yes_make_directory
  3706 00009086 3C4E                <1> 	cmp	al, 'N' ; 'no'
  3707 00009088 75EB                <1> 	jne	short loc_mkdir_ask_again
  3708                              <1> 
  3709                              <1> loc_do_not_make_directory:
  3710                              <1> loc_mkdir_yes_make_directory:
  3711 0000908A E830000000          <1> 	call	y_n_answer ; 29/12/2017
  3712                              <1> 	;cmp	al, 'Y' ; 'yes'
  3713                              <1> 	;cmc
  3714                              <1>         ;jnc	loc_file_rw_restore_retn
  3715 0000908F 3C4E                <1> 	cmp	al, 'N' ; 'no'
  3716                              <1> 	;je	loc_file_rw_restore_retn
  3717                              <1> 	; 28/07/2022
  3718 00009091 7505                <1> 	jne	short loc_mkdir_call_make_sub_dir
  3719 00009093 E9F4FEFFFF          <1> 	jmp	loc_file_rw_restore_retn		
  3720                              <1> 
  3721                              <1> loc_mkdir_call_make_sub_dir:
  3722 00009098 8B35[A8820100]      <1> 	mov	esi, [DelFile_FNPointer]
  3723 0000909E B110                <1> 	mov	cl, 10h ; Directory attributes 
  3724 000090A0 E88B1C0000          <1> 	call	make_sub_directory
  3725                              <1> loc_rename_file_ok: ; 06/03/2016
  3726                              <1>         ;jc	loc_file_rw_cmd_failed
  3727                              <1> 	; 28/07/2022
  3728 000090A5 7305                <1> 	jnc	short move_source_file_to_dest_OK
  3729 000090A7 E9E0FEFFFF          <1> 	jmp	loc_file_rw_cmd_failed
  3730                              <1> move_source_file_to_dest_OK:
  3731 000090AC BE[57350100]        <1> 	mov	esi, Msg_OK
  3732 000090B1 E894DCFFFF          <1> 	call	print_msg
  3733 000090B6 E9D1FEFFFF          <1> 	jmp	loc_file_rw_restore_retn
  3734                              <1> 
  3735                              <1> loc_mkdir_y_n_escape:
  3736 000090BB B04E                <1> 	mov	al, 'N' ; 'no'
  3737 000090BD EBCB                <1> 	jmp	short loc_do_not_make_directory
  3738                              <1> 
  3739                              <1> y_n_answer:
  3740                              <1> 	; 29/12/2017
  3741 000090BF A2[53350100]        <1> 	mov	[Y_N_nextline], al
  3742                              <1> 	;push	ax
  3743 000090C4 50                  <1> 	push	eax
  3744 000090C5 BE[53350100]        <1> 	mov	esi, Y_N_nextline
  3745 000090CA E87BDCFFFF          <1> 	call	print_msg
  3746 000090CF 58                  <1> 	pop	eax
  3747                              <1> 	;pop	ax
  3748 000090D0 C3                  <1> 	retn
  3749                              <1> 
  3750                              <1> delete_directory:
  3751                              <1> 	; 28/07/2022 (TRDOS 386 Kernel v2.0.5)
  3752                              <1> 	; 29/12/2017
  3753                              <1> 	; 15/10/2016
  3754                              <1> 	; 01/03/2016, 06/03/2016
  3755                              <1> 	; 27/02/2016, 28/02/2016, 29/02/2016
  3756                              <1> 	; 26/02/2016 (TRDOS 386 = TRDOS v2.0)
  3757                              <1> 	; 16/10/2010 (CMD_INTR.ASM, 'cmp_cmd_rmdir')
  3758                              <1> 	; 05/06/2010
  3759                              <1> 	;
  3760                              <1> get_fchar:
  3761                              <1> 	; esi = directory name
  3762 000090D1 803E20              <1> 	cmp	byte [esi], 20h
  3763 000090D4 7701                <1>         ja	short loc_rmdir_parse_path_name
  3764                              <1> 
  3765                              <1> loc_rmdir_nodirname_retn:
  3766 000090D6 C3                  <1> 	retn
  3767                              <1> 
  3768                              <1> loc_rmdir_parse_path_name:
  3769 000090D7 BF[EA810100]        <1> 	mov	edi, FindFile_Drv
  3770 000090DC E85B1B0000          <1> 	call	parse_path_name
  3771                              <1> 	;jc	loc_cmd_failed
  3772                              <1> 	; 28/07/2022
  3773 000090E1 7305                <1> 	jnc	short loc_rmdir_check_dirname_exists
  3774                              <1> lc_del_dir_failed:
  3775 000090E3 E96AF5FFFF          <1> 	jmp	loc_cmd_failed
  3776                              <1> 
  3777                              <1> loc_rmdir_check_dirname_exists:
  3778 000090E8 BE[2C820100]        <1> 	mov	esi, FindFile_Name
  3779 000090ED 803E20              <1> 	cmp	byte [esi], 20h
  3780                              <1> 	;jna	loc_cmd_failed
  3781                              <1> 	; 28/07/2022
  3782 000090F0 76F1                <1> 	jna	short lc_del_dir_failed 
  3783 000090F2 8935[A8820100]      <1> 	mov	[DelFile_FNPointer], esi 
  3784                              <1> 
  3785                              <1> loc_rmdir_drv:
  3786 000090F8 8A35[4A790100]      <1> 	mov	dh, [Current_Drv]
  3787 000090FE 8835[A7800100]      <1> 	mov	[RUN_CDRV], dh
  3788                              <1> 
  3789 00009104 8A15[EA810100]      <1> 	mov	dl, [FindFile_Drv]
  3790 0000910A 38F2                <1> 	cmp	dl, dh
  3791 0000910C 7407                <1> 	je	short loc_rmdir_change_directory
  3792                              <1> 
  3793 0000910E E878E7FFFF          <1> 	call	change_current_drive
  3794                              <1> 	;jc	loc_file_rw_cmd_failed
  3795                              <1> 	; 28/07/2022
  3796                              <1> 	;jnc	short loc_rmdir_change_directory
  3797                              <1> 	;jmp	loc_file_rw_cmd_failed
  3798 00009113 7233                <1> 	jc	short loc_rmdir_chdrv_failed
  3799                              <1> 
  3800                              <1> loc_rmdir_change_directory:
  3801 00009115 803D[EB810100]20    <1> 	cmp	byte [FindFile_Directory], 20h
  3802 0000911C 7614                <1> 	jna	short loc_rmdir_find_directory
  3803                              <1> 
  3804 0000911E FE05[BD300100]      <1> 	inc	byte [Restore_CDIR]
  3805 00009124 BE[EB810100]        <1> 	mov	esi, FindFile_Directory
  3806 00009129 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0 
  3807 0000912B E820150000          <1> 	call	change_current_directory
  3808 00009130 7211                <1> 	jc	short loc_rmdir_check_error_code
  3809                              <1> 
  3810                              <1> ;loc_rmdir_change_prompt_dir_string:
  3811                              <1> 	;call	change_prompt_dir_string
  3812                              <1> 
  3813                              <1> loc_rmdir_find_directory:
  3814                              <1> 	;mov	esi, FindFile_Name
  3815 00009132 8B35[A8820100]      <1> 	mov	esi, [DelFile_FNPointer]
  3816 00009138 66B81008            <1> 	mov	ax, 0810h ; Only directories
  3817 0000913C E837FAFFFF          <1> 	call	find_first_file
  3818 00009141 730A                <1> 	jnc	short loc_rmdir_ambgfn_check
  3819                              <1> 
  3820                              <1> loc_rmdir_check_error_code:
  3821 00009143 3C02                <1> 	cmp	al, 2
  3822 00009145 740B                <1> 	je	short loc_rmdir_directory_not_found
  3823 00009147 F9                  <1> 	stc
  3824                              <1> loc_rmdir_chdrv_failed:
  3825 00009148 E93FFEFFFF          <1> 	jmp	loc_file_rw_cmd_failed
  3826                              <1> 
  3827                              <1> loc_rmdir_ambgfn_check:
  3828 0000914D 6621D2              <1> 	and	dx, dx ; Ambiguous filename chars used sign (DX>0)
  3829 00009150 740F                <1> 	jz	short loc_rmdir_directory_found
  3830                              <1> 
  3831                              <1> loc_rmdir_directory_not_found:
  3832 00009152 BE[C7330100]        <1> 	mov	esi, Msg_Dir_Not_Found
  3833 00009157 E8EEDBFFFF          <1> 	call	print_msg
  3834                              <1> 
  3835 0000915C E92BFEFFFF          <1> 	jmp	loc_file_rw_restore_retn
  3836                              <1> 
  3837                              <1> loc_rmdir_directory_found:
  3838 00009161 80E307              <1> 	and	bl, 07h ; Attributes
  3839                              <1> 	;jnz	loc_permission_denied
  3840                              <1> 	; 28/07/2022
  3841 00009164 7405                <1> 	jz	short loc_rmdir_save_lnel
  3842 00009166 E92BFEFFFF          <1> 	jmp	loc_permission_denied	
  3843                              <1> 
  3844                              <1> loc_rmdir_save_lnel: ; 28/02/2016
  3845                              <1>        ;mov	bh, [LongName_EntryLength]
  3846 0000916B 883D[B2820100]      <1> 	mov	[DelFile_LNEL], bh ; Long name entry length (if > 0)
  3847                              <1> 	; edi = Directory Entry Offset (DirBuff)
  3848                              <1> 	; esi = Directory Entry (FFF Structure)
  3849                              <1> 	;mov	[DelFile_DirEntryAddr], edi ; not required
  3850                              <1> 	;mov	ax, [edi+20] ; First Cluster High Word
  3851                              <1>         ;shl	eax, 16
  3852                              <1> 	;mov	ax, [edi+26] ; First Cluster Low Word
  3853                              <1> 	; ROOT Dir First Cluster = 0
  3854                              <1>         ;cmp	eax, 2
  3855                              <1> 	;jb	loc_update_direntry_1
  3856                              <1> 
  3857                              <1> pass_rmdir_fc_check:
  3858 00009171 57                  <1> 	push	edi ; * (29/02/2016)
  3859                              <1> 
  3860 00009172 BE[5D350100]        <1> 	mov	esi, Msg_DoYouWantRmDir
  3861 00009177 E8CEDBFFFF          <1> 	call	print_msg
  3862 0000917C 8B35[A8820100]      <1> 	mov	esi, [DelFile_FNPointer]
  3863 00009182 E8C3DBFFFF          <1> 	call	print_msg
  3864 00009187 BE[49350100]        <1> 	mov	esi, Msg_YesNo
  3865 0000918C E8B9DBFFFF          <1> 	call	print_msg
  3866                              <1> 
  3867                              <1> loc_rmdir_ask_again:
  3868 00009191 30E4                <1> 	xor	ah, ah
  3869 00009193 E87B7DFFFF          <1> 	call	int16h
  3870 00009198 3C1B                <1> 	cmp	al, 1Bh
  3871                              <1> 	;je	short loc_do_not_delete_directory
  3872 0000919A 742F                <1>         je	short loc_rmdir_y_n_escape ; 06/03/2016
  3873 0000919C 24DF                <1> 	and	al, 0DFh
  3874 0000919E A2[53350100]        <1> 	mov	[Y_N_nextline], al
  3875 000091A3 3C59                <1> 	cmp	al, 'Y'
  3876 000091A5 7404                <1> 	je	short loc_rmdir_yes_delete_directory
  3877 000091A7 3C4E                <1> 	cmp	al, 'N'
  3878 000091A9 75E6                <1> 	jne	short loc_rmdir_ask_again
  3879                              <1> 
  3880                              <1> loc_do_not_delete_directory:
  3881                              <1> loc_rmdir_yes_delete_directory:
  3882 000091AB E80FFFFFFF          <1> 	call	y_n_answer ; 29/12/2017
  3883 000091B0 5F                  <1> 	pop	edi ; * (29/02/2016)
  3884                              <1> 	;cmp	al, 'Y' ; 'yes'
  3885                              <1> 	;cmc
  3886                              <1>         ;jnc	loc_file_rw_restore_retn
  3887 000091B1 3C4E                <1> 	cmp	al, 'N' ; 'no'
  3888                              <1> 	;je	loc_file_rw_restore_retn
  3889                              <1> 	; 28/07/2022
  3890                              <1> 	;jne	short loc_delete_sub_dir
  3891                              <1> 	;jmp	loc_file_rw_restore_retn
  3892 000091B3 7411                <1> 	je	short loc_rmdir_rw_restore_retn
  3893                              <1> 
  3894                              <1> loc_delete_sub_dir:
  3895                              <1> 	; 29/12/2017
  3896 000091B5 E85E000000          <1> 	call	delete_sub_directory
  3897 000091BA 7213                <1> 	jc	short loc_rmdir_cmd_failed
  3898                              <1> 
  3899                              <1> loc_rmdir_ok:
  3900 000091BC BE[57350100]        <1> 	mov	esi, Msg_OK
  3901 000091C1 E884DBFFFF          <1> 	call	print_msg
  3902                              <1> loc_rmdir_rw_restore_retn: ; 28/07/2022
  3903 000091C6 E9C1FDFFFF          <1> 	jmp	loc_file_rw_restore_retn
  3904                              <1> 
  3905                              <1> loc_rmdir_y_n_escape:
  3906 000091CB B04E                <1> 	mov	al, 'N' ; 'no'
  3907 000091CD EBDC                <1>         jmp     loc_do_not_delete_directory
  3908                              <1> 
  3909                              <1> loc_rmdir_cmd_failed:
  3910                              <1> 	; 29/12/2017
  3911 000091CF 09C0                <1> 	or	eax, eax ; EAX = 0 -> Directory not empty!
  3912 000091D1 7423                <1> 	jz	short loc_rmdir_directory_not_empty
  3913                              <1> 
  3914                              <1> 	; EAX > 0 -> Error code in AL (or AX or EAX)
  3915                              <1> 
  3916 000091D3 833D[66800100]01    <1> 	cmp	dword [FAT_ClusterCounter], 1
  3917                              <1> 	;jb	loc_file_rw_cmd_failed
  3918                              <1> 	; 28/07/2022
  3919 000091DA 7305                <1> 	jnb	short loc_rmdir_failed
  3920 000091DC E9ABFDFFFF          <1> 	jmp	loc_file_rw_cmd_failed
  3921                              <1> 	
  3922                              <1> loc_rmdir_failed:
  3923 000091E1 F9                  <1> 	stc
  3924                              <1> loc_rmdir_cmd_return:
  3925                              <1> 	; 01/03/2016
  3926 000091E2 9C                  <1> 	pushf
  3927                              <1> 	; ESI = Logical DOS Drive Description Table address	
  3928 000091E3 66BB00FF            <1> 	mov	bx, 0FF00h ; BH = FFh -> use ESI for Drive parameters
  3929                              <1> 	           ; BL = 0 -> Recalculate free cluster count
  3930 000091E7 50                  <1> 	push	eax
  3931 000091E8 E805370000          <1> 	call	calculate_fat_freespace	
  3932 000091ED 58                  <1> 	pop	eax
  3933 000091EE 9D                  <1> 	popf
  3934                              <1> 	;jc	loc_file_rw_cmd_failed
  3935                              <1> 	;jmp	loc_file_rw_restore_retn
  3936                              <1> 	; 28/07/2022
  3937 000091EF 73D5                <1> 	jnc	short loc_rmdir_rw_restore_retn
  3938 000091F1 E996FDFFFF          <1> 	jmp	loc_file_rw_cmd_failed
  3939                              <1> 
  3940                              <1> loc_rmdir_directory_not_empty:
  3941 000091F6 BE[7E350100]        <1> 	mov	esi, Msg_Dir_Not_Empty
  3942 000091FB E84ADBFFFF          <1> 	call	print_msg
  3943                              <1> 	; 01/03/2016
  3944 00009200 A1[66800100]        <1> 	mov	eax, [FAT_ClusterCounter]
  3945 00009205 09C0                <1> 	or	eax, eax ; 0 ?
  3946                              <1> 	;jz	loc_file_rw_restore_retn
  3947                              <1> 	; 28/07/2022
  3948 00009207 74BD                <1> 	jz	short loc_rmdir_rw_restore_retn	
  3949                              <1> 
  3950                              <1> 	; ESI = Logical DOS Drive Description Table address	
  3951 00009209 66BB01FF            <1> 	mov	bx, 0FF01h ; BH = FFh -> use ESI for Drive parameters
  3952                              <1> 	           ; BL = 1 -> add free clusters
  3953 0000920D E8E0360000          <1> 	call	calculate_fat_freespace
  3954 00009212 09C9                <1> 	or	ecx, ecx
  3955                              <1> 	;jz	loc_file_rw_restore_retn ; ecx = 0 -> OK
  3956                              <1> 	;; ecx > 0 -> Error (Recalculation is needed)
  3957                              <1> 	;jmp	short loc_rmdir_cmd_return
  3958                              <1> 	; 28/07/2022
  3959 00009214 75CC                <1> 	jnz	short loc_rmdir_cmd_return
  3960 00009216 EBAE                <1> 	jmp	short loc_rmdir_rw_restore_retn
  3961                              <1> 	;jmp	loc_file_rw_restore_retn
  3962                              <1> 
  3963                              <1> 
  3964                              <1> delete_sub_directory:
  3965                              <1> 	; 28/07/2022 (TRDOS 386 Kernel v2.0.5)
  3966                              <1> 	; 29/12/2017 
  3967                              <1> 	; (moved here from 'delete_directory' for 'sysrmdir' )
  3968                              <1> 
  3969                              <1> 	; EDI = Directory buffer entry offset/address
  3970                              <1> 
  3971                              <1> loc_rmdir_delete_short_name_check_dir_empty:
  3972 00009218 668B4714            <1> 	mov	ax, [edi+20] ; First Cluster High Word
  3973 0000921C C1E010              <1>         shl	eax, 16
  3974 0000921F 668B471A            <1> 	mov	ax, [edi+26] ; First Cluster Low Word
  3975                              <1> 
  3976                              <1> 	;mov 	[DelFile_FCluster], eax
  3977                              <1> 
  3978                              <1> 	;;mov	bx, [DirBuff_EntryCounter]
  3979                              <1> 	;mov	bx, [FindFile_DirEntryNumber] ; 27/02/2016
  3980                              <1> 	;mov	[DelFile_EntryCounter], bx
  3981                              <1> 
  3982 00009223 29DB                <1>     	sub	ebx, ebx
  3983                              <1> 	; 29/12/2017
  3984 00009225 891D[66800100]      <1> 	mov	[FAT_ClusterCounter], ebx ; 0 ; Reset
  3985                              <1> 
  3986 0000922B 8A3D[EA810100]      <1> 	mov	bh, [FindFile_Drv]
  3987 00009231 BE00010900          <1> 	mov	esi, Logical_DOSDisks
  3988 00009236 01DE                <1> 	add	esi, ebx
  3989                              <1> 
  3990 00009238 66817F0CA101        <1> 	cmp	word [edi+DirEntry_NTRes], 01A1h
  3991 0000923E 745A                <1> 	je	short loc_rmdir_check_fs_directory
  3992                              <1> 
  3993                              <1> 	;cmp	byte [esi+LD_FATType], 1
  3994                              <1> 	;jb	short loc_rmdir_get__last_cluster_0
  3995                              <1> 
  3996                              <1> 	; 29/12/2017
  3997 00009240 83F802              <1> 	cmp	eax, 2
  3998 00009243 7306                <1> 	jnb	short loc_rmdir_get_last_cluster_1
  3999                              <1> 	; eax < 2
  4000                              <1> loc_rmdir_get_last_cluster_0:
  4001                              <1> 	;mov	eax, ERR_INV_FORMAT ; invalid format!
  4002 00009245 B813000000          <1> 	mov	eax, ERR_NOT_DIR ; not a valid directory!
  4003                              <1> 	;stc
  4004 0000924A C3                  <1> 	retn
  4005                              <1> 
  4006                              <1> loc_rmdir_get_last_cluster_1:
  4007 0000924B 807E0303            <1> 	cmp	byte [esi+LD_FATType], 3 ; FAT32
  4008 0000924F 750C                <1> 	jne	short loc_rmdir_get_last_cluster_2
  4009                              <1> 
  4010                              <1> 	; is it root directory ?
  4011 00009251 3B4632              <1> 	cmp	eax, [esi+LD_BPB+BPB_RootClus]
  4012 00009254 7507                <1> 	jne	short loc_rmdir_get_last_cluster_2
  4013                              <1> 
  4014                              <1> 	; root directory can not be deleted !!
  4015                              <1> loc_rmdir_permission_denied:
  4016 00009256 B80B000000          <1> 	mov	eax, ERR_PERM_DENIED ; permission denied!
  4017 0000925B F9                  <1> 	stc
  4018 0000925C C3                  <1> 	retn		
  4019                              <1> 
  4020                              <1> loc_rmdir_get_last_cluster_2:
  4021                              <1> 	; 29/12/2017
  4022 0000925D A3[AC820100]        <1> 	mov 	[DelFile_FCluster], eax
  4023                              <1> 	
  4024                              <1> 	;mov	dx, [DirBuff_EntryCounter]
  4025 00009262 668B15[64820100]    <1> 	mov	dx, [FindFile_DirEntryNumber] ; 27/02/2016
  4026 00009269 668915[B0820100]    <1> 	mov	[DelFile_EntryCounter], dx
  4027                              <1> 	
  4028 00009270 8B15[76800100]      <1> 	mov	edx, [DirBuff_Cluster]
  4029 00009276 8915[DC820100]      <1> 	mov	[RmDir_ParentDirCluster], edx
  4030                              <1> 
  4031 0000927C 893D[D8820100]      <1> 	mov	[RmDir_DirEntryOffset], edi
  4032                              <1> 
  4033                              <1> 	; 01/03/2016
  4034                              <1> 	;mov	dword [FAT_ClusterCounter], 0 ; Reset
  4035                              <1> 
  4036                              <1> loc_rmdir_get_last_cluster_3:
  4037 00009282 E8E9370000          <1> 	call	get_last_cluster
  4038                              <1>         ;jc	loc_rmdir_cmd_failed
  4039 00009287 721E                <1> 	jc	short loc_delete_sub_dir_retn ; 29/12/2017
  4040                              <1> 	
  4041 00009289 3B05[AC820100]      <1> 	cmp	eax, [DelFile_FCluster]
  4042 0000928F 7517                <1> 	jne	short loc_rmdir_multi_dir_clusters
  4043                              <1> 
  4044 00009291 C605[D7820100]00    <1> 	mov	byte [RmDir_MultiClusters], 0
  4045 00009298 EB15                <1> 	jmp	short pass_rmdir_multi_dir_clusters
  4046                              <1> 
  4047                              <1> loc_rmdir_check_fs_directory:
  4048                              <1> 	; 29/12/2017
  4049 0000929A 807E04A1            <1> 	cmp	byte [esi+LD_FSType], 0A1h
  4050 0000929E 75B6                <1> 	jne	short loc_rmdir_permission_denied
  4051                              <1> 
  4052                              <1> loc_rmdir_delete_fs_directory:
  4053 000092A0 E8D1120000          <1> 	call	delete_fs_directory
  4054                              <1> 	;jnc	loc_print_deleted_message
  4055 000092A5 7300                <1> 	jnc	short loc_delete_sub_dir_retn ; 29/12/2017
  4056                              <1> 
  4057                              <1> 	; EAX=0 -> Directory not empty !
  4058                              <1> 	; EAX>0 -> Disk r/w error or another (misc) error
  4059                              <1> 	
  4060                              <1> 	;or	eax, eax
  4061                              <1> 	;jz	loc_rmdir_directory_not_empty_2         
  4062                              <1> 	;;stc
  4063                              <1> 	;;jmp	loc_file_rw_cmd_failed
  4064                              <1> 	
  4065                              <1> loc_delete_sub_dir_retn:
  4066 000092A7 C3                  <1> 	retn
  4067                              <1>  
  4068                              <1> loc_rmdir_multi_dir_clusters:
  4069 000092A8 C605[D7820100]01    <1> 	mov	byte [RmDir_MultiClusters], 1
  4070                              <1> 
  4071                              <1> pass_rmdir_multi_dir_clusters:
  4072 000092AF A3[E0820100]        <1> 	mov 	[RmDir_DirLastCluster], eax
  4073 000092B4 890D[E4820100]      <1> 	mov	[RmDir_PreviousCluster], ecx
  4074                              <1> 
  4075                              <1> loc_rmdir_load_fat_sub_directory:
  4076 000092BA E8EC310000          <1> 	call	load_FAT_sub_directory
  4077                              <1> 	;jc	loc_rmdir_cmd_failed
  4078 000092BF 72E6                <1> 	jc	short loc_delete_sub_dir_retn
  4079                              <1> 
  4080                              <1> loc_rmdir_find_last_dir_entry:
  4081 000092C1 56                  <1> 	push	esi
  4082 000092C2 BE[CE810100]        <1> 	mov	esi, Dir_File_Name
  4083 000092C7 C6062A              <1> 	mov	byte [esi], '*'
  4084 000092CA C646082A            <1> 	mov	byte [esi+8], '*'
  4085 000092CE 31DB                <1> 	xor	ebx, ebx ; Entry offset  = 0
  4086                              <1> loc_rmdir_find_last_dir_entry_next:
  4087                              <1> 	;mov	ax, 0800h ; Except volume/long names
  4088                              <1> 	;xor	cx, cx ; 0 = Find a valid file or dir name
  4089                              <1> 	; 28/07/2022
  4090 000092D0 31C0                <1> 	xor	eax, eax
  4091 000092D2 B408                <1> 	mov	ah, 8
  4092                              <1> 	; eax = 0800h
  4093 000092D4 31C9                <1> 	xor	ecx, ecx ; 0
  4094 000092D6 E8C6160000          <1> 	call	find_directory_entry
  4095 000092DB 7225                <1> 	jc	short loc_rmdir_empty_dir_cluster
  4096 000092DD 83FB01              <1> 	cmp	ebx, 1
  4097 000092E0 771B                <1> 	ja	short loc_rmdir_directory_not_empty_1
  4098                              <1> loc_rmdir_dot_entry_check:
  4099 000092E2 80FD2E              <1> 	cmp	ch, '.' ; The first char of the dir entry
  4100 000092E5 7516                <1> 	jne	short loc_rmdir_directory_not_empty_1
  4101 000092E7 08DB                <1> 	or	bl, bl
  4102 000092E9 7506                <1> 	jnz	short loc_rmdir_dotdot_entry_check
  4103 000092EB 807F0120            <1> 	cmp	byte [edi+1], 20h
  4104 000092EF EB06                <1> 	jmp	short pass_rmdir_dot_entry_check
  4105                              <1> 
  4106                              <1> loc_rmdir_dotdot_entry_check:
  4107 000092F1 66817F012E20        <1> 	cmp	word [edi+1], '. '
  4108                              <1> pass_rmdir_dot_entry_check:	
  4109 000092F7 7504                <1> 	jne	short loc_rmdir_directory_not_empty_1 
  4110 000092F9 FEC3                <1> 	inc	bl
  4111 000092FB EBD3                <1> 	jmp	short loc_rmdir_find_last_dir_entry_next 
  4112                              <1> 
  4113                              <1> loc_rmdir_directory_not_empty_1:
  4114 000092FD 58                  <1> 	pop	eax ; pushed esi 
  4115 000092FE 31C0                <1> 	xor	eax, eax ; 0
  4116                              <1> loc_rmdir_directory_not_empty_2:
  4117                              <1> loc_delete_sub_dir_stc_retn:
  4118 00009300 F9                  <1> 	stc
  4119 00009301 C3                  <1> 	retn
  4120                              <1> 
  4121                              <1> loc_rmdir_empty_dir_cluster:
  4122 00009302 5E                  <1> 	pop	esi
  4123                              <1> 
  4124                              <1> loc_rmdir_set_prev_cluster_dir_last_cluster:
  4125 00009303 803D[D7820100]00    <1> 	cmp	byte [RmDir_MultiClusters], 0
  4126 0000930A 7613                <1> 	jna	short loc_rmdir_unlink_dir_last_cluster
  4127                              <1> 
  4128 0000930C A1[E4820100]        <1> 	mov	eax, [RmDir_PreviousCluster]
  4129                              <1> 	;xor	ecx, ecx
  4130 00009311 49                  <1> 	dec	ecx ; FFFFFFFFh
  4131 00009312 E8C7320000          <1> 	call	update_cluster
  4132 00009317 7306                <1> 	jnc	short loc_rmdir_unlink_dir_last_cluster
  4133                              <1> 
  4134                              <1> 	; 01/03/2016
  4135                              <1> 	;cmp	eax, 1  ; eax = 0 -> end of cluster chain
  4136                              <1> 	;cmc 
  4137                              <1> 	;jc	short loc_rmdir_cmd_failed
  4138                              <1> 	;jmp	short loc_rmdir_save_fat_buffer
  4139                              <1> 	; 29/12/2017 
  4140 00009319 21C0                <1> 	and	eax, eax
  4141 0000931B 75E3                <1> 	jnz	short loc_delete_sub_dir_stc_retn
  4142 0000931D EB12                <1> 	jmp	short loc_rmdir_save_fat_buffer	
  4143                              <1> 
  4144                              <1> loc_rmdir_unlink_dir_last_cluster:
  4145 0000931F A1[E0820100]        <1> 	mov	eax, [RmDir_DirLastCluster]
  4146 00009324 31C9                <1> 	xor	ecx, ecx ; 0
  4147 00009326 E8B3320000          <1> 	call	update_cluster
  4148 0000932B 7327                <1> 	jnc	short loc_rmdir_unlink_stc_retn_0Bh
  4149                              <1> 	; Because of it is the last cluster
  4150                              <1> 	; 'update_cluster' must return with eocc error 
  4151 0000932D 09C0                <1> 	or	eax, eax
  4152                              <1> 	;jz	short loc_rmdir_save_fat_buffer ; eocc	
  4153                              <1> 	;stc
  4154                              <1>         ;jmp	short loc_rmdir_cmd_failed
  4155                              <1> 	; 29/12/2017
  4156 0000932F 75CF                <1> 	jnz	short loc_delete_sub_dir_stc_retn
  4157                              <1> 	
  4158                              <1> loc_rmdir_save_fat_buffer:
  4159 00009331 803D[5E800100]02    <1> 	cmp	byte [FAT_BuffValidData], 2
  4160 00009338 7527                <1> 	jne	short loc_rmdir_calculate_FAT_freespace
  4161 0000933A E822350000          <1> 	call	save_fat_buffer
  4162                              <1> 	;jc	short loc_rmdir_cmd_failed
  4163                              <1> 	; 29/12/2017
  4164 0000933F 7219                <1> 	jc	short loc_rmdir_unlink_error_retn
  4165                              <1> 
  4166                              <1> 	; 01/03/2016
  4167 00009341 803D[D7820100]00    <1> 	cmp	byte [RmDir_MultiClusters], 0
  4168 00009348 7617                <1> 	jna	short loc_rmdir_calculate_FAT_freespace
  4169                              <1> 
  4170 0000934A A1[AC820100]        <1> 	mov	eax, [DelFile_FCluster]
  4171 0000934F E92EFFFFFF          <1>         jmp     loc_rmdir_get_last_cluster_3
  4172                              <1> 
  4173                              <1> loc_rmdir_unlink_stc_retn_0Bh:
  4174                              <1> 	; 15/10/2016 (0Bh -> 28)
  4175 00009354 B81C000000          <1> 	mov	eax, ERR_INV_FORMAT ; 28 = Invalid format
  4176                              <1> loc_rmdir_unlink_stc_retn:
  4177 00009359 F9                  <1> 	stc
  4178                              <1> loc_rmdir_unlink_error_retn:
  4179 0000935A C3                  <1> 	retn
  4180                              <1> 
  4181                              <1> loc_rmdir_delete_short_name_invalid_data:
  4182                              <1> 	;mov	eax, 29 ; Invalid data (15/10/2016)
  4183                              <1> 	; 28/07/2022
  4184 0000935B 29C0                <1> 	sub	eax, eax
  4185 0000935D B01D                <1> 	mov	al, 29
  4186                              <1> 	;stc
  4187                              <1>         ;jmp	loc_rmdir_cmd_failed
  4188                              <1> 	; 29/12/2017
  4189 0000935F EBF8                <1> 	jmp	short loc_rmdir_unlink_stc_retn
  4190                              <1> 
  4191                              <1> loc_rmdir_calculate_FAT_freespace:
  4192                              <1> 	;mov	eax, [FAT_ClusterCounter]
  4193                              <1> 	; 29/12/2017
  4194 00009361 29C0                <1> 	sub	eax, eax ; 0
  4195 00009363 8705[66800100]      <1> 	xchg	eax, [FAT_ClusterCounter]
  4196                              <1> 	;
  4197 00009369 66BB01FF            <1> 	mov	bx, 0FF01h
  4198                              <1> 	; BL = 1 -> Add EAX to free space count
  4199                              <1> 	; BH = FFh ->
  4200                              <1> 	; ESI = Logical DOS Drive Description Table address
  4201 0000936D E880350000          <1> 	call	calculate_fat_freespace
  4202                              <1> 
  4203 00009372 21C9                <1> 	and	ecx, ecx ; ecx = 0 -> valid free sector count
  4204 00009374 7409                <1> 	jz 	short loc_rmdir_delete_short_name_continue
  4205                              <1> 
  4206                              <1> loc_rmdir_recalculate_FAT_freespace:
  4207 00009376 66BB00FF            <1>         mov     bx, 0FF00h ; BL = 0 -> Recalculate free space
  4208 0000937A E873350000          <1> 	call	calculate_fat_freespace
  4209                              <1> 	          
  4210                              <1> loc_rmdir_delete_short_name_continue:
  4211 0000937F A1[DC820100]        <1> 	mov	eax, [RmDir_ParentDirCluster]
  4212 00009384 83F802              <1> 	cmp	eax, 2
  4213 00009387 7309                <1> 	jnb	short loc_rmdir_del_short_name_load_sub_dir
  4214 00009389 E89F300000          <1> 	call	load_FAT_root_directory
  4215                              <1> 	;jc	loc_file_rw_cmd_failed
  4216                              <1> 	; 29/12/2017
  4217 0000938E 72CA                <1> 	jc	short loc_rmdir_unlink_error_retn
  4218 00009390 EB07                <1> 	jmp	short loc_rmdir_del_short_name_ld_chk_fclust
  4219                              <1> 
  4220                              <1> loc_rmdir_del_short_name_load_sub_dir:	
  4221 00009392 E814310000          <1> 	call	load_FAT_sub_directory
  4222                              <1> 	;jc	loc_file_rw_cmd_failed
  4223                              <1> 	; 29/12/2017
  4224 00009397 72C1                <1> 	jc	short loc_rmdir_unlink_error_retn
  4225                              <1> 
  4226                              <1> loc_rmdir_del_short_name_ld_chk_fclust:
  4227 00009399 0FB73D[D8820100]    <1> 	movzx	edi, word [RmDir_DirEntryOffset]
  4228 000093A0 81C700000800        <1> 	add	edi, Directory_Buffer
  4229                              <1> 
  4230 000093A6 668B4714            <1> 	mov	ax, [edi+20] ; First Cluster High Word
  4231 000093AA C1E010              <1> 	shl	eax, 16
  4232 000093AD 668B471A            <1> 	mov	ax, [edi+26] ; First Cluster Low Word
  4233                              <1>         ; Not necessary... 
  4234 000093B1 3B05[AC820100]      <1> 	cmp	eax, [DelFile_FCluster]
  4235 000093B7 75A2                <1> 	jne	short loc_rmdir_delete_short_name_invalid_data
  4236                              <1> 	;
  4237 000093B9 C607E5              <1> 	mov	byte [edi], 0E5h ; 'Deleted' sign
  4238                              <1> 	; 27/02/2016
  4239                              <1> 	; TRDOS v1 has a bug here! it does not set
  4240                              <1> 	; 'DirBuff_ValidData' to 2; as result of this bug,
  4241                              <1> 	; 'save_directory_buffer' would not save the change ! 
  4242 000093BC C605[71800100]02    <1>   	mov	byte [DirBuff_ValidData], 2 ; change sign
  4243                              <1> 	;
  4244 000093C3 E8B01C0000          <1> 	call	save_directory_buffer
  4245                              <1> 	;jc	loc_file_rw_cmd_failed
  4246                              <1> 	; 29/12/2017
  4247 000093C8 7290                <1> 	jc	short loc_rmdir_unlink_error_retn
  4248                              <1> 
  4249                              <1> loc_rmdir_del_long_name:
  4250 000093CA 0FB615[B2820100]    <1> 	movzx	edx, byte [DelFile_LNEL]
  4251 000093D1 08D2                <1> 	or	dl, dl
  4252 000093D3 7410                <1> 	jz	short loc_rmdir_update_parent_dir_lmdt
  4253                              <1>              
  4254 000093D5 0FB705[B0820100]    <1> 	movzx	eax, word [DelFile_EntryCounter]
  4255 000093DC 29D0                <1> 	sub	eax, edx
  4256                              <1> 	; 29/12/2017
  4257 000093DE 7205                <1> 	jc	short loc_rmdir_update_parent_dir_lmdt
  4258                              <1>  
  4259                              <1>  	; EAX = Directory Entry Number of the long name last entry
  4260 000093E0 E8EC1D0000          <1> 	call	delete_longname
  4261                              <1> 
  4262                              <1> loc_rmdir_update_parent_dir_lmdt:
  4263 000093E5 E8261D0000          <1> 	call	update_parent_dir_lmdt
  4264                              <1> 	;jc	short loc_file_rw_cmd_failed
  4265                              <1> 	; 29/12/2017
  4266                              <1> 	;jc	short loc_rmdir_unlink_error_retn
  4267                              <1> 
  4268                              <1> loc_delete_sub_directory_ok:
  4269                              <1> 	; 29/12/2017
  4270 000093EA 31C0                <1> 	xor	eax, eax ;  0 ;  cf = 0
  4271 000093EC C3                  <1> 	retn
  4272                              <1> 
  4273                              <1> delete_file:
  4274                              <1> 	; 28/07/2022 (TRDOS 386 Kernel v2.0.5)
  4275                              <1> 	; 29/02/2016
  4276                              <1> 	; 28/02/2016 (TRDOS 386 = TRDOS v2.0)
  4277                              <1> 	; 09/08/2010 (CMD_INTR.ASM, 'cmp_cmd_del')
  4278                              <1> 	; 28/02/2010
  4279                              <1> 
  4280                              <1> get_delfile_fchar:
  4281                              <1> 	; esi = file name
  4282 000093ED 803E20              <1> 	cmp	byte [esi], 20h
  4283 000093F0 7701                <1>         ja	short loc_delfile_parse_path_name
  4284                              <1> 
  4285                              <1> loc_delfile_nofilename_retn:
  4286 000093F2 C3                  <1> 	retn
  4287                              <1> 
  4288                              <1> loc_delfile_parse_path_name:
  4289 000093F3 BF[EA810100]        <1> 	mov	edi, FindFile_Drv
  4290 000093F8 E83F180000          <1> 	call	parse_path_name
  4291                              <1> 	;jc	loc_cmd_failed
  4292                              <1> 	; 28/07/2022
  4293 000093FD 7305                <1> 	jnc	short loc_delfile_check_filename_exists
  4294                              <1> loc_delfile_failed:
  4295 000093FF E94EF2FFFF          <1> 	jmp	loc_cmd_failed
  4296                              <1> 
  4297                              <1> loc_delfile_check_filename_exists:
  4298 00009404 BE[2C820100]        <1> 	mov	esi, FindFile_Name
  4299 00009409 803E20              <1> 	cmp	byte [esi], 20h
  4300                              <1> 	;jna	loc_cmd_failed
  4301                              <1> 	; 28/07/2022
  4302 0000940C 76F1                <1> 	jna	short loc_delfile_failed
  4303 0000940E 8935[A8820100]      <1> 	mov	[DelFile_FNPointer], esi 
  4304                              <1> 
  4305                              <1> loc_delfile_drv:
  4306 00009414 8A15[EA810100]      <1> 	mov	dl, [FindFile_Drv]
  4307 0000941A 8A35[4A790100]      <1> 	mov	dh, [Current_Drv]
  4308 00009420 8835[A7800100]      <1> 	mov	[RUN_CDRV], dh
  4309 00009426 38F2                <1> 	cmp	dl, dh
  4310 00009428 7407                <1> 	je	short loc_delfile_change_directory
  4311                              <1> 
  4312 0000942A E85CE4FFFF          <1> 	call	change_current_drive
  4313                              <1> 	;jc	loc_file_rw_cmd_failed
  4314                              <1> 	; 28/07/2022
  4315                              <1> 	;jnc	short loc_delfile_change_directory
  4316                              <1> 	;jmp	loc_file_rw_cmd_failed
  4317 0000942F 721D                <1> 	jc	short loc_delfile_chdrv_failed
  4318                              <1> 
  4319                              <1> loc_delfile_change_directory:
  4320 00009431 803D[EB810100]20    <1> 	cmp	byte [FindFile_Directory], 20h
  4321 00009438 7619                <1> 	jna	short loc_delfile_find
  4322                              <1> 
  4323 0000943A FE05[BD300100]      <1> 	inc	byte [Restore_CDIR]
  4324 00009440 BE[EB810100]        <1> 	mov	esi, FindFile_Directory
  4325 00009445 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0 
  4326 00009447 E804120000          <1> 	call	change_current_directory
  4327                              <1> 	;jc	loc_file_rw_cmd_failed
  4328                              <1> 	; 28/07/2022
  4329 0000944C 7305                <1> 	jnc	short loc_delfile_chdir_ok
  4330                              <1> loc_delfile_chdrv_failed:
  4331                              <1> loc_delfile_fff_failed:
  4332 0000944E E939FBFFFF          <1> 	jmp	loc_file_rw_cmd_failed
  4333                              <1> 
  4334                              <1> loc_delfile_chdir_ok: ; 28/07/2022
  4335                              <1> 
  4336                              <1> ;loc_delfile_change_prompt_dir_string:
  4337                              <1> 	;call	change_prompt_dir_string
  4338                              <1> 
  4339                              <1> loc_delfile_find:
  4340                              <1> 	;mov	esi, FindFile_Name
  4341 00009453 8B35[A8820100]      <1> 	mov	esi, [DelFile_FNPointer]
  4342 00009459 66B80018            <1> 	mov	ax, 1800h ; Except volume label and dirs
  4343 0000945D E816F7FFFF          <1> 	call	find_first_file
  4344                              <1> 	;jc	loc_file_rw_cmd_failed
  4345                              <1> 	; 28/07/2022
  4346 00009462 72EA                <1> 	jc	short loc_delfile_fff_failed
  4347                              <1> 
  4348                              <1> loc_delfile_ambgfn_check:
  4349 00009464 6621D2              <1> 	and	dx, dx ; Ambiguous filename chars used sign (DX>0)
  4350 00009467 740A                <1> 	jz	short loc_delfile_found
  4351                              <1> 
  4352                              <1> loc_file_not_found:
  4353                              <1> 	;mov	eax, 2 ; File not found sign
  4354                              <1> 	; 28/07/2022
  4355 00009469 31C0                <1> 	xor	eax, eax
  4356 0000946B B002                <1> 	mov	al, 2
  4357 0000946D F9                  <1> 	stc
  4358 0000946E E919FBFFFF          <1> 	jmp	loc_file_rw_cmd_failed   
  4359                              <1> 
  4360                              <1> loc_delfile_found:
  4361 00009473 80E307              <1> 	and	bl, 07h ; Attributes
  4362                              <1> 	;jnz	loc_permission_denied
  4363                              <1> 	; 28/07/2022
  4364 00009476 7405                <1> 	jz	short loc_delfile_attrb_ok
  4365 00009478 E919FBFFFF          <1> 	jmp	loc_permission_denied
  4366                              <1> 
  4367                              <1> loc_delfile_attrb_ok: ; 28/07/2022
  4368                              <1> 
  4369                              <1> ;loc_delfile_found_save_lnel:
  4370                              <1> ;	mov	[DelFile_LNEL], bh ; Long name entry length (if > 0)
  4371                              <1> 
  4372                              <1> loc_delfile_ask_for_delete:
  4373 0000947D 57                  <1> 	push	edi ; * (29/02/2016)
  4374                              <1> 
  4375 0000947E BE[95350100]        <1> 	mov	esi, Msg_DoYouWantDelete
  4376 00009483 E8C2D8FFFF          <1> 	call	print_msg
  4377 00009488 8B35[A8820100]      <1> 	mov	esi, [DelFile_FNPointer]
  4378 0000948E E8B7D8FFFF          <1> 	call	print_msg
  4379 00009493 BE[49350100]        <1> 	mov	esi, Msg_YesNo
  4380 00009498 E8ADD8FFFF          <1> 	call	print_msg
  4381                              <1> 
  4382                              <1> loc_delfile_ask_again:
  4383 0000949D 30E4                <1> 	xor	ah, ah
  4384 0000949F E86F7AFFFF          <1> 	call	int16h
  4385 000094A4 3C1B                <1> 	cmp	al, 1Bh
  4386                              <1> 	;je	short loc_do_not_delete_file
  4387 000094A6 744C                <1> 	je	short loc_delfile_y_n_escape ; 06/03/2016
  4388 000094A8 24DF                <1> 	and	al, 0DFh
  4389 000094AA A2[53350100]        <1> 	mov	[Y_N_nextline], al
  4390 000094AF 3C59                <1> 	cmp	al, 'Y'
  4391 000094B1 7404                <1> 	je	short loc_yes_delete_file
  4392 000094B3 3C4E                <1> 	cmp	al, 'N'
  4393 000094B5 75E6                <1> 	jne	short loc_delfile_ask_again
  4394                              <1> 
  4395                              <1> loc_do_not_delete_file:
  4396                              <1> loc_yes_delete_file:
  4397 000094B7 E803FCFFFF          <1> 	call	y_n_answer ; 29/12/2017
  4398 000094BC 5F                  <1> 	pop	edi ; * (29/02/2016)
  4399                              <1> 	;cmp	al, 'Y' ; 'yes'
  4400                              <1> 	;cmc
  4401                              <1>         ;jnc	loc_file_rw_restore_retn
  4402 000094BD 3C4E                <1> 	cmp	al, 'N' ; 'no'
  4403                              <1>         ;je	loc_file_rw_restore_retn
  4404                              <1> 	; 28/07/2022
  4405 000094BF 7505                <1> 	jne	short loc_delete_file
  4406 000094C1 E9C6FAFFFF          <1> 	jmp	loc_file_rw_restore_retn
  4407                              <1> 
  4408                              <1> loc_delete_file:
  4409 000094C6 8A3D[EA810100]      <1> 	mov	bh, [FindFile_Drv]
  4410                              <1> 	;mov	bl, [DelFile_LNEL]
  4411 000094CC 8A1D[39820100]      <1> 	mov	bl, [FindFile_LongNameEntryLength]
  4412                              <1> 	;mov	cx, [DirBuff_EntryCounter]
  4413 000094D2 668B0D[64820100]    <1> 	mov	cx, [FindFile_DirEntryNumber]
  4414                              <1> 	; (*) EDI = Directory buffer entry offset/address 
  4415 000094D9 E8CB1E0000          <1> 	call	remove_file ; (FILE.ASM, 'proc_delete_file')
  4416                              <1> 	;jnc	loc_print_deleted_message
  4417                              <1> 	; 28/07/2022
  4418 000094DE 7205                <1> 	jc	short loc_delete_file_err1
  4419 000094E0 E99DFAFFFF          <1> 	jmp	loc_print_deleted_message
  4420                              <1> 
  4421                              <1> loc_delete_file_err1:
  4422                              <1> 	;cmp	al, 05h
  4423 000094E5 3C0B                <1> 	cmp	al, ERR_PERM_DENIED  ; 29/12/2017 (5 -> 11)
  4424                              <1> 	;je	loc_permission_denied
  4425                              <1> 	; 28/07/2022
  4426 000094E7 7505                <1> 	jne	short loc_delete_file_err2
  4427 000094E9 E9A8FAFFFF          <1> 	jmp	loc_permission_denied
  4428                              <1> loc_delete_file_err2:
  4429 000094EE F9                  <1> 	stc
  4430 000094EF E998FAFFFF          <1> 	jmp	loc_file_rw_cmd_failed
  4431                              <1> 
  4432                              <1> loc_delfile_y_n_escape:
  4433 000094F4 B04E                <1> 	mov	al, 'N' ; 'no'
  4434 000094F6 EBBF                <1> 	jmp	short loc_do_not_delete_file
  4435                              <1> 
  4436                              <1> set_file_attributes:
  4437                              <1> 	; 28/07/2022 (TRDOS 386 Kernel v2.0.5)
  4438                              <1> 	; 06/03/2016
  4439                              <1> 	; 04/03/2016 (TRDOS 386 = TRDOS v2.0)
  4440                              <1> 	; 10/07/2010 (TRDOS v1, CMD_INTR.ASM, 'cmp_cmd_attrib')
  4441                              <1> 	; 23/05/2010 
  4442                              <1> 	; 17/12/2000 (P2000.ASM)
  4443                              <1> 
  4444                              <1> 	; esi = file or directory name
  4445                              <1> 	;xor	ax, ax
  4446                              <1> 	; 28/07/2022
  4447 000094F8 31C0                <1> 	xor	eax, eax
  4448 000094FA 66A3[E6350100]      <1> 	mov	[Attr_Chars], ax
  4449 00009500 A2[00830100]        <1> 	mov	[Attributes], al
  4450                              <1> 
  4451                              <1> get_attrib_fchar:
  4452                              <1> 	; esi = file name
  4453 00009505 8A06                <1> 	mov	al, [esi]
  4454 00009507 3C20                <1> 	cmp	al, 20h
  4455 00009509 7621                <1> 	jna	short loc_attr_file_nofilename_retn
  4456                              <1> 
  4457                              <1> loc_scan_attrib_params:
  4458 0000950B 3C2D                <1> 	cmp	al, '-'
  4459                              <1> 	;ja	loc_attr_file_parse_path_name
  4460                              <1> 	;je	short loc_attr_space
  4461                              <1> 	; 28/07/2022
  4462 0000950D 7207                <1> 	jb	short loc_sfa_1
  4463 0000950F 740E                <1> 	je	short loc_attr_space
  4464 00009511 E911010000          <1> 	jmp	loc_attr_file_parse_path_name
  4465                              <1> 	
  4466                              <1> loc_sfa_1:
  4467                              <1> 	; 28/07/2022
  4468 00009516 3C2B                <1> 	cmp	al, '+'
  4469                              <1> 	;jne	loc_cmd_failed
  4470 00009518 7405                <1> 	je	short loc_attr_space
  4471                              <1> loc_sfa_2: 
  4472 0000951A E933F1FFFF          <1> 	jmp	loc_cmd_failed	
  4473                              <1> loc_attr_space:
  4474 0000951F 8A6601              <1> 	mov	ah, [esi+1]
  4475 00009522 80FC20              <1>  	cmp	ah, 20h
  4476 00009525 7706                <1> 	ja	short pass_attr_space
  4477                              <1> 	;jb	loc_cmd_failed
  4478                              <1> 	; 28/07/2022
  4479 00009527 72F1                <1> 	jb	short loc_sfa_2
  4480 00009529 46                  <1> 	inc	esi
  4481 0000952A EBF3                <1> 	jmp	short loc_attr_space
  4482                              <1> 
  4483                              <1> loc_attr_file_nofilename_retn:
  4484 0000952C C3                  <1> 	retn
  4485                              <1> 
  4486                              <1> pass_attr_space:
  4487 0000952D 80E4DF              <1> 	and	ah, 0DFh
  4488 00009530 80FC53              <1> 	cmp	ah, 'S'
  4489                              <1> 	;ja	loc_cmd_failed
  4490                              <1> 	; 28/07/2022
  4491 00009533 77E5                <1> 	ja	short loc_sfa_2
  4492 00009535 7204                <1> 	jb	short pass_attr_system
  4493 00009537 B404                <1> 	mov	ah, 04h	; System
  4494 00009539 EB1D                <1> 	jmp	short pass_attr_archive
  4495                              <1> 
  4496                              <1> pass_attr_system:
  4497 0000953B 80FC48              <1> 	cmp	ah, 'H'
  4498 0000953E 7706                <1> 	ja	short pass_attr_hidden
  4499 00009540 720F                <1> 	jb	short pass_attr_read_only
  4500 00009542 B402                <1> 	mov	ah, 02h	; Hidden
  4501 00009544 EB12                <1> 	jmp	short pass_attr_archive
  4502                              <1> 
  4503                              <1> pass_attr_hidden:
  4504 00009546 80FC52              <1> 	cmp	ah, 'R'
  4505                              <1> 	;ja	loc_cmd_failed
  4506                              <1> 	; 28/07/2022
  4507 00009549 77CF                <1> 	ja	short loc_sfa_2
  4508 0000954B 7204                <1> 	jb	short pass_attr_read_only ; Read only
  4509 0000954D B401                <1> 	mov	ah, 01h
  4510 0000954F EB07                <1> 	jmp	short pass_attr_archive
  4511                              <1> 
  4512                              <1> pass_attr_read_only:
  4513 00009551 80FC41              <1> 	cmp	ah, 'A'
  4514 00009554 753B                <1> 	jne	short loc_chk_attr_enter
  4515 00009556 B420                <1> 	mov	ah, 20h	; Archive
  4516                              <1> 
  4517                              <1> pass_attr_archive:
  4518 00009558 3C2D                <1> 	cmp	al, '-'
  4519 0000955A 7508                <1> 	jne	short pass_reducing_attributes
  4520 0000955C 0825[E6350100]      <1> 	or	[Attr_Chars], ah
  4521 00009562 EB06                <1> 	jmp	short loc_change_attributes_inc
  4522                              <1> 
  4523                              <1> pass_reducing_attributes:
  4524 00009564 0825[E7350100]      <1> 	or	[Attr_Chars+1], ah
  4525                              <1> 
  4526                              <1> loc_change_attributes_inc:
  4527 0000956A 46                  <1> 	inc	esi
  4528 0000956B 8A6601              <1> 	mov	ah, [esi+1]
  4529 0000956E 80FC20              <1> 	cmp	ah, 20h
  4530 00009571 7228                <1> 	jb	short pass_change_attr
  4531 00009573 74F5                <1> 	je	short loc_change_attributes_inc
  4532 00009575 80FC2D              <1> 	cmp	ah, '-'
  4533 00009578 770D                <1> 	ja	short loc_chk_next_attr_char1
  4534 0000957A 7405                <1> 	je	short loc_chk_next_attr_char0
  4535 0000957C 80FC2B              <1> 	cmp	ah, '+'
  4536 0000957F 7506                <1> 	jne	short loc_chk_next_attr_char1
  4537                              <1> 
  4538                              <1> loc_chk_next_attr_char0:
  4539 00009581 46                  <1> 	inc	esi
  4540 00009582 668B06              <1> 	mov	ax, [esi]
  4541 00009585 EBA6                <1> 	jmp	short pass_attr_space
  4542                              <1> 
  4543                              <1> loc_chk_next_attr_char1:
  4544 00009587 803E2D              <1> 	cmp	byte [esi], '-'
  4545 0000958A 77A1                <1> 	ja	short pass_attr_space
  4546 0000958C E989000000          <1>         jmp     loc_attr_file_check_fname_fchar
  4547                              <1> 
  4548                              <1> loc_chk_attr_enter:
  4549 00009591 80FC0D              <1> 	cmp	ah, 0Dh
  4550                              <1> 	;jne	loc_cmd_failed
  4551                              <1> 	; 28/07/202
  4552 00009594 7405                <1> 	je	short pass_change_attr
  4553 00009596 E9B7F0FFFF          <1> 	jmp	loc_cmd_failed
  4554                              <1> 
  4555                              <1> pass_change_attr:
  4556 0000959B A0[E6350100]        <1> 	mov	al, [Attr_Chars]
  4557 000095A0 F6D0                <1> 	not	al
  4558 000095A2 2005[00830100]      <1> 	and	[Attributes], al
  4559 000095A8 A0[E7350100]        <1> 	mov	al, [Attr_Chars+1]
  4560 000095AD 0805[00830100]      <1> 	or	[Attributes], al
  4561                              <1> 
  4562                              <1> loc_show_attributes:
  4563 000095B3 BE[473B0100]        <1> 	mov	esi, nextline
  4564 000095B8 E88DD7FFFF          <1> 	call	print_msg
  4565                              <1> 
  4566                              <1> loc_show_attributes_no_nextline:
  4567 000095BD C705[E6350100]4E4F- <1> 	mov	dword [Attr_Chars], 'NORM'
  4567 000095C5 524D                <1>
  4568 000095C7 66C705[EA350100]41- <1> 	mov	word [Attr_Chars+4], 'AL'
  4568 000095CF 4C                  <1>
  4569 000095D0 BE[E6350100]        <1> 	mov	esi, Attr_Chars
  4570 000095D5 A0[00830100]        <1> 	mov	al, [Attributes]
  4571 000095DA A804                <1> 	test	al, 04h
  4572 000095DC 7406                <1> 	jz	short pass_put_attr_s
  4573 000095DE 66C7065300          <1> 	mov	word [esi], 0053h     ; S
  4574 000095E3 46                  <1> 	inc	esi
  4575                              <1> 
  4576                              <1> pass_put_attr_s:
  4577 000095E4 A802                <1> 	test	al, 02h
  4578 000095E6 7406                <1> 	jz	short pass_put_attr_h
  4579 000095E8 66C7064800          <1> 	mov	word [esi], 0048h     ; H
  4580 000095ED 46                  <1> 	inc	esi
  4581                              <1> 
  4582                              <1> pass_put_attr_h:
  4583 000095EE A801                <1> 	test	al, 01h
  4584 000095F0 7406                <1> 	jz	short pass_put_attr_r
  4585 000095F2 66C7065200          <1> 	mov	word [esi], 0052h     ; R
  4586 000095F7 46                  <1> 	inc	esi
  4587                              <1> 
  4588                              <1> pass_put_attr_r:
  4589 000095F8 3C20                <1> 	cmp	al, 20h
  4590 000095FA 7205                <1> 	jb	short pass_put_attr_a
  4591 000095FC 66C7064100          <1> 	mov	word [esi], 0041h     ; A
  4592                              <1> 
  4593                              <1> pass_put_attr_a:
  4594 00009601 BE[D9350100]        <1> 	mov	esi, Str_Attributes
  4595 00009606 E83FD7FFFF          <1> 	call	print_msg
  4596 0000960B BE[473B0100]        <1> 	mov	esi, nextline
  4597 00009610 E835D7FFFF          <1> 	call	print_msg
  4598 00009615 E972F9FFFF          <1> 	jmp	loc_file_rw_restore_retn 
  4599                              <1> 
  4600                              <1> loc_attr_file_check_fname_fchar:
  4601 0000961A 46                  <1> 	inc	esi
  4602 0000961B 803E20              <1> 	cmp	byte [esi], 20h
  4603 0000961E 74FA                <1> 	je	short loc_attr_file_check_fname_fchar
  4604                              <1>         ;jb	pass_change_attr
  4605                              <1> 	; 28/07/2022
  4606 00009620 7705                <1> 	ja	short loc_attr_file_parse_path_name
  4607 00009622 E974FFFFFF          <1> 	jmp	pass_change_attr	
  4608                              <1> 	   
  4609                              <1> loc_attr_file_parse_path_name:
  4610 00009627 BF[EA810100]        <1> 	mov	edi, FindFile_Drv
  4611 0000962C E80B160000          <1> 	call	parse_path_name
  4612                              <1> 	;jc	loc_cmd_failed
  4613                              <1> 	; 28/07/2022
  4614 00009631 7305                <1> 	jnc	short loc_attr_file_check_filename_exists
  4615                              <1> loc_sfa_3:
  4616 00009633 E91AF0FFFF          <1> 	jmp	loc_cmd_failed
  4617                              <1> 
  4618                              <1> loc_attr_file_check_filename_exists:
  4619 00009638 BE[2C820100]        <1> 	mov	esi, FindFile_Name
  4620 0000963D 803E20              <1> 	cmp	byte [esi], 20h
  4621                              <1> 	;jna	loc_cmd_failed
  4622                              <1> 	; 28/07/2022
  4623 00009640 76F1                <1> 	jna	short loc_sfa_3
  4624 00009642 8935[A8820100]      <1> 	mov	[DelFile_FNPointer], esi 
  4625                              <1> 
  4626                              <1> loc_attr_file_drv:
  4627 00009648 8A35[4A790100]      <1> 	mov	dh, [Current_Drv]
  4628 0000964E 8835[A7800100]      <1> 	mov	[RUN_CDRV], dh
  4629                              <1> 
  4630 00009654 8A15[EA810100]      <1> 	mov	dl, [FindFile_Drv]
  4631 0000965A 38F2                <1> 	cmp	dl, dh
  4632 0000965C 7407                <1> 	je	short loc_attr_file_change_directory
  4633                              <1> 
  4634 0000965E E828E2FFFF          <1> 	call	change_current_drive
  4635                              <1> 	;jc	loc_file_rw_cmd_failed
  4636                              <1> 	; 28/07/2022
  4637 00009663 722E                <1> 	jc	short loc_sfa_4
  4638                              <1> 
  4639                              <1> loc_attr_file_change_directory:
  4640 00009665 803D[EB810100]20    <1>         cmp     byte [FindFile_Directory], 20h
  4641 0000966C 7614                <1> 	jna	short loc_attr_file_find
  4642                              <1> 
  4643 0000966E FE05[BD300100]      <1> 	inc	byte [Restore_CDIR]
  4644                              <1> 	
  4645 00009674 BE[EB810100]        <1> 	mov	esi, FindFile_Directory
  4646 00009679 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0 
  4647 0000967B E8D00F0000          <1> 	call	change_current_directory
  4648                              <1> 	;jc	loc_file_rw_cmd_failed
  4649                              <1> 	; 28/07/2022
  4650 00009680 7211                <1> 	jc	short loc_sfa_4
  4651                              <1> 
  4652                              <1> ;loc_attr_file_change_prompt_dir_string:
  4653                              <1> 	;call	change_prompt_dir_string
  4654                              <1> 
  4655                              <1> loc_attr_file_find:
  4656                              <1> 	;mov	esi, FindFile_Name
  4657 00009682 8B35[A8820100]      <1> 	mov	esi, [DelFile_FNPointer]
  4658 00009688 66B80008            <1> 	mov	ax, 0800h ; Except volume labels
  4659 0000968C E8E7F4FFFF          <1> 	call	find_first_file
  4660                              <1> 	;jc	loc_file_rw_cmd_failed
  4661                              <1> 	; 28/07/2022
  4662 00009691 7305                <1> 	jnc	short loc_attr_file_ambgfn_check
  4663                              <1> loc_sfa_4:
  4664 00009693 E9F4F8FFFF          <1> 	jmp	loc_file_rw_cmd_failed
  4665                              <1> 
  4666                              <1> loc_attr_file_ambgfn_check:
  4667 00009698 6609D2              <1> 	or	dx, dx ; Ambiguous filename chars used sign (DX>0)
  4668                              <1> 	;	(Note: It was BX in TRDOS v1)
  4669                              <1> 	;;jz	short loc_attr_file_found
  4670                              <1> 	;jnz	loc_file_not_found ; 06/03/2016
  4671                              <1> 	; 28/07/2022 
  4672 0000969B 7405                <1> 	jz	short loc_attr_file_found
  4673 0000969D E9C7FDFFFF          <1> 	jmp	loc_file_not_found	
  4674                              <1> 
  4675                              <1> 	;mov	eax, 2 ; File not found sign
  4676                              <1> 	;stc
  4677                              <1> 	;jmp	loc_file_rw_cmd_failed   
  4678                              <1> 
  4679                              <1> loc_attr_file_found:
  4680                              <1> 	; EDI = Directory buffer entry offset/address
  4681                              <1> 	; BL = File (or Directory) Attributes 
  4682                              <1> 	;	(Note: It was 'CL' in TRDOS v1)
  4683                              <1> 	; mov	bl, [EDI+0Bh]
  4684                              <1> 	
  4685 000096A2 66833D[E6350100]00  <1> 	cmp	word [Attr_Chars], 0
  4686 000096AA 770B                <1> 	ja	short loc_attr_file_change_attributes
  4687 000096AC 881D[00830100]      <1> 	mov	[Attributes], bl
  4688 000096B2 E9FCFEFFFF          <1> 	jmp	loc_show_attributes
  4689                              <1> 
  4690                              <1> loc_attr_file_change_attributes:
  4691 000096B7 A0[E6350100]        <1> 	mov	al, [Attr_Chars]
  4692 000096BC F6D0                <1> 	not	al
  4693 000096BE 20C3                <1> 	and	bl, al
  4694 000096C0 A0[E7350100]        <1> 	mov	al, [Attr_Chars+1]
  4695 000096C5 08C3                <1> 	or	bl, al
  4696                              <1> 
  4697 000096C7 66817F0CA101        <1> 	cmp	word [edi+DirEntry_NTRes], 01A1h ; Singlix FS
  4698 000096CD 741C                <1> 	je	short loc_attr_file_fs_check
  4699                              <1> 
  4700 000096CF 881D[00830100]      <1> 	mov	[Attributes], bl
  4701 000096D5 885F0B              <1> 	mov	[edi+0Bh], bl    ; Attributes (New!)
  4702                              <1> 
  4703                              <1> 	; 04/03/2016
  4704                              <1> 	; TRDOS v1 has a bug here! it does not set
  4705                              <1> 	; 'DirBuff_ValidData' to 2; as result of this bug,
  4706                              <1> 	; 'save_directory_buffer' would not save the new attributes ! 
  4707                              <1> 	
  4708 000096D8 C605[71800100]02    <1> 	mov	byte [DirBuff_ValidData], 2
  4709                              <1> 
  4710 000096DF E894190000          <1> 	call 	save_directory_buffer
  4711                              <1> 	;jc	loc_file_rw_cmd_failed
  4712                              <1> 	;jmp	short loc_print_attr_changed_message
  4713                              <1> 	; 28/07/2022
  4714 000096E4 7334                <1> 	jnc	short loc_print_attr_changed_message
  4715                              <1> loc_sfa_5:
  4716 000096E6 E9A1F8FFFF          <1> 	jmp	loc_file_rw_cmd_failed 
  4717                              <1> 
  4718                              <1> loc_attr_file_fs_check:
  4719 000096EB 29C0                <1> 	sub	eax, eax
  4720 000096ED 8A25[6F800100]      <1>         mov     ah, [DirBuff_DRV]
  4721 000096F3 BE00010900          <1> 	mov	esi, Logical_DOSDisks
  4722 000096F8 01C6                <1>         add     esi, eax
  4723 000096FA 807E04A1            <1>         cmp     byte [esi+LD_FSType], 0A1h
  4724 000096FE 7309                <1> 	jnc	short loc_attr_file_change_fs_file_attributes
  4725                              <1> 	; 29/12/2017 (0Dh -> 29)	
  4726 00009700 66B81D00            <1> 	mov	ax, 29 ; Invalid Data
  4727 00009704 E983F8FFFF          <1> 	jmp	loc_file_rw_cmd_failed
  4728                              <1> 
  4729                              <1> loc_attr_file_change_fs_file_attributes:
  4730                              <1> 	; BL = New MS-DOS File Attributes
  4731 00009709 88D8                <1> 	mov	al, bl ; File/Directory Attributes
  4732 0000970B 30E4                <1> 	xor	ah, ah ; Attributes in MS-DOS format sign	  
  4733 0000970D E848050000          <1> 	call	change_fs_file_attributes
  4734                              <1> 	;jc	loc_file_rw_cmd_failed
  4735                              <1> 	; 28/07/2022
  4736 00009712 72D2                <1> 	jc	short loc_sfa_5
  4737                              <1> 
  4738 00009714 881D[00830100]      <1> 	mov	[Attributes], bl 
  4739                              <1> 
  4740                              <1> loc_print_attr_changed_message:
  4741 0000971A BE[D4350100]        <1> 	mov	esi, Msg_New
  4742 0000971F E826D6FFFF          <1> 	call	print_msg
  4743 00009724 E994FEFFFF          <1> 	jmp	loc_show_attributes_no_nextline
  4744                              <1> 
  4745                              <1> rename_file:
  4746                              <1> 	; 28/07/2022 (TRDOS 386 Kernel v2.0.5)
  4747                              <1> 	; 13/11/2017
  4748                              <1> 	; 06/11/2016
  4749                              <1> 	; 05/11/2016
  4750                              <1> 	; 16/10/2016
  4751                              <1> 	; 08/03/2016
  4752                              <1> 	; 06/03/2016 (TRDOS 386 = TRDOS v2.0)
  4753                              <1> 	; 20/11/2010 (TRDOS v1, CMD_INTR.ASM, 'cmp_cmd_rename')
  4754                              <1> 	; 16/11/2010 
  4755                              <1> 
  4756                              <1> get_rename_source_fchar:
  4757                              <1> 	; esi = file name
  4758 00009729 803E20              <1> 	cmp	byte [esi], 20h
  4759 0000972C 7613                <1>         jna	short loc_rename_nofilename_retn
  4760                              <1> 
  4761 0000972E 8935[28830100]      <1> 	mov	[SourceFilePath], esi
  4762                              <1> 
  4763                              <1> rename_scan_source_file:
  4764 00009734 46                  <1> 	inc	esi
  4765 00009735 803E20              <1> 	cmp	byte [esi], 20h
  4766 00009738 7408                <1> 	je	short rename_scan_destination_file_1
  4767                              <1> 	;;jb	short loc_rename_nofilename_retn
  4768                              <1> 	;jb	loc_cmd_failed
  4769                              <1> 	;jmp	short rename_scan_source_file
  4770                              <1> 	; 28/07/2022
  4771 0000973A 77F8                <1> 	ja	short rename_scan_source_file
  4772                              <1> loc_rename_failed:
  4773 0000973C E911EFFFFF          <1> 	jmp	loc_cmd_failed
  4774                              <1> 
  4775                              <1> loc_rename_nofilename_retn: ; 08/03/2016
  4776 00009741 C3                  <1> 	retn
  4777                              <1> 
  4778                              <1> rename_scan_destination_file_1:
  4779 00009742 C60600              <1> 	mov	byte [esi], 0
  4780                              <1> 
  4781                              <1> rename_scan_destination_file_2:
  4782 00009745 46                  <1> 	inc	esi  
  4783 00009746 803E20              <1> 	cmp	byte [esi], 20h
  4784 00009749 74FA                <1> 	je	short rename_scan_destination_file_2
  4785                              <1> 	;;jb	short loc_rename_nofilename_retn
  4786                              <1> 	;jb	loc_cmd_failed
  4787                              <1> 	; 28/07/2022
  4788 0000974B 72EF                <1> 	jb	short loc_rename_failed
  4789                              <1> 
  4790 0000974D 8935[2C830100]      <1> 	mov	[DestinationFilePath], esi
  4791                              <1> 
  4792                              <1> rename_scan_destination_file_3:
  4793 00009753 46                  <1> 	inc	esi  
  4794 00009754 803E20              <1> 	cmp	byte [esi], 20h
  4795 00009757 77FA                <1> 	ja	short rename_scan_destination_file_3
  4796                              <1> 
  4797 00009759 C60600              <1> 	mov	byte [esi], 0
  4798                              <1> 
  4799                              <1> loc_rename_save_current_drive:
  4800 0000975C 8A35[4A790100]      <1> 	mov	dh, [Current_Drv]
  4801 00009762 8835[A7800100]      <1> 	mov	byte [RUN_CDRV], dh
  4802                              <1> 
  4803                              <1> loc_rename_sf_parse_path_name:
  4804 00009768 8B35[28830100]      <1> 	mov	esi, [SourceFilePath] 
  4805 0000976E BF[EA810100]        <1> 	mov	edi, FindFile_Drv
  4806 00009773 E8C4140000          <1> 	call	parse_path_name
  4807                              <1> 	;jc	loc_cmd_failed
  4808                              <1> 	; 28/07/2022
  4809 00009778 72C2                <1> 	jc	short loc_rename_failed
  4810                              <1> 
  4811                              <1> loc_rename_sf_check_filename_exists:
  4812 0000977A BE[2C820100]        <1> 	mov	esi, FindFile_Name
  4813 0000977F 803E20              <1> 	cmp	byte [esi], 20h
  4814                              <1> 	;jna	loc_cmd_failed
  4815                              <1> 	; 28/07/2022
  4816 00009782 76B8                <1> 	jna	short loc_rename_failed
  4817                              <1> 
  4818                              <1> 	;mov	[DelFile_FNPointer], esi 
  4819                              <1> 
  4820                              <1> loc_rename_sf_drv:
  4821                              <1> 	;mov	dh, [Current_Drv]
  4822                              <1> 	;mov	[RUN_CDRV], dh
  4823                              <1> 
  4824 00009784 8A15[EA810100]      <1> 	mov	dl, [FindFile_Drv]
  4825 0000978A 38F2                <1> 	cmp	dl, dh ; dh = [Current_Drv]
  4826 0000978C 7407                <1> 	je	short rename_sf_change_directory
  4827                              <1> 
  4828 0000978E E8F8E0FFFF          <1> 	call	change_current_drive
  4829                              <1>  	;jc	loc_file_rw_cmd_failed
  4830                              <1> 	; 28/07/2022
  4831 00009793 722D                <1> 	jc	short loc_rename_fff_failed
  4832                              <1> 
  4833                              <1> rename_sf_change_directory:
  4834 00009795 803D[EB810100]20    <1> 	cmp	byte [FindFile_Directory], 20h
  4835 0000979C 7614                <1> 	jna	short rename_sf_find
  4836                              <1> 
  4837 0000979E FE05[BD300100]      <1> 	inc	byte [Restore_CDIR]
  4838 000097A4 BE[EB810100]        <1> 	mov	esi, FindFile_Directory
  4839 000097A9 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0 
  4840 000097AB E8A00E0000          <1> 	call	change_current_directory
  4841                              <1>  	;jc	loc_file_rw_cmd_failed
  4842                              <1> 	; 28/07/2022
  4843 000097B0 7210                <1> 	jc	short loc_rename_fff_failed
  4844                              <1> 
  4845                              <1> ;rename_sf_change_prompt_dir_string:
  4846                              <1> 	;call	change_prompt_dir_string
  4847                              <1> 
  4848                              <1> rename_sf_find:
  4849                              <1> 	;mov	esi, [DelFile_FNPointer]
  4850 000097B2 BE[2C820100]        <1> 	mov	esi, FindFile_Name
  4851                              <1> 
  4852 000097B7 66B80008            <1> 	mov	ax, 0800h ; Except volume labels
  4853 000097BB E8B8F3FFFF          <1> 	call	find_first_file
  4854                              <1> 	;jc	loc_file_rw_cmd_failed
  4855                              <1> 	; 28/07/2022
  4856 000097C0 7305                <1> 	jnc	short loc_rename_sf_ambgfn_check
  4857                              <1> 
  4858                              <1> loc_rename_fff_failed:
  4859 000097C2 E9C5F7FFFF          <1> 	jmp	loc_file_rw_cmd_failed
  4860                              <1> 
  4861                              <1> loc_rename_sf_ambgfn_check:
  4862 000097C7 6621D2              <1> 	and	dx, dx ; Ambiguous filename chars used sign (DX>0)
  4863                              <1> 	;	(Note: It was BX in TRDOS v1)
  4864                              <1> 	;;jz	short loc_rename_sf_found
  4865                              <1> 	;jnz	loc_file_not_found
  4866                              <1> 	; 28/07/2022
  4867 000097CA 7405                <1> 	jz	short loc_rename_sf_found
  4868 000097CC E998FCFFFF          <1> 	jmp	loc_file_not_found
  4869                              <1> 
  4870                              <1> 	;mov	eax, 2 ; File not found sign
  4871                              <1> 	;stc
  4872                              <1> 	;jmp	loc_file_rw_cmd_failed   
  4873                              <1> 
  4874                              <1> loc_rename_sf_found:
  4875                              <1> 	; EDI = Directory buffer entry offset/address
  4876                              <1> 	; BL = File (or Directory) Attributes 
  4877                              <1> 	;	(Note: It was 'CL' in TRDOS v1)
  4878                              <1> 	; mov	bl, [EDI+0Bh]
  4879                              <1> 
  4880 000097D1 F6C307              <1> 	test	bl, 07h ; Attributes, S-H-R
  4881                              <1> 	;jnz	loc_permission_denied
  4882                              <1> 	; 28/07/2022
  4883 000097D4 7405                <1> 	jz	short loc_rename_attrb_ok
  4884 000097D6 E9BBF7FFFF          <1> 	jmp	loc_permission_denied
  4885                              <1> 
  4886                              <1> loc_rename_attrb_ok:	
  4887 000097DB BE[EA810100]        <1>         mov     esi, FindFile_Drv
  4888 000097E0 BF[30830100]        <1>         mov     edi, SourceFile_Drv
  4889 000097E5 B920000000          <1> 	mov	ecx, 32
  4890 000097EA F3A5                <1> 	rep	movsd
  4891                              <1> 
  4892                              <1> loc_rename_df_parse_path_name:
  4893 000097EC 8B35[2C830100]      <1> 	mov	esi, [DestinationFilePath]
  4894 000097F2 BF[EA810100]        <1> 	mov	edi, FindFile_Drv
  4895 000097F7 E840140000          <1> 	call	parse_path_name
  4896 000097FC 7219                <1> 	jc	short loc_rename_df_cmd_failed
  4897                              <1> 
  4898                              <1> 	;mov	dh, [RUN_CDRV]
  4899 000097FE 8A35[4A790100]      <1> 	mov	dh, [Current_Drv]
  4900                              <1> 
  4901                              <1> 	; 'rename' command is valid only for same dos drive and same dir!
  4902                              <1> 	; ('move' command must be used if source file and destination file
  4903                              <1> 	; directories are not same!) 
  4904 00009804 8A15[EA810100]      <1> 	mov	dl, [FindFile_Drv]
  4905 0000980A 38F2                <1> 	cmp	dl, dh ; are source and destination drives different ?!
  4906 0000980C 7509                <1> 	jne	short loc_rename_df_cmd_failed ; yes! 
  4907                              <1> 
  4908                              <1> rename_df_check_dirname_exists:
  4909 0000980E 803D[EB810100]00    <1> 	cmp	byte [FindFile_Directory], 0
  4910 00009815 760B                <1> 	jna	short rename_df_check_filename_exists
  4911                              <1> 
  4912                              <1> 	; different source file and destination file directories !
  4913                              <1> loc_rename_df_cmd_failed:
  4914 00009817 B801000000          <1> 	mov	eax, 1 ; TRDOS 'Bad command or file name' error
  4915 0000981C F9                  <1> 	stc
  4916 0000981D E96AF7FFFF          <1> 	jmp	loc_file_rw_cmd_failed
  4917                              <1> 	  
  4918                              <1> rename_df_check_filename_exists:
  4919 00009822 BE[2C820100]        <1> 	mov	esi, FindFile_Name
  4920 00009827 E8F1F6FFFF          <1> 	call	check_filename
  4921                              <1> 	;jc	loc_mkdir_invalid_dir_name_chars
  4922                              <1> 	; 28/07/2022
  4923 0000982C 7305                <1> 	jnc	short loc_rename_file_name_ok
  4924 0000982E E90BF8FFFF          <1> 	jmp	loc_mkdir_invalid_dir_name_chars
  4925                              <1> 
  4926                              <1> loc_rename_file_name_ok:
  4927                              <1> 	;mov	[DelFile_FNPointer], esi 
  4928                              <1> 	;cmp	byte [esi], 20h
  4929                              <1> 	;ja	short loc_rename_df_find
  4930                              <1> 
  4931                              <1> 	;mov	dh, [Current_Drv] ; dh has not been changed
  4932                              <1> 
  4933                              <1> rename_df_drv_check_writable:
  4934 00009833 0FB6F6              <1> 	movzx	esi, dh
  4935                              <1> 	;movzx	esi, byte [Current_Drv]
  4936 00009836 81C600010900        <1> 	add	esi, Logical_DOSDisks
  4937                              <1> 
  4938 0000983C 88F2                <1> 	mov	dl, dh ; dl = [Current_Drv]
  4939 0000983E 8A7601              <1> 	mov	dh, [esi+LD_DiskType]
  4940                              <1> 
  4941 00009841 80FE01              <1> 	cmp	dh, 1 ; 0 = Invalid
  4942 00009844 7310                <1> 	jnb	short rename_df_compare_sf_df_name
  4943                              <1> 
  4944                              <1> 	; 16/10/2016 (13h -> 30)
  4945 00009846 B81E000000          <1> 	mov	eax, 30 ; 'Disk write-protected' error
  4946 0000984B 8B1D[2C830100]      <1> 	mov	ebx, [DestinationFilePath] 
  4947 00009851 E936F7FFFF          <1> 	jmp	loc_file_rw_cmd_failed
  4948                              <1> 
  4949                              <1> rename_df_compare_sf_df_name:
  4950 00009856 BE[2C820100]        <1> 	mov	esi, FindFile_Name
  4951 0000985B BF[72830100]        <1> 	mov	edi, SourceFile_Name
  4952                              <1> 	;mov	ecx, 12
  4953                              <1> 	; 28/07/2022
  4954 00009860 29C9                <1> 	sub	ecx, ecx
  4955 00009862 B10C                <1> 	mov	cl, 12
  4956                              <1> rename_df_compare_sf_df_name_next: 
  4957 00009864 AC                  <1> 	lodsb
  4958 00009865 AE                  <1> 	scasb
  4959 00009866 7506                <1> 	jne	short loc_rename_df_find
  4960 00009868 08C0                <1> 	or	al, al
  4961 0000986A 74AB                <1> 	jz	short loc_rename_df_cmd_failed
  4962 0000986C E2F6                <1> 	loop	rename_df_compare_sf_df_name_next 
  4963                              <1> 
  4964                              <1> loc_rename_df_find:
  4965                              <1> 	;mov	esi, [DelFile_FNPointer]
  4966 0000986E BE[2C820100]        <1> 	mov	esi, FindFile_Name
  4967                              <1> 
  4968                              <1> 	;xor	ax, ax ; Any
  4969                              <1> 	; 28/07/2022
  4970 00009873 31C0                <1> 	xor	eax, eax ; 0 ; Any
  4971 00009875 E8FEF2FFFF          <1> 	call	find_first_file
  4972                              <1> 	;;jnc	short loc_rename_df_found
  4973                              <1> 	;; 29/12/2017
  4974                              <1> 	;jnc	loc_permission_denied
  4975                              <1> 	; 28/07/2022
  4976 0000987A 7205                <1> 	jc	short loc_rename_df_check_error_code
  4977 0000987C E915F7FFFF          <1> 	jmp	loc_permission_denied	
  4978                              <1> 
  4979                              <1> loc_rename_df_check_error_code:
  4980                              <1> 	;cmp	eax, 2
  4981 00009881 3C02                <1> 	cmp	al, 2 ; Not found error
  4982 00009883 7406                <1> 	je	short rename_df_move_find_struct_to_dest
  4983 00009885 F9                  <1> 	stc
  4984 00009886 E901F7FFFF          <1> 	jmp	loc_file_rw_cmd_failed
  4985                              <1> 
  4986                              <1> ;loc_rename_df_found:
  4987                              <1> 	; 05/11/2016
  4988                              <1> 	; Permission denied error
  4989                              <1> 	;mov	eax, ERR_PERM_DENIED ; 29/12/2017
  4990                              <1> 	;stc
  4991                              <1> 	;jmp	loc_permission_denied  ; 06/11/2016
  4992                              <1> 
  4993                              <1> rename_df_move_find_struct_to_dest:
  4994 0000988B BE[EA810100]        <1>         mov     esi, FindFile_Drv
  4995 00009890 BF[B0830100]        <1>         mov     edi, DestinationFile_Drv
  4996                              <1> 	;mov	ecx, 32
  4997                              <1> 	; 28/07/2022
  4998 00009895 29C9                <1> 	sub	ecx, ecx
  4999 00009897 B120                <1> 	mov	cl, 32
  5000 00009899 F3A5                <1> 	rep	movsd
  5001                              <1> 
  5002                              <1> loc_rename_df_process_q_sf:
  5003                              <1> 	;mov	ecx, 12
  5004 0000989B B10C                <1> 	mov	cl, 12
  5005 0000989D BE[72830100]        <1>  	mov	esi, SourceFile_Name
  5006 000098A2 BF[15360100]        <1> 	mov	edi, Rename_OldName
  5007                              <1> rename_df_process_q_nml_1_sf:
  5008 000098A7 AC                  <1> 	lodsb
  5009 000098A8 3C20                <1>         cmp	al, 20h
  5010 000098AA 7603                <1>         jna	short rename_df_process_q_nml_2_sf
  5011 000098AC AA                  <1> 	stosb
  5012 000098AD E2F8                <1> 	loop	rename_df_process_q_nml_1_sf
  5013                              <1> 
  5014                              <1> rename_df_process_q_nml_2_sf:
  5015 000098AF C60700              <1> 	mov	byte [edi], 0
  5016                              <1> 
  5017                              <1> loc_rename_df_process_q_df:
  5018                              <1> 	;mov	ecx, 12
  5019 000098B2 B10C                <1> 	mov	cl, 12
  5020 000098B4 BE[F2830100]        <1> 	mov	esi, DestinationFile_Name
  5021 000098B9 BF[26360100]        <1> 	mov	edi, Rename_NewName
  5022                              <1> rename_df_process_q_nml_1_df:
  5023 000098BE AC                  <1> 	lodsb
  5024 000098BF 3C20                <1> 	cmp	al, 20h
  5025 000098C1 7603                <1> 	jna	short loc_rename_df_process_q_nml_2_df
  5026 000098C3 AA                  <1> 	stosb
  5027 000098C4 E2F8                <1> 	loop	rename_df_process_q_nml_1_df
  5028                              <1> 
  5029                              <1> loc_rename_df_process_q_nml_2_df:
  5030 000098C6 C60700              <1> 	mov	byte [edi], 0
  5031                              <1> 
  5032                              <1> loc_rename_confirmation_question:
  5033 000098C9 BE[ED350100]        <1> 	mov	esi, Msg_DoYouWantRename
  5034 000098CE E877D4FFFF          <1> 	call	print_msg
  5035                              <1> 
  5036 000098D3 A0[8D830100]        <1> 	mov	al, [SourceFile_DirEntry+11] ; Attributes
  5037 000098D8 2410                <1> 	and	al, 10h
  5038 000098DA 750C                <1> 	jnz	short rename_confirmation_question_dir
  5039                              <1> 
  5040                              <1> rename_confirmation_question_file:
  5041 000098DC BE[04360100]        <1> 	mov	esi, Rename_File
  5042 000098E1 E864D4FFFF          <1> 	call	print_msg 
  5043 000098E6 EB0A                <1> 	jmp	short rename_confirmation_question_as 
  5044                              <1> 
  5045                              <1> rename_confirmation_question_dir:
  5046 000098E8 BE[0A360100]        <1> 	mov	esi, Rename_Directory
  5047 000098ED E858D4FFFF          <1> 	call	print_msg
  5048                              <1> 
  5049                              <1> rename_confirmation_question_as:
  5050 000098F2 BE[15360100]        <1> 	mov	esi, Rename_OldName
  5051 000098F7 E84ED4FFFF          <1> 	call	print_msg
  5052 000098FC BE[22360100]        <1> 	mov	esi, Msg_File_rename_as
  5053 00009901 E844D4FFFF          <1> 	call	print_msg
  5054 00009906 BE[49350100]        <1> 	mov	esi, Msg_YesNo
  5055 0000990B E83AD4FFFF          <1> 	call	print_msg
  5056                              <1> 
  5057                              <1> loc_rename_ask_again:
  5058 00009910 30E4                <1> 	xor	ah, ah
  5059 00009912 E8FC75FFFF          <1> 	call	int16h
  5060 00009917 3C1B                <1> 	cmp	al, 1Bh
  5061 00009919 740F                <1> 	je	short loc_do_not_rename_file
  5062 0000991B 24DF                <1> 	and	al, 0DFh
  5063 0000991D A2[53350100]        <1> 	mov	[Y_N_nextline], al
  5064 00009922 3C59                <1> 	cmp	al, 'Y'
  5065 00009924 7404                <1> 	je	short loc_yes_rename_file
  5066 00009926 3C4E                <1> 	cmp	al, 'N'
  5067 00009928 75E6                <1> 	jne	short loc_rename_ask_again
  5068                              <1> 
  5069                              <1> loc_do_not_rename_file:
  5070                              <1> loc_yes_rename_file:
  5071 0000992A E890F7FFFF          <1> 	call	y_n_answer ; 29/12/2017
  5072                              <1> 	;cmp	al, 'Y' ; 'yes'
  5073                              <1> 	;cmc
  5074                              <1>         ;jnc	loc_file_rw_restore_retn
  5075 0000992F 3C4E                <1> 	cmp	al, 'N' ; 'no'
  5076                              <1> 	;je	loc_file_rw_restore_retn
  5077                              <1> 	; 28/07/2022
  5078 00009931 7505                <1> 	jne	short loc_rename_file_yes
  5079 00009933 E954F6FFFF          <1> 	jmp	loc_file_rw_restore_retn
  5080                              <1> 
  5081                              <1> loc_rename_file_yes: ; 28/07/2022
  5082 00009938 BE[26360100]        <1> 	mov	esi, Rename_NewName
  5083 0000993D 668B0D[AA830100]    <1> 	mov	cx, [SourceFile_DirEntryNumber] 
  5084 00009944 66A1[96830100]      <1> 	mov	ax, [SourceFile_DirEntry+20] ; First Cluster, HW 
  5085 0000994A C1E010              <1> 	shl	eax, 16 ; 13/11/2017
  5086 0000994D 66A1[9C830100]      <1> 	mov	ax, [SourceFile_DirEntry+26] ; First Cluster, LW 
  5087                              <1> 
  5088 00009953 0FB61D[7F830100]    <1>   	movzx	ebx, byte [SourceFile_LongNameEntryLength]  
  5089 0000995A E8E51A0000          <1>    	call	rename_directory_entry
  5090 0000995F E941F7FFFF          <1> 	jmp	loc_rename_file_ok	
  5091                              <1> ;loc_rename_file_ok:
  5092                              <1> ;	jc	loc_run_cmd_failed
  5093                              <1> ;	mov	esi, Msg_OK
  5094                              <1> ;	call	proc_printmsg
  5095                              <1> ;	jmp	loc_file_rw_restore_retn
  5096                              <1> 
  5097                              <1> move_file:
  5098                              <1> 	; 07/08/2022
  5099                              <1> 	; 28/07/2022 (TRDOS 386 Kernel v2.0.5)
  5100                              <1> 	; 11/03/2016
  5101                              <1> 	; 09/03/2016
  5102                              <1> 	; 08/03/2016 (TRDOS 386 = TRDOS v2.0)
  5103                              <1> 	; 21/05/2011 (TRDOS v1, CMD_INTR.ASM, 'cmp_cmd_move')
  5104                              <1> 	; 23/04/2011
  5105                              <1> 
  5106                              <1> get_move_source_fchar:
  5107                              <1> 	; esi = file name
  5108 00009964 803E20              <1> 	cmp	byte [esi], 20h
  5109 00009967 7613                <1>         jna	short loc_move_nofilename_retn
  5110                              <1> 
  5111 00009969 8935[28830100]      <1> 	mov	[SourceFilePath], esi
  5112                              <1> 
  5113                              <1> move_scan_source_file:
  5114 0000996F 46                  <1> 	inc	esi
  5115 00009970 803E20              <1> 	cmp	byte [esi], 20h
  5116 00009973 7408                <1>         je      short move_scan_destination_1
  5117                              <1> 	;;jb	short loc_move_nofilename_retn
  5118                              <1> 	;jb	loc_cmd_failed
  5119                              <1> 	;jmp	short move_scan_source_file
  5120                              <1> 	; 28/07/2022
  5121 00009975 77F8                <1> 	ja	short move_scan_source_file
  5122                              <1> loc_move_failed:
  5123 00009977 E9D6ECFFFF          <1> 	jmp	loc_cmd_failed
  5124                              <1> 
  5125                              <1> loc_move_nofilename_retn:
  5126 0000997C C3                  <1> 	retn
  5127                              <1> 
  5128                              <1> move_scan_destination_1:
  5129 0000997D C60600              <1> 	mov	byte [esi], 0
  5130                              <1> 
  5131                              <1> move_scan_destination_2:
  5132 00009980 46                  <1> 	inc	esi  
  5133 00009981 803E20              <1> 	cmp	byte [esi], 20h
  5134 00009984 74FA                <1> 	je	short move_scan_destination_2
  5135                              <1> 	;;jb	short loc_move_nofilename_retn
  5136                              <1> 	;jb	loc_cmd_failed
  5137                              <1> 	; 28/07/2022
  5138 00009986 72EF                <1> 	jb	short loc_move_failed	
  5139                              <1> 
  5140 00009988 8935[2C830100]      <1> 	mov	[DestinationFilePath], esi
  5141                              <1> 
  5142                              <1> move_scan_destination_3:
  5143 0000998E 46                  <1> 	inc	esi  
  5144 0000998F 803E20              <1> 	cmp	byte [esi], 20h
  5145 00009992 77FA                <1> 	ja	short move_scan_destination_3
  5146 00009994 C60600              <1> 	mov	byte [esi], 0
  5147                              <1> 
  5148                              <1> loc_move_scan_destination_OK:
  5149 00009997 8B35[28830100]      <1> 	mov	esi, [SourceFilePath]
  5150 0000999D 8B3D[2C830100]      <1> 	mov	edi, [DestinationFilePath]
  5151                              <1> 
  5152 000099A3 B001                <1> 	mov	al, 1  ; move procedure Phase 1
  5153 000099A5 E8141B0000          <1> 	call	move_source_file_to_destination_file
  5154 000099AA 7325                <1> 	jnc	short move_source_file_to_destination_question
  5155                              <1> 
  5156                              <1> loc_move_cmd_failed_1:
  5157 000099AC 08C0                <1> 	or	al, al
  5158                              <1> 	;jz	loc_cmd_failed
  5159                              <1> 	; 28/07/2022
  5160 000099AE 74C7                <1> 	jz	short loc_move_failed
  5161                              <1>  
  5162 000099B0 3C11                <1> 	cmp	al, 11h
  5163 000099B2 7409                <1> 	je	short loc_msg_not_same_device   
  5164                              <1> 	;cmp	al, 05h
  5165                              <1> 	;cmp	al, ERR_PERM_DENIED ; 29/12/2017
  5166                              <1> 	;jne	loc_run_cmd_failed
  5167                              <1> 	;jmp	loc_permission_denied
  5168 000099B4 3C0B                <1> 	cmp	al, ERR_PERM_DENIED
  5169                              <1> 	;je	loc_permission_denied
  5170                              <1> 	; 28/07/2022
  5171 000099B6 7414                <1> 	je	short loc_move_perm_denied
  5172 000099B8 E9C0ECFFFF          <1> 	jmp	loc_run_cmd_failed
  5173                              <1> 
  5174                              <1> 	;mov	esi, Msg_Permission_denied
  5175                              <1> 	;call	print_msg
  5176                              <1> 	;jmp	loc_file_rw_restore_retn
  5177                              <1> 
  5178                              <1> loc_msg_not_same_device:
  5179 000099BD BE[33360100]        <1> 	mov	esi, msg_not_same_drv 
  5180 000099C2 E883D3FFFF          <1> 	call	print_msg
  5181 000099C7 E9C0F5FFFF          <1> 	jmp	loc_file_rw_restore_retn
  5182                              <1> 
  5183                              <1> 	; 28/07/2022
  5184                              <1> loc_move_perm_denied:
  5185 000099CC E9C5F5FFFF          <1> 	jmp	loc_permission_denied	
  5186                              <1> 
  5187                              <1> move_source_file_to_destination_question:
  5188 000099D1 A0[30830100]        <1>         mov     al, [SourceFile_Drv]
  5189 000099D6 0441                <1> 	add	al, 'A'
  5190 000099D8 A2[95360100]        <1> 	mov	[msg_source_file_drv], al
  5191 000099DD A0[B0830100]        <1>         mov     al, [DestinationFile_Drv]
  5192 000099E2 0441                <1> 	add	al, 'A'
  5193 000099E4 A2[B4360100]        <1> 	mov	[msg_destination_file_drv], al
  5194                              <1> 
  5195 000099E9 57                  <1> 	push	edi ; *
  5196                              <1> 
  5197 000099EA BE[79360100]        <1> 	mov	esi, msg_source_file
  5198 000099EF E856D3FFFF          <1> 	call	print_msg
  5199 000099F4 BE[31830100]        <1> 	mov	esi, SourceFile_Directory
  5200 000099F9 803E20              <1> 	cmp	byte [esi], 20h
  5201 000099FC 7605                <1> 	jna	short msftdfq_sfn
  5202 000099FE E847D3FFFF          <1> 	call	print_msg
  5203                              <1> msftdfq_sfn:
  5204 00009A03 BE[72830100]        <1> 	mov	esi, SourceFile_Name
  5205 00009A08 E83DD3FFFF          <1> 	call	print_msg
  5206 00009A0D BE[98360100]        <1> 	mov	esi, msg_destination_file
  5207 00009A12 E833D3FFFF          <1> 	call	print_msg
  5208 00009A17 BE[B1830100]        <1> 	mov	esi, DestinationFile_Directory
  5209 00009A1C 803E20              <1> 	cmp	byte [esi], 20h
  5210 00009A1F 7605                <1> 	jna	short msftdfq_dfn
  5211 00009A21 E824D3FFFF          <1> 	call	print_msg
  5212                              <1> msftdfq_dfn:
  5213 00009A26 BE[F2830100]        <1> 	mov	esi, DestinationFile_Name
  5214 00009A2B E81AD3FFFF          <1> 	call	print_msg
  5215 00009A30 BE[B7360100]        <1> 	mov	esi, msg_copy_nextline
  5216 00009A35 E810D3FFFF          <1> 	call	print_msg
  5217 00009A3A BE[B7360100]        <1> 	mov	esi, msg_copy_nextline
  5218 00009A3F E806D3FFFF          <1> 	call	print_msg
  5219                              <1> 
  5220                              <1> loc_move_ask_for_new_file_yes_no:
  5221 00009A44 BE[45360100]        <1> 	mov	esi, Msg_DoYouWantMoveFile
  5222 00009A49 E8FCD2FFFF          <1> 	call	print_msg
  5223 00009A4E BE[49350100]        <1> 	mov	esi, Msg_YesNo
  5224 00009A53 E8F2D2FFFF          <1> 	call	print_msg
  5225                              <1> loc_move_ask_for_new_file_again:
  5226 00009A58 30E4                <1> 	xor	ah, ah
  5227 00009A5A E8B474FFFF          <1> 	call	int16h
  5228 00009A5F 3C1B                <1> 	cmp	al, 1Bh
  5229                              <1> 	;je	short loc_do_not_move_file
  5230 00009A61 743F                <1> 	je	short loc_move_y_n_escape
  5231 00009A63 24DF                <1> 	and	al, 0DFh
  5232 00009A65 A2[53350100]        <1>         mov     [Y_N_nextline], al
  5233 00009A6A 3C59                <1> 	cmp	al, 'Y'
  5234 00009A6C 7404                <1> 	je	short loc_yes_move_file
  5235 00009A6E 3C4E                <1> 	cmp	al, 'N'
  5236 00009A70 75E6                <1> 	jne	short loc_move_ask_for_new_file_again
  5237                              <1> 
  5238                              <1> loc_do_not_move_file:
  5239                              <1> loc_yes_move_file:
  5240 00009A72 E848F6FFFF          <1> 	call	y_n_answer ; 29/12/2017
  5241 00009A77 5F                  <1> 	pop	edi ; *
  5242                              <1> 	;cmp	al, 'Y' ; 'yes'
  5243                              <1> 	;cmc
  5244                              <1>         ;jnc	loc_file_rw_restore_retn
  5245 00009A78 3C4E                <1> 	cmp	al, 'N' ; 'no'
  5246                              <1>         ;je	loc_file_rw_restore_retn
  5247                              <1> 	; 28/07/2022
  5248 00009A7A 7421                <1> 	je	short loc_move_rw_restore_retn
  5249                              <1> 
  5250                              <1> loc_move_yes_move_file:
  5251 00009A7C B002                <1> 	mov	al, 2 ; move procedure Phase 2
  5252 00009A7E E83B1A0000          <1> 	call	move_source_file_to_destination_file
  5253                              <1> 	;;jc	short loc_move_cmd_failed_2
  5254                              <1>         ;jnc	move_source_file_to_dest_OK
  5255                              <1> 	; 28/07/2022
  5256 00009A83 7205                <1> 	jc	short loc_move_cmd_failed_2
  5257                              <1> 	; 07/08/2022
  5258 00009A85 E922F6FFFF          <1> 	jmp	move_source_file_to_dest_OK
  5259                              <1> 
  5260                              <1> ;move_source_file_to_destination_OK:
  5261                              <1> ;	mov	esi, Msg_OK
  5262                              <1> ;	call	print_msg
  5263                              <1> ;	jmp	loc_file_rw_restore_retn
  5264                              <1> 
  5265                              <1> loc_move_cmd_failed_2:
  5266 00009A8A 3C27                <1> 	cmp	al, 27h
  5267                              <1> 	;jne	loc_run_cmd_failed
  5268                              <1> 	; 28/07/2022
  5269 00009A8C 7405                <1> 	je	short loc_move_ids_err
  5270 00009A8E E9EAEBFFFF          <1> 	jmp	loc_run_cmd_failed
  5271                              <1> 
  5272                              <1> loc_move_ids_err: ; 28/07/2022
  5273 00009A93 BE[5E360100]        <1> 	mov	esi, msg_insufficient_disk_space
  5274 00009A98 E8ADD2FFFF          <1> 	call	print_msg
  5275                              <1> 
  5276                              <1> loc_move_rw_restore_retn: ; 28/07/2022 
  5277 00009A9D E9EAF4FFFF          <1> 	jmp	loc_file_rw_restore_retn
  5278                              <1> 
  5279                              <1> loc_move_y_n_escape:
  5280 00009AA2 B04E                <1> 	mov	al, 'N' ; 'no'
  5281 00009AA4 EBCC                <1> 	jmp	short loc_do_not_move_file
  5282                              <1> 
  5283                              <1> 
  5284                              <1> copy_file:
  5285                              <1> 	; 25/07/2022 - TRDOS 386 Kernel v2.0.5
  5286                              <1> 	; 15/10/2016
  5287                              <1> 	; 24/03/2016
  5288                              <1> 	; 21/03/2016
  5289                              <1> 	; 15/03/2016 (TRDOS 386 = TRDOS v2.0)
  5290                              <1> 	; 21/05/2011 (TRDOS v1, CMD_INTR.ASM, 'cmp_cmd_copy')
  5291                              <1> 	; 01/08/2010
  5292                              <1> 
  5293                              <1> get_copy_source_fchar:
  5294                              <1> 	; esi = file name
  5295 00009AA6 803E20              <1> 	cmp	byte [esi], 20h
  5296 00009AA9 7613                <1>         jna     short loc_copy_nofilename_retn
  5297                              <1> 
  5298 00009AAB 8935[28830100]      <1> 	mov	[SourceFilePath], esi
  5299                              <1> 
  5300                              <1> copy_scan_source_file:
  5301 00009AB1 46                  <1> 	inc	esi  
  5302 00009AB2 803E20              <1> 	cmp	byte [esi], 20h
  5303 00009AB5 7408                <1> 	je	short copy_scan_destination_1
  5304                              <1> 	;;jb	short loc_copy_nofilename_retn
  5305                              <1> 	;jb	loc_cmd_failed
  5306                              <1> 	;jmp	short copy_scan_source_file
  5307                              <1> 	; 25/07/2022
  5308 00009AB7 73F8                <1> 	jnb	short copy_scan_source_file
  5309                              <1> copy_scan_destination_0:
  5310 00009AB9 E994EBFFFF          <1> 	jmp	loc_cmd_failed
  5311                              <1> 
  5312                              <1> loc_copy_nofilename_retn:
  5313 00009ABE C3                  <1> 	retn
  5314                              <1> 
  5315                              <1> copy_scan_destination_1:
  5316 00009ABF C60600              <1> 	mov	byte [esi], 0
  5317                              <1> 
  5318                              <1> copy_scan_destination_2:
  5319 00009AC2 46                  <1> 	inc	esi  
  5320 00009AC3 803E20              <1> 	cmp	byte [esi], 20h
  5321 00009AC6 74FA                <1> 	je	short copy_scan_destination_2
  5322                              <1> 	;;jb	short loc_copy_nofilename_retn
  5323                              <1> 	;jb	loc_cmd_failed
  5324                              <1> 	; 25/07/2022
  5325 00009AC8 72EF                <1> 	jb	short copy_scan_destination_0	
  5326                              <1> 
  5327 00009ACA 8935[2C830100]      <1> 	mov	[DestinationFilePath], esi
  5328                              <1> 
  5329                              <1> copy_scan_destination_3:
  5330 00009AD0 46                  <1> 	inc	esi  
  5331 00009AD1 803E20              <1> 	cmp	byte [esi], 20h
  5332 00009AD4 77FA                <1> 	ja	short copy_scan_destination_3
  5333 00009AD6 C60600              <1> 	mov	byte [esi], 0
  5334                              <1> 
  5335                              <1> loc_copy_save_current_drive:
  5336 00009AD9 8A35[4A790100]      <1> 	mov	dh, [Current_Drv]
  5337 00009ADF 8835[A7800100]      <1> 	mov	[RUN_CDRV], dh
  5338                              <1> 
  5339                              <1> copy_source_file_to_destination_phase_1:
  5340 00009AE5 8B35[28830100]      <1> 	mov	esi, [SourceFilePath]
  5341 00009AEB 8B3D[2C830100]      <1> 	mov	edi, [DestinationFilePath]
  5342                              <1> 
  5343 00009AF1 B001                <1> 	mov	al, 1  ; copy procedure Phase 1
  5344 00009AF3 E85F1C0000          <1> 	call	copy_source_file_to_destination_file
  5345 00009AF8 7327                <1> 	jnc	short copy_source_file_to_destination_question
  5346                              <1> 
  5347                              <1> loc_copy_cmd_failed_1:
  5348                              <1> 	; 18/03/2016 (restore current drive and directory)
  5349 00009AFA 08C0                <1> 	or	al, al
  5350 00009AFC 7507                <1> 	jnz	short loc_copy_cmd_failed_2
  5351                              <1> 
  5352 00009AFE FEC0                <1>         inc     al ; mov al, 1 ; Bad command or file name !
  5353                              <1> loc_copy_cmd_failed_3:	; 25/07/2022
  5354 00009B00 E978EBFFFF          <1> 	jmp	loc_run_cmd_failed
  5355                              <1> 
  5356                              <1> loc_copy_cmd_failed_2:
  5357 00009B05 3C27                <1> 	cmp	al, 27h ; Insufficient disk space 
  5358 00009B07 7409                <1> 	je	short loc_file_write_insuff_disk_space_msg
  5359                              <1>  
  5360                              <1> 	; 29/12/2017
  5361                              <1> 	;cmp	al, 05h
  5362 00009B09 3C0B                <1> 	cmp	al, ERR_PERM_DENIED
  5363                              <1> 	;jne	loc_run_cmd_failed
  5364                              <1> 	; 25/07/2022
  5365 00009B0B 75F3                <1> 	jne	short loc_copy_cmd_failed_3
  5366                              <1> 	
  5367 00009B0D E984F4FFFF          <1> 	jmp	loc_permission_denied
  5368                              <1> 
  5369                              <1> loc_file_write_insuff_disk_space_msg:
  5370 00009B12 BE[5E360100]        <1> 	mov	esi, msg_insufficient_disk_space
  5371 00009B17 E82ED2FFFF          <1> 	call	print_msg
  5372 00009B1C E96BF4FFFF          <1>         jmp     loc_file_rw_restore_retn 
  5373                              <1> 
  5374                              <1> copy_source_file_to_destination_question:
  5375 00009B21 57                  <1> 	push	edi ; *
  5376                              <1> 
  5377                              <1> 	; dh = source file attributes
  5378                              <1> 	; dl > 0 -> destination file found
  5379 00009B22 20D2                <1> 	and	dl, dl            
  5380 00009B24 7446                <1> 	jz	short copy_source_file_to_destination_pass_owrq
  5381                              <1> 
  5382                              <1> loc_copy_ask_for_owr_yes_no:
  5383 00009B26 BE[BA360100]        <1> 	mov	esi, Msg_DoYouWantOverWriteFile
  5384 00009B2B E81AD2FFFF          <1> 	call	print_msg
  5385 00009B30 BE[F2830100]        <1> 	mov	esi, DestinationFile_Name
  5386 00009B35 E810D2FFFF          <1> 	call	print_msg
  5387 00009B3A BE[49350100]        <1> 	mov	esi, Msg_YesNo
  5388 00009B3F E806D2FFFF          <1> 	call	print_msg
  5389                              <1> 
  5390                              <1> loc_copy_ask_for_owr_again:
  5391 00009B44 30E4                <1> 	xor	ah, ah
  5392 00009B46 E8C873FFFF          <1> 	call	int16h
  5393 00009B4B 3C1B                <1> 	cmp	al, 1Bh
  5394                              <1>         ;je     loc_do_not_copy_file
  5395 00009B4D 7419                <1>         je      short loc_copy_y_n_escape
  5396 00009B4F 24DF                <1> 	and	al, 0DFh
  5397 00009B51 A2[53350100]        <1>         mov     [Y_N_nextline], al
  5398 00009B56 3C59                <1> 	cmp	al, 'Y'
  5399                              <1> 	;je	loc_yes_copy_file
  5400                              <1> 	; 25/07/2022
  5401 00009B58 7505                <1> 	jne	short loc_copy_ask_for_owr_n
  5402 00009B5A E9AD000000          <1> 	jmp	loc_yes_copy_file
  5403                              <1> 
  5404                              <1> loc_copy_ask_for_owr_n: ; 25/07/2022
  5405 00009B5F 3C4E                <1> 	cmp	al, 'N'
  5406                              <1>         ;je	loc_do_not_copy_file
  5407                              <1> 	;jmp	short loc_copy_ask_for_owr_again
  5408                              <1> 	; 25/07/2022
  5409 00009B61 75E1                <1> 	jne	short loc_copy_ask_for_owr_again
  5410                              <1> loc_do_not_copy_file_j:
  5411 00009B63 E9A4000000          <1> 	jmp	loc_do_not_copy_file
  5412                              <1> 
  5413                              <1> loc_copy_y_n_escape:
  5414 00009B68 B04E                <1> 	mov	al, 'N' ; 'no'
  5415                              <1> 	;jmp	loc_do_not_copy_file
  5416                              <1> 	; 25/07/2022
  5417 00009B6A EBF7                <1> 	jmp	short loc_do_not_copy_file_j
  5418                              <1> 
  5419                              <1> copy_source_file_to_destination_pass_owrq:
  5420 00009B6C A0[30830100]        <1> 	mov     al, [SourceFile_Drv]
  5421 00009B71 0441                <1> 	add	al, 'A'
  5422 00009B73 A2[95360100]        <1> 	mov	[msg_source_file_drv], al
  5423 00009B78 A0[B0830100]        <1>         mov     al, [DestinationFile_Drv]
  5424 00009B7D 0441                <1> 	add	al, 'A'
  5425 00009B7F A2[B4360100]        <1> 	mov	[msg_destination_file_drv], al
  5426                              <1> 
  5427 00009B84 BE[79360100]        <1> 	mov	esi, msg_source_file
  5428 00009B89 E8BCD1FFFF          <1> 	call	print_msg
  5429 00009B8E BE[31830100]        <1> 	mov	esi, SourceFile_Directory
  5430 00009B93 803E20              <1> 	cmp	byte [esi], 20h
  5431 00009B96 7605                <1> 	jna	short csftdfq_sfn
  5432 00009B98 E8ADD1FFFF          <1> 	call	print_msg
  5433                              <1> csftdfq_sfn:
  5434 00009B9D BE[72830100]        <1> 	mov	esi, SourceFile_Name
  5435 00009BA2 E8A3D1FFFF          <1> 	call	print_msg
  5436 00009BA7 BE[98360100]        <1> 	mov	esi, msg_destination_file
  5437 00009BAC E899D1FFFF          <1> 	call	print_msg
  5438 00009BB1 BE[B1830100]        <1> 	mov	esi, DestinationFile_Directory
  5439 00009BB6 803E20              <1> 	cmp	byte [esi], 20h
  5440 00009BB9 7605                <1> 	jna	short csftdfq_dfn
  5441 00009BBB E88AD1FFFF          <1> 	call	print_msg
  5442                              <1> csftdfq_dfn:
  5443 00009BC0 BE[F2830100]        <1> 	mov	esi, DestinationFile_Name
  5444 00009BC5 E880D1FFFF          <1> 	call	print_msg
  5445 00009BCA BE[B7360100]        <1> 	mov	esi, msg_copy_nextline
  5446 00009BCF E876D1FFFF          <1> 	call	print_msg
  5447 00009BD4 BE[B7360100]        <1> 	mov	esi, msg_copy_nextline
  5448 00009BD9 E86CD1FFFF          <1> 	call	print_msg
  5449                              <1> 
  5450                              <1> loc_copy_ask_for_new_file_yes_no:
  5451 00009BDE BE[D9360100]        <1> 	mov	esi, Msg_DoYouWantCopyFile
  5452 00009BE3 E862D1FFFF          <1> 	call	print_msg
  5453 00009BE8 BE[49350100]        <1> 	mov	esi, Msg_YesNo
  5454 00009BED E858D1FFFF          <1> 	call	print_msg
  5455                              <1> 
  5456                              <1> loc_copy_ask_for_new_file_again:
  5457 00009BF2 30E4                <1> 	xor	ah, ah
  5458 00009BF4 E81A73FFFF          <1> 	call	int16h
  5459 00009BF9 3C1B                <1> 	cmp	al, 1Bh
  5460 00009BFB 740F                <1> 	je	short loc_do_not_copy_file
  5461 00009BFD 24DF                <1> 	and	al, 0DFh
  5462 00009BFF A2[53350100]        <1>         mov     [Y_N_nextline], al
  5463 00009C04 3C59                <1> 	cmp	al, 'Y'
  5464 00009C06 7404                <1> 	je	short loc_yes_copy_file
  5465 00009C08 3C4E                <1> 	cmp	al, 'N'
  5466 00009C0A 75E6                <1> 	jne	short loc_copy_ask_for_new_file_again
  5467                              <1> 
  5468                              <1> loc_do_not_copy_file:
  5469                              <1> loc_yes_copy_file:
  5470 00009C0C E8AEF4FFFF          <1> 	call	y_n_answer ; 29/12/2017
  5471 00009C11 5F                  <1> 	pop	edi ; *
  5472                              <1> 	;cmp	al, 'Y' ; 'yes'
  5473                              <1> 	;cmc
  5474                              <1>         ;jnc	loc_file_rw_restore_retn
  5475 00009C12 3C4E                <1> 	cmp	al, 'N' ; 'no'
  5476                              <1> 	;je	loc_file_rw_restore_retn
  5477                              <1> 	; 25/07/2022
  5478 00009C14 7505                <1> 	jne	short copy_source_file_to_destination_pass_q
  5479 00009C16 E971F3FFFF          <1> 	jmp	loc_file_rw_restore_retn	
  5480                              <1> 
  5481                              <1> copy_source_file_to_destination_pass_q:
  5482 00009C1B B002                <1> 	mov	al, 2  ; copy procedure Phase 2
  5483 00009C1D E8351B0000          <1> 	call	copy_source_file_to_destination_file
  5484                              <1> 	;jc	short loc_file_write_check_disk_space_err
  5485                              <1> 
  5486                              <1> 	; 24/03/2016
  5487                              <1> 	;push	cx
  5488 00009C22 51                  <1> 	push	ecx ; 29/12/2017
  5489 00009C23 BE[B7360100]        <1> 	mov	esi, msg_copy_nextline
  5490 00009C28 E81DD1FFFF          <1> 	call	print_msg
  5491 00009C2D 58                  <1> 	pop	eax ; 29/12/2017
  5492                              <1> 	;;pop	cx
  5493                              <1> 	;pop	ax
  5494                              <1> 
  5495                              <1> 	;or	cl, cl
  5496 00009C2E 08C0                <1> 	or	al, al
  5497 00009C30 7419                <1> 	jz	short copy_source_file_to_destination_OK
  5498                              <1> 	
  5499                              <1> 	; 15/10/2016 (1Dh -> 18)
  5500                              <1> 	; 18/03/2016 (1Dh)
  5501                              <1> 	;cmp	cl, 18 ; write error
  5502 00009C32 3C12                <1> 	cmp	al, 18
  5503 00009C34 7506                <1> 	jne	short copy_source_file_to_destination_not_OK
  5504                              <1> 	;
  5505                              <1> 	;mov	al, cl ; error number (write fault!)
  5506 00009C36 F9                  <1> 	stc
  5507 00009C37 E950F3FFFF          <1> 	jmp	loc_file_rw_cmd_failed
  5508                              <1> 
  5509                              <1> copy_source_file_to_destination_not_OK:
  5510 00009C3C BE[F2360100]        <1> 	mov	esi, Msg_read_file_error_before_EOF
  5511 00009C41 E804D1FFFF          <1> 	call	print_msg
  5512 00009C46 E941F3FFFF          <1> 	jmp	loc_file_rw_restore_retn	      
  5513                              <1>  
  5514                              <1> copy_source_file_to_destination_OK:
  5515 00009C4B BE[57350100]        <1> 	mov	esi, Msg_OK
  5516 00009C50 E8F5D0FFFF          <1> 	call	print_msg
  5517                              <1> 
  5518 00009C55 E932F3FFFF          <1> 	jmp	loc_file_rw_restore_retn
  5519                              <1> 
  5520                              <1> ;loc_file_write_check_disk_space_err:
  5521                              <1> 	;cmp	al, 27h ; Insufficient disk space 
  5522                              <1> 	;je	loc_file_write_insuff_disk_space_msg
  5523                              <1>         ;jb	loc_file_rw_cmd_failed
  5524                              <1> 
  5525                              <1> 	;call	print_misc_error_msg ; 15/03/2016
  5526                              <1>         ;jmp	loc_file_rw_restore_retn 
  5527                              <1> 
  5528                              <1> change_fs_file_attributes:
  5529                              <1> 	; 04/03/2016 ; Temporary
  5530                              <1> 	; AL = File or directory attributes
  5531                              <1> 	; AH = 0 -> Attributes are in MS-DOS format
  5532                              <1> 	; AH > 0 -> Attributes are in SINGLIX format
  5533                              <1> 	;push	ebx
  5534                              <1> 	; ... do somethings here ...
  5535                              <1> 	;pop	ebx
  5536                              <1> 	; BL = File or directory attributes
  5537 00009C5A C3                  <1> 	retn
  5538                              <1> 
  5539                              <1> set_get_env:
  5540                              <1> 	; 25/07/2022 - TRDOS 386 Kernel v2.0.5
  5541                              <1> 	; 11/04/2016 (TRDOS 386 = TRDOS v2.0)
  5542                              <1> 	; 02/09/2011 (TRDOS v1, CMD_INTR.ASM, 'cmp_cmd_set')
  5543                              <1> 	; 2005 - 28/08/2011 
  5544                              <1> get_setenv_fchar:
  5545                              <1> 	; esi = environment variable/string
  5546 00009C5B 8A06                <1> 	mov	al, [esi]
  5547 00009C5D 3C20                <1> 	cmp	al, 20h
  5548 00009C5F 771E                <1> 	ja	short loc_find_env
  5549                              <1> 
  5550 00009C61 BE00300900          <1> 	mov	esi, Env_Page
  5551                              <1> loc_print_setline:
  5552 00009C66 803E00              <1> 	cmp	byte [esi], 0
  5553 00009C69 7613                <1> 	jna	short loc_setenv_retn
  5554 00009C6B E8DAD0FFFF          <1> 	call	print_msg
  5555 00009C70 56                  <1> 	push	esi
  5556 00009C71 BE[473B0100]        <1> 	mov	esi, nextline
  5557 00009C76 E8CFD0FFFF          <1> 	call	print_msg 
  5558 00009C7B 5E                  <1> 	pop	esi
  5559 00009C7C EBE8                <1> 	jmp	short loc_print_setline   
  5560                              <1> 
  5561                              <1> loc_setenv_retn: 
  5562 00009C7E C3                  <1> 	retn
  5563                              <1> 
  5564                              <1> loc_find_env:
  5565 00009C7F 3C3D                <1> 	cmp	al, '='
  5566                              <1> 	;je	loc_cmd_failed
  5567                              <1> 	; 25/07/2022
  5568 00009C81 7505                <1> 	jne	short loc_find_envr
  5569 00009C83 E9CAE9FFFF          <1> 	jmp	loc_cmd_failed
  5570                              <1> 
  5571                              <1> loc_find_envr:	; 25/07/2022
  5572 00009C88 56                  <1> 	push	esi
  5573                              <1> loc_repeat_env_equal_check:
  5574 00009C89 46                  <1> 	inc	esi
  5575 00009C8A 803E3D              <1> 	cmp	byte [esi], '='
  5576 00009C8D 7430                <1> 	je	short pass_env_equal_check
  5577 00009C8F 803E20              <1> 	cmp	byte [esi], 20h
  5578 00009C92 73F5                <1> 	jnb	short loc_repeat_env_equal_check
  5579 00009C94 C60600              <1> 	mov	byte [esi], 0 
  5580 00009C97 5E                  <1> 	pop	esi
  5581                              <1> 	; 25/07/2022 (*)
  5582                              <1> loc_print_env_string:
  5583 00009C98 BF[4A7A0100]        <1> 	mov	edi, TextBuffer ; out buffer
  5584 00009C9D B9FF000000          <1> 	mov	ecx, 255 ; maximum size (limit)
  5585 00009CA2 30C0                <1> 	xor	al, al ; 0 -> use [ESI]
  5586 00009CA4 E877000000          <1> 	call	get_environment_string
  5587 00009CA9 72D3                <1> 	jc	short loc_setenv_retn
  5588                              <1> 	 ; 25/07/2022
  5589                              <1> ;loc_print_env_string:
  5590 00009CAB BE[4A7A0100]        <1> 	mov	esi, TextBuffer
  5591 00009CB0 E895D0FFFF          <1> 	call	print_msg
  5592 00009CB5 BE[473B0100]        <1> 	mov	esi, nextline
  5593                              <1> 	;call	print_msg
  5594                              <1> 	;retn
  5595                              <1> 	; 25/07/2022
  5596 00009CBA E98BD0FFFF          <1> 	jmp	print_msg
  5597                              <1>               
  5598                              <1> pass_env_equal_check:
  5599 00009CBF 46                  <1> 	inc	esi
  5600 00009CC0 803E20              <1> 	cmp	byte [esi], 20h
  5601 00009CC3 73FA                <1> 	jnb	short pass_env_equal_check
  5602 00009CC5 C60600              <1> 	mov	byte [esi], 0	
  5603                              <1> 
  5604                              <1> loc_call_set_env_string:
  5605 00009CC8 5E                  <1> 	pop	esi
  5606 00009CC9 E815010000          <1> 	call	set_environment_string
  5607 00009CCE 73AE                <1> 	jnc	short loc_setenv_retn
  5608                              <1> 
  5609                              <1> loc_set_cmd_failed:
  5610 00009CD0 3C08                <1> 	cmp	al, 08h
  5611                              <1> 	;jne	loc_cmd_failed
  5612                              <1> 	; 25/07/2022
  5613 00009CD2 7405                <1> 	je	short loc_set_cmd_failed_spc
  5614 00009CD4 E979E9FFFF          <1> 	jmp	loc_cmd_failed
  5615                              <1> 
  5616                              <1> loc_set_cmd_failed_spc:
  5617 00009CD9 BE[32370100]        <1> 	mov	esi, Msg_No_Set_Space
  5618                              <1> 	;call	print_msg
  5619                              <1> 	;retn
  5620                              <1> 	; 25/07/2022
  5621 00009CDE E967D0FFFF          <1> 	jmp	print_msg
  5622                              <1> 
  5623                              <1> set_get_path:
  5624                              <1> 	; 25/07/2022 - TRDOS 386 Kernel v2.0.5
  5625                              <1> 	; 11/04/2016 (TRDOS 386 = TRDOS v2.0)
  5626                              <1> 	; 03/09/2011 (TRDOS v1, CMD_INTR.ASM, 'cmp_cmd_path')
  5627                              <1> 	; 2005
  5628                              <1> get_path_fchar:
  5629                              <1>  	; esi = path
  5630 00009CE3 803E20              <1> 	cmp	byte [esi], 20h
  5631 00009CE6 7711                <1> 	ja	short loc_set_path
  5632                              <1> 
  5633 00009CE8 BE00300900          <1> 	mov	esi, Env_Page
  5634                              <1> loc_print_path:
  5635 00009CED 803E00              <1> 	cmp	byte [esi], 0
  5636 00009CF0 762D                <1> 	jna	short loc_path_retn
  5637                              <1> 
  5638 00009CF2 BE[91310100]        <1> 	mov	esi, Cmd_Path ; 'PATH' address
  5639                              <1> 	; 25/07/2022 (*)
  5640 00009CF7 EB9F                <1> 	jmp	short loc_print_env_string
  5641                              <1> ; 25/07/2022
  5642                              <1> ;	mov	edi, TextBuffer ; out buffer
  5643                              <1> ;	xor	al, al  ; use [ESI]
  5644                              <1> ;	mov	ecx, 255 ; maximum size (limit)
  5645                              <1> ;	call	get_environment_string
  5646                              <1> ;	;jc	short loc_path_retn
  5647                              <1> ;	; 25/07/2022
  5648                              <1> ;	jnc	short loc_print_env_string
  5649                              <1> ;	retn
  5650                              <1> 
  5651                              <1> ;	mov	esi, TextBuffer
  5652                              <1> ;	call	print_msg
  5653                              <1> ;	mov	esi, nextline
  5654                              <1> ;	;call	print_msg
  5655                              <1> ;loc_path_retn: 
  5656                              <1> ;	;retn
  5657                              <1> ;	; 25/07/2022
  5658                              <1> ;	jmp	print_msg
  5659                              <1> 
  5660                              <1> loc_set_path:
  5661 00009CF9 56                  <1> 	push	esi 
  5662                              <1> loc_set_path_find_end:
  5663 00009CFA 46                  <1> 	inc	esi
  5664 00009CFB 803E20              <1> 	cmp	byte [esi], 20h
  5665 00009CFE 73FA                <1> 	jnb	short loc_set_path_find_end
  5666 00009D00 C60600              <1> 	mov	byte [esi], 0 
  5667                              <1> loc_set_path_header: 
  5668 00009D03 5E                  <1> 	pop	esi
  5669                              <1> set_path_x: ; 31/12/2017 ('syspath')	  
  5670 00009D04 4E                  <1> 	dec	esi
  5671 00009D05 C6063D              <1> 	mov	byte [esi], '='
  5672 00009D08 4E                  <1> 	dec	esi
  5673 00009D09 C60648              <1> 	mov	byte [esi], 'H'
  5674 00009D0C 4E                  <1> 	dec	esi
  5675 00009D0D C60654              <1> 	mov	byte [esi], 'T'
  5676 00009D10 4E                  <1> 	dec	esi
  5677 00009D11 C60641              <1> 	mov	byte [esi], 'A'
  5678 00009D14 4E                  <1> 	dec	esi
  5679 00009D15 C60650              <1> 	mov	byte [esi], 'P'   
  5680                              <1> 
  5681                              <1> loc_path_call_set_env_string:
  5682 00009D18 E8C6000000          <1> 	call	set_environment_string
  5683 00009D1D 72B1                <1>         jc	short loc_set_cmd_failed
  5684                              <1> loc_path_retn:	; 25/07/2022
  5685 00009D1F C3                  <1> 	retn              
  5686                              <1> 
  5687                              <1> get_environment_string:
  5688                              <1> 	; 12/04/2016
  5689                              <1> 	; 11/04/2016
  5690                              <1> 	; 05/04/2016 (TRDOS 386 = TRDOS v2.0)
  5691                              <1> 	; 02/09/2011 (TRDOS v1, MAINPROG.ASM)
  5692                              <1> 	; 28/08/2011
  5693                              <1> 	; INPUT->
  5694                              <1> 	;	EDI = Output buffer
  5695                              <1> 	;	CX = Buffer length (<= ENV_PAGE_SIZE)
  5696                              <1> 	;
  5697                              <1> 	;	AL > 0 = AL = String sequence number
  5698                              <1> 	;	AL = 0 -> ESI = ASCIIZ Set word 
  5699                              <1> 	;		(environment variable)
  5700                              <1> 	; OUTPUT ->
  5701                              <1> 	;	ESI is not changed
  5702                              <1> 	;	EDI is not changed
  5703                              <1> 	;	EAX = String length (with zero tail)
  5704                              <1> 	;	EDX = Environment variables page address
  5705                              <1> 	;	CF = 1 -> Not found (EAX not valid)
  5706                              <1> 	;
  5707                              <1> 	; (Modified registers: EAX, EDX) 
  5708                              <1> 
  5709 00009D20 BA00300900          <1> 	mov	edx, Env_Page
  5710 00009D25 803A00              <1> 	cmp	byte [edx], 0
  5711 00009D28 7474                <1> 	jz	short get_env_string_with_word_stc_retn
  5712                              <1> 
  5713 00009D2A 66890D[B4840100]    <1> 	mov	[env_var_length], cx
  5714                              <1> 
  5715 00009D31 51                  <1> 	push	ecx ; *
  5716 00009D32 56                  <1> 	push	esi ; **
  5717                              <1> 
  5718 00009D33 08C0                <1> 	or	al, al
  5719 00009D35 7449                <1> 	jz	short get_env_string_with_word
  5720                              <1> 
  5721                              <1> get_env_string_with_seq_number:
  5722 00009D37 B101                <1> 	mov	cl, 1
  5723 00009D39 88C5                <1> 	mov	ch, al
  5724 00009D3B 31C0                <1> 	xor	eax, eax
  5725 00009D3D 89D6                <1> 	mov	esi, edx ; Env_Page
  5726                              <1> 
  5727                              <1> get_env_string_seq_number_check:
  5728 00009D3F 38CD                <1> 	cmp	ch, cl
  5729 00009D41 7726                <1> 	ja	short get_env_string_seq_number_next
  5730                              <1> 
  5731                              <1> get_env_string_move_to_buff:
  5732 00009D43 57                  <1> 	push	edi ; ***
  5733                              <1> 
  5734 00009D44 29D2                <1> 	sub	edx, edx
  5735                              <1> 
  5736                              <1> get_env_string_seq_number_repeat1:
  5737 00009D46 42                  <1> 	inc	edx
  5738 00009D47 AC                  <1> 	lodsb
  5739 00009D48 AA                  <1> 	stosb
  5740                              <1> 
  5741 00009D49 66FF0D[B4840100]    <1> 	dec	word [env_var_length]
  5742 00009D50 7508                <1> 	jnz	short get_env_string_seq_number_repeat3
  5743                              <1> 
  5744                              <1> get_env_string_seq_number_repeat2:
  5745 00009D52 20C0                <1> 	and	al, al
  5746 00009D54 7408                <1> 	jz	short get_env_string_seq_number_ok
  5747 00009D56 42                  <1> 	inc	edx
  5748 00009D57 AC                  <1> 	lodsb
  5749 00009D58 EBF8                <1> 	jmp	short get_env_string_seq_number_repeat2
  5750                              <1> 
  5751                              <1> get_env_string_seq_number_repeat3:
  5752 00009D5A 08C0                <1> 	or	al, al
  5753 00009D5C 75E8                <1> 	jnz	short get_env_string_seq_number_repeat1
  5754                              <1> 
  5755                              <1> get_env_string_seq_number_ok:
  5756 00009D5E 5F                  <1> 	pop	edi ; ***
  5757 00009D5F 89D0                <1> 	mov	eax, edx ; Length of the environment string
  5758                              <1> 			 ; (ASCIIZ, includes ZERO tail)
  5759 00009D61 BA00300900          <1> 	mov	edx, Env_Page
  5760                              <1> 
  5761                              <1> get_env_string_stc_retn:
  5762 00009D66 5E                  <1> 	pop	esi ; **
  5763 00009D67 59                  <1> 	pop	ecx ; *
  5764 00009D68 C3                  <1> 	retn   
  5765                              <1> 	
  5766                              <1> get_env_string_seq_number_next:
  5767 00009D69 AC                  <1> 	lodsb
  5768 00009D6A 08C0                <1> 	or	al, al
  5769 00009D6C 75FB                <1> 	jnz	short get_env_string_seq_number_next
  5770                              <1> 
  5771 00009D6E 81FE00320900        <1> 	cmp	esi, Env_Page + Env_Page_Size ; +512 (+4096)
  5772 00009D74 F5                  <1> 	cmc
  5773 00009D75 72EF                <1> 	jc	short get_env_string_stc_retn
  5774                              <1> 
  5775 00009D77 AC                  <1> 	lodsb
  5776 00009D78 3C01                <1> 	cmp	al, 1
  5777 00009D7A 72EA                <1> 	jb	short get_env_string_stc_retn
  5778 00009D7C FEC1                <1> 	inc	cl
  5779 00009D7E EBBF                <1> 	jmp	short get_env_string_seq_number_check
  5780                              <1> 
  5781                              <1> get_env_string_with_word:
  5782 00009D80 31C9                <1> 	xor	ecx, ecx
  5783                              <1> 
  5784                              <1> get_env_string_calc_word_length:
  5785 00009D82 AC                  <1> 	lodsb 
  5786 00009D83 3C20                <1> 	cmp	al, 20h
  5787 00009D85 7211                <1> 	jb	short get_env_string_calc_word_length_ok
  5788                              <1> 	;inc	cx
  5789 00009D87 FEC1                <1> 	inc	cl
  5790                              <1> 
  5791 00009D89 3C61                <1> 	cmp	al, 'a'
  5792 00009D8B 72F5                <1> 	jb	short get_env_string_calc_word_length
  5793 00009D8D 3C7A                <1> 	cmp	al, 'z'
  5794 00009D8F 77F1                <1> 	ja	short get_env_string_calc_word_length
  5795 00009D91 24DF                <1> 	and	al, 0DFh
  5796 00009D93 8846FF              <1> 	mov	[esi-1], al
  5797 00009D96 EBEA                <1> 	jmp	short get_env_string_calc_word_length
  5798                              <1> 	
  5799                              <1> get_env_string_calc_word_length_ok:
  5800 00009D98 08C9                <1> 	or	cl, cl
  5801 00009D9A 7506                <1> 	jnz	short get_env_string_calc_word_length_save
  5802                              <1>      
  5803 00009D9C 5E                  <1> 	pop	esi ; **
  5804                              <1> 
  5805                              <1> get_env_string_stc_retn1:
  5806 00009D9D 59                  <1> 	pop	ecx ; *
  5807                              <1>         
  5808                              <1> get_env_string_with_word_stc_retn:
  5809 00009D9E 31C0                <1> 	xor	eax, eax  
  5810 00009DA0 F9                  <1> 	stc
  5811 00009DA1 C3                  <1> 	retn
  5812                              <1>   
  5813                              <1> get_env_string_calc_word_length_save:
  5814 00009DA2 871C24              <1> 	xchg	ebx, [esp] ; **
  5815 00009DA5 89DE                <1> 	mov	esi, ebx 
  5816                              <1> 		; Start of the env string (to be searched)
  5817                              <1> 
  5818 00009DA7 57                  <1> 	push	edi ; ***
  5819 00009DA8 89D7                <1> 	mov	edi, edx ; Env_Page
  5820                              <1> 
  5821                              <1> get_env_string_compare:
  5822 00009DAA 57                  <1> 	push	edi ; ****
  5823 00009DAB 51                  <1> 	push	ecx ; ***** ; Variable name length
  5824                              <1> 
  5825                              <1> get_env_string_compare_rep:
  5826 00009DAC AC                  <1> 	lodsb
  5827 00009DAD AE                  <1> 	scasb
  5828 00009DAE 7511                <1> 	jne	short get_env_string_compare_next1
  5829 00009DB0 E2FA                <1> 	loop	get_env_string_compare_rep
  5830                              <1> 	
  5831 00009DB2 803F3D              <1> 	cmp	byte [edi], '='
  5832 00009DB5 750A                <1> 	jne	short get_env_string_compare_next1
  5833                              <1>  
  5834 00009DB7 59                  <1> 	pop	ecx ; *****
  5835 00009DB8 5F                  <1> 	pop	edi ; ****
  5836 00009DB9 89FE                <1> 	mov	esi, edi
  5837 00009DBB 5F                  <1> 	pop	edi ; ***
  5838 00009DBC 871C24              <1> 	xchg	ebx, [esp] ; **
  5839 00009DBF EB82                <1> 	jmp	short get_env_string_move_to_buff
  5840                              <1> 
  5841                              <1> get_env_string_compare_next1:
  5842 00009DC1 89FE                <1> 	mov	esi, edi
  5843 00009DC3 59                  <1> 	pop	ecx ; *****
  5844 00009DC4 5F                  <1> 	pop	edi ; ****
  5845                              <1> get_env_string_compare_next2:
  5846 00009DC5 81FEFF310900        <1> 	cmp	esi, Env_Page + Env_Page_Size - 1 ; +511 (+4095)
  5847 00009DCB 7310                <1> 	jnb	short get_env_string_compare_not_ok
  5848 00009DCD 20C0                <1> 	and	al, al
  5849 00009DCF AC                  <1> 	lodsb
  5850 00009DD0 75F3                <1> 	jnz	short get_env_string_compare_next2
  5851 00009DD2 08C0                <1> 	or	al, al
  5852 00009DD4 7407                <1> 	jz	short get_env_string_compare_not_ok
  5853 00009DD6 4E                  <1> 	dec	esi ; 12/04/2016
  5854 00009DD7 89F7                <1> 	mov	edi, esi
  5855 00009DD9 89DE                <1> 	mov	esi, ebx
  5856 00009DDB EBCD                <1> 	jmp	short get_env_string_compare
  5857                              <1> 
  5858                              <1> get_env_string_compare_not_ok:
  5859 00009DDD 5F                  <1> 	pop	edi ; ***
  5860 00009DDE 89DE                <1> 	mov	esi, ebx
  5861 00009DE0 5B                  <1> 	pop	ebx ; **
  5862 00009DE1 EBBA                <1> 	jmp	short get_env_string_stc_retn1
  5863                              <1> 
  5864                              <1> set_environment_string:
  5865                              <1> 	; 25/07/2022 - TRDOS 386 Kernel v2.0.5
  5866                              <1> 	; 13/04/2016
  5867                              <1> 	; 12/04/2016
  5868                              <1> 	; 11/04/2016
  5869                              <1> 	; 06/04/2016
  5870                              <1> 	; 05/04/2016 (TRDOS 386 = TRDOS v2.0)
  5871                              <1> 	; 02/09/2011 (TRDOS v1, MAINPROG.ASM)
  5872                              <1> 	; 29/08/2011
  5873                              <1> 	; 29/08/2011
  5874                              <1> 	; INPUT->
  5875                              <1> 	;	ESI = ASCIIZ environment string
  5876                              <1> 	; OUTPUT ->
  5877                              <1> 	;	ESI is not changed
  5878                              <1> 	;	CF = 1 -> Could not set, 
  5879                              <1> 	;	     insufficient environment space
  5880                              <1> 	;
  5881                              <1> 	; (EAX, EDX will be changed) 
  5882                              <1> 	;
  5883                              <1> 	;    (EAX = Start address of the env string if > 0)	
  5884                              <1> 	;    (EDX = Environment string length)	
  5885                              <1> 
  5886 00009DE3 56                  <1> 	push 	esi ; *
  5887                              <1> 
  5888 00009DE4 31C0                <1> 	xor	eax, eax
  5889                              <1> 
  5890                              <1> set_env_chk_validation1:
  5891 00009DE6 FEC4                <1> 	inc	ah ; variable (string) length
  5892 00009DE8 AC                  <1> 	lodsb
  5893 00009DE9 3C3D                <1> 	cmp	al, '='
  5894 00009DEB 7415                <1> 	je	short set_env_chk_validation2
  5895 00009DED 3C20                <1> 	cmp	al, 20h
  5896 00009DEF 720F                <1> 	jb	short set_env_string_stc
  5897                              <1> 
  5898                              <1> 	; 06/04/2016
  5899 00009DF1 3C61                <1> 	cmp	al, 'a'
  5900 00009DF3 72F1                <1> 	jb	short set_env_chk_validation1
  5901 00009DF5 3C7A                <1> 	cmp	al, 'z'
  5902 00009DF7 77ED                <1> 	ja	short set_env_chk_validation1
  5903 00009DF9 2C20                <1> 	sub	al, 'a'-'A'
  5904 00009DFB 8846FF              <1> 	mov	[esi-1], al
  5905 00009DFE EBE6                <1> 	jmp	short set_env_chk_validation1
  5906                              <1> 
  5907                              <1> set_env_string_stc:
  5908 00009E00 5E                  <1> 	pop	esi ; *
  5909                              <1> 	;stc
  5910 00009E01 C3                  <1> 	retn 
  5911                              <1> 	   
  5912                              <1> set_env_chk_validation2:
  5913 00009E02 51                  <1> 	push	ecx ; **
  5914 00009E03 53                  <1> 	push	ebx ; *** 
  5915 00009E04 57                  <1> 	push	edi ; ****
  5916                              <1> 
  5917                              <1> 	; 12/04/2016
  5918                              <1> 	;mov	ebx, [esp+12]
  5919                              <1> 	; 25/07/2022
  5920 00009E05 8B54240C            <1> 	mov	edx, [esp+12]
  5921                              <1> 
  5922                              <1> set_env_chk_validation2w:
  5923 00009E09 89F7                <1> 	mov	edi, esi
  5924 00009E0B 4F                  <1> 	dec	edi
  5925                              <1> 
  5926 00009E0C 807FFF20            <1> 	cmp	byte [edi-1], 20h
  5927 00009E10 771A                <1> 	ja	short set_env_chk_validation2z
  5928                              <1> 	
  5929 00009E12 56                  <1> 	push	esi
  5930 00009E13 89FE                <1> 	mov	esi, edi
  5931 00009E15 4E                  <1> 	dec	esi
  5932                              <1> 
  5933                              <1> set_env_chk_validation2x:
  5934 00009E16 4E                  <1> 	dec	esi
  5935                              <1> 
  5936                              <1> 	;cmp	esi, ebx
  5937 00009E17 39D6                <1> 	cmp	esi, edx ; 25/07/2022
  5938 00009E19 7207                <1> 	jb	short set_env_chk_validation2y
  5939                              <1> 
  5940 00009E1B 4F                  <1> 	dec	edi
  5941                              <1> 
  5942 00009E1C 8A06                <1> 	mov	al, [esi]
  5943 00009E1E 8807                <1> 	mov	[edi], al
  5944                              <1> 
  5945 00009E20 EBF4                <1> 	jmp	short set_env_chk_validation2x
  5946                              <1> 
  5947                              <1> set_env_chk_validation2y:
  5948 00009E22 5E                  <1> 	pop	esi
  5949                              <1> 
  5950                              <1> 	;;mov	byte [ebx], 20h
  5951                              <1> 	; 25/07/2022
  5952                              <1> 	;mov	byte [edx], 20h		
  5953                              <1> 
  5954                              <1> 	;inc 	ebx
  5955                              <1> 	;mov	[esp+12], ebx
  5956                              <1> 	; 25/07/2022
  5957 00009E23 42                  <1> 	inc	edx
  5958 00009E24 8954240C            <1> 	mov	[esp+12], edx
  5959                              <1> 
  5960 00009E28 FECC                <1> 	dec 	ah ; 13/04/2016
  5961                              <1> 
  5962 00009E2A EBDD                <1> 	jmp	short set_env_chk_validation2w
  5963                              <1> 	
  5964                              <1> set_env_chk_validation2z:	
  5965                              <1> 	;mov	edx, Env_Page
  5966                              <1> 	;mov	edi, edx
  5967                              <1> 	; 25/07/2022
  5968 00009E2C BB00300900          <1> 	mov	ebx, Env_Page
  5969 00009E31 89DF                <1> 	mov	edi, ebx
  5970                              <1> 
  5971                              <1> set_env_chk_validation3:
  5972 00009E33 AC                  <1> 	lodsb
  5973 00009E34 3C20                <1> 	cmp	al, 20h
  5974 00009E36 74FB                <1> 	je	short set_env_chk_validation3
  5975                              <1> 
  5976 00009E38 9C                  <1> 	pushf
  5977                              <1> 
  5978                              <1> 	; 12/04/2016
  5979                              <1> set_env_chk_validation3n:
  5980 00009E39 3C61                <1> 	cmp	al, 'a'
  5981 00009E3B 720C                <1> 	jb	short set_env_chk_validation3c
  5982 00009E3D 3C7A                <1> 	cmp	al, 'z'
  5983 00009E3F 7705                <1> 	ja	short set_env_chk_validation3x
  5984 00009E41 2C20                <1> 	sub	al, 'a'-'A'
  5985 00009E43 8846FF              <1> 	mov	[esi-1], al
  5986                              <1> 
  5987                              <1> set_env_chk_validation3x:
  5988 00009E46 AC                  <1> 	lodsb
  5989 00009E47 EBF0                <1> 	jmp	short set_env_chk_validation3n
  5990                              <1> 
  5991                              <1> set_env_chk_validation3c:
  5992 00009E49 3C20                <1> 	cmp	al, 20h
  5993 00009E4B 73F9                <1> 	jnb	short set_env_chk_validation3x
  5994                              <1> 		
  5995 00009E4D 803F00              <1> 	cmp	byte [edi], 0
  5996 00009E50 772B                <1> 	ja	short set_env_chk_validation4
  5997                              <1> 
  5998 00009E52 9D                  <1> 	popf
  5999 00009E53 7222                <1> 	jb	short set_env_string_nothing
  6000                              <1> 
  6001 00009E55 B900020000          <1> 	mov	ecx, Env_Page_Size ; 512 (4096)
  6002                              <1> 
  6003                              <1> 	;mov	esi, ebx ; 12/04/2016
  6004                              <1> 	; 25/07/2022
  6005 00009E5A 89D6                <1> 	mov	esi, edx
  6006                              <1> 
  6007                              <1> 	; 25/07/2022
  6008 00009E5C 89CA                <1> 	mov	edx, ecx
  6009                              <1> 
  6010                              <1> set_env_string_copy_to_envb:
  6011 00009E5E AC                  <1> 	lodsb
  6012 00009E5F 3C20                <1> 	cmp	al, 20h
  6013 00009E61 7207                <1> 	jb	short set_env_string_copy_to_envb_z
  6014 00009E63 AA                  <1> 	stosb
  6015 00009E64 E2F8                <1> 	loop	set_env_string_copy_to_envb
  6016                              <1> 
  6017                              <1> 	; 11/04/2016
  6018                              <1> 	;mov	edi, edx ; Env_Page
  6019                              <1> 	; 25/07/2022
  6020 00009E66 89DF                <1> 	mov	edi, ebx
  6021                              <1> 	; 25/07/2022
  6022                              <1> 	;mov	ecx, Env_Page_Size 
  6023 00009E68 89D1                <1> 	mov	ecx, edx
  6024                              <1> 
  6025                              <1> set_env_string_copy_to_envb_z:
  6026                              <1> 	; 25/07/2022
  6027                              <1> 	;push	edx  ; Start address of the variable
  6028                              <1> 	
  6029                              <1> 	;;mov	edx, Env_Page_Size
  6030                              <1> 	;; 25/07/2022
  6031 00009E6A 29CA                <1> 	sub	edx, ecx ; variable (string) length
  6032                              <1> 
  6033 00009E6C 28C0                <1> 	sub	al, al ; 0
  6034 00009E6E F3AA                <1>  	rep	stosb ; clear remain bytes of the env page
  6035                              <1> 
  6036                              <1> 	;pop	eax  ; Start address of the variable
  6037                              <1> 	; 25/07/2022
  6038 00009E70 89D8                <1> 	mov	eax, ebx
  6039                              <1> 
  6040                              <1> set_env_string_allocate_envb_retn:  ; stc or clc return
  6041 00009E72 5F                  <1> 	pop	edi ; ****
  6042 00009E73 5B                  <1> 	pop	ebx ; ***
  6043 00009E74 59                  <1> 	pop	ecx ; **
  6044 00009E75 5E                  <1> 	pop	esi ; *	
  6045 00009E76 C3                  <1> 	retn
  6046                              <1> 
  6047                              <1> set_env_string_nothing:
  6048 00009E77 31C0                <1> 	xor	eax, eax
  6049 00009E79 31D2                <1> 	xor	edx, edx ; 11/04/2016
  6050 00009E7B EBF5                <1> 	jmp	short set_env_string_allocate_envb_retn
  6051                              <1> 
  6052                              <1> set_env_chk_validation4:
  6053                              <1> 	; 11/04/2016
  6054 00009E7D 9D                  <1> 	popf
  6055                              <1> 
  6056                              <1> 	;mov	esi, edx  ; Env_Page
  6057                              <1> 	; 25/07/2022
  6058 00009E7E 89DE                <1> 	mov	esi, ebx
  6059                              <1> 
  6060                              <1> set_env_chk_validation5:	
  6061                              <1> 	;mov	edi, ebx  ; ASCIIZ environment string address	
  6062                              <1> 	; 25/07/2022
  6063 00009E80 89D7                <1> 	mov	edi, edx
  6064 00009E82 0FB6CC              <1> 	movzx	ecx, ah ; Variable (string) length (with '=')
  6065                              <1> 
  6066                              <1> set_env_chk_validation5_loop:
  6067 00009E85 AC                  <1> 	lodsb
  6068 00009E86 AE                  <1> 	scasb
  6069 00009E87 7508                <1> 	jne	short set_env_chk_validation6
  6070 00009E89 E2FA                <1> 	loop	set_env_chk_validation5_loop
  6071                              <1> 
  6072 00009E8B 3C3D                <1> 	cmp	al, '='
  6073                              <1>         ;je	set_env_change_variable
  6074                              <1> 	; 25/07/2022
  6075 00009E8D 7502                <1> 	jne	short set_env_chk_validation6
  6076 00009E8F EB7E                <1> 	jmp	set_env_change_variable
  6077                              <1> 
  6078                              <1> set_env_chk_validation6:
  6079 00009E91 08C0                <1> 	or	al, al ; 0
  6080 00009E93 7403                <1> 	jz	short set_env_chk_validation7
  6081                              <1> 
  6082 00009E95 AC                  <1> 	lodsb
  6083 00009E96 EBF9                <1> 	jmp	short set_env_chk_validation6
  6084                              <1> 
  6085                              <1> set_env_chk_validation7:
  6086 00009E98 88E1                <1> 	mov	cl, ah
  6087 00009E9A 01F1                <1> 	add	ecx, esi
  6088 00009E9C 81F9FF310900        <1> 	cmp	ecx, Env_Page + Env_Page_Size - 1 
  6089                              <1> 		; 511 (4095) 
  6090                              <1> 		; strlen + '=' + 0
  6091 00009EA2 72DC                <1> 	jb	short set_env_chk_validation5
  6092                              <1> 
  6093                              <1> set_env_chk_validation8: ; variable not found
  6094 00009EA4 0FB6F4              <1> 	movzx	esi, ah  ; variable name length (with '=') 
  6095                              <1> 	;add	esi, ebx ; position just after of the '='
  6096                              <1> 	; 25/07/2022
  6097 00009EA7 01D6                <1> 	add	esi, edx
  6098                              <1> 
  6099                              <1> set_env_chk_validation8_loop:
  6100 00009EA9 AC                  <1> 	lodsb
  6101 00009EAA 3C20                <1> 	cmp	al, 20h
  6102 00009EAC 74FB                <1> 	je	short set_env_chk_validation8_loop	
  6103 00009EAE 72C7                <1> 	jb	short set_env_string_nothing
  6104                              <1> 
  6105                              <1> set_env_chk_validation9:
  6106 00009EB0 AC                  <1> 	lodsb
  6107 00009EB1 3C20                <1> 	cmp	al, 20h
  6108 00009EB3 73FB                <1> 	jnb	short set_env_chk_validation9
  6109                              <1> 
  6110                              <1> 	; End of ASCIIZ environment string
  6111                              <1> 
  6112                              <1> set_env_add_variable:
  6113                              <1> 	;sub	esi, ebx ; variable+definition length
  6114                              <1> 	; 25/07/2022
  6115 00009EB5 29D6                <1> 	sub	esi, edx	
  6116                              <1> 
  6117 00009EB7 56                  <1> 	push	esi ; *****
  6118                              <1> 
  6119                              <1> 	;mov	esi, edx ; Environment page address
  6120                              <1> 	; 25/07/2022
  6121 00009EB8 89DE                <1> 	mov	esi, ebx
  6122                              <1> 
  6123 00009EBA B900020000          <1> 	mov	ecx, Env_Page_Size ; 512 (4096)	
  6124                              <1> 
  6125                              <1> set_env_add_variable_loop:
  6126 00009EBF AC                  <1> 	lodsb
  6127 00009EC0 20C0                <1> 	and	al, al		
  6128 00009EC2 7406                <1> 	jz	short set_env_add_variable_chk1 ; 0
  6129 00009EC4 E2F9                <1> 	loop	set_env_add_variable_loop
  6130                              <1> 
  6131                              <1> 	; 11/04/2016
  6132 00009EC6 884EFF              <1> 	mov	[esi-1], cl ; 0
  6133 00009EC9 41                  <1> 	inc	ecx
  6134                              <1> 	
  6135                              <1> set_env_add_variable_chk1: 
  6136 00009ECA 49                  <1> 	dec	ecx
  6137 00009ECB 7408                <1> 	jz	short set_env_add_variable_nspc
  6138 00009ECD AC                  <1> 	lodsb
  6139 00009ECE 08C0                <1> 	or 	al, al
  6140 00009ED0 740B                <1> 	jz	short set_env_add_variable_chk2 ; 00
  6141 00009ED2 49                  <1> 	dec	ecx
  6142 00009ED3 75EA                <1> 	jnz	short set_env_add_variable_loop
  6143                              <1> 
  6144                              <1> set_env_add_variable_nspc: ; no space on environment page
  6145 00009ED5 58                  <1> 	pop	eax ; *****
  6146                              <1> 	;mov	eax, 8 ; No space for new environment string
  6147                              <1> 	; 25/07/2022
  6148 00009ED6 29C0                <1> 	sub	eax, eax
  6149 00009ED8 B008                <1> 	mov	al, 8
  6150 00009EDA F9                  <1> 	stc
  6151 00009EDB EB95                <1>         jmp     short set_env_string_allocate_envb_retn
  6152                              <1> 
  6153                              <1> set_env_add_variable_chk2:
  6154 00009EDD 8B0C24              <1> 	mov	ecx, [esp] ; *****
  6155 00009EE0 4E                  <1> 	dec	esi ; beginning address of the new variable
  6156 00009EE1 89F0                <1> 	mov	eax, esi
  6157 00009EE3 01C8                <1> 	add	eax, ecx ; string length (with CR)
  6158                              <1> 	;add	edx, Env_Page_Size ; 512 (4096)
  6159                              <1> 	; 25/07/2022
  6160 00009EE5 81C300020000        <1> 	add	ebx, Env_Page_Size
  6161                              <1> 	;cmp	eax, edx 
  6162 00009EEB 39D8                <1> 	cmp	eax, ebx ; 25/07/2022
  6163 00009EED 77E6                <1> 	ja	short set_env_add_variable_nspc
  6164 00009EEF 49                  <1> 	dec	ecx ; except CR at the end
  6165                              <1> 	;mov	edx, ecx ; 12/04/2016
  6166                              <1> 	; 25/07/2022
  6167 00009EF0 89CB                <1> 	mov	ebx, ecx
  6168 00009EF2 89F7                <1> 	mov	edi, esi
  6169 00009EF4 893C24              <1> 	mov	[esp], edi ; ***** ; Start address of new variable
  6170                              <1> 	;mov	esi, ebx ; ASCIIZ environment string address
  6171                              <1> 	; 25/07/2022
  6172 00009EF7 89D6                <1> 	mov	esi, edx
  6173 00009EF9 F3A4                <1> 	rep	movsb
  6174 00009EFB 28C0                <1> 	sub	al, al
  6175 00009EFD AA                  <1> 	stosb
  6176 00009EFE 58                  <1> 	pop	eax ; ***** ; Beginning address of new variable			
  6177 00009EFF 81FF00320900        <1>         cmp     edi, Env_Page + Env_Page_Size ; 12/04/2016
  6178                              <1> 	;jnb	set_env_string_allocate_envb_retn ; OK !
  6179                              <1> 	; 25/07/2022
  6180 00009F05 7303                <1>  	jnb	short set_env_add_variable_chk3
  6181 00009F07 880F                <1> 	mov	[edi], cl ; 0
  6182 00009F09 F8                  <1> 	clc	; 13/04/2016
  6183                              <1> set_env_add_variable_chk3:
  6184 00009F0A E963FFFFFF          <1>         jmp     set_env_string_allocate_envb_retn ; OK !
  6185                              <1> 
  6186                              <1> set_env_change_variable:
  6187                              <1> 	; 06/04/2016
  6188                              <1> 	; esi = Variable's address in environment page (after '=')
  6189                              <1> 	; edi = ASCIIZ environment string address (after '=')
  6190                              <1> 
  6191                              <1> 	; ah = variable length from start to the '='
  6192 00009F0F 8825[B4840100]      <1> 	mov	[env_var_length], ah
  6193                              <1> 
  6194 00009F15 28C9                <1> 	sub	cl, cl ; ecx = 0
  6195                              <1> 
  6196 00009F17 57                  <1> 	push	edi ; *****
  6197                              <1> 
  6198 00009F18 89F7                <1> 	mov	edi, esi ; 11/04/2016
  6199                              <1> 
  6200                              <1> set_env_change_variable_calc1:
  6201 00009F1A AC                  <1> 	lodsb
  6202 00009F1B 08C0                <1> 	or	al, al
  6203 00009F1D 7403                <1> 	jz	short set_env_change_variable_calc2
  6204                              <1> 
  6205 00009F1F 41                  <1> 	inc	ecx ; length of environment string (after the '=')
  6206                              <1> 
  6207 00009F20 EBF8                <1> 	jmp	short set_env_change_variable_calc1	
  6208                              <1> 
  6209                              <1> set_env_change_variable_calc2:
  6210 00009F22 8B3424              <1> 	mov	esi, [esp] ; ASCIIZ environment string address
  6211                              <1> 	
  6212 00009F25 29D2                <1> 	sub	edx, edx
  6213                              <1> 
  6214                              <1> set_env_change_variable_calc3:
  6215 00009F27 AC                  <1> 	lodsb
  6216 00009F28 3C20                <1> 	cmp	al, 20h
  6217 00009F2A 7203                <1> 	jb	short set_env_change_variable_calc4
  6218                              <1> 
  6219 00009F2C 42                  <1> 	inc	edx ; length of ASCIIZ string (after the '=')
  6220                              <1> 	
  6221 00009F2D EBF8                <1> 	jmp	short set_env_change_variable_calc3
  6222                              <1> 	
  6223                              <1> set_env_change_variable_calc4:
  6224 00009F2F C646FF00            <1> 	mov	byte [esi-1], 0  ; put ZERO instead of CR
  6225                              <1> 	
  6226 00009F33 5E                  <1> 	pop	esi ; ***** ; ASCIIZ string address (after '=')
  6227                              <1> 
  6228                              <1> 	; EDI = Old variable's address (after '=')
  6229                              <1> 	
  6230                              <1> 	; compare the new string with the old string
  6231 00009F34 39CA                <1> 	cmp	edx, ecx
  6232 00009F36 7718                <1> 	ja	short set_env_change_variable_calc5 ; longer
  6233                              <1> 	;jb	set_env_change_variable_calc9 ; shorter
  6234                              <1> 	; 25/07/2022
  6235 00009F38 7405                <1> 	je	short set_env_change_variable_calc22
  6236 00009F3A E98C000000          <1> 	jmp	set_env_change_variable_calc9 
  6237                              <1> 
  6238                              <1> set_env_change_variable_calc22:	
  6239                              <1> 	;same length (simple copy)
  6240 00009F3F 0FB6C4              <1> 	movzx	eax, ah
  6241 00009F42 01C2                <1> 	add	edx, eax
  6242 00009F44 F7D8                <1> 	neg	eax
  6243 00009F46 01F8                <1> 	add	eax, edi
  6244                              <1> 	; EAX = Start address of the variable
  6245                              <1> 	; EDX = Variable length (without ZERO at the end of variable)
  6246                              <1> 
  6247 00009F48 F3A4                <1> 	rep	movsb
  6248 00009F4A F8                  <1> 	clc	; 13/04/2016
  6249 00009F4B E922FFFFFF          <1>         jmp     set_env_string_allocate_envb_retn ; OK !
  6250                              <1> 
  6251                              <1> set_env_change_variable_calc5:
  6252                              <1> 	; 11/04/2016
  6253 00009F50 52                  <1> 	push	edx ; *****
  6254 00009F51 29CA                <1> 	sub	edx, ecx ; difference ; (the new string is longer)
  6255 00009F53 89F3                <1> 	mov 	ebx, esi
  6256 00009F55 89FE                <1> 	mov	esi, edi
  6257                              <1> 
  6258                              <1> set_env_change_variable_calc6:
  6259 00009F57 AC                  <1> 	lodsb 
  6260 00009F58 20C0                <1> 	and	al, al
  6261 00009F5A 75FB                <1> 	jnz	short set_env_change_variable_calc6
  6262                              <1> 
  6263 00009F5C 81FE00320900        <1> 	cmp	esi, Env_Page + Env_Page_Size ; 512 (4096)
  6264 00009F62 0F836DFFFFFF        <1>         jnb     set_env_add_variable_nspc
  6265                              <1> 
  6266 00009F68 89F9                <1> 	mov	ecx, edi  ; current (old) variable's address
  6267 00009F6A 89F7                <1> 	mov	edi, esi  ; next variable's address 
  6268                              <1> 
  6269 00009F6C AC                  <1> 	lodsb
  6270 00009F6D 08C0                <1> 	or	al, al
  6271 00009F6F 7417                <1> 	jz	short set_env_change_variable_calc8 ; 00
  6272                              <1> 
  6273                              <1> set_env_change_variable_calc7:
  6274 00009F71 AC                  <1> 	lodsb
  6275 00009F72 20C0                <1> 	and	al, al
  6276 00009F74 75FB                <1> 	jnz	short set_env_change_variable_calc7
  6277                              <1> 
  6278 00009F76 81FE00320900        <1> 	cmp	esi, Env_Page + Env_Page_Size ; 512 (4096)
  6279                              <1> 	;jnb	set_env_add_variable_nspc
  6280                              <1> 	; 25/07/2022
  6281 00009F7C 7205                <1> 	jb	short set_env_change_variable_calc24
  6282                              <1> set_env_change_variable_calc23:
  6283 00009F7E E952FFFFFF          <1> 	jmp	set_env_add_variable_nspc
  6284                              <1> 
  6285                              <1> set_env_change_variable_calc24:
  6286 00009F83 AC                  <1> 	lodsb
  6287 00009F84 08C0                <1> 	or	al, al
  6288 00009F86 75E9                <1> 	jnz	short set_env_change_variable_calc7
  6289                              <1> 
  6290                              <1> set_env_change_variable_calc8:
  6291 00009F88 4E                  <1> 	dec	esi ; address of the second (last) 0 of the 00
  6292                              <1> 
  6293 00009F89 01F2                <1> 	add	edx, esi ; final position of the last 0
  6294                              <1> 
  6295 00009F8B 81FA00320900        <1> 	cmp	edx, Env_Page + Env_Page_Size ; 512 (4096)
  6296                              <1> 	;jnb     set_env_add_variable_nspc
  6297                              <1> 	; 25/07/2022
  6298 00009F91 73EB                <1> 	jnb	short set_env_change_variable_calc23
  6299                              <1> 
  6300 00009F93 89C8                <1> 	mov	eax, ecx ; old variable's address (after '=')
  6301                              <1> 
  6302 00009F95 89F1                <1> 	mov	ecx, esi 
  6303 00009F97 29F9                <1> 	sub	ecx, edi ; count of bytes to move forward
  6304                              <1> 
  6305                              <1> 	; 13/04/2016
  6306 00009F99 C60200              <1> 	mov	byte [edx], 0
  6307 00009F9C 89D7                <1> 	mov	edi, edx
  6308 00009F9E 29F2                <1> 	sub	edx, esi ; difference (additional byte count)
  6309 00009FA0 4F                  <1> 	dec	edi ; the last zero address (first byte of the 00)
  6310 00009FA1 89FE                <1> 	mov	esi, edi
  6311 00009FA3 29D6                <1> 	sub	esi, edx ; - displacement
  6312                              <1> 	
  6313 00009FA5 FA                  <1> 	cli	; disable interrupts
  6314 00009FA6 FD                  <1> 	std	; backward
  6315                              <1> 
  6316 00009FA7 F3A4                <1> 	rep	movsb ; move ECX bytes from DS:ESI to ES:EDI
  6317                              <1> 
  6318 00009FA9 FC                  <1> 	cld	; forward (default)
  6319 00009FAA FB                  <1> 	sti	; enable interrupts
  6320                              <1> 	
  6321 00009FAB 89C7                <1> 	mov	edi, eax
  6322 00009FAD 59                  <1> 	pop	ecx ; ***** ; byte count (after '=')
  6323 00009FAE 89CA                <1> 	mov	edx, ecx
  6324 00009FB0 89DE                <1> 	mov	esi, ebx ; ASCIIZ string address (after '=')
  6325 00009FB2 89FB                <1> 	mov	ebx, edi
  6326                              <1> 
  6327 00009FB4 F3A4                <1> 	rep	movsb
  6328                              <1> 
  6329 00009FB6 880F                <1> 	mov	[edi], cl ; 0 ; end of variable
  6330                              <1> 
  6331 00009FB8 0FB605[B4840100]    <1> 	movzx	eax, byte [env_var_length]
  6332 00009FBF 01C2                <1> 	add	edx, eax ; variable length (total)
  6333 00009FC1 F7D8                <1> 	neg	eax
  6334 00009FC3 01D8                <1> 	add	eax, ebx ; start address of the variable
  6335 00009FC5 F8                  <1> 	clc	; 13/04/2016
  6336 00009FC6 E9A7FEFFFF          <1>         jmp     set_env_string_allocate_envb_retn ; OK !
  6337                              <1> 
  6338                              <1> set_env_change_variable_calc9:
  6339                              <1> 	; 11/04/2016
  6340 00009FCB 21D2                <1> 	and	edx, edx ; is empty ?
  6341 00009FCD 753B                <1> 	jnz	short set_env_change_variable_calc15
  6342                              <1> 	
  6343 00009FCF 0FB6DC              <1> 	movzx	ebx, ah
  6344 00009FD2 F7DB                <1> 	neg	ebx
  6345 00009FD4 01FB                <1> 	add	ebx, edi
  6346                              <1> 
  6347                              <1> 	; EBX = Start address of the variable (in env page)
  6348                              <1> 	; EDX = Variable length = 0
  6349                              <1> 	
  6350 00009FD6 89FE                <1> 	mov	esi, edi
  6351                              <1> 
  6352                              <1> set_env_change_variable_calc10:
  6353 00009FD8 AC                  <1> 	lodsb
  6354 00009FD9 08C0                <1> 	or	al, al
  6355 00009FDB 75FB                <1> 	jnz	short set_env_change_variable_calc10
  6356                              <1> 
  6357 00009FDD B9FF310900          <1> 	mov	ecx, Env_Page + Env_Page_Size - 1
  6358                              <1> 
  6359 00009FE2 39CE                <1> 	cmp	esi, ecx ; +511 (+4095)
  6360 00009FE4 7604                <1> 	jna	short set_env_change_variable_calc11
  6361                              <1> 
  6362 00009FE6 89CE                <1> 	mov	esi, ecx
  6363 00009FE8 8806                <1> 	mov	[esi], al ; 0
  6364                              <1> 
  6365                              <1> set_env_change_variable_calc11:
  6366 00009FEA 89DF                <1> 	mov	edi, ebx ; old variable's start address
  6367                              <1> 
  6368                              <1> set_env_change_variable_calc12:
  6369 00009FEC AC                  <1> 	lodsb
  6370 00009FED AA                  <1> 	stosb
  6371 00009FEE 20C0                <1> 	and	al, al
  6372 00009FF0 75FA                <1> 	jnz	short set_env_change_variable_calc12
  6373 00009FF2 39CE                <1> 	cmp	esi, ecx
  6374 00009FF4 7706                <1> 	ja	short set_env_change_variable_calc13
  6375 00009FF6 AC                  <1> 	lodsb
  6376 00009FF7 AA                  <1> 	stosb
  6377 00009FF8 20C0                <1> 	and	al, al
  6378 00009FFA 75F0                <1> 	jnz	short set_env_change_variable_calc12	
  6379                              <1> 
  6380                              <1> set_env_change_variable_calc13:
  6381 00009FFC 29F9                <1> 	sub	ecx, edi
  6382 00009FFE 7203                <1> 	jb	short set_env_change_variable_calc14
  6383 0000A000 41                  <1> 	inc	ecx ; 1-512 (1-4096)
  6384 0000A001 F3AA                <1> 	rep	stosb ; al = 0	
  6385                              <1> 
  6386                              <1> set_env_change_variable_calc14:
  6387 0000A003 29C0                <1> 	sub	eax, eax ; Start address of the variable
  6388                              <1> 	; EAX = 0 -> Variable is removed
  6389                              <1> 	; EDX = Variable length = 0	
  6390                              <1> 
  6391 0000A005 E968FEFFFF          <1>         jmp     set_env_string_allocate_envb_retn ; OK !
  6392                              <1> 	    
  6393                              <1> set_env_change_variable_calc15:	
  6394 0000A00A 52                  <1> 	push	edx ; *****
  6395 0000A00B F7DA                <1> 	neg	edx
  6396 0000A00D 01CA                <1> 	add	edx, ecx ; difference (the old string is longer)
  6397 0000A00F 89F3                <1> 	mov 	ebx, esi
  6398 0000A011 89FE                <1> 	mov	esi, edi
  6399                              <1> 
  6400                              <1> set_env_change_variable_calc16:
  6401 0000A013 AC                  <1> 	lodsb 
  6402 0000A014 20C0                <1> 	and	al, al
  6403 0000A016 75FB                <1> 	jnz	short set_env_change_variable_calc16
  6404                              <1> 
  6405 0000A018 B900320900          <1> 	mov	ecx, Env_Page + Env_Page_Size
  6406                              <1> 
  6407 0000A01D 39CE                <1> 	cmp	esi, ecx ; +512 (+4096)
  6408 0000A01F 7605                <1> 	jna	short set_env_change_variable_calc17
  6409                              <1> 
  6410 0000A021 89CE                <1> 	mov	esi, ecx
  6411 0000A023 8846FF              <1> 	mov	[esi-1], al ; 0
  6412                              <1> 
  6413                              <1> set_env_change_variable_calc17:
  6414 0000A026 89F9                <1> 	mov	ecx, edi  ; current (old) variable's address
  6415 0000A028 89F7                <1> 	mov	edi, esi  ; next variable's address 
  6416                              <1> 
  6417 0000A02A AC                  <1> 	lodsb
  6418 0000A02B 08C0                <1> 	or	al, al
  6419 0000A02D 741D                <1> 	jz	short set_env_change_variable_calc20
  6420                              <1> 
  6421                              <1> set_env_change_variable_calc18:
  6422 0000A02F AC                  <1> 	lodsb
  6423 0000A030 20C0                <1> 	and	al, al
  6424 0000A032 75FB                <1> 	jnz	short set_env_change_variable_calc18
  6425                              <1> 
  6426 0000A034 81FE00320900        <1> 	cmp	esi, Env_Page + Env_Page_Size
  6427 0000A03A 720B                <1> 	jb	short set_env_change_variable_calc19
  6428 0000A03C 740E                <1> 	je	short set_env_change_variable_calc20
  6429                              <1> 
  6430 0000A03E BEFF310900          <1> 	mov	esi, Env_Page + Env_Page_Size - 1
  6431 0000A043 8806                <1> 	mov	[esi], al ; 0
  6432 0000A045 EB06                <1> 	jmp	short set_env_change_variable_calc21
  6433                              <1> 
  6434                              <1> set_env_change_variable_calc19:
  6435 0000A047 AC                  <1> 	lodsb
  6436 0000A048 08C0                <1> 	or	al, al
  6437 0000A04A 75E3                <1> 	jnz	short set_env_change_variable_calc18
  6438                              <1> 
  6439                              <1> set_env_change_variable_calc20:
  6440 0000A04C 4E                  <1> 	dec	esi ; address of the second (last) 0 of the 00
  6441                              <1> 
  6442                              <1> set_env_change_variable_calc21:
  6443                              <1> 	; edx = difference (byte count)
  6444                              <1> 	
  6445 0000A04D 89C8                <1> 	mov	eax, ecx ; old variable's address (after '=')
  6446                              <1> 
  6447 0000A04F 89F1                <1> 	mov	ecx, esi 
  6448 0000A051 29F9                <1> 	sub	ecx, edi ; count of bytes to move backward
  6449                              <1> 
  6450 0000A053 89FE                <1> 	mov	esi, edi ; next variable's address
  6451 0000A055 29D7                <1> 	sub	edi, edx ; (displacement)
  6452                              <1> 	
  6453 0000A057 F3A4                <1> 	rep	movsb
  6454                              <1> 
  6455 0000A059 880F                <1> 	mov	[edi], cl ; 0 ; 00 ; end of environment variables
  6456                              <1> 
  6457 0000A05B 89C7                <1> 	mov	edi, eax
  6458 0000A05D 5A                  <1> 	pop	edx ; ***** ; byte count (after '=')
  6459 0000A05E 89D1                <1> 	mov	ecx, edx
  6460 0000A060 89DE                <1> 	mov	esi, ebx ; ASCIIZ string address (after '=')
  6461 0000A062 89FB                <1> 	mov	ebx, edi
  6462                              <1> 	
  6463 0000A064 F3A4                <1> 	rep	movsb
  6464                              <1> 
  6465 0000A066 880F                <1> 	mov	[edi], cl ; 0 ; end of variable
  6466                              <1> 
  6467 0000A068 0FB605[B4840100]    <1> 	movzx	eax, byte [env_var_length]
  6468 0000A06F 01C2                <1> 	add	edx, eax ; variable length (total)
  6469 0000A071 F7D8                <1> 	neg	eax
  6470 0000A073 01D8                <1> 	add	eax, ebx ; start address of the variable
  6471 0000A075 F8                  <1> 	clc	; 13/04/2016
  6472 0000A076 E9F7FDFFFF          <1>         jmp     set_env_string_allocate_envb_retn ; OK !
  6473                              <1> 
  6474                              <1> mainprog_startup_configuration:
  6475                              <1> 	; 25/07/2022 - TRDOS 386 Kernel v2.0.5
  6476                              <1> 	; 22/11/2017
  6477                              <1> 	; 06/05/2016
  6478                              <1> 	; 14/04/2016 (TRDOS 386 = TRDOS v2.0)
  6479                              <1> 	; 17/09/2011 (TRDOS v1, MAINPROG.ASM)
  6480                              <1> 	;
  6481                              <1> loc_load_mainprog_cfg_file:
  6482 0000A07B BE[0B310100]        <1> 	mov	esi, MainProgCfgFile
  6483 0000A080 66B80018            <1> 	mov	ax, 1800h ; Except volume label and dirs
  6484 0000A084 E8EFEAFFFF          <1> 	call	find_first_file
  6485 0000A089 7256                <1> 	jc	short loc_load_mainprog_cfg_exit
  6486                              <1> 
  6487                              <1> 	;or	eax, eax
  6488                              <1> 	;jz	short loc_load_mainprog_cfg_exit
  6489                              <1> 
  6490                              <1> loc_start_mainprog_configuration:
  6491                              <1> 	; ESI = FindFile_DirEntry Location
  6492                              <1> 	; EAX = File Size
  6493                              <1> 
  6494 0000A08B A3[38790100]        <1> 	mov	[MainProgCfg_FileSize], eax
  6495                              <1> 
  6496 0000A090 668B5614            <1> 	mov	dx, [esi+DirEntry_FstClusHI]
  6497 0000A094 C1E210              <1> 	shl	edx, 16
  6498 0000A097 668B561A            <1> 	mov	dx, [esi+DirEntry_FstClusLO]
  6499 0000A09B 8915[68840100]      <1> 	mov	[csftdf_sf_cluster], edx
  6500                              <1> 
  6501 0000A0A1 89C1                <1> 	mov	ecx, eax
  6502 0000A0A3 29C0                <1> 	sub	eax, eax
  6503                              <1> 
  6504                              <1> 	; TRDOS 386 (TRDOS v2.0)
  6505                              <1> 	; Allocate contiguous memory block for loading the file
  6506                              <1> 	
  6507                              <1> 	; eax = 0 (Allocate memory from the beginning)
  6508                              <1> 	; ecx = File (Allocation) size in bytes
  6509                              <1> 	
  6510 0000A0A5 E821BCFFFF          <1> 	call	allocate_memory_block
  6511 0000A0AA 7235                <1> 	jc	short loc_load_mainprog_cfg_exit
  6512                              <1> 
  6513 0000A0AC A3[60840100]        <1> 	mov	[csftdf_sf_mem_addr], eax ; loading address
  6514 0000A0B1 890D[64840100]      <1> 	mov	[csftdf_sf_mem_bsize], ecx ; block size
  6515                              <1> 
  6516 0000A0B7 31DB                <1> 	xor	ebx, ebx
  6517                              <1> 	;mov	[csftdf_sf_rbytes], ebx ; 0, reset
  6518                              <1> 
  6519 0000A0B9 8A3D[4A790100]      <1> 	mov	bh, [Current_Drv] ; [FindFile_Drv]
  6520 0000A0BF BE00010900          <1> 	mov	esi, Logical_DOSDisks
  6521 0000A0C4 01DE                <1> 	add	esi, ebx
  6522                              <1> 
  6523 0000A0C6 8B1D[60840100]      <1> 	mov	ebx, [csftdf_sf_mem_addr] ; memory block address
  6524                              <1> 
  6525 0000A0CC 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  6526 0000A0D0 7710                <1>         ja	short loc_mcfg_load_fat_file
  6527                              <1> 
  6528 0000A0D2 C705[70840100]0000- <1> 	mov	dword [csftdf_r_size], 65536
  6528 0000A0DA 0100                <1>
  6529 0000A0DC E99A010000          <1>         jmp     loc_mcfg_load_fs_file
  6530                              <1> 
  6531                              <1> loc_load_mainprog_cfg_exit:
  6532 0000A0E1 C3                  <1> 	retn 
  6533                              <1> 
  6534                              <1> loc_mcfg_load_fat_file:
  6535 0000A0E2 0FB74611            <1> 	movzx	eax, word [esi+LD_BPB+BytesPerSec]
  6536 0000A0E6 0FB64E13            <1> 	movzx	ecx, byte [esi+LD_BPB+SecPerClust]
  6537 0000A0EA F7E1                <1> 	mul	ecx
  6538 0000A0EC A3[70840100]        <1> 	mov	[csftdf_r_size], eax
  6539                              <1> 
  6540                              <1> loc_mcfg_load_fat_file_next:
  6541 0000A0F1 E81D010000          <1> 	call	mcfg_read_fat_file_sectors
  6542 0000A0F6 7259                <1>         jc	short mcfg_deallocate_mem ; 25/07/2022
  6543                              <1> 
  6544 0000A0F8 09D2                <1> 	or	edx, edx ; edx > 0 -> EOF
  6545 0000A0FA 74F5                <1> 	jz	short loc_mcfg_load_fat_file_next
  6546                              <1> 
  6547                              <1> loc_mcfg_load_fat_file_ok:
  6548                              <1> 	; 06/05/2016
  6549 0000A0FC C705[04850100]-     <1> 	mov	dword [mainprog_return_addr], loc_mcfg_ci_return_addr 
  6549 0000A102 [CEA10000]          <1>
  6550                              <1> 	;
  6551 0000A106 8B35[60840100]      <1> 	mov	esi, [csftdf_sf_mem_addr]
  6552 0000A10C 8935[3C790100]      <1> 	mov	[MainProgCfg_LineOffset], esi
  6553                              <1> 	
  6554 0000A112 A1[38790100]        <1> 	mov	eax, [MainProgCfg_FileSize]
  6555 0000A117 89C2                <1> 	mov	edx, eax
  6556 0000A119 01F2                <1> 	add	edx, esi
  6557                              <1> 
  6558                              <1> loc_mcfg_process_next_line_check:
  6559 0000A11B 89C1                <1> 	mov	ecx, eax
  6560                              <1> 
  6561 0000A11D 803E2A              <1> 	cmp	byte [esi], "*" ; Remark sign
  6562 0000A120 7503                <1> 	jne	short loc_mcfg_process_next_line
  6563 0000A122 46                  <1> 	inc	esi
  6564 0000A123 EB16                <1> 	jmp	short loc_move_mainprog_cfg_nl1
  6565                              <1> 
  6566                              <1> loc_mcfg_process_next_line:
  6567 0000A125 83F94F              <1> 	cmp	ecx, 79
  6568 0000A128 7604                <1> 	jna	short loc_start_mainprog_cfg_process
  6569                              <1> 	
  6570                              <1> 	;mov	ecx, 79 
  6571                              <1> 	; 25/07/2022
  6572 0000A12A 29C9                <1> 	sub	ecx, ecx
  6573 0000A12C B14F                <1> 	mov	cl, 79
  6574                              <1> 
  6575                              <1> loc_start_mainprog_cfg_process:
  6576 0000A12E BF[FA790100]        <1> 	mov	edi, CommandBuffer
  6577                              <1> 
  6578                              <1> loc_move_mainprog_cfg_line:
  6579 0000A133 AC                  <1> 	lodsb
  6580 0000A134 3C20                <1> 	cmp	al, 20h
  6581 0000A136 720C                <1> 	jb	short loc_move_mainprog_cfg_nl2
  6582 0000A138 AA                  <1> 	stosb
  6583 0000A139 E2F8                <1> 	loop	loc_move_mainprog_cfg_line
  6584                              <1> 
  6585                              <1> loc_move_mainprog_cfg_nl1:
  6586 0000A13B 39D6                <1> 	cmp	esi, edx ; + configuration file size
  6587 0000A13D 7322                <1> 	jnb	short loc_end_of_mainprog_cfg_line
  6588 0000A13F AC                  <1> 	lodsb
  6589 0000A140 3C20                <1> 	cmp	al, 20h
  6590 0000A142 73F7                <1> 	jnb	short loc_move_mainprog_cfg_nl1
  6591                              <1> 
  6592                              <1> loc_move_mainprog_cfg_nl2:
  6593 0000A144 39D6                <1> 	cmp	esi, edx
  6594 0000A146 7319                <1> 	jnb	short loc_end_of_mainprog_cfg_line
  6595 0000A148 8A06                <1> 	mov	al, [esi]
  6596 0000A14A 3C20                <1> 	cmp	al, 20h
  6597 0000A14C 7713                <1>  	ja	short loc_end_of_mainprog_cfg_line
  6598 0000A14E 46                  <1> 	inc	esi
  6599 0000A14F EBF3                <1> 	jmp	short loc_move_mainprog_cfg_nl2	
  6600                              <1> 
  6601                              <1> 	; 25/07/2022
  6602                              <1> mcfg_deallocate_mem:
  6603 0000A151 A1[60840100]        <1> 	mov	eax, [csftdf_sf_mem_addr] ; start address
  6604 0000A156 8B0D[64840100]      <1> 	mov	ecx, [csftdf_sf_mem_bsize] ; block size	
  6605                              <1> 	;call	deallocate_memory_block
  6606                              <1> 	;retn
  6607 0000A15C E98ABDFFFF          <1> 	jmp	deallocate_memory_block               
  6608                              <1> 
  6609                              <1> loc_end_of_mainprog_cfg_line:
  6610 0000A161 C60700              <1> 	mov	byte [edi], 0
  6611                              <1> 
  6612 0000A164 8935[3C790100]      <1> 	mov	[MainProgCfg_LineOffset], esi
  6613                              <1> 
  6614                              <1> 	; 22/11/2017
  6615 0000A16A BE[027A0100]        <1> 	mov	esi, CommandBuffer + 8
  6616 0000A16F 29FE                <1> 	sub	esi, edi
  6617 0000A171 7606                <1> 	jna	short loc_move_mainprog_cfg_command
  6618 0000A173 30C0                <1> 	xor	al, al
  6619                              <1> loc_mainprog_cfg_clear_chrs:
  6620 0000A175 AA                  <1> 	stosb
  6621 0000A176 4E                  <1> 	dec	esi
  6622 0000A177 75FC                <1> 	jnz	short loc_mainprog_cfg_clear_chrs	
  6623                              <1> 
  6624                              <1> loc_move_mainprog_cfg_command:
  6625 0000A179 BE[FA790100]        <1> 	mov	esi, CommandBuffer
  6626 0000A17E 89F7                <1> 	mov	edi, esi
  6627 0000A180 31DB                <1> 	xor	ebx, ebx
  6628                              <1> 	;xor	ecx, ecx
  6629 0000A182 30C9                <1> 	xor	cl, cl
  6630                              <1> 
  6631                              <1> loc_move_mcfg_first_cmd_char:
  6632 0000A184 8A041E              <1> 	mov	al, [esi+ebx]
  6633 0000A187 FEC3                <1> 	inc	bl 
  6634 0000A189 3C20                <1> 	cmp	al, 20h
  6635 0000A18B 7712                <1> 	ja	short loc_move_mcfg_cmd_capitalizing
  6636 0000A18D 7237                <1> 	jb	short loc_move_mcfg_cmd_arguments_ok
  6637 0000A18F 80FB4F              <1> 	cmp	bl, 79
  6638 0000A192 72F0                <1> 	jb	short loc_move_mcfg_first_cmd_char
  6639 0000A194 EB30                <1> 	jmp	short loc_move_mcfg_cmd_arguments_ok
  6640                              <1> 
  6641                              <1> loc_move_mcfg_next_cmd_char:
  6642 0000A196 8A041E              <1> 	mov	al, [esi+ebx]
  6643 0000A199 FEC3                <1> 	inc	bl
  6644 0000A19B 3C20                <1> 	cmp	al, 20h
  6645 0000A19D 7614                <1> 	jna	short loc_move_mcfg_cmd_ok
  6646                              <1> 
  6647                              <1> loc_move_mcfg_cmd_capitalizing:
  6648 0000A19F 3C61                <1> 	cmp	al, 61h ; 'a'
  6649 0000A1A1 7206                <1> 	jb	short loc_move_mcfg_cmd_caps_ok
  6650 0000A1A3 3C7A                <1> 	cmp	al, 7Ah ; 'z'
  6651 0000A1A5 7702                <1> 	ja	short loc_move_mcfg_cmd_caps_ok
  6652 0000A1A7 24DF                <1> 	and	al, 0DFh ; sub	al, 'a'-'A'
  6653                              <1> 
  6654                              <1> loc_move_mcfg_cmd_caps_ok:
  6655 0000A1A9 AA                  <1> 	stosb 
  6656 0000A1AA FEC1                <1> 	inc	cl
  6657 0000A1AC 80FB4F              <1> 	cmp	bl, 79
  6658 0000A1AF 72E5                <1> 	jb	short loc_move_mcfg_next_cmd_char
  6659 0000A1B1 EB13                <1> 	jmp	short loc_move_mcfg_cmd_arguments_ok
  6660                              <1> 
  6661                              <1> loc_move_mcfg_cmd_ok:
  6662 0000A1B3 30C0                <1> 	xor	al, al ; 0
  6663                              <1> 
  6664                              <1> loc_move_mcfg_cmd_arguments:
  6665 0000A1B5 8807                <1> 	mov	[edi], al
  6666 0000A1B7 47                  <1> 	inc	edi
  6667 0000A1B8 80FB4F              <1> 	cmp	bl, 79
  6668 0000A1BB 7309                <1> 	jnb	short loc_move_mcfg_cmd_arguments_ok
  6669 0000A1BD 8A041E              <1> 	mov	al, [esi+ebx]
  6670 0000A1C0 FEC3                <1> 	inc	bl
  6671 0000A1C2 3C20                <1> 	cmp	al, 20h
  6672 0000A1C4 73EF                <1> 	jnb	short loc_move_mcfg_cmd_arguments
  6673                              <1> 	
  6674                              <1> loc_move_mcfg_cmd_arguments_ok:
  6675 0000A1C6 C60700              <1> 	mov	byte [edi], 0
  6676                              <1>        
  6677                              <1> loc_mcfg_process_cmd_interpreter:
  6678 0000A1C9 E8A9E0FFFF          <1> 	call    command_interpreter
  6679                              <1> 
  6680                              <1> loc_mcfg_ci_return_addr: 
  6681 0000A1CE A1[38790100]        <1> 	mov	eax, [MainProgCfg_FileSize]
  6682 0000A1D3 89C2                <1> 	mov	edx, eax
  6683 0000A1D5 8B35[3C790100]      <1> 	mov	esi, [MainProgCfg_LineOffset]
  6684 0000A1DB 01F2                <1> 	add	edx, esi
  6685 0000A1DD 0305[60840100]      <1> 	add	eax, [csftdf_sf_mem_addr]
  6686 0000A1E3 29F0                <1> 	sub	eax, esi
  6687 0000A1E5 0F8730FFFFFF        <1>         ja      loc_mcfg_process_next_line_check
  6688                              <1> 
  6689 0000A1EB E861FFFFFF          <1> 	call	mcfg_deallocate_mem
  6690                              <1>  
  6691 0000A1F0 B94F000000          <1>  	mov	ecx, 79 ; 80 ?
  6692 0000A1F5 BF[FA790100]        <1> 	mov	edi, CommandBuffer
  6693 0000A1FA 30C0                <1> 	xor	al, al
  6694 0000A1FC F3AA                <1> 	rep	stosb
  6695                              <1> 
  6696                              <1> 	; 06/05/2016
  6697 0000A1FE BE[473B0100]        <1> 	mov	esi, nextline
  6698 0000A203 E842CBFFFF          <1> 	call	print_msg
  6699 0000A208 E9BBD7FFFF          <1> 	jmp	dos_prompt
  6700                              <1> 
  6701                              <1> mcfg_read_file_sectors:
  6702                              <1> 	; 14/04/2016
  6703 0000A20D 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  6704 0000A211 7668                <1>         jna	short mcfg_read_fs_file_sectors
  6705                              <1> 
  6706                              <1> mcfg_read_fat_file_sectors:
  6707                              <1> 	; return:
  6708                              <1> 	;   CF = 0 & EDX > 0 -> END OF FILE
  6709                              <1> 	;   CF = 0 & EDX = 0 -> not EOF
  6710                              <1> 	;   CF = 1 -> read error (error code in AL)	
  6711                              <1> 
  6712                              <1> mcfg_read_fat_file_secs_0:
  6713 0000A213 8B15[38790100]      <1> 	mov	edx, [MainProgCfg_FileSize]
  6714 0000A219 2B15[78840100]      <1> 	sub	edx, [csftdf_sf_rbytes]
  6715 0000A21F 3B15[70840100]      <1> 	cmp	edx, [csftdf_r_size]	
  6716 0000A225 7306                <1> 	jnb	short mcfg_read_fat_file_secs_1
  6717 0000A227 8915[70840100]      <1> 	mov	[csftdf_r_size], edx
  6718                              <1> 		
  6719                              <1> mcfg_read_fat_file_secs_1:
  6720 0000A22D A1[70840100]        <1> 	mov	eax, [csftdf_r_size]
  6721 0000A232 29D2                <1> 	sub	edx, edx
  6722 0000A234 0FB74E11            <1> 	movzx	ecx, word [esi+LD_BPB+BytesPerSec]
  6723 0000A238 01C8                <1> 	add	eax, ecx
  6724 0000A23A 48                  <1> 	dec	eax
  6725 0000A23B F7F1                <1> 	div	ecx
  6726 0000A23D 89C1                <1> 	mov	ecx, eax ; sector count
  6727 0000A23F A1[68840100]        <1> 	mov	eax, [csftdf_sf_cluster]
  6728                              <1> 
  6729                              <1> 	; EBX = memory block address (current)
  6730                              <1> 	
  6731 0000A244 E8A6220000          <1> 	call	read_fat_file_sectors
  6732 0000A249 7230                <1> 	jc	short mcfg_read_fat_file_secs_3
  6733                              <1> 
  6734                              <1> 	; EBX = next memory address
  6735                              <1> 
  6736 0000A24B A1[78840100]        <1> 	mov	eax, [csftdf_sf_rbytes]
  6737 0000A250 0305[70840100]      <1> 	add	eax, [csftdf_r_size]
  6738 0000A256 8B15[38790100]      <1> 	mov	edx, [MainProgCfg_FileSize]
  6739 0000A25C 39D0                <1> 	cmp	eax, edx
  6740 0000A25E 731B                <1> 	jnb	short mcfg_read_fat_file_secs_3 ; edx > 0
  6741 0000A260 A3[78840100]        <1> 	mov	[csftdf_sf_rbytes], eax
  6742                              <1> 
  6743 0000A265 53                  <1> 	push	ebx ; *
  6744                              <1> 	; get next cluster (csftdf_r_size! bytes)
  6745 0000A266 A1[68840100]        <1> 	mov	eax, [csftdf_sf_cluster]
  6746 0000A26B E87F200000          <1> 	call	get_next_cluster
  6747 0000A270 5B                  <1> 	pop	ebx ; *
  6748 0000A271 7301                <1> 	jnc	short mcfg_read_fat_file_secs_2
  6749                              <1> 
  6750                              <1> 	;mov	eax, 17; Read error !
  6751 0000A273 C3                  <1> 	retn
  6752                              <1> 
  6753                              <1> mcfg_read_fat_file_secs_2:
  6754 0000A274 29D2                <1> 	sub	edx, edx ; 0
  6755 0000A276 A3[68840100]        <1> 	mov	[csftdf_sf_cluster], eax ; next cluster
  6756                              <1> 
  6757                              <1> ; 25/07/2022 - TRDOS 386 Kernel v2.0.5
  6758                              <1> 
  6759                              <1> mcfg_read_fat_file_secs_3:
  6760                              <1> 	;retn
  6761                              <1> 
  6762                              <1> mcfg_read_fs_file_sectors:
  6763                              <1> 	;retn
  6764                              <1> 
  6765                              <1> loc_mcfg_load_fs_file:
  6766 0000A27B C3                  <1> 	retn
  6767                              <1> 
  6768                              <1> load_and_execute_file:
  6769                              <1> 	; 30/08/2023 - TRDOS 386 Kernel v2.0.6
  6770                              <1> 	; 25/07/2022 - TRDOS 386 Kernel v2.0.5
  6771                              <1> 	; 04/01/2017
  6772                              <1> 	; 06/05/2016 - 07/05/2016 - 11/05/2016
  6773                              <1> 	; 23/04/2016 - 24/04/2016
  6774                              <1> 	; 22/04/2016 (TRDOS 386 = TRDOS v2.0)
  6775                              <1> 	; 05/11/2011 
  6776                              <1> 	; (TRDOS v1, CMDINTR.ASM, 'cmp_cmd_run', 'cmp_cmd_external')
  6777                              <1> 	; ('loc_run_check_filename')
  6778                              <1> 	; 29/08/2011
  6779                              <1> 	; 10/09/2011
  6780                              <1> 	; INPUT->
  6781                              <1> 	;	ESI = Path Name address (CommandBuffer address)
  6782                              <1> 	; OUTPUT ->
  6783                              <1> 	;	none (error message will be shown if an error will occur)
  6784                              <1> 	;
  6785                              <1> 	; (EAX, EBX, ECX, EDX, ESI, EDI, EBP will be changed) 
  6786                              <1> 	;
  6787                              <1> loc_run_check_filename:
  6788 0000A27C 803E20              <1> 	cmp	byte [esi], 20h
  6789                              <1> 	;jb	loc_cmd_failed
  6790                              <1> 	; 25/07/2022
  6791 0000A27F 7237                <1> 	jb	short loc_run_ppn_failed
  6792 0000A281 7703                <1> 	ja	short loc_run_check_filename_ok
  6793 0000A283 46                  <1> 	inc	esi
  6794 0000A284 EBF6                <1> 	jmp	short loc_run_check_filename
  6795                              <1> 
  6796                              <1> loc_run_check_filename_ok:
  6797 0000A286 C605[AB790100]00    <1> 	mov	byte [CmdArgStart], 0 ; reset
  6798 0000A28D 56                  <1> 	push	esi ; *
  6799                              <1> loc_run_get_first_arg_pos:
  6800 0000A28E 46                  <1> 	inc	esi
  6801 0000A28F 8A06                <1> 	mov	al, [esi]
  6802 0000A291 3C20                <1> 	cmp	al, 20h
  6803 0000A293 77F9                <1> 	ja	short loc_run_get_first_arg_pos
  6804 0000A295 C60600              <1> 	mov	byte [esi], 0
  6805                              <1> loc_run_get_external_arg_pos:
  6806                              <1> 	; 11/05/2016
  6807 0000A298 46                  <1> 	inc	esi
  6808 0000A299 8A06                <1> 	mov	al, [esi]
  6809 0000A29B 3C20                <1> 	cmp	al, 20h
  6810 0000A29D 760C                <1> 	jna	short loc_run_parse_path_name
  6811 0000A29F 89F0                <1> 	mov	eax, esi
  6812 0000A2A1 2D[FA790100]        <1> 	sub	eax, CommandBuffer
  6813 0000A2A6 A2[AB790100]        <1> 	mov	byte [CmdArgStart], al
  6814                              <1> loc_run_parse_path_name:
  6815 0000A2AB 5E                  <1> 	pop	esi ; *
  6816 0000A2AC BF[EA810100]        <1> 	mov	edi, FindFile_Drv
  6817 0000A2B1 E886090000          <1> 	call	parse_path_name
  6818                              <1> 	;jc	loc_cmd_failed
  6819                              <1> 	; 25/07/2022
  6820 0000A2B6 7305                <1> 	jnc	short loc_run_check_filename_exists
  6821                              <1> loc_run_ppn_failed:
  6822 0000A2B8 E995E3FFFF          <1> 	jmp	loc_cmd_failed
  6823                              <1> 
  6824                              <1> loc_run_check_filename_exists:
  6825 0000A2BD BE[2C820100]        <1> 	mov	esi, FindFile_Name
  6826 0000A2C2 803E20              <1> 	cmp	byte [esi], 20h
  6827                              <1> 	;jna	loc_cmd_failed
  6828                              <1> 	; 25/07/2022
  6829 0000A2C5 76F1                <1> 	jna	short loc_run_ppn_failed
  6830                              <1> 
  6831                              <1> loc_run_check_exe_filename_ext:
  6832 0000A2C7 E877020000          <1> 	call	check_prg_filename_ext
  6833                              <1> 	;jc	loc_cmd_failed
  6834                              <1> 	; 25/07/2022
  6835 0000A2CC 72EA                <1> 	jc	short loc_run_ppn_failed
  6836                              <1> 	
  6837                              <1> loc_run_check_exe_filename_ext_ok:
  6838 0000A2CE 66A3[02850100]      <1> 	mov	word [EXE_ID], ax
  6839                              <1> 
  6840                              <1> loc_run_drv:
  6841 0000A2D4 C605[01850100]00    <1> 	mov	byte [Run_Manual_Path], 0
  6842 0000A2DB A1[44790100]        <1> 	mov	eax, [Current_Dir_FCluster]
  6843 0000A2E0 A3[FC840100]        <1>         mov     [Run_CDirFC], eax
  6844                              <1> 	;
  6845 0000A2E5 8A35[4A790100]      <1> 	mov	dh, [Current_Drv]
  6846 0000A2EB 8835[A7800100]      <1> 	mov	[RUN_CDRV], dh
  6847                              <1> 
  6848 0000A2F1 8A15[EA810100]      <1> 	mov	dl, [FindFile_Drv]
  6849 0000A2F7 38F2                <1> 	cmp	dl, dh
  6850 0000A2F9 7413                <1> 	je	short loc_run_change_directory
  6851                              <1>                
  6852 0000A2FB 8005[01850100]02    <1> 	add	byte [Run_Manual_Path], 2
  6853                              <1> 
  6854 0000A302 E884D5FFFF          <1> 	call	change_current_drive
  6855                              <1> 	;jc	loc_run_cmd_failed
  6856                              <1> 	; 25/07/2022
  6857 0000A307 7305                <1> 	jnc	short loc_run_change_directory
  6858 0000A309 E96FE3FFFF          <1> 	jmp	loc_run_cmd_failed
  6859                              <1> 
  6860                              <1> loc_run_change_directory:
  6861 0000A30E 803D[EB810100]20    <1> 	cmp	byte [FindFile_Directory], 20h
  6862 0000A315 7624                <1> 	jna	short loc_run_find_executable_file
  6863                              <1> 
  6864 0000A317 FE05[01850100]      <1> 	inc	byte [Run_Manual_Path]
  6865                              <1>      
  6866 0000A31D FE05[BD300100]      <1> 	inc	byte [Restore_CDIR]
  6867                              <1> 
  6868 0000A323 BE[EB810100]        <1> 	mov	esi, FindFile_Directory
  6869 0000A328 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0 
  6870 0000A32A E821030000          <1> 	call	change_current_directory
  6871                              <1> 	;jc	loc_run_cmd_failed
  6872                              <1> 	; 25/07/2022
  6873 0000A32F 7305                <1> 	jnc	short loc_run_change_prompt_dir_string
  6874 0000A331 E947E3FFFF          <1> 	jmp	loc_run_cmd_failed
  6875                              <1> 
  6876                              <1> loc_run_change_prompt_dir_string:
  6877 0000A336 E83E020000          <1> 	call	change_prompt_dir_string
  6878                              <1> 
  6879                              <1> loc_run_find_executable_file:
  6880 0000A33B 66C705[00850100]00- <1> 	mov	word [Run_Auto_Path], 0
  6880 0000A343 00                  <1>
  6881                              <1> 
  6882                              <1> loc_run_find_executable_file_next:
  6883 0000A344 BE[2C820100]        <1> 	mov	esi, FindFile_Name
  6884                              <1> loc_run_find_program_file_next:
  6885 0000A349 66B80018            <1> 	mov	ax, 1800h ; Except volume label and dirs
  6886 0000A34D E826E8FFFF          <1> 	call	find_first_file
  6887                              <1> 	; ESI = Directory Entry (FindFile_DirEntry) Location
  6888                              <1> 	; EDI = Directory Buffer Directory Entry Location
  6889                              <1> 	; EAX = File size
  6890                              <1> 	;jnc	loc_load_and_run_file
  6891                              <1> 	; 25/07/2022
  6892 0000A352 7205                <1> 	jc	short loc_run_program_file_not_found
  6893 0000A354 E949010000          <1> 	jmp	loc_load_and_run_file
  6894                              <1> 
  6895                              <1> loc_run_program_file_not_found:	 
  6896 0000A359 3C02                <1> 	cmp	al, 2 ; file not found
  6897                              <1> 	;jne	loc_run_cmd_failed
  6898                              <1> 	; 25/07/2022
  6899 0000A35B 7405                <1> 	je	short loc_run_progr_file_chk_prg_ext
  6900 0000A35D E91BE3FFFF          <1> 	jmp	loc_run_cmd_failed
  6901                              <1> 
  6902                              <1> loc_run_progr_file_chk_prg_ext: ; 25/07/2022
  6903 0000A362 66A1[02850100]      <1> 	mov	ax, word [EXE_ID]
  6904 0000A368 80FC2E              <1> 	cmp	ah, '.' ; File name has extension sign
  6905 0000A36B 7424                <1> 	je	short loc_run_check_auto_path
  6906                              <1> 
  6907 0000A36D 08C0                <1> 	or	al, al
  6908 0000A36F 7520                <1> 	jnz	short loc_run_check_auto_path
  6909                              <1> 
  6910 0000A371 80FC08              <1> 	cmp	ah, 8 ; count of file name chars
  6911 0000A374 771B                <1> 	ja	short loc_run_check_auto_path
  6912                              <1> 
  6913                              <1> loc_run_change_file_ext_to_prg:
  6914 0000A376 0FB6DC              <1> 	movzx	ebx, ah ; count of file name chars
  6915 0000A379 BE[2C820100]        <1> 	mov	esi, FindFile_Name
  6916 0000A37E 01F3                <1> 	add	ebx, esi	
  6917                              <1> 	; 07/05/2016
  6918 0000A380 C7032E505247        <1> 	mov	dword [ebx],  '.PRG'
  6919 0000A386 66C705[02850100]50- <1> 	mov	word [EXE_ID], 'P.'
  6919 0000A38E 2E                  <1>
  6920 0000A38F EBB8                <1> 	jmp	short loc_run_find_program_file_next	
  6921                              <1> 
  6922                              <1> loc_run_check_auto_path:
  6923                              <1> 	; NOTE: /// 07/05/2016 ///
  6924                              <1> 	; If the path is given, value of byte [Run_Manual_Path]
  6925                              <1> 	; will not be ZERO. If so, file searching by using
  6926                              <1> 	; Automatic Path (via 'PATH' environment variable)
  6927                              <1> 	; will not be applicable, because the program file 
  6928                              <1> 	; is already/absolutely not found.
  6929                              <1> 
  6930 0000A391 A0[01850100]        <1> 	mov	al, [Run_Manual_Path]
  6931 0000A396 08C0                <1> 	or	al, al
  6932                              <1> 	;jnz	loc_cmd_failed
  6933                              <1> 	; 25/07/2022
  6934 0000A398 7524                <1> 	jnz	short loc_run_cap_failed
  6935                              <1> 
  6936                              <1> loc_run_check_auto_path_again:
  6937 0000A39A 66833D[00850100]FF  <1> 	cmp	word [Run_Auto_Path], 0FFFFh		 
  6938                              <1> 		; 0FFFFh = Not a valid run path (in ENV block) 
  6939                              <1> 	;jnb	loc_cmd_failed
  6940                              <1> 	; 25/07/2022
  6941 0000A3A2 731A                <1> 	jnb	short loc_run_cap_failed
  6942                              <1> 	;xor	al, al 
  6943 0000A3A4 BE[91310100]        <1> 	mov	esi, Cmd_Path ; 'PATH'
  6944 0000A3A9 BF[4A7A0100]        <1> 	mov	edi, TextBuffer
  6945 0000A3AE E86DF9FFFF          <1> 	call	get_environment_string
  6946 0000A3B3 7310                <1> 	jnc	short loc_run_chk_filename_ext_again
  6947 0000A3B5 66C705[00850100]FF- <1> 	mov	word [Run_Auto_Path], 0FFFFh ; invalid
  6947 0000A3BD FF                  <1>
  6948                              <1> loc_run_cap_failed: ; 25/07/2022	
  6949                              <1> 	;jmp	loc_cmd_failed
  6950                              <1> 	; 30/08/2023
  6951 0000A3BE B001                <1> 	mov	al, 1 ; (force jump to loc_cmd_failed at the end)
  6952 0000A3C0 E9B8E2FFFF          <1> 	jmp	loc_run_cmd_failed ; (restore cdir if it is needed)
  6953                              <1> 
  6954                              <1> loc_run_chk_filename_ext_again:
  6955 0000A3C5 89C1                <1> 	mov	ecx, eax ; string length (with zero tail)
  6956 0000A3C7 49                  <1> 	dec	ecx ; without zero tail
  6957 0000A3C8 66A1[02850100]      <1> 	mov	ax, [EXE_ID]
  6958 0000A3CE 80FC2E              <1> 	cmp	ah, '.'
  6959 0000A3D1 740E                <1> 	je	short loc_run_chk_auto_path_pos
  6960                              <1> 	 
  6961                              <1> loc_run_change_file_ext_to_noext_again:
  6962 0000A3D3 0FB6DC              <1> 	movzx	ebx, ah
  6963 0000A3D6 BE[2C820100]        <1> 	mov	esi, FindFile_Name
  6964 0000A3DB 01F3                <1> 	add 	ebx, esi
  6965 0000A3DD 29C0                <1> 	sub	eax, eax
  6966 0000A3DF 8903                <1> 	mov	[ebx], eax ; 0 ; erase extension (.PRG)
  6967                              <1> 
  6968                              <1> loc_run_chk_auto_path_pos:
  6969                              <1> 	;movzx	eax,  word [Run_Auto_Path]
  6970 0000A3E1 66A1[00850100]      <1> 	mov	ax, [Run_Auto_Path]
  6971 0000A3E7 39C8                <1> 	cmp	eax, ecx ; ecx = string length (except zero tail)
  6972                              <1> 	;jnb	loc_cmd_failed
  6973                              <1>  	; 25/07/2022
  6974 0000A3E9 73D3                <1> 	jnb	short loc_run_cap_failed
  6975                              <1> 
  6976                              <1> 	;or	eax, eax
  6977 0000A3EB 6609C0              <1> 	or	ax, ax
  6978 0000A3EE 7502                <1> 	jnz	short loc_run_auto_path_pos_move
  6979 0000A3F0 B005                <1> 	mov	al, 5
  6980                              <1> 
  6981                              <1> loc_run_auto_path_pos_move:
  6982 0000A3F2 89FE                <1> 	mov	esi, edi ; offset TextBuffer
  6983 0000A3F4 01C6                <1> 	add	esi, eax
  6984                              <1> 
  6985                              <1> loc_run_auto_path_pos_space_loop:
  6986 0000A3F6 AC                  <1> 	lodsb
  6987 0000A3F7 3C20                <1> 	cmp	al, 20h 
  6988 0000A3F9 74FB                <1> 	je	short loc_run_auto_path_pos_space_loop
  6989                              <1> 	;jb	loc_cmd_failed
  6990                              <1>  	; 25/07/2022
  6991 0000A3FB 72C1                <1> 	jb	short loc_run_cap_failed
  6992                              <1> 	;
  6993 0000A3FD AA                  <1> 	stosb
  6994                              <1> loc_run_auto_path_pos_move_next: 
  6995 0000A3FE AC                  <1> 	lodsb
  6996 0000A3FF 3C3B                <1> 	cmp	al, ';'
  6997 0000A401 7414                <1> 	je	short loc_run_auto_path_pos_move_last_byte
  6998 0000A403 3C20                <1> 	cmp	al, 20h
  6999 0000A405 74F7                <1> 	je	short loc_run_auto_path_pos_move_next
  7000 0000A407 7203                <1> 	jb	short loc_byte_ptr_end_of_path
  7001 0000A409 AA                  <1> 	stosb
  7002 0000A40A EBF2                <1> 	jmp	short loc_run_auto_path_pos_move_next 
  7003                              <1> 
  7004                              <1> loc_byte_ptr_end_of_path: 
  7005 0000A40C 66C705[00850100]FF- <1> 	mov	word [Run_Auto_Path], 0FFFFh ; end of path
  7005 0000A414 FF                  <1>
  7006 0000A415 EB0D                <1> 	jmp	short loc_run_auto_path_move_ok 
  7007                              <1> 
  7008                              <1> loc_run_auto_path_pos_move_last_byte:
  7009 0000A417 89F0                <1> 	mov	eax, esi
  7010 0000A419 2D[4A7A0100]        <1> 	sub	eax, TextBuffer 
  7011 0000A41E 66A3[00850100]      <1> 	mov	[Run_Auto_Path], ax ; next path position
  7012                              <1> 
  7013                              <1> loc_run_auto_path_move_ok:
  7014 0000A424 4F                  <1> 	dec	edi
  7015 0000A425 B02F                <1> 	mov	al, '/'
  7016 0000A427 3807                <1> 	cmp	[edi], al
  7017 0000A429 7403                <1> 	je	short loc_run_auto_path_move_file_name
  7018 0000A42B 47                  <1> 	inc	edi
  7019 0000A42C 8807                <1> 	mov	[edi], al
  7020                              <1> 
  7021                              <1> loc_run_auto_path_move_file_name:
  7022 0000A42E 47                  <1> 	inc	edi   
  7023 0000A42F BE[2C820100]        <1> 	mov	esi, FindFile_Name
  7024                              <1> 
  7025                              <1> loc_run_auto_path_move_fn_loop:
  7026 0000A434 AC                  <1> 	lodsb
  7027 0000A435 AA                  <1> 	stosb
  7028 0000A436 08C0                <1> 	or	al, al
  7029 0000A438 75FA                <1> 	jnz	short loc_run_auto_path_move_fn_loop
  7030                              <1> 
  7031 0000A43A BE[4A7A0100]        <1> 	mov	esi, TextBuffer
  7032 0000A43F BF[EA810100]        <1> 	mov	edi, FindFile_Drv
  7033 0000A444 E8F3070000          <1> 	call	parse_path_name
  7034                              <1> 	;jc	loc_run_cmd_failed
  7035                              <1> 	; 25/07/2022
  7036                              <1> 	;jnc	short loc_run_change_current_drive
  7037                              <1> 	;jmp	loc_run_cmd_failed
  7038 0000A449 7234                <1> 	jc	short loc_run_path_failed
  7039                              <1> 
  7040                              <1> loc_run_change_current_drive: 
  7041 0000A44B 8A35[4A790100]      <1> 	mov	dh, [Current_Drv]
  7042 0000A451 8A15[EA810100]      <1> 	mov	dl, [FindFile_Drv]
  7043 0000A457 38F2                <1> 	cmp	dl, dh
  7044 0000A459 7407                <1> 	je	short loc_run_change_directory_again
  7045                              <1>              
  7046 0000A45B E82BD4FFFF          <1> 	call	change_current_drive
  7047                              <1> 	;jc	loc_run_cmd_failed
  7048                              <1> 	; 25/07/2022
  7049                              <1> 	;jnc	short loc_run_change_directory_again
  7050                              <1> 	;jmp	loc_run_cmd_failed
  7051 0000A460 721D                <1> 	jc	short loc_run_path_failed
  7052                              <1> 
  7053                              <1> loc_run_change_directory_again:
  7054 0000A462 803D[EB810100]20    <1> 	cmp	byte [FindFile_Directory], 20h
  7055 0000A469 761E                <1> 	jna	short loc_load_executable_cdir_chk_again
  7056                              <1> 
  7057 0000A46B FE05[BD300100]      <1> 	inc	byte [Restore_CDIR]
  7058 0000A471 BE[EB810100]        <1> 	mov	esi, FindFile_Directory
  7059 0000A476 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0 
  7060 0000A478 E8D3010000          <1> 	call	change_current_directory
  7061                              <1> 	;jc	loc_run_cmd_failed
  7062                              <1> 	; 25/07/2022
  7063 0000A47D 7305                <1> 	jnc	short loc_run_chg_prompt_dir_str_again
  7064                              <1> loc_run_path_failed: ; 25/07/2022
  7065 0000A47F E9F9E1FFFF          <1> 	jmp	loc_run_cmd_failed
  7066                              <1> 
  7067                              <1> loc_run_chg_prompt_dir_str_again:
  7068 0000A484 E8F0000000          <1> 	call	change_prompt_dir_string
  7069                              <1> 
  7070                              <1> loc_load_executable_cdir_chk_again:
  7071 0000A489 A1[44790100]        <1> 	mov	eax, [Current_Dir_FCluster]
  7072 0000A48E 3B05[FC840100]      <1> 	cmp	eax, [Run_CDirFC]
  7073                              <1> 	;jne	loc_run_find_executable_file_next
  7074                              <1> 	; 30/08/2023
  7075 0000A494 7405                <1> 	je	short jmp_loc_run_check_auto_path_again
  7076 0000A496 E9A9FEFFFF          <1> 	jmp	loc_run_find_executable_file_next		
  7077                              <1> jmp_loc_run_check_auto_path_again:
  7078 0000A49B 30C0                <1> 	xor	al, al ; 0
  7079 0000A49D E9F8FEFFFF          <1> 	jmp	loc_run_check_auto_path_again
  7080                              <1> 
  7081                              <1> loc_load_and_run_file:
  7082                              <1> 	; 25/07/2022 - TRDOS 386 Kernel v2.0.5
  7083                              <1> 	; 13/11/2017
  7084                              <1> 	; 04/01/2017
  7085                              <1> 	; 23/04/2016
  7086 0000A4A2 BE[2C820100]        <1> 	mov	esi, FindFile_Name
  7087 0000A4A7 BF[4A7A0100]        <1> 	mov	edi, TextBuffer
  7088                              <1> 
  7089                              <1>  	; 24/04/2016
  7090 0000A4AC 31D2                <1> 	xor	edx, edx
  7091                              <1> 	;mov	word [argc], dx ; 0
  7092                              <1> 	; 25/07/2022
  7093 0000A4AE 8915[18910100]      <1> 	mov	dword [argc], edx
  7094 0000A4B4 8915[4C900100]      <1> 	mov	dword [u.nread], edx ; 0
  7095                              <1> 
  7096                              <1> loc_load_and_run_file_1:
  7097 0000A4BA AC                  <1> 	lodsb	
  7098 0000A4BB AA                  <1> 	stosb
  7099 0000A4BC FF05[4C900100]      <1> 	inc	dword [u.nread]
  7100 0000A4C2 20C0                <1> 	and	al, al
  7101 0000A4C4 75F4                <1> 	jnz 	short loc_load_and_run_file_1
  7102                              <1> 	
  7103 0000A4C6 A0[AB790100]        <1> 	mov	al, [CmdArgStart]
  7104 0000A4CB 20C0                <1> 	and	al, al
  7105 0000A4CD 7442                <1> 	jz	short loc_load_and_run_file_7
  7106                              <1> 
  7107 0000A4CF 0FB6F0              <1> 	movzx	esi, al ; 11/05/2016
  7108                              <1> 	;mov	ecx, 80
  7109                              <1> 	; 25/07/2022
  7110 0000A4D2 31C9                <1> 	xor	ecx, ecx
  7111 0000A4D4 B150                <1> 	mov	cl, 80
  7112                              <1> 	;sub	ecx, esi
  7113 0000A4D6 28C1                <1> 	sub	cl, al
  7114 0000A4D8 81C6[FA790100]      <1> 	add	esi, CommandBuffer
  7115                              <1> 
  7116                              <1> 	;inc	word [argc] ; 11/05/2016
  7117                              <1> 	; 25/07/2022
  7118 0000A4DE FF05[18910100]      <1> 	inc	dword [argc]
  7119                              <1> 
  7120                              <1> loc_load_and_run_file_2:
  7121 0000A4E4 AC                  <1> 	lodsb
  7122 0000A4E5 3C20                <1> 	cmp	al, 20h
  7123 0000A4E7 7716                <1> 	ja	short loc_load_and_run_file_5	
  7124 0000A4E9 721D                <1> 	jb	short loc_load_and_run_file_6
  7125                              <1> 
  7126                              <1> loc_load_and_run_file_3:
  7127 0000A4EB 803E20              <1> 	cmp	byte [esi], 20h
  7128 0000A4EE 7707                <1> 	ja	short loc_load_and_run_file_4
  7129 0000A4F0 7216                <1> 	jb	short loc_load_and_run_file_6
  7130 0000A4F2 46                  <1> 	inc	esi
  7131 0000A4F3 E2F6                <1> 	loop	loc_load_and_run_file_3
  7132 0000A4F5 EB11                <1> 	jmp	short loc_load_and_run_file_6
  7133                              <1> 
  7134                              <1> loc_load_and_run_file_4:
  7135 0000A4F7 28C0                <1> 	sub	al, al ; 0
  7136                              <1> 	;inc	word [argc]
  7137                              <1> 	; 25/07/2022
  7138 0000A4F9 FF05[18910100]      <1> 	inc	dword [argc]
  7139                              <1> loc_load_and_run_file_5:
  7140 0000A4FF AA                  <1> 	stosb
  7141 0000A500 FF05[4C900100]      <1> 	inc	dword [u.nread]
  7142 0000A506 E2DC                <1> 	loop	loc_load_and_run_file_2
  7143                              <1> 			
  7144                              <1> loc_load_and_run_file_6:
  7145 0000A508 30C0                <1> 	xor	al, al ; 0
  7146 0000A50A AA                  <1> 	stosb
  7147 0000A50B FF05[4C900100]      <1> 	inc	dword [u.nread]
  7148                              <1> loc_load_and_run_file_7:
  7149 0000A511 8807                <1> 	mov 	[edi], al ; 0
  7150                              <1> 	;inc	word [argc] ; 24/04/2016
  7151                              <1> 	; 25/07/2022
  7152 0000A513 FF05[18910100]      <1> 	inc	dword [argc]
  7153 0000A519 FF05[4C900100]      <1> 	inc	dword [u.nread] ; 24/04/2016
  7154 0000A51F BE[4A7A0100]        <1> 	mov	esi, TextBuffer
  7155 0000A524 8B15[58820100]      <1> 	mov	edx, [FindFile_DirEntry+DirEntry_FileSize]
  7156 0000A52A 66A1[50820100]      <1> 	mov	ax, [FindFile_DirEntry+DirEntry_FstClusHI]
  7157 0000A530 C1E010              <1> 	shl	eax, 16 ; 13/11/2017
  7158 0000A533 66A1[56820100]      <1> 	mov	ax, [FindFile_DirEntry+DirEntry_FstClusLO]
  7159                              <1> 	; EAX = First Cluster number
  7160                              <1> 	; EDX = File Size
  7161                              <1> 	; ESI = Argument list address
  7162                              <1> 	; [argc] = argument count
  7163                              <1> 	; [u.nread] = argument list length
  7164 0000A539 E8C5630000          <1> 	call	load_and_run_file ; trdosk6.s
  7165                              <1>         ;jc	loc_run_cmd_failed ; 04/01/2017
  7166                              <1> loc_load_and_run_file_8: ; 06/05/2016
  7167 0000A53E E949EAFFFF          <1> 	jmp	loc_file_rw_restore_retn
  7168                              <1> 
  7169                              <1> check_prg_filename_ext:
  7170                              <1> 	; 23/04/2016 (TRDOS 386 = TRDOS v2.0)
  7171                              <1> 	; 10/09/2011 
  7172                              <1> 	; (TRDOS v1, CMDINTR.ASM, 'proc_check_exe_filename_ext')
  7173                              <1> 	; 14/11/2009
  7174                              <1> 	; INPUT -> 
  7175                              <1> 	;	ESI = Dot File Name
  7176                              <1> 	; OUTPUT ->
  7177                              <1> 	;     cf = 0 -> EXE_ID in AL
  7178                              <1> 	;	ESI = Last char + 1 position
  7179                              <1> 	;     cf = 1 -> Invalid executable file name
  7180                              <1> 	;	or no file name extension if AH<=8
  7181                              <1> 	;	AL = Last file name char     
  7182                              <1> 	;     cf = 0 -> AL='P' (PRG), AL=0 (no extension)
  7183                              <1> 	;
  7184                              <1> 	; (Modified registers: EAX, ESI)
  7185                              <1>   
  7186 0000A543 30E4                <1> 	xor	ah, ah
  7187                              <1> loc_run_check_filename_ext:	
  7188 0000A545 AC                  <1> 	lodsb
  7189 0000A546 3C21                <1> 	cmp	al, 21h
  7190 0000A548 7229                <1> 	jb	short loc_check_exe_fn_retn 
  7191 0000A54A FEC4                <1> 	inc	ah
  7192 0000A54C 3C2E                <1> 	cmp	al, '.'
  7193 0000A54E 75F5                <1> 	jne	short loc_run_check_filename_ext	
  7194                              <1> 		 
  7195                              <1> loc_run_check_filename_ext_dot:
  7196 0000A550 80FC02              <1> 	cmp	ah, 2  ; .??? is not valid
  7197 0000A553 88C4                <1> 	mov	ah, al ; '.' 
  7198 0000A555 7219                <1> 	jb	short loc_check_prg_fn_retn
  7199                              <1> 
  7200                              <1> loc_run_check_filename_ext_dot_ok:
  7201 0000A557 AC                  <1> 	lodsb
  7202 0000A558 24DF                <1> 	and	al, 0DFh 
  7203                              <1> 
  7204                              <1> loc_run_check_filename_ext_prg:
  7205 0000A55A 3C50                <1> 	cmp	al, 'P'
  7206 0000A55C 7212                <1> 	jb	short loc_check_prg_fn_retn
  7207 0000A55E 7711                <1> 	ja	short loc_check_prg_fn_stc
  7208 0000A560 AC                  <1> 	lodsb
  7209 0000A561 24DF                <1> 	and	al, 0DFh 
  7210 0000A563 3C52                <1> 	cmp	al, 'R'
  7211 0000A565 750A                <1> 	jne	short loc_check_prg_fn_stc
  7212 0000A567 AC                  <1> 	lodsb
  7213 0000A568 24DF                <1> 	and	al, 0DFh
  7214 0000A56A 3C47                <1> 	cmp	al, 'G'
  7215 0000A56C 7503                <1> 	jne	short loc_check_prg_fn_stc
  7216                              <1> 
  7217 0000A56E B050                <1> 	mov	al, 'P'
  7218                              <1> loc_check_prg_fn_retn:
  7219 0000A570 C3                  <1> 	retn
  7220                              <1> 
  7221                              <1> ; 25/07/2022 - TRDOS 386 Kernel v2.0.5
  7222                              <1> 
  7223                              <1> loc_check_prg_fn_stc:
  7224 0000A571 F9                  <1> 	stc
  7225 0000A572 C3                  <1> 	retn
  7226                              <1>  
  7227                              <1> loc_check_exe_fn_retn:
  7228 0000A573 28C0                <1> 	sub	al, al ; 0
  7229                              <1> 	;retn
  7230                              <1>               
  7231                              <1> find_and_list_files:
  7232                              <1> 	;retn
  7233                              <1> set_exec_arguments:
  7234 0000A575 C3                  <1> 	retn
  7235                              <1> 
  7236                              <1> delete_fs_directory:
  7237 0000A576 31C0                <1> 	xor	eax, eax
  7238 0000A578 C3                  <1> 	retn
  3428                                  %include 'trdosk4.s' ; 24/01/2016
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.6) - Directory Functions : trdosk4.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 29/08/2023  (Previous: 11/08/2022)
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 24/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.15 (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 0000A579 BE[A8800100]        <1> 	mov	esi, PATH_Array
    28                              <1> change_prompt_dir_str: ; 05/10/2016 (call from 'set_working_path')
    29 0000A57E BF[4E790100]        <1> 	mov	edi, Current_Directory
    30 0000A583 8A25[48790100]      <1> 	mov	ah, [Current_Dir_Level]
    31 0000A589 E807000000          <1> 	call	set_current_directory_string
    32 0000A58E 880D[A9790100]      <1> 	mov	[Current_Dir_StrLen], cl
    33                              <1> 
    34 0000A594 C3                  <1> 	retn
    35                              <1> 
    36                              <1> set_current_directory_string:
    37                              <1> 	; 11/08/2022 (TRDOS 386 Kernel v2.0.5)
    38                              <1> 	; 24/01/2016 (TRDOS 386 = TRDOS v2.0)
    39                              <1> 	; 27/03/2011
    40                              <1> 	; 09/10/2009
    41                              <1> 	; INPUT:
    42                              <1> 	;    ESI = Path Array Address 
    43                              <1> 	;    EDI = Current Directory String Buffer
    44                              <1> 	;    AH = Current Directory Level
    45                              <1> 	; OUTPUT => EAX, EBX, ESI will be changed
    46                              <1> 	;    EDI will be same with input
    47                              <1> 	;    ECX = Current Directory String Length 
    48                              <1> 
    49 0000A595 57                  <1> 	push    edi
    50 0000A596 80FC00              <1> 	cmp     ah, 0
    51 0000A599 7651                <1> 	jna	short pass_write_path
    52 0000A59B 83C610              <1> 	add	esi, 16
    53 0000A59E 89F3                <1> 	mov	ebx, esi
    54                              <1> loc_write_path:
    55                              <1> 	;mov	ecx, 8
    56                              <1> 	; 11/08/2022
    57 0000A5A0 29C9                <1> 	sub	ecx, ecx
    58 0000A5A2 B108                <1> 	mov	cl, 8
    59                              <1> path_write_dirname1:
    60 0000A5A4 AC                  <1> 	lodsb
    61 0000A5A5 3C20                <1> 	cmp	al, 20h
    62 0000A5A7 7612                <1> 	jna	short pass_write_dirname1
    63 0000A5A9 AA                  <1> 	stosb
    64 0000A5AA 81FF[A8790100]      <1> 	cmp	edi, End_Of_Current_Dir_Str
    65 0000A5B0 733A                <1> 	jnb	short pass_write_path
    66 0000A5B2 E2F0                <1> 	loop	path_write_dirname1
    67 0000A5B4 803E20              <1> 	cmp	byte [esi], 20h
    68 0000A5B7 7624                <1> 	jna	short pass_write_dirname2
    69 0000A5B9 EB0A                <1> 	jmp     short loc_put_dot_cont_ext
    70                              <1> pass_write_dirname1:
    71 0000A5BB 89DE                <1> 	mov	esi, ebx
    72 0000A5BD 83C608              <1> 	add	esi, 8
    73 0000A5C0 803E20              <1> 	cmp	byte [esi], 20h
    74 0000A5C3 7618                <1> 	jna	short pass_write_dirname2
    75                              <1> loc_put_dot_cont_ext:
    76 0000A5C5 C6072E              <1> 	mov	byte [edi], "."
    77                              <1> 	;mov	ecx, 3
    78 0000A5C8 B103                <1> 	mov	cl, 3
    79                              <1> loc_check_dir_name_ext:
    80 0000A5CA AC                  <1> 	lodsb
    81 0000A5CB 47                  <1> 	inc	edi
    82 0000A5CC 3C20                <1> 	cmp	al, 20h
    83 0000A5CE 760D                <1> 	jna	short pass_write_dirname2
    84 0000A5D0 8807                <1> 	mov	[edi], al
    85 0000A5D2 81FF[A8790100]      <1> 	cmp	edi, End_Of_Current_Dir_Str
    86 0000A5D8 7312                <1> 	jnb	short pass_write_path
    87 0000A5DA E2EE                <1> 	loop    loc_check_dir_name_ext
    88 0000A5DC 47                  <1> 	inc	edi
    89                              <1> pass_write_dirname2:
    90 0000A5DD FECC                <1> 	dec	ah
    91 0000A5DF 740B                <1> 	jz      short pass_write_path
    92 0000A5E1 83C310              <1> 	add	ebx, 16
    93 0000A5E4 89DE                <1> 	mov	esi, ebx
    94 0000A5E6 C6072F              <1> 	mov	byte [edi],"/"
    95 0000A5E9 47                  <1> 	inc	edi
    96 0000A5EA EBB4                <1> 	jmp	short loc_write_path
    97                              <1> pass_write_path:
    98 0000A5EC C60700              <1> 	mov	byte [edi], 0
    99 0000A5EF 47                  <1> 	inc	edi
   100 0000A5F0 89F9                <1> 	mov	ecx, edi
   101 0000A5F2 5F                  <1> 	pop	edi
   102 0000A5F3 29F9                <1> 	sub	ecx, edi
   103                              <1> 	; ECX = Current Directory String Length
   104 0000A5F5 C3                  <1> 	retn
   105                              <1> 
   106                              <1> get_current_directory:
   107                              <1> 	; 29/08/2023 (TRDOS 386 Kernel v2.0.6)
   108                              <1> 	; 11/08/2022
   109                              <1> 	; 28/07/2022 (TRDOS 386 Kernel v2.0.5)
   110                              <1> 	; 15/10/2016
   111                              <1> 	; 14/02/2016
   112                              <1> 	; 24/01/2016 (TRDOS 386 = TRDOS v2.0)
   113                              <1> 	; 27/03/2011
   114                              <1> 	;
   115                              <1> 	; INPUT-> ESI = Current Directory Buffer
   116                              <1> 	;         DL = TRDOS Logical Dos Drive Number + 1
   117                              <1> 	;              (0 = Default/Current Drive)
   118                              <1> 	;           
   119                              <1> 	;   Note: Required dir buffer length may be <= 92 bytes
   120                              <1> 	;         for TRDOS (7*12 name chars + 7 slash + 0)
   121                              <1> 	; OUTPUT ->  ESI = Current Directory Buffer
   122                              <1> 	;            EAX, EBX, ECX, EDX, EDI will be changed
   123                              <1> 	;            CX/CL = Current Directory String Length
   124                              <1> 	;	     DL = Drive Number (0 based)
   125                              <1> 	;            (If input is 0, output is current drv number) 
   126                              <1> 	;            DH = same with input 
   127                              <1> 	;   cf = 0 -> AL = 0
   128                              <1> 	;   cf = 1 -> error code in AL 
   129                              <1>               
   130                              <1> loc_get_current_drive_0:
   131                              <1> 	; 29/08/2023
   132 0000A5F6 29C0                <1> 	sub	eax, eax ; 0
   133                              <1> 	;cmp	dl, 0
   134 0000A5F8 38C2                <1> 	cmp	dl, al
   135 0000A5FA 7724                <1> 	ja	short loc_get_current_drive_1
   136 0000A5FC 8A15[4A790100]      <1> 	mov	dl, [Current_Drv]
   137                              <1> 	; 29/08/2023
   138                              <1> 	;jmp	short loc_get_current_drive_2
   139                              <1>  
   140                              <1> loc_get_current_drive_2:
   141                              <1> 	; 29/08/2023
   142                              <1> 	;xor	eax, eax
   143                              <1> 	; eax = 0
   144 0000A602 88D4                <1> 	mov	ah, dl
   145 0000A604 56                  <1> 	push	esi ; (*)
   146 0000A605 BE00010900          <1> 	mov	esi, Logical_DOSDisks
   147 0000A60A 01C6                <1> 	add	esi, eax
   148 0000A60C 8A06                <1> 	mov	al, [esi+LD_Name] 
   149 0000A60E 3C41                <1> 	cmp	al, 'A'
   150 0000A610 721C                <1> 	jb	short loc_get_current_drive_not_ready_retn
   151                              <1> 
   152                              <1> 	; 28/07/2022
   153 0000A612 31C9                <1> 	xor	ecx, ecx
   154                              <1> 
   155 0000A614 8A667F              <1> 	mov	ah, [esi+LD_CDirLevel]
   156 0000A617 08E4                <1> 	or	ah, ah
   157 0000A619 7519                <1> 	jnz	short loc_get_current_drive_3
   158                              <1> 
   159                              <1> 	;xor	ah, ah ; mov ah, 0
   160                              <1> 	
   161                              <1> 	; 11/08/2022 - BugFix (*)
   162 0000A61B 5E                  <1> 	pop	esi ; (*) Current Directory Buffer address
   163                              <1> 	
   164 0000A61C 8826                <1> 	mov	[esi], ah
   165                              <1> 	; 28/07/2022
   166                              <1> 	;xor	ecx, ecx
   167 0000A61E EB2D                <1> 	jmp	short loc_get_current_drive_4
   168                              <1> 
   169                              <1> 	; 29/08/2023
   170                              <1> loc_get_current_drive_1:
   171 0000A620 FECA                <1> 	dec 	dl
   172 0000A622 3A15[BC300100]      <1> 	cmp	dl, [Last_DOS_DiskNo]
   173 0000A628 76D8                <1> 	jna	short loc_get_current_drive_2
   174                              <1> 	;mov	eax, 0Fh ; Invalid drive (Drive not ready!)
   175                              <1> 	;cmc 	; stc
   176                              <1> 	; 28/07/2022
   177                              <1> 	;sub	eax, eax ; 29/08/2023
   178                              <1> 	; eax = 0
   179 0000A62A B00F                <1> 	mov	al, 0Fh
   180 0000A62C F9                  <1> 	stc
   181 0000A62D C3                  <1> 	retn
   182                              <1> 
   183                              <1> loc_get_current_drive_not_ready_retn:
   184 0000A62E 5E                  <1> 	pop	esi
   185                              <1> 	;mov	eax, 15
   186 0000A62F 66B80F00            <1> 	mov	ax, 15 ; Drive not ready
   187 0000A633 C3                  <1> 	retn 
   188                              <1> 
   189                              <1> loc_get_current_drive_3:
   190 0000A634 BF[A8800100]        <1>         mov     edi, PATH_Array
   191 0000A639 57                  <1> 	push	edi
   192 0000A63A 81C680000000        <1> 	add	esi, LD_CurrentDirectory
   193                              <1> 	;mov	ecx, 32
   194                              <1> 	; 28/07/2022
   195 0000A640 B120                <1> 	mov	cl, 32
   196 0000A642 F3A5                <1> 	rep	movsd
   197 0000A644 5E                  <1> 	pop	esi ; Path Array Address
   198 0000A645 5F                  <1> 	pop	edi ; pushed esi (current dir buffer offset) 
   199                              <1> 	;
   200 0000A646 E84AFFFFFF          <1> 	call	set_current_directory_string
   201 0000A64B 89FE                <1> 	mov	esi, edi
   202                              <1> 
   203                              <1> loc_get_current_drive_4:
   204 0000A64D 30C0                <1> 	xor	al, al
   205 0000A64F C3                  <1> 	retn
   206                              <1> 
   207                              <1> change_current_directory:
   208                              <1> 	; 28/07/2022 (TRDOS 386 Kernel v2.0.5)
   209                              <1> 	; 02/03/2021 (TRDOS 386 v2.0.3) ((BugFix))
   210                              <1> 	; 19/02/2016
   211                              <1> 	; 11/02/2016
   212                              <1> 	; 10/02/2016
   213                              <1> 	; 08/02/2016
   214                              <1> 	; 06/02/2016 (TRDOS 386 = TRDOS v2.0)
   215                              <1> 	; 18/09/2011 (DIR.ASM, 09/10/2011)	
   216                              <1> 	; 04/10/2009
   217                              <1> 	; 2005
   218                              <1> 	; INPUT -> 
   219                              <1> 	;	ESI = Directory string
   220                              <1> 	;	ah = CD command (CDh = save current dir string)
   221                              <1> 	; OUTPUT -> 
   222                              <1> 	; 	EDI = DOS Drive Description Table
   223                              <1> 	; 	cf = 1 -> error
   224                              <1> 	;	   EAX = Error code
   225                              <1> 	;	cf = 0 -> successful
   226                              <1> 	;	   ESI = PATH_Array
   227                              <1> 	;	   EAX = Current Directory First Cluster
   228                              <1> 	;
   229                              <1> 	; (EAX, EBX, ECX, EDX, ESI, EDI will be changed)
   230                              <1> 	
   231 0000A650 8825[36810100]      <1> 	mov	[CD_COMMAND], ah
   232 0000A656 803E2F              <1> 	cmp	byte [esi], '/'
   233 0000A659 7505                <1> 	jne	short loc_ccd_cdir_level
   234 0000A65B 46                  <1> 	inc	esi
   235 0000A65C 30C0                <1> 	xor	al, al
   236 0000A65E EB05                <1> 	jmp	short loc_ccd_parse_path_name
   237                              <1> loc_ccd_cdir_level:
   238 0000A660 A0[48790100]        <1> 	mov	al, [Current_Dir_Level]
   239                              <1> loc_ccd_parse_path_name:
   240 0000A665 88C4                <1> 	mov	ah, al
   241 0000A667 BF[A8800100]        <1> 	mov	edi, PATH_Array
   242                              <1> 
   243                              <1> ; Reset directory levels > cdir level
   244                              <1> 	; is this required !?
   245                              <1> 	;
   246                              <1> 	; Relations:
   247                              <1> 	; MAINPROG.ASM (pass_ccdrv_reset_cdir_FAT_fcluster)
   248                              <1> 	; proc_parse_dir_name,
   249                              <1> 	; proc_change_current_directory (this procedure)
   250                              <1> 	; proc_change_prompt_dir_string 
   251                              <1>  
   252 0000A66C 0FB6C8              <1> 	movzx	ecx, al
   253 0000A66F FEC1                <1> 	inc	cl
   254 0000A671 C0E104              <1> 	shl	cl, 4
   255 0000A674 01CF                <1> 	add	edi, ecx
   256 0000A676 B107                <1> 	mov	cl, 7
   257 0000A678 28C1                <1> 	sub	cl, al
   258 0000A67A C0E102              <1> 	shl	cl, 2
   259 0000A67D 89C3                <1> 	mov	ebx, eax
   260 0000A67F 31C0                <1> 	xor	eax, eax ; 0
   261 0000A681 F3AB                <1> 	rep	stosd
   262 0000A683 89D8                <1> 	mov	eax, ebx
   263                              <1> 
   264 0000A685 BF[A8800100]        <1> 	mov	edi, PATH_Array
   265                              <1> 
   266 0000A68A 803E20              <1> 	cmp	byte [esi], 20h
   267 0000A68D F5                  <1> 	cmc
   268 0000A68E 7305                <1> 	jnc	short pass_ccd_parse_dir_name
   269                              <1> 
   270                              <1> 		; ESI = Path name
   271                              <1> 		; AL = CCD_Level
   272 0000A690 E871010000          <1>         call    parse_dir_name
   273                              <1> 		; AL = CCD_Level 
   274                              <1> 		; AH = Last_Dir_Level
   275                              <1> 		; (EDI = PATH_Array)
   276                              <1> 
   277                              <1> pass_ccd_parse_dir_name:
   278 0000A695 9C                  <1> 	pushf
   279                              <1> 
   280                              <1> 	;mov	[CCD_Level], al
   281                              <1>         ;mov	[Last_Dir_Level], ah
   282 0000A696 66A3[2C810100]      <1> 	mov	[CCD_Level], ax
   283                              <1> 
   284 0000A69C 31DB                <1> 	xor	ebx, ebx
   285 0000A69E 8A3D[4A790100]      <1> 	mov	bh, [Current_Drv]
   286 0000A6A4 BE00010900          <1> 	mov	esi, Logical_DOSDisks
   287 0000A6A9 01DE                <1> 	add	esi, ebx
   288                              <1> 
   289 0000A6AB 9D                  <1> 	popf 
   290 0000A6AC 720A                <1> 	jc	short loc_ccd_bad_path_name_retn
   291                              <1> 
   292 0000A6AE 8935[28810100]      <1> 	mov	[CCD_DriveDT], esi
   293                              <1> 
   294 0000A6B4 3C07                <1> 	cmp	al, 7
   295 0000A6B6 7208                <1> 	jb	short loc_ccd_load_child_dir
   296                              <1> 
   297                              <1> loc_ccd_bad_path_name_retn:
   298 0000A6B8 87F7                <1> 	xchg	esi, edi
   299                              <1> 	;mov	eax, 19 ; Bad directory/path name 
   300                              <1> 	; 28/07/2022
   301 0000A6BA 29C0                <1> 	sub	eax, eax
   302 0000A6BC B013                <1> 	mov	al, 19
   303 0000A6BE F9                  <1> 	stc
   304                              <1> loc_ccd_retn_p:
   305 0000A6BF C3                  <1> 	retn
   306                              <1> 
   307                              <1> loc_ccd_load_child_dir:
   308                              <1> 	; AL = CCD_Level
   309 0000A6C0 08C0                <1> 	or	al, al
   310 0000A6C2 7467                <1> 	jz	short loc_ccd_load_root_dir
   311                              <1> 
   312                              <1> 	;mov	cx, ax
   313                              <1> 	; 28/07/2022
   314 0000A6C4 89C1                <1> 	mov	ecx, eax
   315 0000A6C6 C0E004              <1> 	shl	al, 4
   316 0000A6C9 0FB6F0              <1> 	movzx	esi, al
   317 0000A6CC 01FE                <1>      	add	esi, edi  ; offset PATH_Array
   318                              <1> 
   319 0000A6CE 8B460C              <1> 	mov	eax, [esi+12]
   320 0000A6D1 38E9                <1> 	cmp	cl, ch
   321                              <1> 	;je	loc_ccd_load_sub_directory
   322                              <1> 	; 28/07/2022
   323 0000A6D3 7505                <1> 	jne	short loc_ccd_1
   324 0000A6D5 E9FA000000          <1> 	jmp	loc_ccd_load_sub_directory	
   325                              <1> 
   326                              <1> loc_ccd_1:	; 28/07/2022
   327 0000A6DA A3[44790100]        <1> 	mov	[Current_Dir_FCluster], eax
   328                              <1> 
   329                              <1> loc_ccd_load_child_dir_next:
   330 0000A6DF 83C610              <1> 	add	esi, 16 ; DOS DirEntry Format FileName Address
   331                              <1> 
   332                              <1>  	; Directory attribute : 10h
   333 0000A6E2 B010                <1> 	mov	al, 00010000b ; 10h (Attrib AND mask)
   334                              <1> 	;mov	ah, 11001000b ; C8h
   335                              <1> 	; Volume name attribute: 8h
   336 0000A6E4 B408                <1> 	mov	ah, 00001000b ; 08h (Attrib NAND, AND --> zero mask)
   337                              <1> 
   338                              <1> 	;xor	cx, cx  
   339 0000A6E6 31C9                <1> 	xor	ecx, ecx ; 02/03/2021
   340 0000A6E8 E8B6010000          <1> 	call	locate_current_dir_file
   341 0000A6ED 7353                <1> 	jnc	short loc_ccd_set_dir_cluster_ptr
   342                              <1> 
   343                              <1> 	; 19/02/2016
   344                              <1> 	;mov	edi, [CCD_DriveDT]
   345 0000A6EF 8A25[2C810100]      <1> 	mov	ah, [CCD_Level]
   346 0000A6F5 803D[36810100]CD    <1> 	cmp	byte [CD_COMMAND], 0CDh ;'CD' command or another
   347 0000A6FC 7509                <1> 	jne	short loc_ccd_load_child_dir_err
   348                              <1> 	; It is better to save recent successful part 
   349                              <1> 	; of the (requested) path as current directory.
   350                              <1> 	; (Otherwise the path would be reset to back
   351                              <1> 	; on the next 'CD' command.)
   352 0000A6FE 88E1                <1> 	mov	cl, ah
   353 0000A700 50                  <1> 	push	eax
   354 0000A701 E8E4000000          <1> 	call	loc_ccd_save_current_dir
   355 0000A706 58                  <1> 	pop	eax
   356                              <1> loc_ccd_load_child_dir_err:            
   357 0000A707 3C03                <1> 	cmp	al, 3	; AL = 2 => File not found error
   358 0000A709 7202                <1> 	jb	short loc_ccd_path_not_found_retn
   359 0000A70B F9                  <1> 	stc
   360 0000A70C C3                  <1> 	retn
   361                              <1> 
   362                              <1> loc_ccd_path_not_found_retn:
   363 0000A70D B003                <1> 	mov	al, 3	; Path not found
   364 0000A70F C3                  <1> 	retn
   365                              <1> 
   366                              <1> loc_ccd_load_FAT_root_dir:
   367 0000A710 803D[49790100]02    <1> 	cmp	byte [Current_FATType], 2
   368 0000A717 776B                <1> 	ja	short loc_ccd_load_FAT32_root_dir
   369                              <1> 
   370                              <1> 	;mov	esi, [CCD_DriveDT]
   371                              <1> 	;push	esi
   372 0000A719 E80F1D0000          <1> 	call	load_FAT_root_directory
   373                              <1> 	;pop	edi ; Dos Drv Description Table
   374                              <1> 
   375 0000A71E 89F7                <1> 	mov	edi, esi
   376 0000A720 BE[A8800100]        <1> 	mov	esi, PATH_Array
   377 0000A725 7298                <1> 	jc	short loc_ccd_retn_p
   378                              <1> 
   379 0000A727 31C0                <1> 	xor	eax, eax
   380 0000A729 EB78                <1>         jmp	short loc_ccd_set_cdfc
   381                              <1> 
   382                              <1> loc_ccd_load_root_dir:
   383 0000A72B 803D[49790100]01    <1> 	cmp	byte [Current_FATType], 1
   384 0000A732 73DC                <1> 	jnb	short loc_ccd_load_FAT_root_dir
   385                              <1> 
   386                              <1> loc_ccd_load_FS_root_dir:
   387 0000A734 E8AC1D0000          <1> 	call	load_FS_root_directory
   388 0000A739 EB5C                <1> 	jmp	short pass_ccd_load_FAT_sub_directory
   389                              <1> 
   390                              <1> loc_ccd_load_FS_sub_directory_next:
   391 0000A73B E8A51D0000          <1> 	call	load_FS_sub_directory
   392 0000A740 EB1F                <1> 	jmp	short pass_ccd_set_dir_cluster_ptr  
   393                              <1> 
   394                              <1> loc_ccd_set_dir_cluster_ptr:
   395                              <1> 	; EDI = Directory Entry
   396 0000A742 668B4714            <1> 	mov	ax, [edi+20] ; First Cluster High Word
   397 0000A746 C1E010              <1> 	shl	eax, 16
   398 0000A749 668B471A            <1> 	mov	ax, [edi+26] ; First Cluster Low Word
   399                              <1> 
   400 0000A74D 8B35[28810100]      <1> 	mov	esi, [CCD_DriveDT]
   401 0000A753 803D[49790100]01    <1> 	cmp	byte [Current_FATType], 1
   402 0000A75A 72DF                <1> 	jb	short loc_ccd_load_FS_sub_directory_next
   403                              <1> 	;push	esi
   404 0000A75C E84A1D0000          <1> 	call	load_FAT_sub_directory
   405                              <1> 	;pop	edi ; Dos Drv Description Table
   406                              <1> 
   407                              <1> pass_ccd_set_dir_cluster_ptr:
   408                              <1> 	;mov	edi, esi
   409 0000A761 BE[A8800100]        <1> 	mov	esi, PATH_Array
   410 0000A766 7265                <1> 	jc	short loc_ccd_retn_c
   411                              <1> 
   412 0000A768 A1[76800100]        <1> 	mov	eax, [DirBuff_Cluster]
   413                              <1> 
   414 0000A76D FE05[2C810100]      <1> 	inc	byte [CCD_Level]
   415 0000A773 0FB61D[2C810100]    <1> 	movzx	ebx, byte [CCD_Level]
   416 0000A77A C0E304              <1> 	shl	bl, 4 ; * 16 (<= 128)   
   417 0000A77D 01DE                <1> 	add	esi, ebx ; 19/02/2016
   418 0000A77F 89460C              <1> 	mov	[esi+12], eax
   419 0000A782 EB1F                <1> 	jmp	short loc_ccd_set_cdfc
   420                              <1> 
   421                              <1> loc_ccd_load_FAT32_root_dir:
   422 0000A784 BE[A8800100]        <1> 	mov	esi, PATH_Array
   423 0000A789 8B460C              <1> 	mov	eax, [esi+12]
   424 0000A78C 8B35[28810100]      <1> 	mov	esi, [CCD_DriveDT]
   425                              <1>  
   426                              <1> loc_ccd_load_FAT_sub_directory:
   427                              <1> 	;push	esi
   428 0000A792 E8141D0000          <1> 	call	load_FAT_sub_directory
   429                              <1> 	;pop	edi ; Dos Drv Description Table
   430                              <1> 
   431                              <1> pass_ccd_load_FAT_sub_directory:
   432                              <1> 	;mov	edi, esi
   433 0000A797 BE[A8800100]        <1> 	mov	esi, PATH_Array
   434 0000A79C 722F                <1> 	jc	short loc_ccd_retn_c
   435                              <1> 
   436 0000A79E A1[76800100]        <1> 	mov	eax, [DirBuff_Cluster]
   437                              <1> 
   438                              <1> loc_ccd_set_cdfc:
   439 0000A7A3 8A0D[2C810100]      <1> 	mov	cl, [CCD_Level]
   440 0000A7A9 880D[48790100]      <1> 	mov	[Current_Dir_Level], cl
   441 0000A7AF A3[44790100]        <1> 	mov	[Current_Dir_FCluster], eax
   442                              <1> 
   443 0000A7B4 8A2D[2D810100]      <1> 	mov	ch, [Last_Dir_Level]
   444 0000A7BA 38E9                <1> 	cmp	cl, ch 
   445                              <1> 	;jb	loc_ccd_load_child_dir_next
   446                              <1> 	; 28/07/2022
   447 0000A7BC 7305                <1> 	jnb	short loc_ccd_2	
   448 0000A7BE E91CFFFFFF          <1> 	jmp	loc_ccd_load_child_dir_next
   449                              <1> loc_ccd_2:
   450 0000A7C3 803D[36810100]CD    <1> 	cmp	byte [CD_COMMAND], 0CDh ;'CD' command or another
   451 0000A7CA 741E                <1> 	je	short loc_ccd_save_current_dir
   452                              <1> 
   453                              <1>         ; jne -> don't save, restore (the previous cdir) later !
   454                              <1>         ; (saving the cdir would prevent previous cdir restoration!)
   455                              <1> 
   456 0000A7CC F8                  <1> 	clc
   457                              <1> 
   458                              <1> loc_ccd_retn_c:
   459 0000A7CD 8B3D[28810100]      <1> 	mov	edi, [CCD_DriveDT]
   460 0000A7D3 C3                  <1> 	retn
   461                              <1> 
   462                              <1> loc_ccd_load_sub_directory:
   463 0000A7D4 8B35[28810100]      <1> 	mov	esi, [CCD_DriveDT]
   464 0000A7DA 803D[49790100]01    <1> 	cmp	byte [Current_FATType], 1
   465 0000A7E1 73AF                <1> 	jnb	short loc_ccd_load_FAT_sub_directory 
   466 0000A7E3 E8FD1C0000          <1> 	call	load_FS_sub_directory
   467 0000A7E8 EBAD                <1> 	jmp	short pass_ccd_load_FAT_sub_directory 
   468                              <1> 
   469                              <1> loc_ccd_save_current_dir:
   470                              <1> 	; 02/03/2021 (TRDOS 386 v2.0.3) ((BugFix))
   471                              <1> 	; ('find_directory_entry' has been fixed to prevent large
   472                              <1> 	; ECX value > 65535)
   473                              <1> 	; 
   474 0000A7EA BE[A8800100]        <1> 	mov	esi, PATH_Array ; 19/02/2016
   475 0000A7EF 8B3D[28810100]      <1> 	mov	edi, [CCD_DriveDT]
   476 0000A7F5 57                  <1> 	push	edi
   477 0000A7F6 83C77F              <1>         add     edi, LD_CDirLevel
   478 0000A7F9 880F                <1> 	mov	[edi], cl
   479 0000A7FB 47                  <1> 	inc	edi ; LD_CurrentDirectory 
   480 0000A7FC 56                  <1> 	push	esi
   481                              <1> 	;;mov	ecx, 32  ; always < 65536 (in this procedure)
   482 0000A7FD 66B92000            <1> 	mov	cx, 32
   483                              <1> 	; 02/03/2021
   484                              <1> 	;mov	ecx, 32
   485 0000A801 F3A5                <1> 	rep	movsd
   486                              <1> 	; Current directory has been saved to 
   487                              <1> 	; the DOS drive description table, cdir area !
   488 0000A803 5E                  <1> 	pop	esi  ; PATH_Array
   489 0000A804 5F                  <1> 	pop	edi  ; Dos Drv Description Table
   490                              <1> 
   491 0000A805 C3                  <1> 	retn
   492                              <1> 
   493                              <1> parse_dir_name:
   494                              <1> 	; 11/02/2016
   495                              <1> 	; 10/02/2016
   496                              <1> 	; 07/02/2016 (TRDOS 386 = TRDOS v2.0)
   497                              <1> 	; 18/09/2011
   498                              <1> 	; 17/10/2009
   499                              <1> 	; INPUT ->
   500                              <1> 	;	ESI = ASCIIZ Directory String Address
   501                              <1> 	;	AL = Current Directory Level
   502                              <1> 	;	EDI = Destination Adress
   503                              <1> 	;	     (8 levels, each one 12+4 byte)
   504                              <1> 	; OUTPUT ->
   505                              <1> 	;	EDI = Dir Entry Formatted Array
   506                              <1> 	;	     with zero cluster pointer at the last level
   507                              <1> 	;	AH = Last Dir Level
   508                              <1> 	;	AL = Current Dir Level
   509                              <1> 	;
   510                              <1> 	; (esi, ebx, ecx will be changed) 
   511                              <1> 
   512                              <1> 	;mov	[PATH_Array_Ptr], edi
   513 0000A806 88C4                <1> 	mov	ah, al
   514 0000A808 66A3[CC810100]      <1> 	mov	[PATH_CDLevel], ax
   515                              <1> repeat_ppdn_check_slash:
   516 0000A80E AC                  <1> 	lodsb
   517 0000A80F 3C2F                <1> 	cmp	al, '/'
   518 0000A811 74FB                <1> 	je	short repeat_ppdn_check_slash
   519 0000A813 3C21                <1> 	cmp	al, 21h
   520 0000A815 7219                <1> 	jb	short loc_ppdn_retn
   521 0000A817 57                  <1> 	push	edi
   522                              <1> loc_ppdn_get_dir_name:
   523 0000A818 B90C000000          <1> 	mov	ecx, 12
   524 0000A81D BF[CE810100]        <1> 	mov	edi, Dir_File_Name
   525                              <1> repeat_ppdn_get_dir_name:
   526 0000A822 AA                  <1> 	stosb
   527 0000A823 AC                  <1> 	lodsb
   528 0000A824 3C2F                <1> 	cmp	al, '/'
   529 0000A826 740A                <1> 	je	short loc_check_level_dot_conv_dir_name
   530 0000A828 3C20                <1> 	cmp	al, 20h
   531 0000A82A 7605                <1> 	jna	short loc_ppdn_end_of_path_scan
   532 0000A82C E2F4                <1> 	loop	repeat_ppdn_get_dir_name
   533 0000A82E 5F                  <1> 	pop	edi
   534 0000A82F F9                  <1> 	stc
   535                              <1> loc_ppdn_retn:
   536 0000A830 C3                  <1> 	retn
   537                              <1> 
   538                              <1> loc_ppdn_end_of_path_scan:
   539 0000A831 4E                  <1> 	dec	esi
   540                              <1> loc_check_level_dot_conv_dir_name:
   541 0000A832 31C0                <1> 	xor	eax, eax
   542 0000A834 AA                  <1> 	stosb
   543 0000A835 89F3                <1> 	mov	ebx, esi
   544 0000A837 BE[CE810100]        <1> 	mov	esi, Dir_File_Name
   545 0000A83C AC                  <1> 	lodsb
   546                              <1> repeat_ppdn_name_check_dot:
   547 0000A83D 3C2E                <1> 	cmp	al, '.'
   548 0000A83F 7509                <1> 	jne	short loc_ppdn_convert_sub_dir_name
   549                              <1> repeat_ppdn_name_dot_dot:
   550 0000A841 AC                  <1> 	lodsb
   551 0000A842 3C2E                <1> 	cmp	al, '.'
   552 0000A844 743E                <1> 	je	short loc_ppdn_dot_dot
   553 0000A846 3C21                <1> 	cmp	al, 21h
   554 0000A848 7226                <1> 	jb	short pass_ppdn_convert_sub_dir_name
   555                              <1> loc_ppdn_convert_sub_dir_name:
   556 0000A84A 8A25[CD810100]      <1> 	mov	ah, [PATH_Level]
   557 0000A850 80FC07              <1> 	cmp	ah, 7
   558 0000A853 731B                <1> 	jnb	short pass_ppdn_convert_sub_dir_name
   559 0000A855 FEC4                <1> 	inc	ah  
   560 0000A857 8825[CD810100]      <1> 	mov	[PATH_Level], ah
   561 0000A85D BE[CE810100]        <1> 	mov	esi, Dir_File_Name
   562                              <1> 	;mov	edi, [PATH_Array_Ptr]
   563 0000A862 B010                <1> 	mov	al, 16
   564 0000A864 F6E4                <1> 	mul	ah
   565 0000A866 8B3C24              <1> 	mov	edi, [esp]
   566                              <1> 	;push	edi 
   567 0000A869 01C7                <1> 	add	edi, eax
   568 0000A86B E802030000          <1> 	call	convert_file_name
   569                              <1> 	;pop	edi
   570                              <1> pass_ppdn_convert_sub_dir_name:
   571 0000A870 89DE                <1> 	mov	esi, ebx
   572                              <1> repeat_ppdn_check_last_slash:
   573 0000A872 AC                  <1> 	lodsb
   574 0000A873 3C2F                <1> 	cmp	al, '/'
   575 0000A875 74FB                <1> 	je	short repeat_ppdn_check_last_slash
   576 0000A877 3C21                <1> 	cmp	al, 21h
   577 0000A879 739D                <1> 	jnb	short loc_ppdn_get_dir_name
   578                              <1> end_of_parse_dir_name:
   579 0000A87B 5F                  <1> 	pop	edi
   580 0000A87C F5                  <1> 	cmc  
   581                              <1> 	;mov	al, [PATH_CDLevel]
   582                              <1> 	;mov	ah, [PATH_Level]
   583 0000A87D 66A1[CC810100]      <1> 	mov	ax, [PATH_CDLevel]
   584 0000A883 C3                  <1> 	retn
   585                              <1> 
   586                              <1> loc_ppdn_dot_dot:
   587 0000A884 AC                  <1> 	lodsb
   588 0000A885 3C21                <1> 	cmp	al, 21h
   589 0000A887 73F2                <1> 	jnb	short end_of_parse_dir_name 
   590                              <1> loc_ppdn_dot_dot_prev_level:
   591 0000A889 66A1[CC810100]      <1> 	mov	ax, [PATH_CDLevel]
   592 0000A88F 80EC01              <1> 	sub	ah, 1
   593 0000A892 80D400              <1> 	adc	ah, 0
   594 0000A895 38E0                <1> 	cmp	al, ah
   595 0000A897 7602                <1> 	jna	short pass_ppdn_set_al_to_ah
   596 0000A899 88E0                <1> 	mov	al, ah
   597                              <1> pass_ppdn_set_al_to_ah:
   598 0000A89B 66A3[CC810100]      <1> 	mov	[PATH_CDLevel], ax
   599 0000A8A1 EBCD                <1> 	jmp	short pass_ppdn_convert_sub_dir_name
   600                              <1> 
   601                              <1> locate_current_dir_file:
   602                              <1> 	; 28/07/2022 (TRDOS 386 Kernel v2.0.5)
   603                              <1> 	; 20/11/2017
   604                              <1> 	; 14/02/2016
   605                              <1> 	; 13/02/2016
   606                              <1> 	; 10/02/2016
   607                              <1> 	; 06/02/2016 (TRDOS 386 = TRDOS v2.0)
   608                              <1> 	; 14/08/2010
   609                              <1> 	; 19/09/2009
   610                              <1>         ; 2005
   611                              <1> 	; INPUT ->
   612                              <1> 	;	ESI = DOS DirEntry Format FileName Address
   613                              <1> 	;	AL = Attributes Mask 
   614                              <1> 	;	(<AL AND EntryAttrib> must be equal to AL)
   615                              <1> 	;	AH = Negative Attributes Mask (If AH>0)
   616                              <1> 	;	(<AH AND EntryAttrib> must be ZERO)
   617                              <1> 	;	CH > 0 Find First Free Dir Entry or Deleted Entry
   618                              <1> 	;	CL = 0 -> Return the First Free Dir Entry
   619                              <1> 	;	CL = E5h -> Return the 1st deleted entry
   620                              <1> 	;	CL = FFh -> Return the 1st deleted or free entry
   621                              <1> 	;	CL > 0 and CL <> E5h and CL <> FFh -> Return the first 
   622                              <1> 	;	     proper entry (which fits with Atributes Masks)
   623                              <1> 	;	CX = 0 Find Valid File/Directory/VolumeName
   624                              <1> 	;	? = Any One Char
   625                              <1> 	;	* = Every Chars
   626                              <1> 	; OUTPUT ->
   627                              <1> 	;	EDI = Directory Entry Address (in Directory Buffer)
   628                              <1> 	;	ESI = DOS DirEntry Format FileName Address
   629                              <1> 	;	CF = 0 -> No Error, Proper Entry,
   630                              <1> 	;	DL = Attributes
   631                              <1> 	;	DH = Previous Entry Attr (LongName Check)
   632                              <1> 	;	AL > 0 -> Ambiguous filename wildcard "?" used
   633                              <1> 	;	AH > 0 -> Ambiguous filename wildcard "*" used
   634                              <1> 	;	AX = 0 -> Filename full fits with directory entry
   635                              <1> 	;	CH = The 1st Name Char of Current Dir Entry
   636                              <1> 	;	CF = 1 -> Proper entry not found, Error Code in EAX/AL
   637                              <1> 	;	CL = 0 and CH = 0 -> Free Entry (End Of Dir)
   638                              <1> 	;	CL = 0 and CH = E5h -> Deleted Entry fits with filters
   639                              <1> 	;	CL > 0 -> Entry not found, CH invalid
   640                              <1> 	;	CF = 0 -> 
   641                              <1> 	;	EBX = Current Directory Entry Index/Number (BX)
   642                              <1> 
   643                              <1> 	;mov	word [DirBuff_EntryCounter], 0 ; Zero Based
   644                              <1> 
   645 0000A8A3 8935[30810100]      <1> 	mov	[CDLF_FNAddress], esi
   646 0000A8A9 66A3[2E810100]      <1> 	mov	[CDLF_AttributesMask], ax
   647 0000A8AF 66890D[34810100]    <1> 	mov	[CDLF_DEType], cx
   648                              <1> 
   649 0000A8B6 31DB                <1> 	xor	ebx, ebx
   650 0000A8B8 881D[44810100]      <1> 	mov	[PreviousAttr], bl ; 0  ; 13/02/2016
   651                              <1> 
   652 0000A8BE 8A3D[4A790100]      <1> 	mov	bh, [Current_Drv]
   653 0000A8C4 381D[71800100]      <1> 	cmp	byte [DirBuff_ValidData], bl ; 0
   654 0000A8CA 761D                <1> 	jna	short loc_lcdf_reload_current_dir2
   655 0000A8CC 8A1D[6F800100]      <1>         mov     bl, [DirBuff_DRV]
   656 0000A8D2 80EB41              <1> 	sub	bl, 'A'
   657 0000A8D5 38DF                <1> 	cmp	bh, bl
   658 0000A8D7 750E                <1> 	jne	short loc_lcdf_reload_current_dir1
   659 0000A8D9 8B15[76800100]      <1> 	mov	edx, [DirBuff_Cluster]
   660 0000A8DF 3B15[44790100]      <1> 	cmp	edx, [Current_Dir_FCluster]
   661 0000A8E5 7412                <1> 	je	short loc_cdir_locatefile_search
   662                              <1> 
   663                              <1> loc_lcdf_reload_current_dir1:
   664 0000A8E7 30DB                <1> 	xor	bl, bl
   665                              <1> loc_lcdf_reload_current_dir2:
   666 0000A8E9 89DE                <1> 	mov	esi, ebx
   667 0000A8EB 81C600010900        <1>         add     esi, Logical_DOSDisks
   668 0000A8F1 E872000000          <1> 	call	reload_current_directory 
   669 0000A8F6 735B                <1> 	jnc	short loc_locatefile_search_again 
   670 0000A8F8 C3                  <1> 	retn  
   671                              <1> 
   672                              <1> loc_cdir_locatefile_search:
   673 0000A8F9 31DB                <1> 	xor	ebx, ebx
   674 0000A8FB 55                  <1> 	push	ebp ; 20/11/2017
   675 0000A8FC E8A0000000          <1> 	call	find_directory_entry
   676 0000A901 5D                  <1> 	pop	ebp ; 20/11/2017
   677 0000A902 7347                <1> 	jnc	short loc_cdir_locate_file_retn
   678                              <1> 
   679                              <1> loc_locatefile_check_stc_reason:
   680 0000A904 08ED                <1> 	or	ch, ch
   681 0000A906 7442                <1> 	jz	short loc_cdir_locate_file_stc_retn
   682                              <1> 
   683                              <1> loc_locatefile_check_next_entryblock:
   684                              <1> 	;mov	bh, [Current_Drv]
   685                              <1> 	;sub	bl, bl
   686                              <1> 	;movzx	esi, bx
   687                              <1> 	; 28/07/2022
   688 0000A908 31DB                <1>         xor	ebx, ebx
   689 0000A90A 8A3D[4A790100]      <1> 	mov	bh, [Current_Drv]
   690 0000A910 89DE                <1> 	mov	esi, ebx
   691 0000A912 81C600010900        <1> 	add     esi, Logical_DOSDisks
   692                              <1> 
   693 0000A918 803D[48790100]00    <1> 	cmp	byte [Current_Dir_Level], 0
   694 0000A91F 760A                <1> 	jna	short loc_locatefile_check_FAT_type
   695                              <1>             
   696 0000A921 803D[49790100]01    <1> 	cmp	byte [Current_FATType], 1
   697 0000A928 730A                <1> 	jnb	short loc_locatefile_load_subdir_cluster
   698 0000A92A C3                  <1> 	retn  
   699                              <1> 
   700                              <1> loc_locatefile_check_FAT_type:
   701 0000A92B 803D[49790100]03    <1> 	cmp	byte [Current_FATType], 3
   702 0000A932 7217                <1> 	jb	short loc_cdir_locate_file_retn
   703                              <1> 
   704                              <1> loc_locatefile_load_subdir_cluster:
   705 0000A934 A1[76800100]        <1> 	mov	eax, [DirBuff_Cluster]
   706 0000A939 E8B1190000          <1> 	call	get_next_cluster
   707 0000A93E 730C                <1> 	jnc	short loc_locatefile_next_cluster
   708 0000A940 09C0                <1> 	or	eax, eax
   709 0000A942 7506                <1> 	jnz	short loc_locatefile_drive_not_ready_read_err
   710                              <1> 	;stc
   711                              <1> 	; 28/07/2022
   712                              <1> ;loc_locatefile_file_notfound:
   713                              <1> 	;mov	eax, 2 ; File/Directory/VolName not found
   714 0000A944 31C0                <1> 	xor	eax, eax
   715 0000A946 B002                <1> 	mov	al, 2
   716 0000A948 F9                  <1> 	stc
   717 0000A949 C3                  <1> 	retn
   718                              <1> 
   719                              <1> loc_locatefile_drive_not_ready_read_err:
   720                              <1> 	;mov	eax, 17 ;Drive not ready or read error
   721                              <1> loc_cdir_locate_file_stc_retn:
   722 0000A94A F5                  <1> 	cmc ;stc
   723                              <1> loc_cdir_locate_file_retn:
   724 0000A94B C3                  <1> 	retn
   725                              <1> 
   726                              <1> loc_locatefile_next_cluster:
   727 0000A94C E85A1B0000          <1> 	call	load_FAT_sub_directory
   728                              <1> 	;jc	short loc_locatefile_drive_not_ready_read_err
   729 0000A951 72F8                <1> 	jc	short loc_cdir_locate_file_retn 
   730                              <1> 
   731                              <1> loc_locatefile_search_again:
   732 0000A953 8B35[30810100]      <1> 	mov	esi, [CDLF_FNAddress] 
   733 0000A959 66A1[2E810100]      <1> 	mov	ax, [CDLF_AttributesMask]
   734 0000A95F 668B0D[34810100]    <1> 	mov	cx, [CDLF_DEType] 
   735 0000A966 EB91                <1> 	jmp	short loc_cdir_locatefile_search
   736                              <1> 
   737                              <1> reload_current_directory:
   738                              <1> 	; 28/07/2022 (TRDOS 386 Kernel v2.0.5)
   739                              <1> 	; 06/02/2016 (TRDOS 386 = TRDOS v2.0)
   740                              <1> 	; 13/06/2010
   741                              <1> 	; 22/09/2009
   742                              <1>         ;
   743                              <1> 	; INPUT ->
   744                              <1> 	;	ESI = Dos drive description table address
   745                              <1> 	
   746                              <1> 	;mov	al, [esi+LD_FATType]
   747 0000A968 A0[49790100]        <1> 	mov	al, [Current_FATType]
   748 0000A96D 3C02                <1> 	cmp	al, 2
   749 0000A96F 7726                <1> 	ja	short loc_reload_FAT_sub_directory
   750 0000A971 8A25[48790100]      <1> 	mov	ah, [Current_Dir_Level]
   751 0000A977 08C0                <1> 	or	al, al
   752 0000A979 7409                <1> 	jz	short loc_reload_FS_directory
   753 0000A97B 08E4                <1> 	or	ah, ah
   754 0000A97D 7518                <1> 	jnz	short loc_reload_FAT_sub_directory
   755                              <1> loc_reload_FAT_12_16_root_directory:
   756                              <1> 	;call	load_FAT_root_directory
   757                              <1> 	;retn
   758                              <1> 	; 28/07/2022
   759 0000A97F E9A91A0000          <1> 	jmp	load_FAT_root_directory
   760                              <1> loc_reload_FS_directory:
   761 0000A984 20E4                <1> 	and	ah, ah
   762 0000A986 7505                <1> 	jnz	short loc_reload_FS_sub_directory 
   763                              <1> loc_reload_FS_root_directory: 
   764                              <1> 	;call	load_FS_root_directory
   765                              <1> 	;retn
   766                              <1> 	; 28/07/2022
   767 0000A988 E9581B0000          <1> 	jmp	load_FS_root_directory
   768                              <1> loc_reload_FS_sub_directory:
   769 0000A98D A1[44790100]        <1> 	mov	eax, [Current_Dir_FCluster]
   770                              <1> 	;call	load_FS_sub_directory
   771                              <1> 	;retn
   772 0000A992 E94E1B0000          <1> 	jmp	load_FS_sub_directory 
   773                              <1> loc_reload_FAT_sub_directory:
   774 0000A997 A1[44790100]        <1> 	mov	eax, [Current_Dir_FCluster]
   775                              <1> 	;call	load_FAT_sub_directory
   776                              <1> 	;retn
   777                              <1> 	; 28/07/2022
   778 0000A99C E90A1B0000          <1> 	jmp	load_FAT_sub_directory
   779                              <1> 
   780                              <1> find_directory_entry:
   781                              <1> 	; 28/07/2022 (TRDOS 386 Kernel v2.0.5)
   782                              <1> 	; 02/03/2021 (TRDOS 386 v2.0.3) ((BugFix))
   783                              <1> 	; 14/02/2016
   784                              <1> 	; 13/02/2016
   785                              <1> 	; 10/02/2016
   786                              <1> 	; 06/02/2016 (TRDOS 386 = TRDOS v2.0)
   787                              <1> 	; 14/08/2010 (DIR.ASM, "proc_find_direntry")
   788                              <1> 	; 19/09/2009
   789                              <1> 	; 2005
   790                              <1> 	; INPUT ->
   791                              <1> 	;	ESI = Sub Dir or File Name Address
   792                              <1> 	;	AL = Attributes Mask 
   793                              <1> 	;	(<AL AND EntryAttrib> must be equal to AL)
   794                              <1> 	;	AH = Negative Attributes Mask (If AH>0)
   795                              <1> 	;	(<AH AND EntryAttrib> must be ZERO)
   796                              <1> 	;	CH > 0 Find First Free Dir Entry or Deleted Entry
   797                              <1> 	;	CL = 0 -> Return the First Free Dir Entry
   798                              <1> 	;	CL = E5h -> Return the 1st deleted entry
   799                              <1> 	;	CL = FFh -> Return the 1st deleted or free entry
   800                              <1> 	;	CL > 0 and CL <> E5h and CL <> FFh -> Return the first 
   801                              <1> 	;            proper entry (which fits with Atributes Masks)
   802                              <1> 	;	CX = 0 -> Find Valid File/Directory/VolumeName
   803                              <1> 	;	? = Any One Char
   804                              <1> 	;	* = Every Chars
   805                              <1> 	;	EBX = Current Dir Entry (BX)
   806                              <1> 	;
   807                              <1> 	; OUTPUT -> 
   808                              <1> 	;	EDI = Directory Entry Address (in DirectoryBuffer)
   809                              <1> 	;	ESI = Sub Dir or File Name Address
   810                              <1> 	;	CF = 0 -> No Error, Proper Entry,
   811                              <1> 	;	DL = Attributes
   812                              <1> 	;	DH = Previous Entry Attr (LongName Check)
   813                              <1> 	;	AL > 0 -> Ambiguous filename wildcard "?" used
   814                              <1> 	;	AH > 0 -> Ambiguous filename wildcard "*" used
   815                              <1> 	;	AX = 0 -> Filename full fits with directory entry
   816                              <1> 	;	EBX = CurrentDirEntry (BX)
   817                              <1> 	;	CH = The 1st Name Char of Current Dir Entry
   818                              <1> 	;	CF = 1 -> Proper entry not found, Error Code in AX/AL
   819                              <1> 	;	CL = 0 and CH = 0 -> Free Entry (End Of Dir)
   820                              <1> 	;	CL = 0 and CH = E5h -> Deleted Entry fits with filters
   821                              <1> 	;	CL > 0 -> Entry not found, CH invalid
   822                              <1> 	;
   823                              <1> 	; (EAX, EBX, ECX, EDX, EDI, EBP will be changed)	 
   824                              <1> 
   825 0000A9A1 663B1D[74800100]    <1> 	cmp	bx, [DirBuff_LastEntry]
   826 0000A9A8 7728                <1> 	ja      short loc_ffde_stc_retn_255 ; 28/07/2022
   827                              <1> 
   828                              <1> 	;mov    [DirBuff_CurrentEntry], bx  
   829                              <1> 
   830 0000A9AA BF00000800          <1>   	mov	edi, Directory_Buffer
   831 0000A9AF 66A3[40810100]      <1> 	mov	[FDE_AttrMask], ax
   832                              <1> 
   833 0000A9B5 29C0                <1> 	sub	eax, eax
   834                              <1>             
   835                              <1> 	;;mov	[PreviousAttr], al ; 0 ;; 13/02/2016
   836 0000A9B7 66A3[42810100]      <1> 	mov	[AmbiguousFileName], ax ; 0
   837                              <1> 
   838 0000A9BD 6689D8              <1> 	mov	ax, bx
   839                              <1> 	;shl	ax, 5 ; ; * 32 ; Directory entry size
   840                              <1> 	; 28/07/2022
   841 0000A9C0 C1E005              <1> 	shl	eax, 5
   842 0000A9C3 01C7                <1> 	add     edi, eax
   843                              <1> 
   844 0000A9C5 08ED                <1> 	or	ch, ch
   845                              <1> 	;jnz	loc_find_free_deleted_entry_0
   846                              <1> 	; 28/07/2022
   847 0000A9C7 7405                <1> 	jz	short loc_fde_any_valid_entry_opt
   848 0000A9C9 E911010000          <1> 	jmp	loc_find_free_deleted_entry_0
   849                              <1> 
   850                              <1> loc_fde_any_valid_entry_opt:
   851 0000A9CE 08C9                <1> 	or      cl, cl
   852                              <1>         ;jnz	loc_ffde_stc_retn_255
   853                              <1> 	; 28/07/2022
   854 0000A9D0 742E                <1> 	jz	short check_find_dir_entry
   855                              <1> 
   856                              <1> 	; 28/07/2022
   857                              <1> loc_ffde_stc_retn_255:
   858                              <1> 	; 02/03/2021 (TRDOS 386 v2.0.3) ((BugFix))
   859                              <1> 	; (ECX must not be > 65535)
   860                              <1> 	; ((because 'loc_ccd_save_current_dir'
   861                              <1> 	;  sets CX to 32 for 'rep movsd')) 
   862 0000A9D2 66B9FFFF            <1> 	mov	cx, 0FFFFh
   863                              <1> 	;xor	ecx, ecx
   864                              <1> 	;dec	ecx ; 0FFFFFFFFh
   865                              <1> 	;xor	eax, eax
   866                              <1> loc_find_direntry_stc_retn:
   867                              <1> loc_check_ffde_retn_1:
   868                              <1> 	;mov	ax, 2
   869                              <1> 	;mov	eax, 2 ; File Not Found
   870                              <1> 	; 28/07/2022
   871 0000A9D6 29C0                <1> 	sub	eax, eax
   872 0000A9D8 B002                <1> 	mov	al, 2
   873 0000A9DA 8A35[44810100]      <1> 	mov	dh, [PreviousAttr]
   874 0000A9E0 66891D[72800100]    <1> 	mov	[DirBuff_CurrentEntry], bx
   875 0000A9E7 F9                  <1> 	stc
   876 0000A9E8 C3                  <1> 	retn
   877                              <1> 
   878                              <1> 	; 28/07/2022
   879                              <1> loc_find_dir_next_entry_prevdeleted:
   880 0000A9E9 80CA80              <1> 	or	dl, 80h  ; Bit 7 -> deleted entry sign
   881                              <1> 	;jmp	short loc_find_dir_next_entry
   882                              <1> 
   883                              <1> 	; 28/07/2022
   884                              <1> loc_find_dir_next_entry:
   885 0000A9EC 8815[44810100]      <1> 	mov	byte [PreviousAttr], dl ; LongName check
   886                              <1> loc_find_dir_next_entry_1:
   887 0000A9F2 5E                  <1> 	pop	esi
   888 0000A9F3 83C720              <1> 	add	edi, 32
   889                              <1> 	;;inc	word [DirBuff_EntryCounter]
   890                              <1> 	;inc	bx
   891                              <1> 	; 28/07/2022
   892 0000A9F6 43                  <1> 	inc	ebx
   893 0000A9F7 663B1D[74800100]    <1> 	cmp	bx, [DirBuff_LastEntry]
   894 0000A9FE 77D2                <1> 	ja	short loc_ffde_stc_retn_255
   895                              <1>         ; 28/07/2022
   896                              <1> 	;jmp	short check_find_dir_entry 
   897                              <1>  
   898                              <1> check_find_dir_entry:
   899 0000AA00 66A1[40810100]      <1> 	mov	ax, [FDE_AttrMask]
   900 0000AA06 8A2F                <1> 	mov	ch, [edi]
   901 0000AA08 80FD00              <1> 	cmp     ch, 0 ; Is it never used entry?
   902                              <1> 	;jna	loc_find_direntry_stc_retn
   903                              <1> 	; 28/07/2022
   904 0000AA0B 7702                <1> 	ja	short loc_fde_check_attrib
   905                              <1> 	; end of directory entries
   906 0000AA0D EBC7                <1> 	jmp	loc_find_direntry_stc_retn
   907                              <1> loc_fde_check_attrib: 
   908 0000AA0F 56                  <1> 	push	esi
   909 0000AA10 8A570B              <1> 	mov	dl, [edi+0Bh] ; File attributes
   910 0000AA13 80FDE5              <1> 	cmp	ch, 0E5h ; Is it a deleted file?
   911 0000AA16 74D1                <1> 	je	short loc_find_dir_next_entry_prevdeleted
   912                              <1> 
   913 0000AA18 80FA0F              <1> 	cmp     dl, 0Fh ; longname sub component check
   914 0000AA1B 7505                <1> 	jne     short loc_check_attributes_mask
   915 0000AA1D E8A6010000          <1> 	call	save_longname_sub_component
   916                              <1> 
   917                              <1> loc_check_attributes_mask:
   918 0000AA22 88C6                <1> 	mov	dh, al
   919 0000AA24 20D6                <1> 	and	dh, dl 
   920                              <1> 	; 28/07/2022   
   921 0000AA26 38F0                <1> 	cmp	al, dh
   922 0000AA28 75C2                <1> 	jne	short loc_find_dir_next_entry
   923 0000AA2A 20D4                <1> 	and	ah, dl
   924 0000AA2C 75BE                <1>         jnz	short loc_find_dir_next_entry
   925 0000AA2E 80FA0F              <1> 	cmp	dl, 0Fh
   926 0000AA31 7515                <1> 	jne	short pass_direntry_attr_check
   927                              <1> 
   928 0000AA33 3C0F                <1> 	cmp	al, 0Fh ; AL = 0Fh -> find long name
   929 0000AA35 75B5                <1> 	jne	short loc_find_dir_next_entry
   930                              <1> 
   931 0000AA37 5E                  <1> 	pop	esi
   932                              <1> 	;xor	ax, ax
   933                              <1> 	; 28/07/2022
   934                              <1> 	;sub	eax, eax
   935 0000AA38 30C0                <1> 	xor	al, al
   936 0000AA3A 8A35[44810100]      <1> 	mov	dh, [PreviousAttr]
   937 0000AA40 66891D[72800100]    <1> 	mov	[DirBuff_CurrentEntry], bx
   938 0000AA47 C3                  <1> 	retn
   939                              <1> 
   940                              <1> pass_direntry_attr_check:
   941 0000AA48 89FD                <1> 	mov	ebp, edi ; 14/02/2016
   942                              <1> 	;mov	ecx, 8
   943                              <1> 	; 28/07/2022
   944 0000AA4A 29C9                <1> 	sub	ecx, ecx
   945 0000AA4C B108                <1> 	mov	cl, 8
   946                              <1> loc_lodsb_find_dir:
   947 0000AA4E AC                  <1> 	lodsb
   948 0000AA4F 3C2A                <1> 	cmp	al, '*'
   949 0000AA51 7508                <1> 	jne	short pass_fde_ambiguous1_check
   950 0000AA53 FE05[43810100]      <1>         inc     byte [AmbiguousFileName+1]
   951 0000AA59 EB23                <1> 	jmp	short loc_check_direntry_extension
   952                              <1> 
   953                              <1> pass_fde_ambiguous1_check:
   954 0000AA5B 3C3F                <1> 	cmp	al, '?'
   955 0000AA5D 750D                <1> 	jne	short pass_fde_ambiguous2_check
   956 0000AA5F FE05[42810100]      <1> 	inc	byte [AmbiguousFileName]
   957 0000AA65 803F20              <1> 	cmp	byte [edi], 20h
   958 0000AA68 763E                <1> 	jna	short loc_find_dir_next_entry_ebp
   959 0000AA6A EB0F                <1> 	jmp	short loc_scasb_find_dir_inc_di
   960                              <1> 
   961                              <1> pass_fde_ambiguous2_check:
   962 0000AA6C 3C20                <1> 	cmp	al, 20h
   963 0000AA6E 7507                <1> 	jne	short loc_scasb_find_dir
   964 0000AA70 803F20              <1> 	cmp	byte [edi], 20h
   965 0000AA73 7533                <1> 	jne	short loc_find_dir_next_entry_ebp
   966 0000AA75 EB07                <1> 	jmp	short loc_check_direntry_extension
   967                              <1> 
   968                              <1> loc_scasb_find_dir:
   969 0000AA77 3A07                <1> 	cmp	al, [edi]
   970 0000AA79 752D                <1> 	jne	short loc_find_dir_next_entry_ebp
   971                              <1> loc_scasb_find_dir_inc_di:
   972 0000AA7B 47                  <1> 	inc	edi
   973 0000AA7C E2D0                <1> 	loop	loc_lodsb_find_dir
   974                              <1> 
   975                              <1> loc_check_direntry_extension:
   976 0000AA7E BE08000000          <1> 	mov	esi, 8
   977 0000AA83 89F7                <1> 	mov	edi, esi ; 8
   978 0000AA85 033424              <1> 	add	esi, [esp] ; Sub Dir or File Name Address
   979 0000AA88 01EF                <1> 	add	edi, ebp
   980 0000AA8A B103                <1> 	mov	cl, 3
   981                              <1> loc_lodsb_find_dir_ext:
   982 0000AA8C AC                  <1> 	lodsb
   983 0000AA8D 3C2A                <1> 	cmp	al, '*'
   984 0000AA8F 7508                <1> 	jne	short pass_fde_ambiguous3_check
   985 0000AA91 FE05[43810100]      <1> 	inc	byte [AmbiguousFileName+1]
   986 0000AA97 EB1F                <1> 	jmp	short loc_find_dir_proper_direntry
   987                              <1> 
   988                              <1> pass_fde_ambiguous3_check:
   989 0000AA99 3C3F                <1> 	cmp	al, '?'
   990 0000AA9B 7512                <1> 	jne	short pass_fde_ambiguous4_check
   991 0000AA9D FE05[42810100]      <1> 	inc	byte [AmbiguousFileName]
   992 0000AAA3 803F20              <1> 	cmp	byte [edi], 20h
   993                              <1> 	;jna	short loc_find_dir_next_entry_ebp
   994                              <1> 	;jmp	short loc_scasb_find_dir_ext_inc_di
   995                              <1> 	; 28/07/2022
   996 0000AAA6 7732                <1> 	ja	short loc_scasb_find_dir_ext_inc_di 
   997                              <1> 
   998                              <1> loc_find_dir_next_entry_ebp:
   999 0000AAA8 89EF                <1> 	mov	edi, ebp ; 14/02/2016
  1000 0000AAAA E93DFFFFFF          <1> 	jmp	loc_find_dir_next_entry ; 28/07/2022
  1001                              <1> 
  1002                              <1> pass_fde_ambiguous4_check:
  1003 0000AAAF 3C20                <1> 	cmp	al, 20h
  1004 0000AAB1 7523                <1> 	jne	short loc_scasb_find_dir_ext
  1005 0000AAB3 803F20              <1> 	cmp	byte [edi], 20h
  1006                              <1> 	; 28/07/2022
  1007 0000AAB6 75F0                <1> 	jne	short loc_find_dir_next_entry_ebp
  1008                              <1> 	;jmp	short loc_find_dir_proper_direntry
  1009                              <1> 
  1010                              <1> loc_find_dir_proper_direntry:
  1011 0000AAB8 30C9                <1> 	xor	cl, cl
  1012                              <1> loc_find_dir_proper_direntry_1:
  1013 0000AABA 5E                  <1> 	pop	esi
  1014 0000AABB 89EF                <1>         mov     edi, ebp
  1015 0000AABD 8A2F                <1> 	mov	ch, [edi]
  1016 0000AABF 8A570B              <1> 	mov     dl, [edi+0Bh] ; Dir entry attributes
  1017 0000AAC2 66A1[42810100]      <1> 	mov	ax, [AmbiguousFileName]
  1018                              <1> loc_find_dir_proper_direntry_2:
  1019 0000AAC8 8A35[44810100]      <1> 	mov     dh, [PreviousAttr]
  1020 0000AACE 66891D[72800100]    <1> 	mov	[DirBuff_CurrentEntry], bx
  1021 0000AAD5 C3                  <1> 	retn
  1022                              <1> 
  1023                              <1> loc_scasb_find_dir_ext:
  1024 0000AAD6 3A07                <1> 	cmp	al, [edi]
  1025 0000AAD8 75CE                <1> 	jne	short loc_find_dir_next_entry_ebp
  1026                              <1> loc_scasb_find_dir_ext_inc_di:
  1027 0000AADA 47                  <1> 	inc	edi
  1028 0000AADB E2AF                <1> 	loop    loc_lodsb_find_dir_ext
  1029 0000AADD EBDB                <1> 	jmp	short loc_find_dir_proper_direntry_1
  1030                              <1> 
  1031                              <1> loc_find_free_deleted_entry_0:
  1032 0000AADF 66A1[40810100]      <1> 	mov	ax, [FDE_AttrMask]
  1033 0000AAE5 8A2F                <1> 	mov	ch, [edi]
  1034 0000AAE7 8A570B              <1> 	mov	dl, [edi+0Bh] ; File attributes
  1035 0000AAEA 08C9                <1> 	or	cl, cl 
  1036 0000AAEC 7407                <1> 	jz	short loc_check_ffde_0_repeat
  1037                              <1> 	;cmp	cl, 0E5h
  1038                              <1> 	;je	short pass_loc_check_ffde_0_err
  1039 0000AAEE 80F9FF              <1> 	cmp	cl, 0FFh
  1040 0000AAF1 7430                <1> 	je	short loc_find_free_deleted_entry_1
  1041 0000AAF3 EB4A                <1> 	jmp	short pass_loc_check_ffde_0_err
  1042                              <1> 
  1043                              <1> loc_check_ffde_0_repeat:
  1044 0000AAF5 08ED                <1> 	or	ch, ch
  1045 0000AAF7 7510                <1> 	jnz	short loc_check_ffde_0_next
  1046                              <1> 
  1047                              <1> loc_check_ffde_retn_2:
  1048                              <1> 	;sub	ax, ax
  1049                              <1> 	; 28/07/2022
  1050 0000AAF9 29C0                <1> 	sub	eax, eax
  1051 0000AAFB 8A35[44810100]      <1> 	mov	dh, [PreviousAttr]
  1052 0000AB01 66891D[72800100]    <1> 	mov	[DirBuff_CurrentEntry], bx
  1053 0000AB08 C3                  <1> 	retn
  1054                              <1>  
  1055                              <1> loc_check_ffde_0_next:
  1056                              <1> 	;inc	bx
  1057                              <1> 	; 28/07/2022
  1058 0000AB09 43                  <1> 	inc	ebx
  1059 0000AB0A 83C720              <1> 	add	edi, 32
  1060                              <1> 	;inc	word [DirBuff_EntryCounter]
  1061                              <1> 	 
  1062 0000AB0D 663B1D[74800100]    <1>         cmp	bx, [DirBuff_LastEntry]
  1063                              <1> 	;ja	short loc_ffde_stc_retn_255
  1064                              <1> 	; 07/08/2022
  1065 0000AB14 773A                <1> 	ja	short jmp_ffde_stc_retn_255
  1066                              <1> 
  1067 0000AB16 8815[44810100]      <1> 	mov	[PreviousAttr], dl
  1068 0000AB1C 8A2F                <1> 	mov	ch, [edi]
  1069 0000AB1E 8A570B              <1> 	mov	dl, [edi+0Bh] ; file attributes
  1070 0000AB21 EBD2                <1> 	jmp	short loc_check_ffde_0_repeat
  1071                              <1> 
  1072                              <1> loc_find_free_deleted_entry_1:
  1073 0000AB23 28D2                <1> 	sub	dl, dl      
  1074                              <1> loc_find_free_deleted_entry_2:
  1075 0000AB25 20ED                <1> 	and	ch, ch  
  1076 0000AB27 74D0                <1> 	jz	short loc_check_ffde_retn_2
  1077 0000AB29 80FDE5              <1> 	cmp	ch, 0E5h
  1078 0000AB2C 74CB                <1> 	je	short loc_check_ffde_retn_2
  1079                              <1> 	;inc	bx
  1080                              <1> 	; 28/07/2022
  1081 0000AB2E 43                  <1> 	inc	ebx
  1082 0000AB2F 83C720              <1> 	add	edi, 32
  1083 0000AB32 663B1D[74800100]    <1> 	cmp	bx, [DirBuff_LastEntry]
  1084                              <1> 	;ja	short loc_ffde_stc_retn_255
  1085                              <1> 	; 07/08/2022
  1086 0000AB39 7715                <1> 	ja	short jmp_ffde_stc_retn_255
  1087                              <1> 
  1088 0000AB3B 8A2F                <1> 	mov	ch, [edi]
  1089 0000AB3D EBE6                <1> 	jmp	short loc_find_free_deleted_entry_2
  1090                              <1> 
  1091                              <1> pass_loc_check_ffde_0_err:
  1092 0000AB3F 38CD                <1> 	cmp	ch, cl
  1093 0000AB41 741F                <1> 	je	short loc_check_ffde_attrib 
  1094                              <1> 
  1095                              <1> 	;inc	bx
  1096                              <1> 	; 28/07/2022
  1097 0000AB43 43                  <1> 	inc	ebx
  1098 0000AB44 83C720              <1> 	add	edi, 32
  1099 0000AB47 663B1D[74800100]    <1> 	cmp	bx, [DirBuff_LastEntry]
  1100                              <1>         ;ja	loc_ffde_stc_retn_255
  1101                              <1> 	; 28/07/2022
  1102 0000AB4E 7605                <1> 	jna	short loc_ffe_save_prev_attr
  1103                              <1> jmp_ffde_stc_retn_255:	; 07/08/2022
  1104 0000AB50 E97DFEFFFF          <1> 	jmp	loc_ffde_stc_retn_255
  1105                              <1> 
  1106                              <1> loc_ffe_save_prev_attr: ; 28/07/2022
  1107 0000AB55 8815[44810100]      <1> 	mov	[PreviousAttr], dl
  1108 0000AB5B 8A2F                <1> 	mov	ch, [edi]
  1109 0000AB5D 8A570B              <1> 	mov	dl, [edi+0Bh]
  1110 0000AB60 EBDD                <1> 	jmp	short pass_loc_check_ffde_0_err
  1111                              <1> 
  1112                              <1> loc_check_ffde_attrib:
  1113 0000AB62 88C6                <1> 	mov	dh, al
  1114 0000AB64 20D6                <1> 	and	dh, dl    
  1115 0000AB66 38F0                <1> 	cmp	al, dh
  1116 0000AB68 759F                <1> 	jne	short loc_check_ffde_0_next
  1117 0000AB6A 20D4                <1> 	and	ah, dl
  1118 0000AB6C 759B                <1> 	jnz	short loc_check_ffde_0_next
  1119 0000AB6E 30C9                <1> 	xor	cl, cl 
  1120 0000AB70 EB87                <1>         jmp	short loc_check_ffde_retn_2
  1121                              <1> 
  1122                              <1> convert_file_name:
  1123                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  1124                              <1> 	; 06/03/2016
  1125                              <1> 	; 11/02/2016
  1126                              <1> 	; 07/02/2016 (TRDOS 386 = TRDOS v2.0)
  1127                              <1> 	; 06/10/2009
  1128                              <1> 	; 2005
  1129                              <1> 	;
  1130                              <1> 	; INPUT  ->
  1131                              <1> 	;	ESI = Dot File Name Location
  1132                              <1> 	;	EDI = Dir Entry Format File Name Location
  1133                              <1> 	; OUTPUT ->
  1134                              <1> 	;	EDI = Dir Entry Format File Name Location
  1135                              <1> 	;	ESI = Dot File Name Location (capitalized)
  1136                              <1> 	;
  1137                              <1> 	; (ECX, AL will be changed) 
  1138                              <1>      
  1139 0000AB72 56                  <1> 	push	esi  
  1140 0000AB73 57                  <1> 	push	edi
  1141                              <1> 
  1142                              <1> 	;mov	ecx, 11
  1143                              <1> 	; 29/07 2022
  1144 0000AB74 29C9                <1> 	sub	ecx, ecx
  1145 0000AB76 B10B                <1> 	mov	cl, 11
  1146 0000AB78 B020                <1> 	mov	al, 20h
  1147 0000AB7A F3AA                <1> 	rep	stosb
  1148                              <1> 
  1149 0000AB7C 8B3C24              <1> 	mov	edi, [esp]
  1150                              <1> 
  1151 0000AB7F B10C                <1> 	mov	cl, 12 ; file name length (max.)
  1152                              <1> 	; 06/03/2016
  1153                              <1> 	; Directory entry name limit (11 bytes) check for
  1154                              <1> 	; 'rename_directory_entry' procedure.
  1155                              <1> 	; (EDI points to Directory Entry)
  1156                              <1> 	; (If the file name would not contain a dot
  1157                              <1> 	; and file name length would be 12, this would cause to
  1158                              <1> 	; overwrite the attributes byte of the directory entry.)
  1159                              <1> 	;
  1160 0000AB81 B50B                <1> 	mov	ch, 11 ; directory entry's name length
  1161                              <1> loc_check_first_dot:
  1162 0000AB83 8A06                <1> 	mov	al, [esi]
  1163 0000AB85 3C2E                <1> 	cmp	al, 2Eh
  1164 0000AB87 750C                <1> 	jne	short pass_check_first_dot
  1165 0000AB89 8807                <1> 	mov	[edi], al
  1166 0000AB8B 47                  <1> 	inc	edi
  1167 0000AB8C 46                  <1> 	inc	esi
  1168 0000AB8D FEC9                <1> 	dec	cl
  1169 0000AB8F 75F2                <1> 	jnz	short loc_check_first_dot
  1170                              <1> 	;;(ecx <= 12)
  1171                              <1> 	;;loop	loc_check_first_dot 
  1172 0000AB91 EB30                <1> 	jmp	short stop_convert_file
  1173                              <1> 
  1174                              <1> loc_get_fchar:
  1175 0000AB93 8A06                <1> 	mov	al, [esi]
  1176                              <1> pass_check_first_dot:
  1177 0000AB95 3C61                <1> 	cmp	al, 61h ; 'a'
  1178 0000AB97 7208                <1> 	jb	short pass_name_capitalize
  1179 0000AB99 3C7A                <1> 	cmp	al, 7Ah ; 'z'
  1180 0000AB9B 7704                <1> 	ja	short pass_name_capitalize
  1181 0000AB9D 24DF                <1> 	and	al, 0DFh
  1182 0000AB9F 8806                <1> 	mov	[esi], al
  1183                              <1> pass_name_capitalize:
  1184 0000ABA1 3C21                <1> 	cmp	al, 21h
  1185 0000ABA3 721E                <1> 	jb	short stop_convert_file
  1186 0000ABA5 3C2E                <1> 	cmp	al, 2Eh ; '.'
  1187 0000ABA7 750C                <1> 	jne	short pass_dot_space
  1188                              <1> add_dot_space: 
  1189 0000ABA9 80F904              <1> 	cmp	cl, 4
  1190 0000ABAC 760E                <1> 	jna	short inc_and_loop
  1191 0000ABAE 47                  <1> 	inc	edi
  1192 0000ABAF FECD                <1> 	dec	ch ; 06/03/2016
  1193 0000ABB1 FEC9                <1> 	dec	cl
  1194 0000ABB3 EBF4                <1> 	jmp	short add_dot_space
  1195                              <1> 	
  1196                              <1> 	;mov	al, 4
  1197                              <1> 	;cmp	cl, al
  1198                              <1> 	;jna	short inc_and_loop
  1199                              <1> 	;sub	cl, al
  1200                              <1> 	;add	edi, ecx
  1201                              <1> 	;mov	cl, al
  1202                              <1> 	;jmp	short inc_and_loop	
  1203                              <1> 
  1204                              <1> pass_dot_space:
  1205 0000ABB5 8807                <1> 	mov	[edi], al
  1206                              <1> loc_after_double_dot:
  1207                              <1> 	; 06/03/2016
  1208 0000ABB7 FECD                <1> 	dec	ch ; count down for 11 bytes dir entry limit
  1209 0000ABB9 740A                <1> 	jz	short stop_convert_file_x
  1210 0000ABBB 47                  <1> 	inc	edi
  1211                              <1> inc_and_loop:
  1212 0000ABBC FEC9                <1> 	dec	cl ; count down for 12 bytes filename limit 
  1213 0000ABBE 7403                <1> 	jz	short stop_convert_file	
  1214 0000ABC0 46                  <1> 	inc	esi
  1215                              <1> 	;;(ecx <= 12)
  1216                              <1> 	;;loop	loc_get_fchar
  1217 0000ABC1 EBD0                <1> 	jmp	short loc_get_fchar
  1218                              <1> 
  1219                              <1> stop_convert_file:
  1220                              <1> 	; 06/03/2016
  1221 0000ABC3 30ED                <1> 	xor	ch, ch
  1222                              <1> 	; ECX < 256 ; 'find_first_file' -> xor cl, cl
  1223                              <1> stop_convert_file_x:
  1224 0000ABC5 5F                  <1> 	pop	edi
  1225 0000ABC6 5E                  <1> 	pop	esi
  1226 0000ABC7 C3                  <1> 	retn
  1227                              <1>  
  1228                              <1> save_longname_sub_component:
  1229                              <1> 	; 13/02/2016
  1230                              <1> 	; 06/02/2016 (TRDOS 386 = TRDOS v2.0)
  1231                              <1> 	; 28/02/2010
  1232                              <1> 	; 17/10/2009
  1233                              <1> 	; INPUT ->
  1234                              <1> 	;	EDI = Directory Entry    
  1235                              <1> 	;     	// This procedure is called
  1236                              <1> 	;	// from 'find_directory_entry' procedure.
  1237                              <1> 	;	// If the last entry returns with
  1238                              <1> 	;	// a non-zero LongnameFound value and
  1239                              <1> 	;	// if LFN_CheckSum value is equal to
  1240                              <1> 	;	// the next shortname checksum,
  1241                              <1> 	;	// long name is valid.
  1242                              <1> 	;	// If a longname is longer than 65 bytes,
  1243                              <1> 	;	// it is invalid for trdos. (>45h)
  1244                              <1>  
  1245 0000ABC8 57                  <1> 	push	edi
  1246 0000ABC9 56                  <1> 	push	esi
  1247                              <1> 	;push	ebx
  1248                              <1> 	;push	ecx
  1249                              <1> 	;push	edx
  1250 0000ABCA 50                  <1> 	push	eax
  1251                              <1>            
  1252 0000ABCB 29C9                <1> 	sub	ecx, ecx
  1253                              <1> 	;sub	eax, eax
  1254 0000ABCD B11A                <1> 	mov	cl, 26
  1255                              <1> 
  1256 0000ABCF 0FB607              <1> 	movzx	eax, byte [edi] ; LDIR_Order
  1257 0000ABD2 3C41                <1> 	cmp	al, 41h  ; 40h (last long entry sign) + 1
  1258 0000ABD4 722B                <1> 	jb	short pass_pslnsc_last_long_entry
  1259                              <1> 
  1260 0000ABD6 88C4                <1> 	mov	ah, al
  1261 0000ABD8 80EC40              <1> 	sub	ah, 40h
  1262 0000ABDB 8825[46810100]      <1> 	mov	[LFN_EntryLength], ah
  1263                              <1> 	
  1264 0000ABE1 3C45                <1> 	cmp	al, 45h  ; 40h (last long entry sign) + 5
  1265                              <1>  		; Max 130 byte length is usable in TRDOS
  1266                              <1> ; 26*5 = 130
  1267 0000ABE3 7753                <1> 	ja	short loc_pslnsc_retn
  1268                              <1> 
  1269 0000ABE5 2407                <1> 	and	al, 07h ; 0Fh
  1270 0000ABE7 A2[45810100]        <1> 	mov	[LongNameFound], al
  1271                              <1> 
  1272 0000ABEC FEC8                <1> 	dec	al
  1273                              <1> 	;mov	cl, 26
  1274 0000ABEE F6E1                <1> 	mul	cl
  1275                              <1> 
  1276 0000ABF0 89C6                <1> 	mov	esi, eax
  1277 0000ABF2 01CE                <1> 	add	esi, ecx
  1278                              <1> 		; to make is an ASCIIZ string
  1279                              <1> 		; with ax+26 bytes length
  1280 0000ABF4 81C6[48810100]      <1> 	add	esi, LongFileName
  1281 0000ABFA 66C7060000          <1> 	mov	word [esi], 0   
  1282 0000ABFF EB16                <1> 	jmp	short loc_pslsc_move_ldir_name2 
  1283                              <1> 
  1284                              <1> pass_pslnsc_last_long_entry:
  1285 0000AC01 3C04                <1> 	cmp	al, 04h
  1286 0000AC03 7733                <1> 	ja	short loc_pslnsc_retn
  1287 0000AC05 FE0D[45810100]      <1> 	dec	byte [LongNameFound]
  1288 0000AC0B 3A05[45810100]      <1> 	cmp	al, [LongNameFound]
  1289 0000AC11 7525                <1> 	jne	short loc_pslnsc_retn
  1290                              <1> 
  1291                              <1> loc_pslsc_move_ldir_name1:
  1292 0000AC13 FEC8                <1> 	dec	al
  1293                              <1> 	;mov	cl, 26
  1294 0000AC15 F6E1                <1> 	mul	cl
  1295                              <1> 
  1296                              <1> loc_pslsc_move_ldir_name2:
  1297 0000AC17 8A4F0D              <1> 	mov	cl, [edi+0Dh] ; long name checksum
  1298 0000AC1A 880D[47810100]      <1> 	mov	[LFN_CheckSum], cl 
  1299 0000AC20 89FE                <1> 	mov	esi, edi ; LDIR_Order
  1300 0000AC22 BF[48810100]        <1> 	mov	edi, LongFileName
  1301 0000AC27 01C7                <1> 	add	edi, eax
  1302 0000AC29 46                  <1> 	inc	esi
  1303 0000AC2A B105                <1> 	mov	cl, 5 ; chars 1 to 5
  1304 0000AC2C F366A5              <1> 	rep	movsw
  1305 0000AC2F 83C603              <1> 	add	esi, 3
  1306 0000AC32 A5                  <1> 	movsd	; char 6 & 7 
  1307 0000AC33 A5                  <1> 	movsd	; char 8 & 9
  1308 0000AC34 A5                  <1> 	movsd	; char 10 & 11
  1309 0000AC35 46                  <1> 	inc	esi
  1310 0000AC36 46                  <1> 	inc	esi 
  1311 0000AC37 A5                  <1> 	movsd   ; char 12 & 13 
  1312                              <1> 
  1313                              <1> loc_pslnsc_retn:
  1314 0000AC38 58                  <1>  	pop	eax
  1315                              <1> 	;pop	edx
  1316                              <1> 	;pop	ecx
  1317                              <1> 	;pop	ebx
  1318 0000AC39 5E                  <1> 	pop	esi  
  1319 0000AC3A 5F                  <1> 	pop	edi
  1320                              <1>  
  1321 0000AC3B C3                  <1>     	retn
  1322                              <1> 
  1323                              <1> parse_path_name:
  1324                              <1> 	; 09/08/2022
  1325                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  1326                              <1> 	; 10/02/2016
  1327                              <1> 	; 08/02/2016 (TRDOS 386 = TRDOS v2.0)
  1328                              <1> 	; 10/009/2011 ('proc_parse_pathname')
  1329                              <1> 	; 27/11/2009
  1330                              <1> 	; 05/12/2004
  1331                              <1> 	;
  1332                              <1> 	; INPUT ->
  1333                              <1> 	;	ESI = Beginning of ASCIIZ pathname string
  1334                              <1> 	;       EDI = Destination Address
  1335                              <1> 	;	      (which is TR-DOS FindFile data buffer)
  1336                              <1> 	; OUTPUT ->
  1337                              <1> 	;	CF = 1 -> Error
  1338                              <1> 	;	     EAX = Error Code (AL)
  1339                              <1> 	;
  1340                              <1> 	; (Modified registers: eax, ecx, esi, edi) 
  1341                              <1> 	
  1342                              <1> 	; Clear the pathname bytes in TR-DOS Findfile data buffer 
  1343 0000AC3C 57                  <1> 	push	edi
  1344                              <1> 	;mov	ecx, 20  ; 80 bytes
  1345                              <1> 	; 29/07/2022
  1346 0000AC3D 29C9                <1> 	sub	ecx, ecx
  1347 0000AC3F B114                <1> 	mov	cl, 20
  1348 0000AC41 31C0                <1> 	xor	eax, eax
  1349 0000AC43 F3AB                <1> 	rep	stosd 
  1350 0000AC45 5F                  <1> 	pop	edi
  1351                              <1> 
  1352 0000AC46 668B06              <1> 	mov	ax, [esi]
  1353 0000AC49 80FC3A              <1> 	cmp	ah, ':'
  1354 0000AC4C 741C                <1> 	je	short loc_ppn_change_drive
  1355 0000AC4E A0[4A790100]        <1> 	mov	al, [Current_Drv]
  1356 0000AC53 EB33                <1> 	jmp	short pass_ppn_change_drive
  1357                              <1> 
  1358                              <1> pass_ppn_cdir:
  1359 0000AC55 8B35[6A820100]      <1> 	mov	esi, [First_Path_Pos]
  1360 0000AC5B AC                  <1> 	lodsb
  1361                              <1> loc_ppn_get_filename:
  1362 0000AC5C 83C741              <1> 	add	edi, 65 ; FindFile_Name location
  1363                              <1> 	; TRDOS Filename length must not be more than 12 bytes
  1364                              <1> 	;mov	ecx, 12
  1365 0000AC5F B10C                <1> 	mov	cl, 12
  1366                              <1> loc_ppn_get_fnchar_next:
  1367 0000AC61 AA                  <1> 	stosb
  1368 0000AC62 AC                  <1> 	lodsb
  1369 0000AC63 3C21                <1> 	cmp	al, 21h
  1370 0000AC65 726F                <1> 	jb	short loc_ppn_clc_return 
  1371 0000AC67 E2F8                <1>         loop    loc_ppn_get_fnchar_next
  1372                              <1> loc_ppn_return:
  1373 0000AC69 C3                  <1> 	retn
  1374                              <1> 
  1375                              <1> loc_ppn_change_drive:
  1376                              <1> 	; 29/07/2022
  1377                              <1> 	; ecx = 0
  1378 0000AC6A 24DF                <1> 	and	al, 0DFh
  1379 0000AC6C 2C41                <1> 	sub	al, 'A'; A:
  1380 0000AC6E 726A                <1> 	jc	short loc_ppn_invalid_drive
  1381 0000AC70 3805[BC300100]      <1> 	cmp	[Last_DOS_DiskNo], al
  1382 0000AC76 7262                <1> 	jb	short loc_ppn_invalid_drive
  1383                              <1> 
  1384 0000AC78 46                  <1> 	inc	esi
  1385 0000AC79 46                  <1> 	inc	esi
  1386 0000AC7A 8A26                <1> 	mov	ah, [esi]
  1387 0000AC7C 80FC21              <1> 	cmp	ah, 21h
  1388 0000AC7F 7307                <1> 	jnb	short pass_ppn_change_drive
  1389                              <1> 
  1390                              <1> loc_ppn_cmd_failed:
  1391                              <1> 	; File or directory name is not existing
  1392 0000AC81 8807                <1> 	mov	[edi], al ; Drv 
  1393 0000AC83 66B80100            <1> 	mov	ax, 1 ; eax = 1
  1394                              <1> 	; TR-DOS Error Code 01h = Bad Command Argument
  1395                              <1> 	; MS-DOS Error Code 01h : Invalid Function Number
  1396                              <1> 	;stc
  1397                              <1> 	; (MainProg ErrMsg: "Bad command or file name!")
  1398 0000AC87 C3                  <1> 	retn
  1399                              <1> 
  1400                              <1> pass_ppn_change_drive:
  1401 0000AC88 8935[6A820100]      <1> 	mov	[First_Path_Pos], esi
  1402                              <1> 	;mov	dword [Last_Slash_Pos], 0
  1403                              <1> 	; 29/07/2022
  1404 0000AC8E 890D[6E820100]      <1> 	mov	[Last_Slash_Pos], ecx ; 0
  1405 0000AC94 AA                  <1> 	stosb
  1406 0000AC95 8A06                <1> 	mov	al, [esi]
  1407                              <1> loc_scan_ppn_dslash:
  1408 0000AC97 3C2F                <1> 	cmp	al, '/'
  1409 0000AC99 7506                <1>   	jne	short loc_scan_next_slash_pos
  1410 0000AC9B 8935[6E820100]      <1> 	mov	[Last_Slash_Pos], esi
  1411                              <1> loc_scan_next_slash_pos:
  1412 0000ACA1 46                  <1> 	inc	esi
  1413 0000ACA2 8A06                <1> 	mov	al, [esi]
  1414 0000ACA4 3C20                <1> 	cmp	al, 20h
  1415 0000ACA6 77EF                <1> 	ja	short loc_scan_ppn_dslash
  1416                              <1> 	;cmp	dword [Last_Slash_Pos], 0
  1417                              <1> 	; 09/08/2022
  1418 0000ACA8 390D[6E820100]      <1> 	cmp	[Last_Slash_Pos], ecx ; 0 ?
  1419 0000ACAE 76A5                <1> 	jna	short pass_ppn_cdir
  1420                              <1> 	
  1421 0000ACB0 8B0D[6E820100]      <1> 	mov	ecx, [Last_Slash_Pos]
  1422 0000ACB6 8B35[6A820100]      <1> 	mov	esi, [First_Path_Pos]
  1423 0000ACBC 29F1                <1> 	sub	ecx, esi
  1424 0000ACBE 41                  <1> 	inc	ecx
  1425                              <1> 	;cmp	ecx, 64
  1426 0000ACBF 80F940              <1> 	cmp	cl, 64
  1427 0000ACC2 7715                <1> 	ja	short loc_ppn_invalid_drive_stc
  1428                              <1> 
  1429 0000ACC4 89F8                <1> 	mov	eax, edi ; Dest Dir String Location (65 byte)
  1430 0000ACC6 F3A4                <1> 	rep	movsb
  1431                              <1> 	;mov	[edi], cl ; 0, End of Dir String
  1432 0000ACC8 8B35[6E820100]      <1> 	mov	esi, [Last_Slash_Pos]
  1433 0000ACCE 46                  <1> 	inc	esi
  1434 0000ACCF 89C7                <1> 	mov	edi, eax
  1435 0000ACD1 AC                  <1> 	lodsb
  1436 0000ACD2 3C21                <1> 	cmp	al, 21h
  1437 0000ACD4 7386                <1> 	jnb	short loc_ppn_get_filename
  1438                              <1> loc_ppn_clc_return:
  1439                              <1> 	;clc
  1440 0000ACD6 31C0                <1> 	xor	eax, eax
  1441 0000ACD8 C3                  <1> 	retn
  1442                              <1> 
  1443                              <1> loc_ppn_invalid_drive_stc:
  1444 0000ACD9 F5                  <1> 	cmc	 ; stc
  1445                              <1> loc_ppn_invalid_drive:
  1446                              <1> 	; cf = 1
  1447                              <1> 	; The Drive Letter/Char < "A" or > "Z"
  1448 0000ACDA 66B80F00            <1> 	mov	ax, 0Fh
  1449                              <1> 	; MS-DOS Error Code 0Fh = Disk Drive Invalid 
  1450                              <1> 	; (MainProg ErrMsg: "Drive not ready or read error!")
  1451 0000ACDE C3                  <1> 	retn
  1452                              <1> 
  1453                              <1> find_longname:
  1454                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  1455                              <1> 	; 13/02/2016 (TRDOS 386 = TRDOS v2.0)
  1456                              <1> 	; 24/01/2010 (DIR.ASM, 'proc_find_longname')
  1457                              <1> 	; 17/10/2009
  1458                              <1> 	
  1459                              <1> 	; INPUT -> 
  1460                              <1> 	;	ESI = DOS short file name address
  1461                              <1> 	; 	for example: "filename.ext"
  1462                              <1> 	;
  1463                              <1> 	; OUTPUT ->
  1464                              <1> 	; 	ESI = ASCIIZ longname address (cf = 0)
  1465                              <1> 	;	cf = 1 -> error number returns in EAX (AL)
  1466                              <1> 	;	AL = 0 & CF=1 -> longname not found
  1467                              <1> 	;	     the file/directory has no longname
  1468                              <1> 	; 	cf = 0 -> AL = FAT Type 
  1469                              <1>  
  1470                              <1> 	; 17/10/2009
  1471                              <1> 	; ASCIIZ string will be returned
  1472                              <1> 	; as LongFileName
  1473                              <1> 	; clearing/reset is not needed
  1474                              <1> 	;mov	ecx, 33
  1475                              <1> 	;mov	edi, LongFileName
  1476                              <1> 	;sub	ax, ax ; 0
  1477                              <1> 	;rep	stosw
  1478                              <1> 
  1479                              <1> 	;mov	byte [LongNameFound], 0
  1480                              <1> 
  1481                              <1> 	; ESI = ASCIIZ file/directory name address
  1482                              <1> 	;   AL = Attributes AND mask 
  1483                              <1> 	;	(Result of AND must be equal to AL)
  1484                              <1> 	;   AH = Negative attributes mask 
  1485                              <1> 	;	(Result of AND must be ZERO)
  1486 0000ACDF 66B80008            <1> 	mov	ax, 0800h 
  1487                              <1> 		; it must not be volume name or longname
  1488 0000ACE3 E890DEFFFF          <1> 	call	find_first_file
  1489 0000ACE8 7212                <1> 	jc	short loc_fln_retn
  1490                              <1>  
  1491                              <1> loc_fln_check_FAT_Type:
  1492 0000ACEA 803D[49790100]01    <1> 	cmp	byte [Current_FATType], 1
  1493 0000ACF1 7302                <1> 	jnb	short loc_fln_check_longname_yes_sign
  1494                              <1> 
  1495                              <1> 	;call	get_fs_longname
  1496                              <1> 	;retn
  1497                              <1> 	; 29/07/2022
  1498 0000ACF3 EB37                <1> 	jmp	get_fs_longname
  1499                              <1> 
  1500                              <1> loc_fln_check_longname_yes_sign:
  1501 0000ACF5 08FF                <1> 	or	bh, bh
  1502 0000ACF7 7504                <1> 	jnz	short loc_fln_check_longnamefound_number
  1503                              <1> loc_fln_longname_not_found_retn:
  1504 0000ACF9 31C0                <1> 	xor	eax, eax 
  1505                              <1> 	; cf = 1 & al = 0 -> longname not found
  1506 0000ACFB F9                  <1> 	stc
  1507                              <1> loc_fln_retn:
  1508 0000ACFC C3                  <1> 	retn
  1509                              <1> 
  1510                              <1> loc_fln_check_longnamefound_number:
  1511                              <1> 	; 'LongNameFound' is set by
  1512                              <1>         ; by 'save_longname_sub_component'
  1513                              <1> 	; which is called from
  1514                              <1> 	; 'find_directory_entry' 
  1515                              <1> 	; which is called from 
  1516                              <1> 	; 'find_first_file'
  1517                              <1> 	; It must 1 if the longname is valid
  1518 0000ACFD 803D[45810100]01    <1>         cmp     byte [LongNameFound], 1
  1519 0000AD04 75F3                <1> 	jne	short loc_fln_longname_not_found_retn
  1520                              <1>              
  1521                              <1> loc_fln_calculate_checksum: 
  1522 0000AD06 E813000000          <1> 	call	calculate_checksum
  1523                              <1> 	; AL = shortname checksum
  1524                              <1> 
  1525                              <1> loc_fln_longname_validation:
  1526                              <1> 	; 'LFN_CheckSum' has been set already
  1527                              <1> 	; by 'save_longname_sub_component'
  1528                              <1> 	; which is called from
  1529                              <1> 	; 'find_directory_entry' 
  1530                              <1> 	; which is called from 
  1531                              <1> 	; 'find_first_file'
  1532 0000AD0B 3805[47810100]      <1> 	cmp	[LFN_CheckSum], al
  1533 0000AD11 75E6                <1> 	jne	short loc_fln_longname_not_found_retn
  1534                              <1> 
  1535 0000AD13 BE[48810100]        <1> 	mov	esi, LongFileName
  1536 0000AD18 A0[49790100]        <1> 	mov	al, [Current_FATType]
  1537 0000AD1D C3                  <1> 	retn
  1538                              <1> 
  1539                              <1> calculate_checksum:
  1540                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  1541                              <1> 	; 13/02/2016 (TRDOS 386 = TRDOS v2.0)
  1542                              <1> 	; 17/10/2009 (DIR.ASM, 'proc_calculate_checksum')
  1543                              <1>         ;    
  1544                              <1> 	; INPUT ->
  1545                              <1> 	;	ESI = 11 byte DOS File Name location
  1546                              <1> 	;	(in DOS Directory Entry Format)
  1547                              <1> 	; OUTPUT ->
  1548                              <1> 	;	 AL = 8 bit checksum (CRC) value
  1549                              <1> 	;
  1550                              <1> 	; (Modified registers: EAX, ECX, ESI)
  1551                              <1> 
  1552                              <1> 	; Erdogan Tan [ 17-10-2009 ]
  1553                              <1> 	;  'ror al, 1' instruction
  1554                              <1> 
  1555                              <1> 	; Erdogan Tan [ 20-06-2004 ]
  1556                              <1> 	; This 8086 assembly code is an original code
  1557                              <1> 	; which is adapted from C code in
  1558                              <1> 	; Microsoft FAT32 File System Specification
  1559                              <1> 	; Version 1.03, December 6, 2000
  1560                              <1> 	; Page 28
  1561                              <1> 
  1562 0000AD1E 30C0                <1> 	xor	al, al
  1563                              <1> 	;mov	ecx, 11
  1564                              <1> 	; 29/07/2022
  1565 0000AD20 29C9                <1> 	sub	ecx, ecx
  1566 0000AD22 B10B                <1> 	mov	cl, 11
  1567                              <1> loc_next_sum:
  1568                              <1> 	;xor	ah, ah
  1569                              <1> 	;test	al, 1
  1570                              <1> 	;jz	short pass_ah_80h
  1571                              <1> 	;mov	ah, 80h
  1572                              <1> ;pass_ah_80h:
  1573                              <1> 	;shr	al, 1
  1574 0000AD24 D0C8                <1> 	ror	al, 1 ; 17/10/2009  
  1575 0000AD26 0206                <1> 	add	al, [esi]
  1576 0000AD28 46                  <1> 	inc	esi
  1577                              <1> 	;add	al, ah
  1578 0000AD29 E2F9                <1> 	loop	loc_next_sum
  1579 0000AD2B C3                  <1> 	retn
  1580                              <1> 
  1581                              <1> get_fs_longname:
  1582                              <1> 	; temporary (13/02/2016)
  1583 0000AD2C 31C0                <1> 	xor	eax, eax
  1584 0000AD2E F9                  <1> 	stc
  1585 0000AD2F C3                  <1> 	retn
  1586                              <1> 
  1587                              <1> make_sub_directory:
  1588                              <1> 	; 07/08/2022
  1589                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  1590                              <1> 	; 16/10/2016
  1591                              <1> 	; 02/03/2016, 03/03/2016
  1592                              <1> 	; 26/02/2016, 27/02/2016
  1593                              <1> 	; 21/02/2016 (TRDOS 386 = TRDOS v2.0)
  1594                              <1> 	; 01/08/2011 (DIR.ASM, 'proc_make_directory')
  1595                              <1> 	; 10/07/2010
  1596                              <1> 	; INPUT ->
  1597                              <1> 	; 	ESI = ASCIIZ Directory Name
  1598                              <1> 	;	CL = Directory Attributes
  1599                              <1> 	; OUTPUT ->
  1600                              <1> 	;	EAX = New sub dir's first cluster
  1601                              <1> 	;	ESI = Logical Dos Drv Descr. Table Addr.
  1602                              <1> 	;	CF = 1 -> error code in AL (EAX)
  1603                              <1> 
  1604                              <1> 	;test	cl, 10h  ; directory
  1605                              <1> 	;jz	short loc_make_directory_access_denied
  1606                              <1> 	;test	cl, 08h ; volume name
  1607                              <1> 	;jnz	short loc_make_directory_access_denied
  1608                              <1> 
  1609 0000AD30 80E107              <1> 	and	cl, 07h
  1610 0000AD33 880D[C4820100]      <1> 	mov	byte [mkdir_attrib], cl
  1611                              <1> 
  1612 0000AD39 56                  <1> 	push	esi
  1613 0000AD3A 31DB                <1> 	xor	ebx, ebx
  1614 0000AD3C 8A3D[4A790100]      <1> 	mov	bh, [Current_Drv]
  1615 0000AD42 BE00010900          <1> 	mov	esi, Logical_DOSDisks
  1616 0000AD47 01DE                <1> 	add	esi, ebx
  1617 0000AD49 5B                  <1> 	pop	ebx
  1618                              <1> 
  1619                              <1> 	; 10/07/2010 -> 1st writable disk check for trdos
  1620                              <1> 	; LD_DiskType = 0 for write protection (read only) 
  1621 0000AD4A 807E0101            <1> 	cmp	byte [esi+LD_DiskType], 1 ; 0 = Invalid
  1622 0000AD4E 7308                <1> 	jnb	short loc_mkdir_check_file_sytem
  1623                              <1> 	; 16/10/2016 (13h -> 30)
  1624                              <1> 	;mov	eax, 30 ; 'Disk write-protected' error
  1625                              <1> 	;mov	edx, 0
  1626                              <1> 	; 29/07/2022
  1627 0000AD50 29C0                <1> 	sub	eax, eax
  1628 0000AD52 B01E                <1> 	mov	al, 30
  1629 0000AD54 29D2                <1> 	sub	edx, edx ; 0
  1630 0000AD56 F9                  <1> 	stc
  1631                              <1> 	; err retn: EDX = 0, EBX = Dir name offset
  1632                              <1> 	;ESI = Logical DOS drive description table address
  1633 0000AD57 C3                  <1> 	retn
  1634                              <1> 
  1635                              <1> ;loc_make_directory_access_denied:
  1636                              <1> 	;mov	ax, 05h ; access denied (invalid attributes input)
  1637                              <1> 	;stc
  1638                              <1> 	;retn
  1639                              <1> 
  1640                              <1> loc_mkdir_check_file_sytem:
  1641 0000AD58 807E0301            <1> 	cmp	byte [esi+LD_FATType], 1
  1642 0000AD5C 730A                <1> 	jnb	short loc_mkdir_check_free_sectors
  1643                              <1> 
  1644                              <1> loc_make_fs_directory:
  1645 0000AD5E A1[44790100]        <1> 	mov	eax, [Current_Dir_FCluster]
  1646                              <1> 	
  1647                              <1> 	; EAX = Parent directory DDT Address
  1648                              <1> 	; ESI = Logical DOS Drive DT Address
  1649                              <1> 	; EBX = Directory name offset (as ASCIIZ name)
  1650                              <1> 	
  1651                              <1> 	;call	make_fs_directory
  1652                              <1> 	;retn
  1653                              <1> 	; 29/07/2022
  1654 0000AD63 E986150000          <1> 	jmp	make_fs_directory  
  1655                              <1> 
  1656                              <1> loc_mkdir_check_free_sectors:
  1657 0000AD68 0FB64613            <1>         movzx   eax, byte [esi+LD_BPB+SecPerClust]
  1658 0000AD6C 8B4E74              <1> 	mov	ecx, [esi+LD_FreeSectors]
  1659 0000AD6F 39C1                <1> 	cmp	ecx, eax
  1660 0000AD71 7254                <1> 	jb	short loc_mkdir_insufficient_disk_space
  1661                              <1> 
  1662                              <1> loc_make_fat_directory:
  1663 0000AD73 891D[B4820100]      <1> 	mov	[mkdir_DirName_Offset], ebx
  1664 0000AD79 890D[C0820100]      <1> 	mov	[mkdir_FreeSectors], ecx
  1665                              <1> 
  1666                              <1> 	;mov	al, [esi+LD_BPB+SecPerClust]
  1667 0000AD7F A2[C6820100]        <1> 	mov	byte [mkdir_SecPerClust], al
  1668                              <1> 
  1669                              <1> loc_mkdir_gffc_1:
  1670 0000AD84 E888170000          <1> 	call	get_first_free_cluster
  1671 0000AD89 722A                <1> 	jc	short loc_mkdir_gffc_retn
  1672                              <1> 
  1673                              <1> ;loc_mkdir_gffc_1_cont: 
  1674                              <1> 	;cmp	eax, 2
  1675                              <1> 	;jb	short loc_mkdir_gffc_insufficient_disk_space
  1676                              <1> 
  1677                              <1> ;loc_mkdir_gffc_1_save_fcluster:  
  1678 0000AD8B A3[B8820100]        <1> 	mov	[mkdir_FFCluster], eax
  1679                              <1> 
  1680                              <1> loc_mkdir_locate_ffe:
  1681                              <1> 	; Current directory fcluster <> Directory buffer cluster
  1682                              <1> 	; Current directory will be reloaded by
  1683                              <1> 	; 'locate_current_dir_file' procedure
  1684                              <1> 	;
  1685                              <1> 	; ESI = Logical DOS Drive Description Table Address 
  1686                              <1> 	;push	esi ; 27/02/2016
  1687 0000AD90 31C0                <1> 	xor	eax, eax
  1688 0000AD92 89C1                <1>         mov	ecx, eax
  1689 0000AD94 6649                <1> 	dec	cx ; FFFFh  
  1690                              <1> 	; CX = FFFFh -> find first deleted or free entry
  1691                              <1> 	; ESI would be ASCIIZ filename address if the call
  1692                              <1> 	; would not be for first free or deleted dir entry
  1693 0000AD96 E808FBFFFF          <1> 	call	locate_current_dir_file
  1694 0000AD9B 734A                <1> 	jnc	short loc_mkdir_set_ff_dir_entry_1
  1695                              <1> 	;pop	esi 
  1696                              <1> 	; ESI = Logical DOS Drive Description Table Address 
  1697 0000AD9D 83F802              <1> 	cmp	eax, 2  ; cmp al, 2 ; File/Dir not found !
  1698 0000ADA0 7529                <1> 	jne	short loc_mkdir_stc_return
  1699                              <1> 
  1700                              <1> loc_mkdir_add_new_cluster:
  1701 0000ADA2 3805[49790100]      <1> 	cmp	byte [Current_FATType], al ; 2
  1702                              <1> 	;cmp	byte ptr [esi+LD_FATType], 2
  1703 0000ADA8 770C                <1> 	ja	short loc_mkdir_add_new_cluster_check_fsc
  1704 0000ADAA 803D[48790100]01    <1> 	cmp	byte [Current_Dir_Level], 1
  1705                              <1> 	;cmp	byte [esi+LD_CDirLevel], 1
  1706 0000ADB1 7303                <1> 	jnb	short loc_mkdir_add_new_cluster_check_fsc
  1707                              <1> 
  1708 0000ADB3 B00C                <1> 	mov	al, 12 ; No more files 
  1709                              <1> loc_mkdir_gffc_retn:
  1710 0000ADB5 C3                  <1> 	retn
  1711                              <1> 
  1712                              <1> loc_mkdir_add_new_cluster_check_fsc:
  1713 0000ADB6 8B0D[C0820100]      <1> 	mov	ecx, [mkdir_FreeSectors]
  1714                              <1> 	;movzx	eax, byte [mkdir_SecPerClust]
  1715 0000ADBC A0[C6820100]        <1> 	mov	al, [mkdir_SecPerClust]
  1716                              <1> 	;shl	ax, 1 ; AX = 2 * AX
  1717                              <1> 	; 29/07/2022
  1718 0000ADC1 D1E0                <1> 	shl	eax, 1
  1719 0000ADC3 39C1                <1> 	cmp	ecx, eax
  1720 0000ADC5 7350                <1> 	jnb	short loc_mkdir_add_new_subdir_cluster
  1721                              <1> 
  1722                              <1> loc_mkdir_insufficient_disk_space:
  1723                              <1> 	;mov	edx, ecx
  1724                              <1> ;loc_mkdir_gffc_insufficient_disk_space:
  1725                              <1> 	; 29/07/2022
  1726                              <1> 	;mov	ax, 27h ; MSDOS err => insufficient disk space
  1727                              <1> 	
  1728                              <1> 	; err retn: EDX = Free sectors, EBX = Dir name offset
  1729                              <1>         ; ESI -> Dos drive description table address
  1730                              <1> 	;; ecx = edx
  1731                              <1> 	
  1732                              <1> 	;retn
  1733                              <1> 	
  1734                              <1> 	; 29/07/2022
  1735 0000ADC7 30E4                <1> 	xor	ah, ah
  1736 0000ADC9 B027                <1> 	mov	al, 27h
  1737                              <1> 
  1738                              <1> loc_mkdir_stc_return:
  1739 0000ADCB F9                  <1> 	stc
  1740 0000ADCC C3                  <1> 	retn 
  1741                              <1> 
  1742                              <1> loc_mkdir_gffc_2:
  1743 0000ADCD E83F170000          <1> 	call	get_first_free_cluster
  1744 0000ADD2 72E1                <1> 	jc	short loc_mkdir_gffc_retn
  1745                              <1> 
  1746                              <1> ;loc_mkdir_gffc_1_cont: 
  1747                              <1> 	;cmp	eax, 2
  1748                              <1> 	;jb	short loc_mkdir_gffc_insufficient_disk_space
  1749                              <1> 
  1750                              <1> ;loc_mkdir_gffc_2_save_fcluster:  
  1751 0000ADD4 A3[B8820100]        <1> 	mov	[mkdir_FFCluster], eax
  1752                              <1> 
  1753 0000ADD9 A1[BC820100]        <1> 	mov	eax, [mkdir_LastDirCluster]
  1754                              <1> 
  1755 0000ADDE E8C8160000          <1> 	call	load_FAT_sub_directory 
  1756 0000ADE3 72D0                <1> 	jc	short loc_mkdir_gffc_retn
  1757                              <1> 
  1758 0000ADE5 31FF                <1> 	xor	edi, edi
  1759                              <1> loc_mkdir_set_ff_dir_entry_1:
  1760                              <1> 	; 27/02/2016
  1761 0000ADE7 56                  <1> 	push	esi ; Logical DOS Drv Desc. Tbl. address
  1762                              <1> 	; EDI = Directory Entry Address
  1763 0000ADE8 8B35[B4820100]      <1> 	mov	esi, [mkdir_DirName_Offset]
  1764 0000ADEE A1[B8820100]        <1> 	mov	eax, [mkdir_FFCluster]
  1765                              <1> 
  1766 0000ADF3 66B91000            <1> 	mov	cx, 10h	; CL = Directory attribute
  1767                              <1> 			; CH = 0 -> File size is 0
  1768 0000ADF7 0A0D[C4820100]      <1> 	or	cl, [mkdir_attrib] ; S, H, R  
  1769 0000ADFD E8A3010000          <1> 	call	make_directory_entry
  1770                              <1> 
  1771 0000AE02 5E                  <1> 	pop	esi
  1772                              <1> 
  1773 0000AE03 C605[71800100]02    <1> 	mov	byte [DirBuff_ValidData], 2
  1774 0000AE0A E869020000          <1> 	call	save_directory_buffer
  1775                              <1>         ;jnc	loc_mkdir_set_ff_dir_entry_2
  1776                              <1> 	; 29/07/2022
  1777 0000AE0F 7205                <1> 	jc	short loc_mkdir_return
  1778 0000AE11 E9CA000000          <1> 	jmp	loc_mkdir_set_ff_dir_entry_2
  1779                              <1> 
  1780                              <1> loc_mkdir_return:
  1781 0000AE16 C3                  <1> 	retn
  1782                              <1> 
  1783                              <1> loc_mkdir_add_new_subdir_cluster:
  1784 0000AE17 8B15[76800100]      <1> 	mov	edx, [DirBuff_Cluster]
  1785 0000AE1D 8915[BC820100]      <1> 	mov	[mkdir_LastDirCluster], edx       
  1786                              <1> 
  1787 0000AE23 A1[B8820100]        <1> 	mov	eax, [mkdir_FFCluster]
  1788 0000AE28 E87E160000          <1> 	call	load_FAT_sub_directory 
  1789 0000AE2D 72E7                <1> 	jc	short loc_mkdir_return
  1790                              <1> 	; eax = 0
  1791                              <1> 	; ecx = directory buffer sector count (<= 128)
  1792                              <1> 
  1793                              <1> pass_mkdir_add_new_subdir_cluster:
  1794                              <1> 
  1795                              <1> ; 29/07/2022
  1796                              <1> ;	;sub	edi, edi ; 0
  1797                              <1> ;	; 29/07/2022 - BUGFIX !
  1798                              <1> ;	mov	edi, Directory_Buffer
  1799                              <1> ;
  1800                              <1> ;	;mov	al, 128 ; double word
  1801                              <1> ;	;mul	ecx ; ecx =  directory buffer sector count
  1802                              <1> ;	;mov	ecx, eax
  1803                              <1> ;	;shl	cx, 7 ; 128 * sector count	
  1804                              <1> ;	mov	ax, [esi+LD_BPB+BytesPerSec] ; 512
  1805                              <1> ;	;shr	ax, 2 ; 'byte count / 4' for 'stosd'
  1806                              <1> ;	; 29/07/2022
  1807                              <1> ;	shr	eax, 2
  1808                              <1> ;	;mul	cx ; max = 128*(512/4) -> 16384 (stosd)
  1809                              <1> ;	;mov	cx, ax
  1810                              <1> ;	;sub	ax, ax ; 0
  1811                              <1> ;	; 29/07/2022
  1812                              <1> ;	mul	ecx
  1813                              <1> ;	mov	ecx, eax
  1814                              <1> ;	sub	eax, eax
  1815                              <1> ;	rep	stosd ; clear directory buffer
  1816                              <1> 
  1817                              <1> 	; 29/07/2022
  1818 0000AE2F E85C010000          <1> 	call	clear_directory_buffer
  1819                              <1> 
  1820 0000AE34 C605[71800100]02    <1> 	mov	byte [DirBuff_ValidData], 2
  1821 0000AE3B E838020000          <1> 	call	save_directory_buffer 
  1822 0000AE40 72D4                <1> 	jc	short loc_mkdir_return
  1823                              <1> 
  1824                              <1> loc_mkdir_save_added_cluster:
  1825 0000AE42 A1[BC820100]        <1> 	mov	eax, [mkdir_LastDirCluster]
  1826 0000AE47 8B0D[B8820100]      <1> 	mov	ecx, [mkdir_FFCluster]
  1827                              <1> 	; 01/03/2016
  1828 0000AE4D 31D2                <1> 	xor	edx, edx
  1829 0000AE4F 8915[66800100]      <1> 	mov	[FAT_ClusterCounter], edx ; 0 ; reset
  1830 0000AE55 E884170000          <1> 	call	update_cluster
  1831 0000AE5A 7304                <1> 	jnc	short loc_mkdir_save_fat_buffer_0
  1832 0000AE5C 09C0                <1> 	or	eax, eax ; EAX = 0 -> cluster value is 0 or eocc
  1833 0000AE5E 7518                <1> 	jnz	short loc_mkdir_save_fat_buffer_stc_retn
  1834                              <1> 
  1835                              <1> loc_mkdir_save_fat_buffer_0:
  1836 0000AE60 A1[B8820100]        <1> 	mov	eax, [mkdir_FFCluster]
  1837 0000AE65 A3[BC820100]        <1> 	mov	[mkdir_LastDirCluster], eax
  1838                              <1> 
  1839 0000AE6A 31C9                <1> 	xor	ecx, ecx
  1840 0000AE6C 49                  <1> 	dec	ecx ; FFFFFFFFh
  1841                              <1> 	; ESI = Logical DOS Drive Description Table address 
  1842 0000AE6D E86C170000          <1> 	call	update_cluster
  1843 0000AE72 731A                <1> 	jnc	short loc_mkdir_save_fat_buffer_1
  1844 0000AE74 09C0                <1> 	or	eax, eax
  1845 0000AE76 7416                <1> 	jz	short loc_mkdir_save_fat_buffer_1
  1846                              <1> 
  1847                              <1> loc_mkdir_save_fat_buffer_stc_retn:
  1848                              <1> 	; 01/03/2016
  1849 0000AE78 803D[66800100]01    <1> 	cmp	byte [FAT_ClusterCounter], 1
  1850 0000AE7F 720C                <1> 	jb	short loc_mkdir_save_fat_buffer_retn
  1851                              <1> 
  1852 0000AE81 66BB00FF            <1> 	mov	bx, 0FF00h ; recalculate free space (BL = 0)
  1853                              <1> 			   ; (BH = FFh -> Use ESI as Drv Param. Tbl.)
  1854 0000AE85 50                  <1> 	push	eax
  1855 0000AE86 E8671A0000          <1> 	call	calculate_fat_freespace
  1856 0000AE8B 58                  <1> 	pop	eax
  1857 0000AE8C F9                  <1> 	stc
  1858                              <1> loc_mkdir_save_fat_buffer_retn:
  1859 0000AE8D C3                  <1> 	retn
  1860                              <1> 
  1861                              <1> loc_mkdir_save_fat_buffer_1:
  1862                              <1> 	; byte [FAT_BuffValidData] = 2 
  1863 0000AE8E E8CE190000          <1> 	call	save_fat_buffer
  1864 0000AE93 72E3                <1> 	jc	short loc_mkdir_save_fat_buffer_stc_retn
  1865                              <1> 
  1866                              <1> 	; 01/03/2016
  1867 0000AE95 803D[66800100]01    <1> 	cmp	byte [FAT_ClusterCounter], 1
  1868 0000AE9C 721B                <1> 	jb	short loc_mkdir_save_fat_buffer_2
  1869                              <1> 
  1870                              <1> 	; ESI = Logical DOS Drive Description Table address 
  1871 0000AE9E A1[66800100]        <1> 	mov	eax, [FAT_ClusterCounter]
  1872 0000AEA3 66BB01FF            <1> 	mov	bx, 0FF01h ; add free clusters 
  1873 0000AEA7 E8461A0000          <1> 	call	calculate_fat_freespace
  1874                              <1> 
  1875                              <1> 	;inc	eax ; 0FFFFFFFFh -> 0 ; recalculation is needed!
  1876                              <1> 	;jnz	short loc_mkdir_save_fat_buffer_2
  1877                              <1> 
  1878                              <1> 	; ecx > 0 -> Recalculation is needed
  1879 0000AEAC 09C9                <1> 	or	ecx, ecx 
  1880 0000AEAE 7409                <1> 	jz	short loc_mkdir_save_fat_buffer_2
  1881                              <1> 
  1882 0000AEB0 66BB00FF            <1> 	mov	bx, 0FF00h ; ; recalculate free space
  1883 0000AEB4 E8391A0000          <1> 	call	calculate_fat_freespace
  1884                              <1> 
  1885                              <1> loc_mkdir_save_fat_buffer_2:
  1886 0000AEB9 C605[C7820100]01    <1> 	mov	byte [mkdir_add_new_cluster], 1
  1887 0000AEC0 E9B0000000          <1> 	jmp	loc_mkdir_upd_parent_dir_lmdt
  1888                              <1> 
  1889                              <1> loc_mkdir_update_sub_dir_cluster:
  1890 0000AEC5 A1[B8820100]        <1> 	mov	eax, [mkdir_FFCluster]
  1891 0000AECA 29C9                <1> 	sub	ecx, ecx ; 0
  1892                              <1> 	; 01/03/2016
  1893 0000AECC 890D[66800100]      <1> 	mov	[FAT_ClusterCounter], ecx ; 0 ; Reset
  1894 0000AED2 49                  <1> 	dec	ecx ; 0FFFFFFFFh
  1895                              <1> 
  1896                              <1> 	; ESI = Logical DOS Drive Descisption Table address  
  1897 0000AED3 E806170000          <1> 	call	update_cluster
  1898 0000AED8 7364                <1> 	jnc	short loc_mkdir_save_fat_buffer_3
  1899 0000AEDA 09C0                <1> 	or	eax, eax ; EAX = 0 -> cluster value is 0 or eocc
  1900 0000AEDC 7460                <1> 	jz	short loc_mkdir_save_fat_buffer_3
  1901                              <1> 	; 01/03/2016
  1902 0000AEDE EB98                <1> 	jmp	short loc_mkdir_save_fat_buffer_stc_retn
  1903                              <1> 
  1904                              <1> loc_mkdir_set_ff_dir_entry_2:
  1905                              <1> 	; ESI = Logical DOS Drive Description Table address  
  1906 0000AEE0 A1[B8820100]        <1> 	mov	eax, [mkdir_FFCluster]
  1907                              <1> 	; Load disk sectors as a directory cluster
  1908 0000AEE5 E8C1150000          <1> 	call	load_FAT_sub_directory 
  1909 0000AEEA 7251                <1> 	jc	short retn_make_fat_directory
  1910                              <1> 	
  1911                              <1> 	; eax = 0
  1912                              <1> 	; ecx = directory buffer sector count (<= 128)
  1913                              <1> 
  1914                              <1> ; 29/07/2022
  1915                              <1> ;	mov	edi, Directory_Buffer + 64 ; 26/02/2016
  1916                              <1> ;
  1917                              <1> ;	; 02/03/2016
  1918                              <1> ;	mov	ax, [esi+LD_BPB+BytesPerSec] ; 512
  1919                              <1> ;	;shr	ax, 2 ; 'byte count / 4' for 'stosd'
  1920                              <1> ;	; 29/07/2022
  1921                              <1> ;	shr	eax, 2
  1922                              <1> ;	mul 	ecx
  1923                              <1> ;	mov	ecx, eax
  1924                              <1> ;	;
  1925                              <1> ;	; 29/07/2022 - BUGFIX !
  1926                              <1> ;	sub	ecx, 16 ; - 64 bytes
  1927                              <1> ;			; (space for '.' & '..' entries)
  1928                              <1> ;	;sub	ax, ax
  1929                              <1> ;	sub	eax, eax
  1930                              <1> ;	rep	stosd
  1931                              <1> ;
  1932                              <1> ;	;;mov	al, 128 ; double word (count in sector)
  1933                              <1> ;	;;mul	ecx ; ecx = directory buffer sector count
  1934                              <1> ;	;;mov	ecx, eax
  1935                              <1> ;	;shl	cx, 7 ; 128 * sector count
  1936                              <1> ;	;sub	ecx, 64 ; 29/07/2022
  1937                              <1> ;	;;sub	eax, eax
  1938                              <1> ;	;;sub	al, al ; 0
  1939                              <1> ;	;rep	stosd ; clear directory buffer
  1940                              <1> 
  1941                              <1> 	; 29/07/2022
  1942 0000AEEC E89F000000          <1> 	call	clear_directory_buffer
  1943                              <1> 
  1944 0000AEF1 BF00000800          <1> 	mov	edi, Directory_Buffer ; 26/02/2016
  1945                              <1> 	
  1946 0000AEF6 56                  <1> 	push	esi
  1947                              <1> 
  1948 0000AEF7 BE[C8820100]        <1> 	mov	esi, mkdir_Name
  1949 0000AEFC 66C7062E00          <1> 	mov	word [esi], 2Eh ; db '.', '0'
  1950                              <1> 
  1951 0000AF01 A1[B8820100]        <1> 	mov	eax, [mkdir_FFCluster]
  1952                              <1> 	;mov	cx, 10h ; CL = Directory attribute
  1953                              <1> 			; CH = 0 -> File size is 0
  1954                              <1> 	; 29/07/2022
  1955 0000AF06 B110                <1> 	mov	cl, 10h
  1956 0000AF08 E898000000          <1> 	call	make_directory_entry
  1957                              <1> 
  1958 0000AF0D BF20000800          <1> 	mov	edi, Directory_Buffer + 32 ; 26/02/2016
  1959                              <1> 
  1960                              <1> 	; 03/03/2016
  1961                              <1> 	; Following modification has been done according to 
  1962                              <1> 	; 'Microsoft Extensible Firmware Initiative
  1963                              <1> 	; FAT32 File System Specification' document,
  1964                              <1> 	; 'FAT: General Overview of On-Disk FormatPage 25'.
  1965                              <1> 	; "Finally, you set DIR_FstClusLO and DIR_FstClusHI
  1966                              <1> 	; for the dotdot entry (the second entry) to the
  1967                              <1> 	; first cluster number of the directory in which you 
  1968                              <1> 	; just created the directory (value is 0 if this directory
  1969                              <1> 	; is the root directory even for FAT32 volumes)."
  1970                              <1> 	; (Correctness of this modification has been verified
  1971                              <1> 	;  by using Windows 98 'scandisk.exe'.)
  1972                              <1> 
  1973 0000AF12 29C0                <1> 	sub	eax, eax
  1974 0000AF14 3805[48790100]      <1> 	cmp	byte [Current_Dir_Level], al ; 0
  1975 0000AF1A 7605                <1> 	jna	short loc_mkdir_set_ff_dir_entry_3
  1976 0000AF1C A1[44790100]        <1> 	mov	eax, [Current_Dir_FCluster] ; parent dir
  1977                              <1> loc_mkdir_set_ff_dir_entry_3:
  1978 0000AF21 66C746012E00        <1> 	mov	word [esi+1], 2Eh ; db '.', '0'
  1979                              <1> 
  1980                              <1> 	;mov	cx, 10h
  1981 0000AF27 E879000000          <1> 	call	make_directory_entry
  1982                              <1> 
  1983 0000AF2C 5E                  <1> 	pop	esi
  1984                              <1> 
  1985 0000AF2D C605[71800100]02    <1> 	mov	byte [DirBuff_ValidData], 2
  1986 0000AF34 E83F010000          <1> 	call	save_directory_buffer
  1987                              <1> 	;jnc	loc_mkdir_update_sub_dir_cluster
  1988                              <1> 	; 29/07/2022
  1989 0000AF39 7202                <1> 	jc	short retn_make_fat_directory
  1990 0000AF3B EB88                <1> 	jmp	loc_mkdir_update_sub_dir_cluster
  1991                              <1> 
  1992                              <1> retn_make_fat_directory:
  1993 0000AF3D C3                  <1> 	retn
  1994                              <1> 
  1995                              <1> loc_mkdir_save_fat_buffer_3:
  1996                              <1> 	; 01/03/2016
  1997                              <1> 	; byte [FAT_BuffValidData] = 2 
  1998 0000AF3E E81E190000          <1> 	call	save_fat_buffer
  1999                              <1> 	;jc	short loc_mkdir_save_fat_buffer_stc_retn
  2000                              <1> 	; 07/08/2022
  2001 0000AF43 7305                <1> 	jnc	short loc_mkdir_save_fat_buffer_4
  2002 0000AF45 E92EFFFFFF          <1> 	jmp	loc_mkdir_save_fat_buffer_stc_retn
  2003                              <1> 
  2004                              <1> loc_mkdir_save_fat_buffer_4:
  2005 0000AF4A 803D[66800100]01    <1> 	cmp	byte [FAT_ClusterCounter], 1
  2006 0000AF51 721B                <1> 	jb	short loc_mkdir_save_fat_buffer_5
  2007                              <1> 
  2008                              <1> 	; ESI = Logical DOS Drive Description Table address 
  2009 0000AF53 A1[66800100]        <1> 	mov	eax, [FAT_ClusterCounter]
  2010 0000AF58 66BB01FF            <1> 	mov	bx, 0FF01h ; add free clusters 
  2011 0000AF5C E891190000          <1> 	call	calculate_fat_freespace
  2012                              <1> 
  2013                              <1> 	;inc	eax ; 0FFFFFFFFh -> 0 ; recalculation is needed!
  2014                              <1>         ;jnz    short loc_mkdir_save_fat_buffer_5
  2015                              <1> 
  2016                              <1> 	; ecx > 0 -> Recalculation is needed
  2017 0000AF61 09C9                <1> 	or	ecx, ecx 
  2018 0000AF63 7409                <1>         jz      short loc_mkdir_save_fat_buffer_5
  2019                              <1> 
  2020 0000AF65 66BB00FF            <1> 	mov	bx, 0FF00h ; recalculate free space
  2021 0000AF69 E884190000          <1> 	call	calculate_fat_freespace
  2022                              <1> 
  2023                              <1> loc_mkdir_save_fat_buffer_5:	
  2024 0000AF6E C605[C7820100]00    <1> 	mov	byte [mkdir_add_new_cluster], 0
  2025                              <1> 
  2026                              <1> loc_mkdir_upd_parent_dir_lmdt:
  2027 0000AF75 E896010000          <1> 	call	update_parent_dir_lmdt
  2028                              <1> 
  2029                              <1> 	; 01/03/2016
  2030 0000AF7A 803D[C7820100]00    <1> 	cmp	byte [mkdir_add_new_cluster], 0
  2031                              <1> 	;ja	loc_mkdir_gffc_2
  2032                              <1> 	; 29/07/2022
  2033 0000AF81 7605                <1> 	jna	short loc_mkdir_retn_new_dir_cluster
  2034 0000AF83 E945FEFFFF          <1> 	jmp	loc_mkdir_gffc_2
  2035                              <1> 
  2036                              <1> loc_mkdir_retn_new_dir_cluster:
  2037 0000AF88 A1[B8820100]        <1> 	mov	eax, [mkdir_FFCluster]
  2038 0000AF8D 31D2                <1> 	xor	edx, edx
  2039                              <1> loc_mkdir_retn:
  2040 0000AF8F C3                  <1> 	retn
  2041                              <1> 
  2042                              <1> clear_directory_buffer:
  2043                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  2044                              <1> 	;
  2045                              <1> 	; eax = 0
  2046                              <1> 	; ecx = directory buffer sector count (<= 128)
  2047                              <1> 	;
  2048 0000AF90 BF00000800          <1> 	mov	edi, Directory_Buffer
  2049                              <1> 	;mov	al, 128 ; double word
  2050                              <1> 	;mul	ecx ; ecx = directory buffer sector count
  2051                              <1> 	;mov	ecx, eax
  2052                              <1> 	;shl	cx, 7 ; 128 * sector count	
  2053 0000AF95 668B4611            <1> 	mov	ax, [esi+LD_BPB+BytesPerSec] ; 512
  2054 0000AF99 C1E802              <1> 	shr	eax, 2 ; 'byte count / 4' for 'stosd'
  2055 0000AF9C F7E1                <1> 	mul	ecx ; max = 128*(512/4) -> 16384 (stosd)
  2056 0000AF9E 89C1                <1> 	mov	ecx, eax
  2057 0000AFA0 29C0                <1> 	sub	eax, eax
  2058 0000AFA2 F3AB                <1> 	rep	stosd ; clear directory buffer
  2059 0000AFA4 C3                  <1> 	retn
  2060                              <1> 
  2061                              <1> make_directory_entry:
  2062                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  2063                              <1> 	; 02/03/2016
  2064                              <1> 	; 21/02/2016 (TRDOS 386 = TRDOS v2.0)
  2065                              <1> 	; 09/08/2010 (DIR.ASM, 'proc_make_directory_entry')
  2066                              <1> 	; 17/07/2010
  2067                              <1> 	; INPUT ->
  2068                              <1> 	; 	EDI = Directory Entry Address
  2069                              <1> 	;	ESI = Dot File Name Location
  2070                              <1> 	;	EAX = First Cluster
  2071                              <1> 	;	File Size = 0 (Must be set later)
  2072                              <1> 	;	CL = Attributes
  2073                              <1> 	;	CH = 0 (File size = 0) 
  2074                              <1> 	;	(If CH>0, File size is in dword [EBX]) (*)
  2075                              <1> 	; OUTPUT -> 
  2076                              <1> 	;	EDI = Directory Entry Address
  2077                              <1> 	;	ESI = Dot File Name Location (Capitalized)
  2078                              <1> 	;	If CH input = 0, File Size = 0
  2079                              <1> 	;	Otherwise file size is as dword [EBX] (*)
  2080                              <1> 	;	DX = Date, AX = Time in DOS Dir Entry format
  2081                              <1> 	;	EBX = same
  2082                              <1> 	;	ECX = same
  2083                              <1> 
  2084 0000AFA5 51                  <1> 	push	ecx
  2085                              <1> 
  2086 0000AFA6 884F0B              <1> 	mov	[edi+11], cl ; Attributes
  2087 0000AFA9 6689471A            <1> 	mov	[edi+26], ax ; FClusterLw, 26
  2088 0000AFAD C1E810              <1> 	shr	eax, 16
  2089 0000AFB0 66894714            <1> 	mov	[edi+20], ax ; FClusterHw, 20
  2090                              <1> 	;xor	ax, ax 
  2091                              <1> 	; 29/07/2022
  2092 0000AFB4 31C0                <1> 	xor	eax, eax
  2093 0000AFB6 6689470C            <1> 	mov	[edi+12], ax ; NTReserved, 12
  2094                              <1> 			     ; CrtTimeTenth, 13
  2095 0000AFBA 08ED                <1> 	or	ch, ch
  2096 0000AFBC 7402                <1> 	jz	short loc_make_direntry_set_filesize
  2097                              <1> 
  2098 0000AFBE 8B03                <1> 	mov	eax, [ebx]
  2099                              <1>         
  2100                              <1> loc_make_direntry_set_filesize:
  2101 0000AFC0 89471C              <1> 	mov	[edi+28], eax ; FileSize, 28
  2102                              <1> 	
  2103 0000AFC3 E8AAFBFFFF          <1> 	call	convert_file_name
  2104                              <1> 	;EDI = Dir Entry Format File Name Location
  2105                              <1> 	;ESI = Dot File Name Location (capitalized)
  2106                              <1> 
  2107 0000AFC8 E816000000          <1> 	call	convert_current_date_time
  2108                              <1> 	; OUTPUT -> DX = Date in dos dir entry format
  2109                              <1>         ; 	    AX = Time in dos dir entry format
  2110 0000AFCD 6689470E            <1> 	mov	[edi+14], ax ; CrtTime, 14
  2111 0000AFD1 66895710            <1> 	mov	[edi+16], dx ; CrtDate, 16
  2112 0000AFD5 66895712            <1> 	mov	[edi+18], dx ; LastAccDate, 18
  2113 0000AFD9 66894716            <1> 	mov	[edi+22], ax ; WrtTime, 14
  2114 0000AFDD 66895718            <1> 	mov	[edi+24], dx ; WrtDate, 16
  2115 0000AFE1 59                  <1> 	pop	ecx
  2116                              <1> 
  2117 0000AFE2 C3                  <1> 	retn
  2118                              <1> 
  2119                              <1> convert_current_date_time:
  2120                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  2121                              <1> 	; 21/02/2016 (TRDOS 386 = TRDOS v2.0)
  2122                              <1> 	; 13/06/2010 (DIR.ASM, 'proc_convert_current_date_time')
  2123                              <1> 	; converts date&time to dos dir entry format
  2124                              <1> 	; INPUT -> none
  2125                              <1> 	; OUTPUT -> DX = Date in dos dir entry format
  2126                              <1> 	;           AX = Time in dos dir entry format
  2127                              <1>  
  2128 0000AFE3 B404                <1> 	mov	ah, 04h ; Return Current Date
  2129 0000AFE5 E88BB2FFFF          <1> 	call	int1Ah 
  2130                              <1> 
  2131 0000AFEA 88E8                <1> 	mov	al, ch ; <- century BCD
  2132 0000AFEC 240F                <1> 	and	al, 0Fh
  2133 0000AFEE 88EC                <1> 	mov	ah, ch
  2134 0000AFF0 C0EC04              <1> 	shr	ah, 4
  2135 0000AFF3 D50A                <1> 	aad
  2136 0000AFF5 88C5                <1> 	mov	ch, al ; -> century 
  2137                              <1> 
  2138 0000AFF7 88C8                <1> 	mov	al, cl ; <- year BCD
  2139 0000AFF9 240F                <1> 	and	al, 0Fh
  2140 0000AFFB 88CC                <1> 	mov	ah, cl
  2141 0000AFFD C0EC04              <1> 	shr	ah, 4
  2142 0000B000 D50A                <1> 	aad
  2143 0000B002 88C1                <1> 	mov	cl, al ; -> year
  2144                              <1> 
  2145                              <1> 	;mov	al, ch
  2146                              <1> 	;mov	ah, 100
  2147                              <1> 	;mul	ah
  2148                              <1> 	; 29/07/2022
  2149 0000B004 B064                <1> 	mov	al, 100
  2150 0000B006 F6E5                <1> 	mul	ch	
  2151                              <1> 
  2152                              <1> 	;xor	ch, ch
  2153                              <1> 	;add	ax, cx
  2154                              <1> 	; 29/07/2022
  2155 0000B008 00C8                <1> 	add	al, cl
  2156 0000B00A 80D400              <1> 	adc	ah, 0
  2157 0000B00D 662DBC07            <1> 	sub	ax, 1980 ; ms-dos epoch
  2158                              <1> 	;mov	cx, ax
  2159                              <1> 	; 29/07/2022
  2160 0000B011 88C1                <1> 	mov	cl, al
  2161                              <1> 	;mov	ecx, eax
  2162                              <1> 
  2163 0000B013 88F0                <1> 	mov	al, dh ; <- month in bcd
  2164 0000B015 240F                <1> 	and	al, 0Fh
  2165 0000B017 88F4                <1> 	mov	ah, dh
  2166 0000B019 C0EC04              <1> 	shr	ah, 4
  2167 0000B01C D50A                <1> 	aad
  2168 0000B01E 88C6                <1> 	mov	dh, al ; -> month
  2169                              <1> 
  2170 0000B020 88D0                <1> 	mov	al, dl ; <- day BCD
  2171 0000B022 240F                <1> 	and	al, 0Fh
  2172 0000B024 88D4                <1> 	mov	ah, dl
  2173 0000B026 C0EC04              <1> 	shr	ah, 4
  2174 0000B029 D50A                <1> 	aad
  2175 0000B02B 88C2                <1> 	mov	dl, al ; -> day
  2176                              <1> 
  2177 0000B02D 88C8                <1> 	mov	al, cl ; count of years from 1980
  2178                              <1> 	;shl	ax, 4
  2179                              <1> 	; 29/07/2022
  2180                              <1> 	;mov	eax, ecx
  2181 0000B02F C1E004              <1> 	shl	eax, 4
  2182                              <1> 
  2183 0000B032 08F0                <1> 	or	al, dh ; month of year, 1 to 12
  2184                              <1> 	;shl	ax, 5
  2185                              <1> 	; 29/07/2022
  2186 0000B034 C1E005              <1> 	shl	eax, 5
  2187 0000B037 08D0                <1> 	or	al, dl ; day of year, 1 to 31
  2188                              <1> 	
  2189                              <1> 	;push	ax ; push date
  2190                              <1> 	; 29/07/2022
  2191 0000B039 50                  <1> 	push	eax
  2192                              <1> 
  2193 0000B03A B402                <1> 	mov	ah, 02h ; Return Current Time
  2194 0000B03C E834B2FFFF          <1> 	call	int1Ah
  2195                              <1> 
  2196 0000B041 88E8                <1> 	mov	al, ch ; <- hours BCD
  2197 0000B043 240F                <1> 	and	al, 0Fh
  2198 0000B045 88EC                <1> 	mov	ah, ch
  2199 0000B047 C0EC04              <1> 	shr	ah, 4
  2200 0000B04A D50A                <1> 	aad
  2201 0000B04C 88C5                <1> 	mov	ch, al ; -> hours
  2202                              <1> 
  2203 0000B04E 88C8                <1> 	mov	al, cl ; <- minutes BCD
  2204 0000B050 240F                <1> 	and	al, 0Fh
  2205 0000B052 88CC                <1> 	mov	ah, cl
  2206 0000B054 C0EC04              <1> 	shr	ah, 4
  2207 0000B057 D50A                <1> 	aad
  2208 0000B059 88C1                <1> 	mov	cl, al ; -> minutes
  2209                              <1> 
  2210 0000B05B 88F0                <1> 	mov	al, dh ; <- seconds BCD
  2211 0000B05D 240F                <1> 	and	al, 0Fh
  2212 0000B05F 88F4                <1> 	mov	ah, dh
  2213 0000B061 C0EC04              <1> 	shr	ah, 4
  2214 0000B064 D50A                <1> 	aad
  2215 0000B066 88C6                <1> 	mov	dh, al ; -> seconds
  2216                              <1> 
  2217 0000B068 88E8                <1> 	mov	al, ch ; hours
  2218                              <1> 	;shl	ax, 6
  2219                              <1> 	; 29/07/2022
  2220 0000B06A C1E006              <1> 	shl	eax, 6
  2221 0000B06D 08C8                <1> 	or	al, cl ; minutes
  2222                              <1> 	;shl	ax, 5
  2223                              <1> 	; 29/07/2022
  2224 0000B06F C1E005              <1> 	shl	eax, 5
  2225 0000B072 D0EE                <1> 	shr	dh, 1 ; 2 seconds
  2226                              <1> 	; There is a bug in TRDOS v1 here !
  2227                              <1> 	; it was 'or al, dl' ! 
  2228 0000B074 08F0                <1> 	or	al, dh ; seconds
  2229                              <1> 
  2230                              <1> 	;pop	dx ; pop date
  2231                              <1> 	; 29/07/2022
  2232 0000B076 5A                  <1> 	pop	edx	
  2233                              <1> 
  2234 0000B077 C3                  <1> 	retn
  2235                              <1> 
  2236                              <1> save_directory_buffer:
  2237                              <1> 	; 30/07/2022
  2238                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  2239                              <1> 	; 15/10/2016
  2240                              <1> 	; 23/03/2016
  2241                              <1> 	; 26/02/2016
  2242                              <1> 	; 22/02/2016 (TRDOS 386 = TRDOS v2.0)
  2243                              <1> 	; 01/08/2011
  2244                              <1> 	; 14/03/2010
  2245                              <1> 	; INPUT ->
  2246                              <1> 	; 	 none
  2247                              <1> 	; OUTPUT ->
  2248                              <1> 	;  cf = 0 -> write OK...
  2249                              <1> 	;  cf = 1 -> error code in AL (EAX)
  2250                              <1> 	;  cf = 1 & AL = 0Dh => CH & CL = FS & FAT type
  2251                              <1> 	;  EBX = Directory Buffer Address
  2252                              <1> 	;
  2253                              <1> 	;  (EAX, ECX, EDX will be modified)
  2254                              <1>  
  2255 0000B078 BB00000800          <1> 	mov	ebx, Directory_Buffer
  2256 0000B07D 803D[71800100]02    <1> 	cmp	byte [DirBuff_ValidData], 2
  2257 0000B084 7403                <1> 	je	short loc_save_dir_buffer
  2258 0000B086 31C0                <1> 	xor	eax, eax
  2259 0000B088 C3                  <1> 	retn            
  2260                              <1> 
  2261                              <1> loc_save_dir_buffer:
  2262 0000B089 56                  <1> 	push	esi
  2263 0000B08A 31DB                <1> 	xor	ebx, ebx 
  2264 0000B08C 8A3D[6F800100]      <1>         mov     bh, [DirBuff_DRV]
  2265 0000B092 80EF41              <1> 	sub	bh, 'A'
  2266 0000B095 BE00010900          <1>         mov     esi, Logical_DOSDisks
  2267 0000B09A 01DE                <1> 	add	esi, ebx
  2268 0000B09C 668B4E03            <1>         mov     cx, [esi+LD_FATType]
  2269                              <1> 	; CH = FS Type (A1h for FS)
  2270                              <1> 	; CL = FAT Type (0 for FS)
  2271 0000B0A0 08C9                <1> 	or	cl, cl
  2272 0000B0A2 7431                <1> 	jz	short loc_save_dir_buff_stc_retn
  2273                              <1> 
  2274                              <1> loc_save_dir_buffer_check_cluster_no:    
  2275 0000B0A4 A1[76800100]        <1> 	mov	eax, [DirBuff_Cluster]
  2276 0000B0A9 28FF                <1> 	sub	bh, bh ; ebx = 0
  2277 0000B0AB 09C0                <1> 	or	eax, eax
  2278 0000B0AD 753E                <1> 	jnz	short loc_save_sub_dir_buffer
  2279 0000B0AF 8A25[70800100]      <1> 	mov	ah, [DirBuff_FATType]
  2280 0000B0B5 FEC3                <1> 	inc	bl ;  bl = 1
  2281 0000B0B7 38DC                <1> 	cmp	ah, bl
  2282 0000B0B9 721B                <1> 	jb	short loc_save_dir_buff_inv_data_retn
  2283 0000B0BB FEC3                <1> 	inc	bl ; bl = 2
  2284 0000B0BD 38E3                <1> 	cmp	bl, ah
  2285 0000B0BF 7215                <1> 	jb	short loc_save_dir_buff_inv_data_retn
  2286                              <1> 
  2287                              <1> loc_save_root_dir_buffer:
  2288 0000B0C1 668B5E17            <1> 	mov	bx, [esi+LD_BPB+RootDirEnts]
  2289 0000B0C5 6683C30F            <1> 	add	bx, 15
  2290                              <1> 	;shr	bx, 4 ; 16 dir entries per sector
  2291                              <1> 	; 29/07/2022
  2292 0000B0C9 C1EB04              <1> 	shr	ebx, 4
  2293                              <1> 	;or	bx, bx
  2294 0000B0CC 09DB                <1> 	or	ebx, ebx
  2295 0000B0CE 7405                <1> 	jz	short loc_save_dir_buff_stc_retn
  2296                              <1> 	;mov	ecx, ebx 
  2297 0000B0D0 8B4664              <1> 	mov	eax, [esi+LD_ROOTBegin] ; 26/02/2016
  2298 0000B0D3 EB22                <1> 	jmp	short loc_write_directory_to_disk
  2299                              <1> 
  2300                              <1> loc_save_dir_buff_stc_retn:
  2301 0000B0D5 F9                  <1> 	stc
  2302                              <1> loc_save_dir_buff_inv_data_retn:
  2303                              <1> 	; 15/10/2016 (0Dh -> 29)
  2304 0000B0D6 B01D                <1> 	mov	al, 29 ; Invalid data !
  2305 0000B0D8 C605[71800100]00    <1> 	mov	byte [DirBuff_ValidData], 0
  2306 0000B0DF EB05                <1> 	jmp	short loc_save_dir_buff_retn 
  2307                              <1> 
  2308                              <1> loc_write_directory_to_disk_err:
  2309                              <1> 	; 15/10/2016 (disk write error code, 1Dh -> 18)
  2310 0000B0E1 B812000000          <1> 	mov	eax, 18 ; Drive not ready or write error 
  2311                              <1> 
  2312                              <1> loc_save_dir_buff_retn:
  2313 0000B0E6 BB00000800          <1> 	mov	ebx, Directory_Buffer
  2314 0000B0EB 5E                  <1> 	pop	esi
  2315 0000B0EC C3                  <1> 	retn
  2316                              <1>  
  2317                              <1> loc_save_sub_dir_buffer:
  2318                              <1> 	; ebx  = 0
  2319                              <1> 	;sub	eax, 2
  2320                              <1> 	; 30/07/2022
  2321 0000B0ED 48                  <1> 	dec	eax
  2322 0000B0EE 48                  <1> 	dec	eax
  2323 0000B0EF 8A5E13              <1> 	mov	bl, [esi+LD_BPB+SecPerClust]
  2324 0000B0F2 F7E3                <1> 	mul	ebx
  2325 0000B0F4 034668              <1>         add     eax, [esi+LD_DATABegin]
  2326                              <1>  	;mov	ecx, ebx
  2327                              <1> 
  2328                              <1> loc_write_directory_to_disk:
  2329 0000B0F7 89D9                <1>  	mov	ecx, ebx
  2330 0000B0F9 BB00000800          <1> 	mov	ebx, Directory_Buffer
  2331 0000B0FE E87B6D0000          <1> 	call	disk_write
  2332 0000B103 72DC                <1> 	jc	short loc_write_directory_to_disk_err
  2333                              <1> 
  2334                              <1> loc_save_dir_buff_validate_retn:
  2335 0000B105 C605[71800100]01    <1> 	mov	byte [DirBuff_ValidData], 1
  2336 0000B10C 31C0                <1> 	xor	eax, eax
  2337                              <1> 	; 26/02/2016
  2338 0000B10E EBD6                <1> 	jmp	short loc_save_dir_buff_retn
  2339                              <1> 
  2340                              <1> update_parent_dir_lmdt:
  2341                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  2342                              <1> 	; 29/12/2017
  2343                              <1> 	; 22/02/2016 (TRDOS 386 = TRDOS v2.0)
  2344                              <1> 	; 01/08/2011
  2345                              <1> 	; 16/10/2010 
  2346                              <1> 	; 
  2347                              <1> 	; INPUT -> 
  2348                              <1> 	;	none
  2349                              <1>  	; OUTPUT ->
  2350                              <1> 	;	(last modification date & time of the parent dir
  2351                              <1> 	;	will be changed/updated)
  2352                              <1> 	;
  2353                              <1> 	; (EAX, EBX, ECX, EDX, EDI will be changed)
  2354                              <1> 
  2355 0000B110 29C0                <1> 	sub	eax, eax
  2356 0000B112 8A25[48790100]      <1> 	mov	ah, [Current_Dir_Level]
  2357 0000B118 A0[49790100]        <1> 	mov	al, [Current_FATType]
  2358 0000B11D 3C01                <1> 	cmp	al, 1
  2359 0000B11F 7239                <1> 	jb	short loc_UPDLMDT_proc_retn
  2360                              <1>     
  2361                              <1> loc_update_parent_dir_lm_date_time:
  2362 0000B121 08E4                <1> 	or	ah, ah
  2363 0000B123 7435                <1> 	jz	short loc_UPDLMDT_proc_retn
  2364                              <1> 
  2365 0000B125 56                  <1> 	push	esi ; *
  2366 0000B126 8825[E8820100]      <1> 	mov	[UPDLMDT_CDirLevel], ah
  2367 0000B12C 8B15[44790100]      <1> 	mov	edx, [Current_Dir_FCluster]
  2368 0000B132 8915[E9820100]      <1> 	mov	[UPDLMDT_CDirFCluster], edx
  2369                              <1> 
  2370 0000B138 FECC                <1> 	dec	ah
  2371                              <1> 	;mov	ecx, 12
  2372                              <1>         ; 29/07/2022
  2373 0000B13A 29C9                <1> 	sub	ecx, ecx
  2374 0000B13C B10C                <1> 	mov	cl, 12
  2375                              <1> 	;
  2376 0000B13E BE[A8800100]        <1> 	mov     esi, PATH_Array
  2377                              <1> 
  2378 0000B143 8825[48790100]      <1> 	mov	[Current_Dir_Level], ah
  2379 0000B149 08E4                <1> 	or	ah, ah
  2380 0000B14B 750E                <1> 	jnz	short loc_update_parent_dir_lmdt_load_sub_dir_1
  2381 0000B14D 803D[49790100]02    <1> 	cmp	byte [Current_FATType], 2
  2382 0000B154 770B                <1> 	ja	short loc_update_parent_dir_lmdt_load_sub_dir_2
  2383 0000B156 28C0                <1> 	sub	al, al ; eax = 0
  2384 0000B158 EB0A                <1> 	jmp	short loc_update_parent_dir_lmdt_load_sub_dir_3
  2385                              <1> 
  2386                              <1> loc_UPDLMDT_proc_retn:
  2387 0000B15A C3                  <1> 	retn
  2388                              <1>          
  2389                              <1> loc_update_parent_dir_lmdt_load_sub_dir_1:
  2390 0000B15B B010                <1> 	mov	al, 16
  2391 0000B15D F6E4                <1> 	mul	ah 
  2392 0000B15F 01C6                <1> 	add	esi, eax
  2393                              <1> 
  2394                              <1> loc_update_parent_dir_lmdt_load_sub_dir_2:  
  2395 0000B161 8B460C              <1> 	mov	eax, [esi+12] ; Parent Dir First Cluster
  2396                              <1> 
  2397                              <1> loc_update_parent_dir_lmdt_load_sub_dir_3:
  2398 0000B164 A3[44790100]        <1> 	mov	[Current_Dir_FCluster], eax
  2399                              <1> 
  2400 0000B169 83C610              <1> 	add	esi, 16
  2401 0000B16C 66BF[CE81]          <1> 	mov	di, Dir_File_Name  
  2402 0000B170 F3A4                <1> 	rep	movsb
  2403                              <1> 	
  2404 0000B172 BE00010900          <1> 	mov	esi, Logical_DOSDisks
  2405 0000B177 29DB                <1> 	sub	ebx, ebx
  2406 0000B179 8A3D[4A790100]      <1> 	mov	bh, [Current_Drv]
  2407 0000B17F 01DE                <1> 	add	esi, ebx
  2408 0000B181 E8E2F7FFFF          <1> 	call	reload_current_directory
  2409 0000B186 722F                <1> 	jc	short loc_update_parent_dir_lmdt_restore_cdirlevel
  2410                              <1> 
  2411                              <1> loc_update_parent_dir_lmdt_locate_dir: 
  2412 0000B188 BE[CE810100]        <1> 	mov	esi, Dir_File_Name        
  2413                              <1> 	;xor	cx, cx
  2414                              <1> 	; 29/07/2022
  2415 0000B18D 31C9                <1> 	xor	ecx, ecx
  2416 0000B18F 66B81008            <1> 	mov	ax, 0810h ; Only directories
  2417 0000B193 E80BF7FFFF          <1>         call    locate_current_dir_file
  2418                              <1> 	; EDI = DirBuff Directory Entry Address
  2419 0000B198 721D                <1> 	jc	short loc_update_parent_dir_lmdt_restore_cdirlevel
  2420                              <1> 
  2421 0000B19A E844FEFFFF          <1> 	call	convert_current_date_time
  2422 0000B19F 66895712            <1> 	mov	[edi+18], dx ; Last Access Date
  2423 0000B1A3 66895718            <1> 	mov	[edi+24], dx ; Last Write Date
  2424 0000B1A7 66894716            <1> 	mov	[edi+22], ax ; Last Write Time
  2425                              <1> 
  2426 0000B1AB C605[71800100]02    <1> 	mov	byte [DirBuff_ValidData], 2
  2427 0000B1B2 E8C1FEFFFF          <1> 	call	save_directory_buffer
  2428                              <1> 	; 29/12/2017
  2429                              <1> 	;jc	short loc_update_parent_dir_lmdt_restore_cdirlevel
  2430                              <1> 	;xor	al, al 
  2431                              <1> loc_update_parent_dir_lmdt_restore_cdirlevel:
  2432                              <1>  	;current directory level restoration
  2433 0000B1B7 8A25[E8820100]      <1> 	mov	ah, [UPDLMDT_CDirLevel]
  2434 0000B1BD 8825[48790100]      <1> 	mov	[Current_Dir_Level], ah
  2435 0000B1C3 8B15[E9820100]      <1>         mov     edx, [UPDLMDT_CDirFCluster]
  2436 0000B1C9 8915[44790100]      <1> 	mov	[Current_Dir_FCluster], edx
  2437                              <1> 
  2438 0000B1CF 5E                  <1> 	pop	esi ; *
  2439 0000B1D0 C3                  <1> 	retn
  2440                              <1> 
  2441                              <1> delete_longname:
  2442                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  2443                              <1> 	; 27/02/2016 (TRDOS 386 = TRDOS v2.0)
  2444                              <1> 	; 01/08/2011 (DIR.ASM, 'proc_delete_longname')
  2445                              <1> 	; 14/03/2010
  2446                              <1> 	; INPUT ->
  2447                              <1> 	; 	EAX = Directory Entry (Index) Number (< 65536)
  2448                              <1> 	; OUTPUT ->
  2449                              <1> 	;	cf = 0 -> OK  (EAX = 0)
  2450                              <1> 	; 	cf = 1 -> error code in EAX (AL)
  2451                              <1> 	;
  2452                              <1> 	; (Modified registers: EAX, EDX, ECX, EBX, EDI) 
  2453                              <1> 
  2454 0000B1D1 66A3[18830100]      <1> 	mov	[DLN_EntryNumber], ax
  2455 0000B1D7 C605[1A830100]40    <1>         mov     byte [DLN_40h], 40h
  2456                              <1> 
  2457 0000B1DE E857000000          <1> 	call	locate_current_dir_entry
  2458 0000B1E3 7307                <1> 	jnc	short loc_dln_check_attributes
  2459 0000B1E5 C3                  <1> 	retn
  2460                              <1> 
  2461                              <1> loc_dln_longname_not_found:
  2462                              <1> 	;mov	eax, 2
  2463                              <1> 	; 29/07/2022
  2464 0000B1E6 29C0                <1> 	sub	eax, eax
  2465 0000B1E8 B002                <1> 	mov	al, 2
  2466 0000B1EA F9                  <1> 	stc
  2467 0000B1EB C3                  <1> 	retn
  2468                              <1> 
  2469                              <1> loc_dln_check_attributes:
  2470 0000B1EC B00F                <1> 	mov	al, 0Fh  ; long name
  2471 0000B1EE 8A670B              <1> 	mov	ah, [edi+0Bh] ; dir entry attributes
  2472 0000B1F1 38C4                <1> 	cmp	ah, al
  2473 0000B1F3 75F1                <1> 	jne	short loc_dln_longname_not_found
  2474 0000B1F5 8A27                <1> 	mov	ah, [edi]
  2475 0000B1F7 2A25[1A830100]      <1> 	sub	ah, [DLN_40h]
  2476 0000B1FD 76E7                <1> 	jna	short loc_dln_longname_not_found         
  2477 0000B1FF 80FC14              <1> 	cmp	ah, 14h ; 84-64=20 -> 20*13=260 bytes
  2478 0000B202 77E2                <1> 	ja	short loc_dln_longname_not_found
  2479                              <1>              
  2480 0000B204 C607E5              <1> 	mov	byte [edi], 0E5h  ; deleted sign
  2481 0000B207 C605[71800100]02    <1> 	mov	byte [DirBuff_ValidData], 2 ; changed/write sign
  2482 0000B20E C605[1A830100]00    <1> 	mov	byte [DLN_40h], 0 ; 40h -> 0
  2483                              <1> 	  
  2484                              <1> loc_dln_delete_next_ln_entry:
  2485 0000B215 80FC01              <1> 	cmp	ah, 1
  2486 0000B218 7616                <1> 	jna	short loc_dln_longname_retn
  2487                              <1> loc_dln_delete_next_ln_entry_0:
  2488 0000B21A 66FF05[18830100]    <1> 	inc	word [DLN_EntryNumber]
  2489 0000B221 0FB705[18830100]    <1> 	movzx	eax, word [DLN_EntryNumber] 
  2490 0000B228 E80D000000          <1> 	call	locate_current_dir_entry
  2491 0000B22D 73BD                <1> 	jnc	short loc_dln_check_attributes
  2492                              <1> 
  2493                              <1> loc_dln_longname_stc_retn:
  2494 0000B22F C3                  <1> 	retn 
  2495                              <1> 	   
  2496                              <1> loc_dln_longname_retn:
  2497                              <1> 	;cmp	byte [DirBuff_ValidData], 2
  2498                              <1> 	;jne	short loc_dln_longname_retn_xor_eax
  2499 0000B230 E843FEFFFF          <1> 	call	save_directory_buffer
  2500 0000B235 72F8                <1> 	jc	short loc_dln_longname_stc_retn
  2501                              <1> 
  2502                              <1> loc_dln_longname_retn_xor_eax:
  2503 0000B237 31C0                <1> 	xor	eax, eax
  2504 0000B239 C3                  <1> 	retn
  2505                              <1> 
  2506                              <1> locate_current_dir_entry:
  2507                              <1> 	; 30/07/2022
  2508                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  2509                              <1> 	; 16/10/2016
  2510                              <1> 	; 15/10/2016
  2511                              <1> 	; 23/03/2016
  2512                              <1> 	; 27/02/2016 (TRDOS 386 = TRDOS v2.0)
  2513                              <1> 	; 01/08/2011 (DIR.ASM, 'proc_locate_current_dir_entry')
  2514                              <1> 	; 07/03/2010
  2515                              <1> 	; INPUT ->
  2516                              <1> 	;	EAX = Directory Entry (Index) Number (< 65536) 
  2517                              <1> 	; OUTPUT ->
  2518                              <1> 	;	EDI = Directory Entry Address
  2519                              <1> 	; 	EAX = Cluster Number of Directory Buffer
  2520                              <1> 	;	EBX = Directory Buffer Entry Offset
  2521                              <1> 	;	ECX = DirBuff Valid Data identifier (CL)
  2522                              <1> 	;   	If CF = 0 and CL = 2 then
  2523                              <1> 	;	   directory buffer modified and
  2524                              <1> 	;	   must be written to disk.
  2525                              <1> 	; 	If CF = 0  and CL = 1 then
  2526                              <1> 	;	   dir buffer has been written to disk, already.
  2527                              <1> 	;	CF = 1 -> Error code in EAX (AL)
  2528                              <1> 	;
  2529                              <1> 	; (Modified registers: EAX, EDX, ECX, EBX, EDI) 
  2530                              <1> 
  2531                              <1> loc_locate_current_dir_entry:
  2532 0000B23A 56                  <1> 	push	esi
  2533 0000B23B 89C1                <1> 	mov	ecx, eax
  2534                              <1> 	;mov	edx, 32
  2535                              <1> 	; 29/07/2022
  2536 0000B23D 29D2                <1> 	sub	edx, edx
  2537 0000B23F B220                <1> 	mov	dl, 32
  2538 0000B241 F7E2                <1> 	mul	edx 
  2539 0000B243 A3[24830100]        <1> 	mov	[LCDE_ByteOffset], eax
  2540 0000B248 31DB                <1> 	xor	ebx, ebx
  2541 0000B24A 8A3D[4A790100]      <1> 	mov	bh, [Current_Drv]
  2542 0000B250 A0[6F800100]        <1>         mov     al, [DirBuff_DRV]
  2543 0000B255 2C41                <1> 	sub	al, 'A'
  2544 0000B257 BE00010900          <1>         mov     esi, Logical_DOSDisks
  2545 0000B25C 01DE                <1> 	add	esi, ebx
  2546 0000B25E 38C7                <1> 	cmp	bh, al
  2547                              <1> 	;jne	loc_lcde_reload_current_directory
  2548                              <1> 	; 29/07/2022
  2549 0000B260 7405                <1> 	je	short loc_lcde_cdl_check
  2550 0000B262 E986000000          <1> 	jmp	loc_lcde_reload_current_directory
  2551                              <1> loc_lcde_cdl_check:
  2552                              <1> 	; 29/07/2022
  2553 0000B267 31C0                <1> 	xor	eax, eax
  2554 0000B269 803D[48790100]00    <1> 	cmp	byte [Current_Dir_Level], 0
  2555 0000B270 7728                <1> 	ja	short loc_lcde_calc_dirbuff_cluster_offset
  2556                              <1> 	; 27/02/2016
  2557                              <1> 	; TRDOS v1 has bug here for FAT32 fs !
  2558                              <1> 	; (Root Directory Entries for FAT32 = 0)
  2559 0000B272 807E0303            <1> 	cmp	byte [esi+LD_FATType], 3  ; FAT32
  2560 0000B276 7322                <1> 	jnb	short loc_lcde_calc_dirbuff_cluster_offset
  2561                              <1> 
  2562                              <1> loc_lcde_cdl_check_FAT12_16:
  2563                              <1> 	; 29/07/2022
  2564                              <1> 	;xor	eax, eax
  2565 0000B278 668B4617            <1> 	mov	ax, [esi+LD_BPB+RootDirEnts]
  2566                              <1> 	;dec	ax
  2567 0000B27C 48                  <1> 	dec	eax
  2568                              <1> 	;xor	dx, dx  
  2569                              <1> 	;cmp	ax, cx ; cx = Directory Entry (Index) Number
  2570                              <1> 	; 29/07/2022
  2571 0000B27D 39C8                <1> 	cmp	eax, ecx
  2572 0000B27F 720E                <1> 	jb	short loc_lcde_stc_12h_retn
  2573 0000B281 66890D[1C830100]    <1> 	mov	[LCDE_EntryIndex], cx
  2574 0000B288 31C0                <1> 	xor	eax, eax
  2575 0000B28A E985000000          <1>         jmp     loc_lcde_check_dir_buffer_cluster
  2576                              <1> 
  2577                              <1> loc_lcde_stc_12h_retn:
  2578 0000B28F 5E                  <1> 	pop	esi
  2579 0000B290 89CB                <1> 	mov	ebx, ecx
  2580 0000B292 89D1                <1> 	mov	ecx, edx
  2581                              <1> 	; 16/10/2016 (12h -> 12)
  2582 0000B294 B80C000000          <1> 	mov	eax, 12 ; No more files
  2583 0000B299 C3                  <1> 	retn 
  2584                              <1> 
  2585                              <1> loc_lcde_calc_dirbuff_cluster_offset:
  2586                              <1> 	;mov	bl, [esi+LD_BPB+SecPerClust]
  2587                              <1> 	;xor	bh, bh
  2588                              <1> 	;mov	ax, [esi+LD_BPB+BytesPerSec]
  2589                              <1> 	;mul	bx
  2590                              <1>  	;;or	dx, dx ; If bytes per cluster > 32KB it is invalid
  2591                              <1> 	;; 29/07/2022
  2592                              <1> 	;or	dl, dl
  2593                              <1> 	;jnz	short loc_lcde_invalid_format
  2594                              <1> 	; 29/07/2022
  2595 0000B29A 31DB                <1> 	xor	ebx, ebx
  2596 0000B29C 8A5E13              <1> 	mov	bl, [esi+LD_BPB+SecPerClust]
  2597 0000B29F 668B4611            <1> 	mov	ax, [esi+LD_BPB+BytesPerSec]
  2598 0000B2A3 F7E3                <1> 	mul	ebx
  2599 0000B2A5 89C1                <1> 	mov	ecx, eax
  2600                              <1> 	;mov	cx, ax ; BYTES PER CLUSTER
  2601 0000B2A7 A1[24830100]        <1> 	mov	eax, [LCDE_ByteOffset]
  2602                              <1> 	;sub	edx, edx
  2603 0000B2AC F7F1                <1> 	div	ecx
  2604 0000B2AE 3DFFFF0000          <1> 	cmp	eax, 65535
  2605 0000B2B3 7746                <1> 	ja	short loc_lcde_invalid_format
  2606                              <1> 
  2607                              <1> 	; cluster sequence number of directory (< 65536)
  2608 0000B2B5 66A3[1E830100]      <1> 	mov	[LCDE_ClusterSN], ax 
  2609                              <1> 
  2610                              <1> 	;mov	ax, dx ; byte offset in cluster (directory buffer)
  2611                              <1> 	; 29/07/2022
  2612 0000B2BB 89D0                <1> 	mov	eax, edx
  2613                              <1> 	;mov	bx, 32	; 1 dir entry = 32 bytes
  2614 0000B2BD B320                <1>         mov	bl, 32
  2615                              <1> 	;sub	dx, dx	; 0
  2616                              <1> 	;div	bx 
  2617 0000B2BF 29D2                <1> 	sub	edx, edx
  2618 0000B2C1 F7F3                <1> 	div	ebx
  2619 0000B2C3 66A3[1C830100]      <1> 	mov	[LCDE_EntryIndex], ax ; dir entry index/sequence number
  2620                              <1> 				      ; (in directory buffer/cluster)	  
  2621                              <1> loc_lcde_get_current_sub_dir_fcluster:
  2622 0000B2C9 A1[44790100]        <1> 	mov	eax, [Current_Dir_FCluster]
  2623                              <1> 
  2624                              <1> loc_lcde_get_next_cluster:
  2625 0000B2CE 66833D[1E830100]00  <1> 	cmp	word [LCDE_ClusterSN], 0
  2626 0000B2D6 763C                <1> 	jna	short loc_lcde_check_dir_buffer_cluster
  2627 0000B2D8 A3[20830100]        <1> 	mov	[LCDE_Cluster], eax
  2628 0000B2DD E80D100000          <1> 	call	get_next_cluster
  2629 0000B2E2 721E                <1> 	jc	short loc_lcde_check_gnc_error
  2630 0000B2E4 66FF0D[1E830100]    <1>   	dec	word [LCDE_ClusterSN]
  2631 0000B2EB EBE1                <1> 	jmp	short loc_lcde_get_next_cluster
  2632                              <1> 
  2633                              <1> loc_lcde_reload_current_directory:
  2634 0000B2ED 51                  <1> 	push	ecx
  2635 0000B2EE E875F6FFFF          <1> 	call	reload_current_directory
  2636 0000B2F3 59                  <1> 	pop	ecx
  2637                              <1> 	;jnc	loc_lcde_cdl_check
  2638                              <1> 	;pop	esi
  2639                              <1> 	;retn
  2640                              <1> 	; 09/08/2022
  2641 0000B2F4 727E                <1> 	jc	short loc_lcde_retn
  2642 0000B2F6 E96CFFFFFF          <1> 	jmp	loc_lcde_cdl_check
  2643                              <1> 
  2644                              <1> loc_lcde_invalid_format:
  2645                              <1> 	; 15/10/2016 (0Bh -> 28)
  2646                              <1> 	;mov	eax, 28 ; Invalid Format !
  2647                              <1> 	; 29/07/2022
  2648 0000B2FB 29C0                <1> 	sub	eax, eax
  2649 0000B2FD B01C                <1> 	mov	al, 28
  2650                              <1> loc_lcde_drive_not_ready_read_err:
  2651 0000B2FF F9                  <1> 	stc
  2652 0000B300 5E                  <1> 	pop	esi 
  2653 0000B301 C3                  <1> 	retn  
  2654                              <1> 
  2655                              <1> loc_lcde_check_gnc_error:
  2656 0000B302 09C0                <1> 	or	eax, eax
  2657 0000B304 75F9                <1> 	jnz	short loc_lcde_drive_not_ready_read_err
  2658 0000B306 66FF0D[1E830100]    <1> 	dec	word [LCDE_ClusterSN]
  2659 0000B30D 75EC                <1> 	jnz	short loc_lcde_invalid_format 
  2660 0000B30F A1[20830100]        <1> 	mov	eax, [LCDE_Cluster]
  2661                              <1> 
  2662                              <1> loc_lcde_check_dir_buffer_cluster:
  2663 0000B314 3B05[76800100]      <1> 	cmp	eax, [DirBuff_Cluster]
  2664 0000B31A 755A                <1> 	jne	short loc_lcde_load_dir_cluster
  2665 0000B31C 803D[71800100]00    <1> 	cmp	byte [DirBuff_ValidData], 0
  2666 0000B323 7726                <1> 	ja	short lcde_check_dir_buffer_cluster_next
  2667 0000B325 803D[48790100]00    <1> 	cmp	byte [Current_Dir_Level], 0    
  2668 0000B32C 775D                <1> 	ja	short loc_lcde_load_dir_cluster_0
  2669                              <1> 	; 27/02/2016
  2670                              <1> 	; TRDOS v1 has bug here for FAT32 fs !
  2671 0000B32E 807E0303            <1> 	cmp	byte [esi+LD_FATType], 3  ; FAT32
  2672 0000B332 7357                <1> 	jnb	short loc_lcde_load_dir_cluster_0
  2673                              <1> 	;
  2674 0000B334 0FB74E17            <1> 	movzx	ecx, word [esi+LD_BPB+RootDirEnts]
  2675 0000B338 6683C10F            <1> 	add	cx, 15 ; round up (16 entries per sector)
  2676                              <1> 	;shr	cx, 4 ; 1 sector contains 16 dir entries	
  2677                              <1> 	; 29/07/2022
  2678 0000B33C C1E904              <1> 	shr	ecx, 4
  2679 0000B33F 8B4664              <1>         mov     eax, [esi+LD_ROOTBegin]
  2680 0000B342 EB52                <1> 	jmp	short loc_lcde_load_dir_cluster_1 
  2681                              <1> 
  2682                              <1> loc_lcde_validate_dirBuff:
  2683 0000B344 C605[71800100]01    <1> 	mov	byte [DirBuff_ValidData], 1
  2684                              <1> 
  2685                              <1> lcde_check_dir_buffer_cluster_next:
  2686 0000B34B 0FB71D[1C830100]    <1> 	movzx	ebx, word [LCDE_EntryIndex]
  2687 0000B352 663B1D[74800100]    <1> 	cmp	bx, [DirBuff_LastEntry]
  2688 0000B359 77A0                <1> 	ja	short loc_lcde_invalid_format 
  2689                              <1> 	;mov	eax, 32
  2690                              <1> 	; 29/07/2022
  2691 0000B35B 31C0                <1> 	xor	eax, eax
  2692 0000B35D B020                <1> 	mov	al, 32
  2693 0000B35F F7E3                <1> 	mul	ebx
  2694                              <1> 	;or	edx, edx
  2695                              <1> 	;jnz	short loc_lcde_invalid_format
  2696                              <1> 
  2697 0000B361 BF00000800          <1> 	mov	edi, Directory_Buffer  
  2698 0000B366 01C7                <1> 	add	edi, eax ; add entry offset to buffer address
  2699                              <1> 
  2700                              <1> loc_lcde_dir_buffer_last_check:
  2701 0000B368 A1[76800100]        <1> 	mov	eax, [DirBuff_Cluster]
  2702 0000B36D 0FB60D[71800100]    <1> 	movzx	ecx, byte [DirBuff_ValidData]
  2703                              <1> 
  2704                              <1> loc_lcde_retn:
  2705 0000B374 5E                  <1> 	pop	esi
  2706 0000B375 C3                  <1> 	retn
  2707                              <1> 
  2708                              <1> loc_lcde_load_dir_cluster:
  2709                              <1> 	;cmp	byte [DirBuff_ValidData], 2
  2710                              <1> 	;jne	short loc_lcde_load_dir_cluster_n2
  2711 0000B376 50                  <1> 	push	eax
  2712 0000B377 E8FCFCFFFF          <1> 	call	save_directory_buffer
  2713 0000B37C 58                  <1> 	pop	eax
  2714 0000B37D 72F5                <1> 	jc	short loc_lcde_retn
  2715                              <1> 
  2716                              <1> loc_lcde_load_dir_cluster_n2:
  2717 0000B37F C605[71800100]00    <1> 	mov	byte [DirBuff_ValidData], 0
  2718 0000B386 A3[76800100]        <1> 	mov	[DirBuff_Cluster], eax
  2719                              <1> 
  2720                              <1> loc_lcde_load_dir_cluster_0:
  2721                              <1> 	;sub	eax, 2
  2722                              <1> 	; 30/07/2022
  2723 0000B38B 48                  <1> 	dec	eax
  2724 0000B38C 48                  <1> 	dec	eax
  2725 0000B38D 0FB64E13            <1> 	movzx	ecx, byte [esi+LD_BPB+SecPerClust]
  2726 0000B391 F7E1                <1> 	mul	ecx
  2727 0000B393 034668              <1>         add     eax, [esi+LD_DATABegin]
  2728                              <1> 
  2729                              <1> loc_lcde_load_dir_cluster_1:
  2730 0000B396 BB00000800          <1> 	mov	ebx, Directory_Buffer
  2731                              <1> 	; ecx = sector count
  2732 0000B39B E8ED6A0000          <1> 	call	disk_read
  2733 0000B3A0 73A2                <1> 	jnc	short loc_lcde_validate_dirBuff
  2734                              <1> 
  2735                              <1> 	; 15/10/2016 
  2736                              <1> 	; (Disk read error instead of drv not ready err)
  2737 0000B3A2 B811000000          <1> 	mov	eax, 17 ; Drive not ready or read error !
  2738 0000B3A7 EBCB                <1> 	jmp	short loc_lcde_retn
  2739                              <1> 
  2740                              <1> 
  2741                              <1> remove_file:
  2742                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  2743                              <1> 	; 15/10/2016
  2744                              <1> 	; 28/02/2016 (TRDOS 386 = TRDOS v2.0)
  2745                              <1> 	; 10/04/2011 (FILE.ASM, 'proc_delete_file')
  2746                              <1> 	; 09/08/2010
  2747                              <1> 	; INPUT ->
  2748                              <1> 	;	EDI = Directory Buffer Entry Address
  2749                              <1> 	;	 CX = Directory Buffer Entry Counter/Index
  2750                              <1> 	;	 BL = Longname Entry Length
  2751                              <1> 	;	 BH = Logical DOS Drive Number 
  2752                              <1> 
  2753 0000B3A9 29C0                <1> 	sub	eax, eax
  2754 0000B3AB 88FC                <1> 	mov	ah, bh
  2755 0000B3AD BE00010900          <1> 	mov	esi, Logical_DOSDisks
  2756 0000B3B2 01C6                <1> 	add	esi, eax
  2757                              <1> 
  2758 0000B3B4 807E0301            <1> 	cmp	byte [esi+LD_FATType], 1
  2759 0000B3B8 7311                <1> 	jnb	short loc_del_fat_file 
  2760                              <1>               
  2761 0000B3BA 807E04A1            <1> 	cmp	byte [esi+LD_FSType], 0A1h
  2762 0000B3BE 7406                <1> 	je	short loc_del_fs_file
  2763                              <1> 
  2764                              <1> loc_del_file_invalid_format:
  2765 0000B3C0 30E4                <1> 	xor	ah, ah
  2766                              <1> 	; 15/10/2016 (0Bh -> 28)
  2767 0000B3C2 B01C                <1> 	mov	al, 28  ; Invalid Format
  2768 0000B3C4 F9                  <1> 	stc 
  2769 0000B3C5 C3                  <1> 	retn
  2770                              <1> 
  2771                              <1> loc_del_fs_file:
  2772                              <1> 	;call	delete_fs_file
  2773                              <1> 	;retn
  2774                              <1> 	; 29/07/2022
  2775 0000B3C6 E9230F0000          <1> 	jmp	delete_fs_file	
  2776                              <1> 
  2777                              <1> loc_del_fat_file:
  2778 0000B3CB E808000000          <1> 	call	delete_directory_entry
  2779 0000B3D0 7205                <1> 	jc	short loc_del_file_err_retn 
  2780                              <1> 
  2781                              <1> loc_delfile_unlink_cluster_chain:
  2782 0000B3D2 E8C8160000          <1> 	call	truncate_cluster_chain
  2783                              <1> 	;jc	short loc_del_file_err_retn
  2784                              <1> 
  2785                              <1> loc_delfile_return:
  2786                              <1> loc_del_file_err_retn:
  2787 0000B3D7 C3                  <1> 	retn
  2788                              <1> 
  2789                              <1> delete_directory_entry:
  2790                              <1> 	; 15/10/2016
  2791                              <1> 	; 28/02/2016 (TRDOS 386 = TRDOS v2.0)
  2792                              <1> 	; 01/08/2011 (DIR.ASM, 'proc_delete_directory_entry')
  2793                              <1> 	; 10/04/2011 
  2794                              <1> 	; INPUT ->
  2795                              <1> 	; 	ESI = Logical Dos Drive Descripton Table Address 
  2796                              <1> 	;	EDI = Directory Buffer Entry Address
  2797                              <1> 	;	 CX = Directory Buffer Entry Counter/Index
  2798                              <1> 	;	 BL = Longname Entry Length
  2799                              <1> 	; OUTPUT ->
  2800                              <1> 	; 	ESI = Logical dos drive descripton table address 
  2801                              <1> 	;	EAX = First cluster to be truncated/unlinked
  2802                              <1> 	;       CF = 1 -> Error code in EAX (AL)
  2803                              <1> 	;       CF = 0 & BH <> 0 -> LMDT write error  (BH = 1)
  2804                              <1> 	;       CF = 0 & BL <> 0 -> Long name delete error (BL = FFh) 
  2805                              <1> 	;
  2806                              <1> 	;  (EDI, EBX, ECX register contents will be changed)
  2807                              <1> 
  2808 0000B3D8 881D[B2820100]      <1> 	mov	[DelFile_LNEL], bl
  2809 0000B3DE 66890D[B0820100]    <1> 	mov	[DelFile_EntryCounter], cx
  2810                              <1> 
  2811 0000B3E5 668B4714            <1> 	mov	ax, [edi+20] ; First Cluster High Word
  2812 0000B3E9 C1E010              <1> 	shl	eax, 16
  2813 0000B3EC 668B471A            <1> 	mov	ax, [edi+26] ; First Cluster Low Word
  2814                              <1> 
  2815 0000B3F0 A3[AC820100]        <1> 	mov	[DelFile_FCluster], eax
  2816                              <1> 
  2817                              <1> loc_del_short_name:
  2818 0000B3F5 C607E5              <1> 	mov	byte [edi], 0E5h  ; Deleted sign
  2819                              <1> 
  2820 0000B3F8 C605[71800100]02    <1> 	mov	byte [DirBuff_ValidData], 2
  2821 0000B3FF E874FCFFFF          <1> 	call	save_directory_buffer
  2822 0000B404 723D                <1> 	jc	short loc_delete_direntry_err_return
  2823                              <1>  
  2824                              <1> loc_del_long_name:
  2825 0000B406 0FB615[B2820100]    <1> 	movzx	edx, byte [DelFile_LNEL]
  2826 0000B40D 08D2                <1> 	or	dl, dl
  2827 0000B40F 7416                <1> 	jz	short loc_del_dir_entry_update_parent_dir_lm_date
  2828                              <1> 
  2829 0000B411 8835[B2820100]      <1> 	mov	[DelFile_LNEL], dh ; 0              
  2830                              <1>   
  2831 0000B417 0FB705[B0820100]    <1> 	movzx	eax, word [DelFile_EntryCounter]
  2832 0000B41E 29D0                <1> 	sub	eax, edx
  2833                              <1> 	;jnc	short loc_del_long_name_continue
  2834 0000B420 7205                <1> 	jc	short loc_del_dir_entry_update_parent_dir_lm_date   
  2835                              <1> 
  2836                              <1> ;loc_del_direntry_inv_data_return: ; 15/10/2016 (0Dh -> 29)
  2837                              <1> ;	mov	eax, 29 ; 0Dh (TRDOS 8086) ; Invalid data
  2838                              <1> ;	retn
  2839                              <1> 
  2840                              <1> loc_del_long_name_continue: 
  2841                              <1> 	; AX = Directory Entry Number of the long name last entry
  2842 0000B422 E8AAFDFFFF          <1> 	call	delete_longname
  2843                              <1> 	;jc	short loc_delete_direntry_err_return
  2844                              <1> 
  2845                              <1> loc_del_dir_entry_update_parent_dir_lm_date:
  2846 0000B427 801D[B2820100]00    <1> 	sbb	byte [DelFile_LNEL], 0 ; 0FFh if cf = 1
  2847                              <1> 
  2848 0000B42E E8DDFCFFFF          <1> 	call	update_parent_dir_lmdt
  2849 0000B433 B700                <1> 	mov	bh, 0
  2850 0000B435 80D700              <1> 	adc	bh, 0
  2851                              <1> 
  2852 0000B438 8A1D[B2820100]      <1> 	mov	bl, byte [DelFile_LNEL]
  2853                              <1>  
  2854                              <1> loc_delete_direntry_return:
  2855 0000B43E A1[AC820100]        <1> 	mov	eax, [DelFile_FCluster]
  2856                              <1> loc_delete_direntry_err_return:
  2857 0000B443 C3                  <1> 	retn
  2858                              <1> 
  2859                              <1> rename_directory_entry:
  2860                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  2861                              <1> 	; 13/11/2017
  2862                              <1> 	; 15/10/2016
  2863                              <1> 	; 06/03/2016 (TRDOS 386 = TRDOS v2.0)
  2864                              <1> 	; 01/08/2011 (DIR.ASM, 'proc_rename_directory_entry')
  2865                              <1> 	; 19/11/2010
  2866                              <1> 	; INPUT -> (Current Directory)
  2867                              <1> 	;	CX = Directory Entry Number
  2868                              <1> 	;      EAX = First Cluster number of file or directory
  2869                              <1> 	;      EBX = Longname Length (dir entry count) (< 256)
  2870                              <1> 	;      ESI = New file (or directory) name (no path).
  2871                              <1> 	;           (ASCIIZ string)  
  2872                              <1> 	; OUTPUT -> 
  2873                              <1> 	;      CF = 0 -> successfull
  2874                              <1> 	;      CF = 1 -> error code in EAX (AL)
  2875                              <1> 	;
  2876                              <1> 	; (EAX, EBX, ECX, EDX, ESI, EDI will be changed)
  2877                              <1> 
  2878 0000B444 803D[49790100]00    <1> 	cmp	byte [Current_FATType], 0
  2879 0000B44B 7705                <1> 	ja	short loc_rename_directory_entry
  2880                              <1> 
  2881                              <1> 	;call	rename_fs_file_or_directory
  2882                              <1> 	;retn
  2883                              <1> 	; 29/07/2022
  2884 0000B44D E99C0E0000          <1>  	jmp	rename_fs_file_or_directory	
  2885                              <1> 	
  2886                              <1> loc_rename_directory_entry:
  2887 0000B452 881D[B2820100]      <1> 	mov	[DelFile_LNEL], bl
  2888 0000B458 66890D[B0820100]    <1> 	mov	[DelFile_EntryCounter], cx
  2889 0000B45F A3[AC820100]        <1> 	mov	[DelFile_FCluster], eax
  2890                              <1> 
  2891 0000B464 0FB7C1              <1> 	movzx	eax, cx
  2892 0000B467 E8CEFDFFFF          <1> 	call	locate_current_dir_entry
  2893 0000B46C 7307                <1> 	jnc	short loc_rename_direntry_check_fcluster
  2894                              <1> 
  2895                              <1> loc_rename_direntry_pop_retn:
  2896 0000B46E C3                  <1> 	retn
  2897                              <1> 
  2898                              <1> loc_rename_direntry_pop_invd_retn:
  2899                              <1> 	; 29/07/2022
  2900                              <1> 	;stc
  2901                              <1> loc_rename_direntry_invd_retn:
  2902                              <1> 	; 15/10/2016 (0Dh -> 29)
  2903                              <1> 	;mov	eax, 29 ; Invalid data
  2904                              <1> 	; 29/07/2022
  2905 0000B46F 29C0                <1> 	sub	eax, eax
  2906 0000B471 B01D                <1> 	mov	al, 29
  2907 0000B473 F9                  <1> 	stc
  2908                              <1> loc_rename_retn:
  2909 0000B474 C3                  <1> 	retn 
  2910                              <1> 
  2911                              <1> loc_rename_direntry_check_fcluster:
  2912 0000B475 668B5714            <1> 	mov	dx, [edi+20] ; First Cluster HW
  2913 0000B479 C1E210              <1> 	shl	edx, 16 ; 13/11/2017
  2914 0000B47C 668B571A            <1> 	mov	dx, [edi+26] ; First Cluster LW
  2915 0000B480 3B15[AC820100]      <1> 	cmp	edx, [DelFile_FCluster]
  2916 0000B486 75E7                <1> 	jne	short loc_rename_direntry_pop_invd_retn
  2917                              <1> 	; ESI = New file (or directory) name. (ASCIIZ string)
  2918                              <1> 	; 06/03/2016
  2919                              <1> 	; TRDOS v2 - NOTE: 'convert_file_name' procedure
  2920                              <1> 	; has been modified for eliminating following situation.
  2921                              <1> 	; 
  2922                              <1> 	; TRDOS v1 - NOTE: If file/dir name is more than 11 bytes
  2923                              <1> 	; without a dot, attributes (edi+11) byte will be overwritten !
  2924                              <1> 	; (Dot file name input must be proper for 11 byte dir entry
  2925                              <1> 	;  type file name output.) 
  2926 0000B488 E8E5F6FFFF          <1> 	call	convert_file_name
  2927                              <1> 
  2928 0000B48D C605[71800100]02    <1>         mov     byte [DirBuff_ValidData], 2
  2929 0000B494 E8DFFBFFFF          <1> 	call	save_directory_buffer
  2930 0000B499 72D9                <1> 	jc	short loc_rename_retn
  2931                              <1> 
  2932                              <1> loc_rename_direntry_del_ln:
  2933 0000B49B 0FB615[B2820100]    <1> 	movzx	edx, byte [DelFile_LNEL]
  2934 0000B4A2 08D2                <1> 	or	dl, dl
  2935 0000B4A4 7410                <1> 	jz	short loc_rename_direntry_update_parent_dir_lm_date
  2936                              <1> 
  2937 0000B4A6 0FB705[B0820100]    <1> 	movzx	eax, word [DelFile_EntryCounter]
  2938 0000B4AD 29D0                <1> 	sub	eax, edx
  2939 0000B4AF 72BE                <1> 	jc	short loc_rename_direntry_invd_retn
  2940                              <1> 
  2941                              <1> loc_rename_direntry_del_ln_continue: 
  2942                              <1> 	; EAX = Directory Entry Number of the long name last entry
  2943 0000B4B1 E81BFDFFFF          <1> 	call	delete_longname
  2944                              <1> 
  2945                              <1> loc_rename_direntry_update_parent_dir_lm_date:
  2946 0000B4B6 E855FCFFFF          <1> 	call	update_parent_dir_lmdt
  2947 0000B4BB 31C0                <1> 	xor	eax, eax 
  2948 0000B4BD C3                  <1> 	retn
  2949                              <1> 
  2950                              <1> move_source_file_to_destination_file:
  2951                              <1> 	; 07/08/2022
  2952                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  2953                              <1> 	; 15/10/2016
  2954                              <1> 	; 11/03/2016
  2955                              <1> 	; 10/03/2016 (TRDOS 386 = TRDOS v2.0)
  2956                              <1> 	; 01/08/2011 (FILE.ASM)
  2957                              <1> 	; 04/08/2010
  2958                              <1> 	;
  2959                              <1> 	;   Phase 1 -> Check destination file, 
  2960                              <1> 	;              'not found' is required
  2961                              <1> 	;   Phase 2 -> Check source file
  2962                              <1> 	;              'found' and proper attributes is required
  2963                              <1> 	;   Phase 3 -> Make destination directory entry,
  2964                              <1> 	;           add new dir cluster or section if it is required
  2965                              <1> 	;   Phase 4 -> Delete source directory entry.
  2966                              <1> 	;       cf = 1 causes to return before the phase 4.
  2967                              <1> 	;    (source file protection against any possible errors)    
  2968                              <1> 	;
  2969                              <1> 	; 08/05/2011 major modification
  2970                              <1> 	;            -> destination file deleting is removed   
  2971                              <1> 	;            for msdos move/rename compatibility.
  2972                              <1> 	;            (Access denied error will return if
  2973                              <1> 	;            the destination file is found...)
  2974                              <1> 	; INPUT ->
  2975                              <1> 	;	 ESI = Source File Pathname (Asciiz)
  2976                              <1> 	;        EDI = Destination File Pathname (Asciiz)
  2977                              <1> 	;        AL = 0 --> Interrupt (System call)
  2978                              <1> 	;        AL > 0 --> Command Interpreter (Question)
  2979                              <1> 	;        AL = 1 --> Question Phase
  2980                              <1> 	;        AL = 2 --> Progress Phase        
  2981                              <1> 	; OUTPUT -> 
  2982                              <1> 	;	 cf = 0 -> OK
  2983                              <1> 	;        EAX = Destination directory first cluster
  2984                              <1> 	;        ESI = Logical DOS drive description table 
  2985                              <1> 	;        EBX = Destination file structure offset
  2986                              <1> 	;        CX = 0 (CX > 0 --> calculate free space error)
  2987                              <1> 	;        cf = 1 -> Error code in EAX (AL) 
  2988                              <1> 	;
  2989                              <1> 	;  (EDX, ECX, EBX, ESI, EDI will be changed)
  2990                              <1> 
  2991 0000B4BE 3C02                <1> 	cmp	al, 2
  2992                              <1> 	;je	msftdf_df2_check_directory
  2993                              <1> 	; 29/07/2022
  2994 0000B4C0 7505                <1> 	jne	short msftdf
  2995 0000B4C2 E97B010000          <1> 	jmp	msftdf_df2_check_directory
  2996                              <1> msftdf:
  2997 0000B4C7 A2[32840100]        <1> 	mov	[move_cmd_phase], al
  2998                              <1> 
  2999                              <1> msftdf_parse_sf_path:
  3000                              <1> 	; ESI = ASCIIZ pathname (Source)
  3001 0000B4CC 57                  <1> 	push	edi 
  3002 0000B4CD BF[30830100]        <1> 	mov	edi, SourceFile_Drv
  3003 0000B4D2 E865F7FFFF          <1> 	call	parse_path_name
  3004 0000B4D7 5E                  <1> 	pop	esi
  3005 0000B4D8 7211                <1> 	jc	short msftdf_psf_retn
  3006                              <1> 
  3007                              <1> msftdf_parse_df_path:
  3008                              <1> 	; ESI = ASCIIZ pathname	(Destination)
  3009 0000B4DA BF[B0830100]        <1> 	mov	edi, DestinationFile_Drv
  3010 0000B4DF E858F7FFFF          <1> 	call	parse_path_name
  3011 0000B4E4 7306                <1> 	jnc	short msftdf_check_sf_drv
  3012                              <1> 
  3013 0000B4E6 3C01                <1> 	cmp	al, 1 ; File or directory name is not existing
  3014 0000B4E8 7602                <1> 	jna	short msftdf_check_sf_drv
  3015                              <1> 
  3016                              <1> msftdf_stc_retn:
  3017 0000B4EA F9                  <1> 	stc
  3018                              <1> msftdf_psf_retn:
  3019 0000B4EB C3                  <1> 	retn 
  3020                              <1> 
  3021                              <1> msftdf_check_sf_drv:
  3022 0000B4EC A0[30830100]        <1> 	mov	al, [SourceFile_Drv]
  3023                              <1> 
  3024                              <1> msftdf_check_df_drv:
  3025 0000B4F1 8A15[B0830100]      <1> 	mov	dl, [DestinationFile_Drv]
  3026                              <1> 
  3027                              <1> msftdf_compare_sf_df_drv:
  3028 0000B4F7 29DB                <1> 	sub	ebx, ebx
  3029 0000B4F9 8A3D[4A790100]      <1> 	mov	bh, [Current_Drv]
  3030 0000B4FF 38C2                <1> 	cmp	dl, al
  3031 0000B501 7408                <1> 	je	short msftdf_check_sf_df_drv_ok
  3032                              <1> 
  3033                              <1> msftdf_not_same_drv:
  3034                              <1>         ; DL = source file's drive number
  3035 0000B503 88C6                <1> 	mov	dh, al ; destination file's drive number
  3036                              <1> 	; 15/10/2016 (11h -> 21)
  3037                              <1> 	;mov	eax, 21 ; Not the same drive
  3038                              <1> 	; 29/07/2022
  3039 0000B505 29C0                <1> 	sub	eax, eax
  3040 0000B507 B015                <1> 	mov	al, 21
  3041 0000B509 F9                  <1> 	stc
  3042 0000B50A C3                  <1> 	retn 
  3043                              <1> 
  3044                              <1> msftdf_check_sf_df_drv_ok:
  3045 0000B50B 8815[33840100]      <1> 	mov	[msftdf_sf_df_drv], dl
  3046                              <1> 
  3047 0000B511 29C0                <1>         sub	eax, eax
  3048 0000B513 88D4                <1> 	mov	ah, dl
  3049 0000B515 0500010900          <1> 	add	eax, Logical_DOSDisks
  3050 0000B51A A3[34840100]        <1> 	mov	[msftdf_drv_offset], eax
  3051                              <1> 
  3052 0000B51F 38FA                <1> 	cmp	dl, bh ; byte [Current_Drv]
  3053 0000B521 7407                <1> 	je	short msftdf_df_check_directory
  3054                              <1> 
  3055                              <1> msftdf_change_drv:
  3056 0000B523 E863C3FFFF          <1> 	call 	change_current_drive
  3057 0000B528 726D                <1> 	jc	short msftdf_df_error_retn
  3058                              <1> 	  
  3059                              <1> msftdf_check_destination_file:
  3060                              <1> msftdf_df_check_directory:
  3061 0000B52A BE[B1830100]        <1> 	mov	esi, DestinationFile_Directory
  3062 0000B52F 803E20              <1> 	cmp	byte [esi], 20h
  3063 0000B532 760F                <1> 	jna	short msftdf_df_find_1
  3064                              <1> 
  3065                              <1> msftdf_df_change_directory:
  3066 0000B534 FE05[BD300100]      <1> 	inc	byte [Restore_CDIR]
  3067 0000B53A 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0 
  3068 0000B53C E80FF1FFFF          <1> 	call	change_current_directory
  3069 0000B541 7254                <1> 	jc	short msftdf_df_error_retn
  3070                              <1> 
  3071                              <1> ;msftdf_df_change_prompt_dir_string:
  3072                              <1> ;	call 	change_prompt_dir_string
  3073                              <1> 
  3074                              <1> msftdf_df_find_1:
  3075 0000B543 BE[F2830100]        <1>         mov     esi, DestinationFile_Name
  3076 0000B548 803E20              <1> 	cmp	byte [esi], 20h
  3077 0000B54B 7632                <1> 	jna	short msftdf_df_copy_sf_name
  3078                              <1> 
  3079                              <1> msftdf_df_find_2:
  3080 0000B54D 6631C0              <1> 	xor	ax, ax ; DestinationFile_AttributesMask -> any/zero
  3081 0000B550 E823D6FFFF          <1> 	call	find_first_file
  3082                              <1> 	;jnc	msftdf_permission_denied_retn
  3083                              <1> 	; 29/07/2022
  3084 0000B555 7205                <1> 	jc	short msftdf_df_check_error_code
  3085 0000B557 E98B000000          <1> 	jmp	msftdf_permission_denied_retn 
  3086                              <1> 
  3087                              <1> msftdf_df_check_error_code:
  3088                              <1> 	;cmp	eax, 2 ; File not found error
  3089 0000B55C 3C02                <1> 	cmp	al, 2
  3090 0000B55E 7536                <1> 	jne	short msftdf_df_stc_retn
  3091                              <1>               
  3092                              <1> msftdf_df_check_fname:
  3093                              <1> 	; 15/10/2016
  3094 0000B560 BE[F2830100]        <1> 	mov	esi, DestinationFile_Name ; *
  3095 0000B565 E8B3D9FFFF          <1> 	call	check_filename
  3096 0000B56A 7307                <1> 	jnc	short msftdf_convert_df_direntry_name
  3097                              <1> 	; invalid file name chars !
  3098 0000B56C B81A000000          <1> 	mov	eax, ERR_INV_FILE_NAME  ; 26
  3099 0000B571 EB23                <1> 	jmp	short msftdf_df_stc_retn
  3100                              <1> 
  3101                              <1> msftdf_convert_df_direntry_name:
  3102                              <1> 	; mov	esi, DestinationFile_Name ; *
  3103 0000B573 BF[02840100]        <1> 	mov	edi, DestinationFile_DirEntry
  3104 0000B578 E8F5F5FFFF          <1> 	call	convert_file_name
  3105 0000B57D EB19                <1>   	jmp	short msftdf_restore_current_dir_1
  3106                              <1> 
  3107                              <1> msftdf_df_copy_sf_name:
  3108 0000B57F 89F7                <1> 	mov	edi, esi
  3109 0000B581 57                  <1> 	push	edi 
  3110 0000B582 BE[72830100]        <1>         mov     esi, SourceFile_Name
  3111                              <1> 	;mov	ecx, 12
  3112                              <1> 	; 29/07/2022
  3113 0000B587 29C9                <1> 	sub	ecx, ecx
  3114 0000B589 B10C                <1> 	mov	cl, 12
  3115                              <1> msftdf_df_copy_sf_name_loop:
  3116 0000B58B AC                  <1> 	lodsb
  3117 0000B58C AA                  <1>         stosb
  3118 0000B58D 08C0                <1> 	or	al, al
  3119 0000B58F 7402                <1> 	jz	short msftdf_df_copy_sf_name_ok	
  3120 0000B591 E2F8                <1>         loop    msftdf_df_copy_sf_name_loop
  3121                              <1> msftdf_df_copy_sf_name_ok:	
  3122 0000B593 5E                  <1> 	pop	esi  
  3123 0000B594 EBB7                <1> 	jmp	short msftdf_df_find_2
  3124                              <1> 
  3125                              <1> msftdf_df_stc_retn:
  3126 0000B596 F9                  <1> 	stc
  3127                              <1> msftdf_restore_cdir_failed:
  3128                              <1> msftdf_df_error_retn:
  3129 0000B597 C3                  <1> 	retn
  3130                              <1> 
  3131                              <1> msftdf_restore_current_dir_1:
  3132 0000B598 803D[BD300100]00    <1> 	cmp	byte [Restore_CDIR], 0
  3133 0000B59F 760D                <1> 	jna	short msftdf_sf_check_directory
  3134 0000B5A1 8B35[34840100]      <1> 	mov	esi, [msftdf_drv_offset] 
  3135 0000B5A7 E895C3FFFF          <1> 	call	restore_current_directory
  3136 0000B5AC 72E9                <1> 	jc	short msftdf_restore_cdir_failed
  3137                              <1> 
  3138                              <1> msftdf_sf_check_directory:
  3139 0000B5AE BE[31830100]        <1> 	mov	esi, SourceFile_Directory
  3140 0000B5B3 803E20              <1> 	cmp	byte [esi], 20h
  3141 0000B5B6 760F                <1> 	jna	short msftdf_sf_find
  3142                              <1> msftdf_sf_change_directory:
  3143 0000B5B8 FE05[BD300100]      <1> 	inc	byte [Restore_CDIR]
  3144 0000B5BE 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0 
  3145 0000B5C0 E88BF0FFFF          <1> 	call	change_current_directory
  3146 0000B5C5 7225                <1> 	jc	short msftdf_return
  3147                              <1> 
  3148                              <1> ;msftdf_sf_change_prompt_dir_string:
  3149                              <1> ;	call	change_prompt_dir_string
  3150                              <1> 
  3151                              <1> msftdf_sf_find:
  3152 0000B5C7 BE[72830100]        <1>         mov     esi, SourceFile_Name  ; Offset 66
  3153 0000B5CC 66B80018            <1> 	mov	ax, 1800h ; Only files
  3154 0000B5D0 E8A3D5FFFF          <1> 	call	find_first_file
  3155 0000B5D5 7215                <1> 	jc	short msftdf_return
  3156                              <1> 
  3157                              <1> msftdf_sf_ambgfn_check:
  3158 0000B5D7 6609D2              <1> 	or	dx, dx ; Ambiguous filename chars used sign (DX>0)
  3159 0000B5DA 7406                <1> 	jz	short msftdf_sf_found
  3160                              <1> 
  3161                              <1> msftdf_ambiguous_file_name_error:
  3162                              <1> 	;mov	eax, 2 ; File not found error
  3163                              <1> 	; 29/07/2022
  3164 0000B5DC 29C0                <1> 	sub	eax, eax
  3165 0000B5DE B002                <1> 	mov	al, 2
  3166 0000B5E0 F9                  <1> 	stc
  3167 0000B5E1 C3                  <1> 	retn
  3168                              <1> 
  3169                              <1> msftdf_sf_found:
  3170 0000B5E2 80E31F              <1> 	and	bl, 1Fh ; Attributes, D-V-S-H-R
  3171 0000B5E5 7415                <1> 	jz	short msftdf_save_sf_structure
  3172                              <1> 
  3173                              <1> msftdf_permission_denied_retn:
  3174                              <1> 	;mov	eax, 05h ; Access (Permission) denied !
  3175                              <1> 	; 29/07/2022
  3176 0000B5E7 29C0                <1> 	sub	eax, eax
  3177 0000B5E9 B005                <1> 	mov	al, 5
  3178 0000B5EB F9                  <1> 	stc
  3179                              <1> msftdf_rest_cdir_err_retn:
  3180                              <1> msftdf_return:
  3181 0000B5EC C3                  <1> 	retn
  3182                              <1> 
  3183                              <1> msftdf_phase_1_return:
  3184 0000B5ED 31C0                <1> 	xor	eax, eax
  3185 0000B5EF A2[32840100]        <1> 	mov	[move_cmd_phase], al ; 0
  3186 0000B5F4 FEC0                <1> 	inc	al ; mov al, 1
  3187 0000B5F6 BB[42B60000]        <1> 	mov	ebx, msftdf_df2_check_directory
  3188                              <1> 	;mov	edx, 0FFFFFFFFh 
  3189 0000B5FB C3                  <1> 	retn
  3190                              <1> 
  3191                              <1> msftdf_save_sf_structure:
  3192 0000B5FC BE[3C820100]        <1> 	mov	esi, FindFile_DirEntry
  3193 0000B601 BF[82830100]        <1> 	mov	edi, SourceFile_DirEntry
  3194                              <1> 	;mov	ecx, 8
  3195                              <1> 	; 29/07/2022
  3196 0000B606 29C9                <1> 	sub	ecx, ecx
  3197 0000B608 B108                <1> 	mov	cl, 8
  3198 0000B60A F3A5                <1> 	rep	movsd
  3199                              <1> 
  3200                              <1> msftdf_df_copy_sf_parameters:
  3201 0000B60C BE0B000000          <1> 	mov	esi, 11
  3202 0000B611 89F7                <1> 	mov	edi, esi
  3203 0000B613 81C6[82830100]      <1> 	add	esi, SourceFile_DirEntry
  3204 0000B619 81C7[02840100]      <1> 	add	edi, DestinationFile_DirEntry
  3205                              <1> 	;mov	ecx, 21
  3206 0000B61F B115                <1> 	mov	cl, 21
  3207 0000B621 F3A4                <1> 	rep	movsb
  3208                              <1> 
  3209                              <1> msftdf_restore_current_dir_2:
  3210 0000B623 803D[BD300100]00    <1> 	cmp	byte [Restore_CDIR], 0
  3211 0000B62A 760D                <1> 	jna	short msftdf_df2_check_move_cmd_phase
  3212 0000B62C 8B35[34840100]      <1>  	mov	esi, [msftdf_drv_offset]
  3213 0000B632 E80AC3FFFF          <1> 	call	restore_current_directory
  3214 0000B637 72B3                <1> 	jc	short msftdf_rest_cdir_err_retn
  3215                              <1> 
  3216                              <1> msftdf_df2_check_move_cmd_phase:
  3217 0000B639 803D[32840100]01    <1> 	cmp	byte [move_cmd_phase], 1
  3218 0000B640 74AB                <1> 	je	short msftdf_phase_1_return
  3219                              <1> 
  3220                              <1> msftdf_df2_check_directory:
  3221 0000B642 BE[B1830100]        <1> 	mov	esi, DestinationFile_Directory
  3222 0000B647 803E20              <1> 	cmp	byte [esi], 20h
  3223 0000B64A 760F                <1> 	jna	short msftdf_make_dfde_locate_ffe_on_directory
  3224                              <1> msftdf_df2_change_directory:
  3225 0000B64C FE05[BD300100]      <1> 	inc	byte [Restore_CDIR]
  3226 0000B652 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0 
  3227 0000B654 E8F7EFFFFF          <1> 	call	change_current_directory
  3228 0000B659 7291                <1> 	jc	short msftdf_return
  3229                              <1> 
  3230                              <1> ;msftdf_df2_change_prompt_dir_string:
  3231                              <1> ;	call	change_prompt_dir_string
  3232                              <1> 
  3233                              <1> msftdf_make_dfde_locate_ffe_on_directory:
  3234                              <1> 	; Current directory fcluster <> Directory buffer cluster
  3235                              <1> 	; Current directory will be reloaded by
  3236                              <1> 	; 'locate_current_dir_file' procedure
  3237                              <1> 	;
  3238                              <1> 	;xor	ax, ax
  3239 0000B65B 31C0                <1> 	xor	eax, eax
  3240 0000B65D 89C1                <1> 	mov	ecx, eax
  3241 0000B65F 6649                <1> 	dec	cx ; FFFFh  
  3242                              <1> 		; CX = FFFFh -> find first deleted or free entry
  3243                              <1> 		; ESI would be ASCIIZ filename address if the call
  3244                              <1> 		; would not be for first free or deleted dir entry  
  3245 0000B661 E83DF2FFFF          <1> 	call	locate_current_dir_file
  3246                              <1> 	; 07/08/2022
  3247 0000B666 733F                <1> 	jnc	short msftdf_make_dfde_set_ff_dir_entry
  3248                              <1> 	
  3249                              <1> 	;cmp	eax, 2
  3250 0000B668 3C02                <1>         cmp	al, 2
  3251 0000B66A 7537                <1> 	jne	short msftdf_error_retn
  3252                              <1> 
  3253                              <1> msftdf_add_new_dir_entry_check_fs:
  3254 0000B66C 8B35[34840100]      <1> 	mov	esi, [msftdf_drv_offset]
  3255 0000B672 A1[76800100]        <1> 	mov 	eax, [DirBuff_Cluster]
  3256 0000B677 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  3257 0000B67B 7711                <1> 	ja	short msftdf_add_new_subdir_cluster
  3258                              <1> 
  3259                              <1> msftdf_add_new_fs_subdir_section:
  3260                              <1> 	;CL=0, CH=E5h --> deleted entry, CH=0 --> free entry
  3261                              <1>         ;xor	cx, cx
  3262 0000B67D 30ED                <1> 	xor	ch, ch ; cx = 0 --> add a new subdir section
  3263 0000B67F E86A0C0000          <1> 	call	add_new_fs_section
  3264 0000B684 721E                <1>         jc	short msftdf_dsfde_error_retn
  3265                              <1> 	;mov	[createfile_LastDirCluster], eax
  3266                              <1> 
  3267 0000B686 E85A0E0000          <1> 	call	load_FS_sub_directory 
  3268                              <1> 	;mov	ebx, Directory_Buffer 
  3269 0000B68B 7318                <1> 	jnc	short msftdf_add_new_fs_subdir_section_ok
  3270 0000B68D C3                  <1> 	retn	 
  3271                              <1> 
  3272                              <1> msftdf_add_new_subdir_cluster:
  3273 0000B68E E8E8140000          <1> 	call	add_new_cluster
  3274 0000B693 720F                <1> 	jc	short msftdf_dsfde_error_retn
  3275                              <1> 	
  3276                              <1> 	;mov	[createfile_LastDirCluster], eax
  3277                              <1> 
  3278 0000B695 E8110E0000          <1> 	call	load_FAT_sub_directory
  3279 0000B69A 7309                <1> 	jnc	short msftdf_add_new_subdir_cluster_ok
  3280                              <1> 	; EBX = Directory buffer address
  3281                              <1> 
  3282                              <1> msftdf_ansdc_update_parent_dir_lmdt:
  3283                              <1> msftdf_make_dfde_err_upd_pdir_lmdt:
  3284 0000B69C 50                  <1> 	push	eax
  3285 0000B69D E86EFAFFFF          <1> 	call	update_parent_dir_lmdt
  3286 0000B6A2 58                  <1> 	pop	eax
  3287                              <1> 
  3288                              <1> msftdf_error_retn:
  3289 0000B6A3 F9                  <1> 	stc
  3290                              <1> msftdf_dsfde_restore_cdir_failed:
  3291                              <1> msftdf_dsfde_error_retn:
  3292 0000B6A4 C3                  <1> 	retn
  3293                              <1> 
  3294                              <1> msftdf_add_new_fs_subdir_section_ok:
  3295                              <1> msftdf_add_new_subdir_cluster_ok:
  3296 0000B6A5 89DF                <1> 	mov	edi, ebx ; Directory buffer address
  3297                              <1> 
  3298                              <1> msftdf_make_dfde_set_ff_dir_entry:
  3299 0000B6A7 8B15[44790100]      <1> 	mov	edx, [Current_Dir_FCluster]
  3300 0000B6AD 8915[98840100]      <1> 	mov	[createfile_FFCluster], edx
  3301                              <1> 	; EDI = Directory entry offset
  3302 0000B6B3 BE[02840100]        <1> 	mov	esi, DestinationFile_DirEntry
  3303                              <1> 	;mov	ecx, 8
  3304                              <1> 	; 29/07/2022
  3305 0000B6B8 29C9                <1> 	sub	ecx, ecx
  3306 0000B6BA B108                <1> 	mov	cl, 8
  3307 0000B6BC F3A5                <1> 	rep	movsd
  3308                              <1> 
  3309 0000B6BE C605[71800100]02    <1> 	mov	byte [DirBuff_ValidData], 2 
  3310 0000B6C5 E8AEF9FFFF          <1> 	call	save_directory_buffer
  3311 0000B6CA 72D0                <1> 	jc	short msftdf_make_dfde_err_upd_pdir_lmdt
  3312                              <1> 
  3313                              <1> msftdf_make_dfde_update_pdir_lmdt:
  3314 0000B6CC E83FFAFFFF          <1> 	call	update_parent_dir_lmdt
  3315                              <1> 
  3316                              <1> msftdf_dsfde_restore_current_dir_1:
  3317 0000B6D1 803D[BD300100]00    <1> 	cmp	byte [Restore_CDIR], 0
  3318 0000B6D8 760D                <1> 	jna	short msftdf_dsfde_check_directory
  3319 0000B6DA 8B35[34840100]      <1>  	mov	esi, [msftdf_drv_offset]
  3320 0000B6E0 E85CC2FFFF          <1> 	call	restore_current_directory
  3321 0000B6E5 72BD                <1> 	jc	short msftdf_dsfde_restore_cdir_failed
  3322                              <1> 
  3323                              <1> msftdf_dsfde_check_directory:
  3324 0000B6E7 BE[31830100]        <1> 	mov	esi, SourceFile_Directory
  3325 0000B6EC 803E20              <1> 	cmp	byte [esi], 20h
  3326 0000B6EF 760F                <1> 	jna	short msftdf_dsfde_find_file
  3327                              <1> 
  3328                              <1> msftdf_dsfde_change_directory:
  3329 0000B6F1 FE05[BD300100]      <1> 	inc	byte [Restore_CDIR]
  3330 0000B6F7 28E4                <1> 	sub	ah, ah ; CD_COMMAND sign -> 0 
  3331 0000B6F9 E852EFFFFF          <1> 	call	change_current_directory
  3332 0000B6FE 72A4                <1> 	jc	short msftdf_dsfde_error_retn
  3333                              <1> 
  3334                              <1> ;msftdf_dsfde_sf_change_prompt_dir_string:
  3335                              <1> ;	call	change_prompt_dir_string
  3336                              <1> 
  3337                              <1> msftdf_dsfde_find_file:
  3338 0000B700 BE[72830100]        <1> 	mov	esi, SourceFile_Name  ; Offset 66
  3339 0000B705 668B460E            <1> 	mov	ax, [esi+14] ; 80 -> SourceFile_AttributesMask
  3340 0000B709 E86AD4FFFF          <1> 	call	find_first_file
  3341 0000B70E 7294                <1> 	jc	short msftdf_dsfde_error_retn
  3342                              <1> 
  3343                              <1> msftdf_dsfde_delete_direntry:
  3344 0000B710 8B35[34840100]      <1> 	mov	esi, [msftdf_drv_offset]
  3345                              <1> 	
  3346 0000B716 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  3347 0000B71A 770A                <1> 	ja	short msftdf_delete_FAT_direntry
  3348                              <1> 	
  3349 0000B71C 30DB                <1> 	xor	bl, bl
  3350                              <1> 	; BL = 0 -> File
  3351                              <1> 	; EDI -> Directory buffer entry offset/address 
  3352 0000B71E E8CB0B0000          <1> 	call	delete_fs_directory_entry
  3353 0000B723 7315                <1> 	jnc	short msftdf_dsfde_restore_current_dir_2
  3354 0000B725 C3                  <1> 	retn
  3355                              <1> 
  3356                              <1> msftdf_delete_FAT_direntry:	
  3357 0000B726 8A1D[39820100]      <1> 	mov	bl, [FindFile_LongNameEntryLength]
  3358 0000B72C 668B0D[64820100]    <1> 	mov	cx, [FindFile_DirEntryNumber]
  3359                              <1> 	; ESI = Logical DOS drive description table address
  3360                              <1> 	; EDI = Directory buffer entry offset/address 
  3361 0000B733 E8A0FCFFFF          <1> 	call	delete_directory_entry
  3362 0000B738 721C                <1> 	jc	short msftdf_retn
  3363                              <1> 
  3364                              <1> msftdf_dsfde_restore_current_dir_2:
  3365 0000B73A 803D[BD300100]00    <1> 	cmp	byte [Restore_CDIR], 0
  3366 0000B741 7607                <1> 	jna	short msftdf_new_dir_fcluster_retn
  3367                              <1> 	;mov	esi, [msftdf_drv_offset]
  3368 0000B743 E8F9C1FFFF          <1> 	call	restore_current_directory
  3369 0000B748 720C                <1> 	jc	short msftdf_retn
  3370                              <1> 
  3371                              <1> msftdf_new_dir_fcluster_retn:
  3372 0000B74A 31C9                <1> 	xor	ecx, ecx 
  3373 0000B74C A1[98840100]        <1> 	mov	eax, [createfile_FFCluster]
  3374 0000B751 BB[B0830100]        <1> 	mov	ebx, DestinationFile_Drv
  3375                              <1> 
  3376                              <1> msftdf_retn:
  3377 0000B756 C3                  <1> 	retn
  3378                              <1> 
  3379                              <1> 
  3380                              <1> copy_source_file_to_destination_file:
  3381                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  3382                              <1> 	; 17/10/2016
  3383                              <1> 	; 16/10/2016
  3384                              <1> 	; 15/10/2016
  3385                              <1> 	; 30/03/2016, 31/03/2016
  3386                              <1> 	; 24/03/2016, 25/03/2016, 28/03/2016
  3387                              <1> 	; 21/03/2016, 22/03/2016, 23/03/2016
  3388                              <1> 	; 16/03/2016, 17/03/2016, 18/03/2016
  3389                              <1> 	; 15/03/2016 (TRDOS 386 = TRDOS v2.0)
  3390                              <1> 	; 02/09/2011 (FILE.ASM 'copy_source_file_to_destination_file')
  3391                              <1> 	; 01/08/2010 - 18/05/2011
  3392                              <1> 	;
  3393                              <1> 	;   Command Interpreter phase 1 enter ->
  3394                              <1> 	;           AL = 1 -> Caller is command interpreter
  3395                              <1> 	;           AL = 2 -> The second call, re-enter/continue
  3396                              <1> 	;   Phase 1 -> Check source file
  3397                              <1> 	;              'found' is required
  3398                              <1> 	;   Phase 2 -> Check destination file, 
  3399                              <1> 	;              save 'found' or 'not found' status
  3400                              <1> 	;              'permission denied' error will be return
  3401                              <1> 	;              if attributes have not for ordinary file 
  3402                              <1> 	;              without readonly attribute
  3403                              <1> 	;   Command Interpreter phase 1 return ->
  3404                              <1> 	;              DH = Source file attributes
  3405                              <1> 	;              DL = Destination file found status
  3406                              <1> 	;              EAX = 0 
  3407                              <1> 	;   Command Interpreter phase 2 enter ->
  3408                              <1> 	;              AL = 2 -> Continue from the last position
  3409                              <1> 	;              AH = 
  3410                              <1> 	;   Phase 3 -> Load source file or use read/write cluster method
  3411                              <1> 	;   Phase 4 -> Create destination file if it is not found
  3412                              <1> 	;   Phase 5 -> Open destination file
  3413                              <1> 	;   Phase 6 -> Read from source and write to destination
  3414                              <1> 	;   Phase 7 -> Unload source file, if it is loaded at memory
  3415                              <1> 	;       cf = 1 causes to return before the phase 7
  3416                              <1> 	;              but loaded file will be unloaded
  3417                              <1> 	;	       (allocated memory block will be deallocated) 
  3418                              <1> 	;
  3419                              <1> 	; INPUT -> 
  3420                              <1> 	;	 ESI = Source File Pathname (Asciiz)
  3421                              <1> 	;        EDI = Destination File Pathname (Asciiz)
  3422                              <1> 	;        AL = 0 --> Interrupt (System call)
  3423                              <1> 	;        AL > 0 --> Command Interpreter (Question)
  3424                              <1> 	;        AL = 1 --> Question Phase
  3425                              <1> 	;        AL = 2 --> Progress Phase        
  3426                              <1> 	;
  3427                              <1> 	; OUTPUT -> 
  3428                              <1> 	;	cf = 0 -> OK
  3429                              <1> 	;	EAX = Destination file first cluster
  3430                              <1> 	;
  3431                              <1> 	;        CL > 0 if there is file reading error before EOF
  3432                              <1> 	;	        (incomplete copy) 
  3433                              <1> 	;        CH > 0 if file is (full) loaded at memory
  3434                              <1> 	;
  3435                              <1> 	;	cf = 1 -> Error code in AL (EAX) 
  3436                              <1> 	;
  3437                              <1> 	; (EBX, ECX, ESI, EDI register contents will be changed)           
  3438                              <1> 
  3439                              <1> 
  3440 0000B757 3C02                <1> 	cmp	al, 2
  3441                              <1> 	;je	csftdf2_check_cdrv
  3442                              <1> 	; 29/07/2022
  3443 0000B759 7205                <1> 	jb	short csftdf_ph1
  3444                              <1> 	;jmp	csftdf2_check_cdrv
  3445 0000B75B E94F020000          <1> 	jmp	csftdf_ph2
  3446                              <1> 
  3447                              <1> ; Phase 1
  3448                              <1> 	; 29/07/2022
  3449                              <1> csftdf_ph1:
  3450 0000B760 A2[58840100]        <1> 	mov	byte [copy_cmd_phase], al
  3451                              <1> 
  3452 0000B765 57                  <1> 	push	edi ; *
  3453                              <1> 
  3454                              <1> csftdf_parse_sf_path:
  3455 0000B766 BF[30830100]        <1> 	mov	edi, SourceFile_Drv
  3456 0000B76B E8CCF4FFFF          <1> 	call	parse_path_name
  3457 0000B770 721C                <1> 	jc	short csftdf_parse_sf_path_failed
  3458                              <1> 
  3459                              <1> csftdf_parse_df_path:	
  3460 0000B772 5E                  <1> 	pop	esi ; * (pushed edi) 
  3461                              <1> 
  3462                              <1> csftdf_sf_check_filename_exists:
  3463 0000B773 803D[72830100]21    <1> 	cmp	byte [SourceFile_Name], 21h
  3464 0000B77A 7215                <1> 	jb	short csftdf_sf_file_not_found_error
  3465                              <1> 
  3466 0000B77C BF[B0830100]        <1> 	mov	edi, DestinationFile_Drv
  3467 0000B781 E8B6F4FFFF          <1> 	call	parse_path_name
  3468 0000B786 7310                <1> 	jnc	short csftdf_check_sf_cdrv
  3469                              <1> 	
  3470 0000B788 3C01                <1> 	cmp	al, 1 ; File or directory name is not existing
  3471 0000B78A 760C                <1> 	jna	short csftdf_check_sf_cdrv
  3472                              <1> 
  3473                              <1> csftdf_parse_df_path_failed:
  3474 0000B78C F9                  <1> 	stc 
  3475                              <1> csftdf_sf_error_retn: 
  3476 0000B78D C3                  <1> 	retn
  3477                              <1> 
  3478                              <1> csftdf_parse_sf_path_failed:	
  3479 0000B78E 5F                  <1> 	pop	edi ; *
  3480 0000B78F EBFC                <1> 	jmp	short csftdf_sf_error_retn
  3481                              <1> 
  3482                              <1> csftdf_sf_file_not_found_error:
  3483 0000B791 B802000000          <1> 	mov	eax, 2 ; File not found 
  3484 0000B796 EBF5                <1> 	jmp	short csftdf_sf_error_retn
  3485                              <1> 
  3486                              <1> csftdf_check_sf_cdrv:
  3487 0000B798 8A3D[4A790100]      <1> 	mov	bh, [Current_Drv]
  3488                              <1> 
  3489 0000B79E 883D[5B840100]      <1> 	mov	[csftdf_cdrv], bh ; 23/03/2016
  3490                              <1> 
  3491 0000B7A4 8A15[30830100]      <1> 	mov	dl, [SourceFile_Drv]
  3492 0000B7AA 38FA                <1> 	cmp	dl, bh ; byte [Current_Drv]
  3493 0000B7AC 7407                <1> 	je	short csftdf_sf_check_directory
  3494                              <1> 
  3495 0000B7AE E8D8C0FFFF          <1> 	call	change_current_drive
  3496 0000B7B3 72D8                <1> 	jc	short csftdf_sf_error_retn
  3497                              <1> 
  3498                              <1> csftdf_sf_check_directory:
  3499 0000B7B5 BE[31830100]        <1> 	mov	esi, SourceFile_Directory
  3500 0000B7BA 803E20              <1> 	cmp	byte [esi], 20h
  3501 0000B7BD 760F                <1> 	jna	short csftdf_find_sf
  3502                              <1> 
  3503                              <1> csftdf_sf_change_directory:
  3504 0000B7BF FE05[BD300100]      <1> 	inc	byte [Restore_CDIR]
  3505 0000B7C5 30E4                <1> 	xor	ah, ah ; CD_COMMAND sign -> 0 
  3506 0000B7C7 E884EEFFFF          <1> 	call	change_current_directory
  3507 0000B7CC 72BF                <1> 	jc	short csftdf_sf_error_retn
  3508                              <1> 
  3509                              <1> ;csftdf_sf_change_prompt_dir_string:
  3510                              <1> ;	call	change_prompt_dir_string
  3511                              <1> 
  3512                              <1> csftdf_find_sf:
  3513 0000B7CE BE[72830100]        <1> 	mov	esi, SourceFile_Name
  3514 0000B7D3 66B80018            <1> 	mov	ax, 1800h ; Except volume label and dirs
  3515 0000B7D7 E89CD3FFFF          <1> 	call	find_first_file
  3516 0000B7DC 72AF                <1> 	jc	short csftdf_sf_error_retn
  3517                              <1> 
  3518                              <1> csftdf_sf_ambgfn_check:
  3519 0000B7DE 6621D2              <1> 	and	dx, dx ; Ambiguous filename chars used sign (DX>0)
  3520 0000B7E1 7406                <1> 	jz	short csftdf_sf_found
  3521                              <1> 
  3522                              <1> csftdf_ambiguous_file_name_error:
  3523                              <1> 	;mov	eax, 2 ; File not found error
  3524                              <1> 	; 29/07/2022
  3525 0000B7E3 29C0                <1> 	sub	eax, eax
  3526 0000B7E5 B002                <1> 	mov	al, 2
  3527 0000B7E7 F9                  <1> 	stc
  3528 0000B7E8 C3                  <1> 	retn
  3529                              <1> 
  3530                              <1> csftdf_sf_found:
  3531 0000B7E9 A3[5C840100]        <1> 	mov	[csftdf_filesize], eax
  3532                              <1> 
  3533 0000B7EE 09C0                <1> 	or	eax, eax
  3534 0000B7F0 7506                <1> 	jnz	short csftdf_set_source_file_direntry
  3535                              <1> 
  3536                              <1> csftdf_sf_file_size_zero:
  3537                              <1> 	;mov	eax, 20 ; TRDOS zero length (file size) error
  3538                              <1> 	; 29/07/2022
  3539 0000B7F2 29C0                <1> 	sub	eax, eax
  3540 0000B7F4 B014                <1> 	mov	al, 20
  3541 0000B7F6 F9                  <1> 	stc
  3542 0000B7F7 C3                  <1> 	retn
  3543                              <1> 
  3544                              <1> csftdf_set_source_file_direntry:
  3545 0000B7F8 BE[3C820100]        <1> 	mov	esi, FindFile_DirEntry
  3546 0000B7FD BF[82830100]        <1> 	mov	edi, SourceFile_DirEntry
  3547                              <1> 	;mov	ecx, 8
  3548                              <1> 	; 29/07/2022
  3549 0000B802 31C9                <1> 	xor	ecx, ecx
  3550 0000B804 B108                <1> 	mov	cl, 8
  3551 0000B806 F3A5                <1> 	rep	movsd
  3552                              <1> 
  3553                              <1> csftdf_sf_restore_cdrv:
  3554                              <1> 	; 22/03/2016
  3555 0000B808 8A15[5B840100]      <1> 	mov	dl, [csftdf_cdrv]
  3556 0000B80E 3A15[4A790100]      <1> 	cmp	dl, [Current_Drv]
  3557 0000B814 7407                <1> 	je	short csftdf_sf_restore_cdir
  3558 0000B816 E870C0FFFF          <1> 	call	change_current_drive 
  3559 0000B81B 724F                <1> 	jc	short csftdf_df_error_retn ; 30/03/2016
  3560                              <1> 
  3561                              <1> csftdf_sf_restore_cdir:
  3562 0000B81D 803D[BD300100]00    <1> 	cmp	byte [Restore_CDIR], 0
  3563 0000B824 7612                <1> 	jna	short csftdf_df_check_filename_exists
  3564 0000B826 29C0                <1> 	sub	eax, eax
  3565 0000B828 BE00010900          <1> 	mov	esi, Logical_DOSDisks
  3566 0000B82D 88D4                <1> 	mov	ah, dl ; byte [csftdf_cdrv]
  3567 0000B82F 01C6                <1> 	add	esi, eax
  3568 0000B831 E80BC1FFFF          <1> 	call	restore_current_directory
  3569 0000B836 7234                <1> 	jc	short csftdf_df_error_retn
  3570                              <1>   
  3571                              <1> csftdf_df_check_filename_exists:
  3572 0000B838 803D[F2830100]20    <1> 	cmp	byte [DestinationFile_Name], 20h
  3573 0000B83F 7716                <1> 	ja	short csftdf_check_df_cdrv
  3574                              <1> 
  3575                              <1> csftdf_copy_sf_name:
  3576 0000B841 BF[F2830100]        <1> 	mov	edi, DestinationFile_Name
  3577 0000B846 BE[72830100]        <1> 	mov	esi, SourceFile_Name
  3578 0000B84B B10C                <1> 	mov	cl, 12
  3579                              <1> 
  3580                              <1> csftdf_df_copy_sf_name_loop:
  3581 0000B84D AC                  <1> 	lodsb
  3582 0000B84E AA                  <1> 	stosb
  3583 0000B84F 08C0                <1> 	or	al, al
  3584 0000B851 7404                <1> 	jz	short csftdf_check_df_cdrv             
  3585 0000B853 FEC9                <1> 	dec	cl
  3586 0000B855 75F6                <1> 	jnz	csftdf_df_copy_sf_name_loop
  3587                              <1> 
  3588                              <1> csftdf_check_df_cdrv:
  3589 0000B857 8A15[B0830100]      <1> 	mov	dl, [DestinationFile_Drv]
  3590 0000B85D 3A15[4A790100]      <1> 	cmp	dl, [Current_Drv]
  3591 0000B863 7408                <1> 	je	short csftdf_df_check_directory
  3592                              <1> 
  3593 0000B865 E821C0FFFF          <1> 	call	change_current_drive
  3594 0000B86A 7301                <1> 	jnc	short csftdf_df_check_directory
  3595                              <1> 
  3596                              <1> csftdf_df_error_retn:
  3597 0000B86C C3                  <1> 	retn
  3598                              <1> 
  3599                              <1> csftdf_df_check_directory:
  3600 0000B86D BE[B1830100]        <1> 	mov	esi, DestinationFile_Directory
  3601 0000B872 803E20              <1>         cmp     byte [esi], 20h
  3602 0000B875 760F                <1> 	jna	short csftdf_find_df
  3603                              <1> 
  3604                              <1> csftdf_df_change_directory:
  3605 0000B877 FE05[BD300100]      <1> 	inc	byte [Restore_CDIR]
  3606 0000B87D 28E4                <1> 	sub	ah, ah ; CD_COMMAND sign -> 0 
  3607 0000B87F E8CCEDFFFF          <1> 	call	change_current_directory
  3608 0000B884 72E6                <1> 	jc	short csftdf_df_error_retn
  3609                              <1> 
  3610                              <1> ;csftdf_df_change_prompt_dir_string:
  3611                              <1> ;	call	change_prompt_dir_string
  3612                              <1> 
  3613                              <1> csftdf_find_df:
  3614                              <1> 	; 23/03/2016
  3615 0000B886 29DB                <1> 	sub	ebx, ebx
  3616 0000B888 8A3D[B0830100]      <1> 	mov	bh,  [DestinationFile_Drv]
  3617 0000B88E 81C300010900        <1> 	add	ebx, Logical_DOSDisks
  3618 0000B894 891D[88840100]      <1> 	mov	[csftdf_df_drv_dt], ebx
  3619                              <1> 
  3620 0000B89A BE[F2830100]        <1> 	mov	esi, DestinationFile_Name
  3621 0000B89F 6631C0              <1> 	xor	ax, ax 
  3622                              <1> 		; DestinationFile_AttributesMask -> any/zero
  3623 0000B8A2 E8D1D2FFFF          <1> 	call	find_first_file
  3624 0000B8A7 7217                <1> 	jc	short csftdf_df_check_error_code
  3625                              <1> 
  3626                              <1> csftdf_df_ambgfn_check:
  3627 0000B8A9 6609D2              <1> 	or	dx, dx ; Ambiguous filename chars used sign (DX>0)
  3628 0000B8AC 7529                <1> 	jnz	short csftdf_df_error_inv_fname
  3629                              <1> 	
  3630                              <1> csftdf_df_found:
  3631 0000B8AE C605[5A840100]01    <1> 	mov	byte [DestinationFileFound], 1
  3632                              <1> 	; 17/10/2016 (cl -> bl)
  3633 0000B8B5 80E31F              <1> 	and	bl, 1Fh ; Attributes, D-V-S-H-R
  3634 0000B8B8 7459                <1> 	jz	short csftdf_df_save_first_cluster
  3635                              <1> 
  3636                              <1> csftdf_df_permission_denied_retn:	 
  3637                              <1> 	;mov	eax, 05h ; Access/Permission denied.
  3638                              <1> 	; 29/07/2022
  3639 0000B8BA 29C0                <1> 	sub	eax, eax
  3640 0000B8BC B005                <1> 	mov	al, 5
  3641                              <1> csftdf_df_error_stc_retn:
  3642 0000B8BE F9                  <1> 	stc
  3643 0000B8BF C3                  <1> 	retn
  3644                              <1> 
  3645                              <1> csftdf_df_check_error_code:
  3646                              <1> 	;cmp	eax, 2
  3647 0000B8C0 3C02                <1> 	cmp	al, 2
  3648 0000B8C2 75FA                <1> 	jne	short csftdf_df_error_stc_retn
  3649                              <1> 
  3650 0000B8C4 C605[5A840100]00    <1> 	mov	byte [DestinationFileFound], 0
  3651                              <1> 
  3652                              <1> 	; 15/10/2016
  3653 0000B8CB BE[2C820100]        <1> 	mov	esi, FindFile_Name ; *
  3654 0000B8D0 E848D6FFFF          <1> 	call	check_filename
  3655 0000B8D5 7306                <1> 	jnc	short csftdf_df_valid_fname
  3656                              <1> csftdf_df_error_inv_fname: ; 'invalid file name !'
  3657                              <1> 	;mov 	eax, ERR_INV_FILE_NAME  ; 26
  3658                              <1> 	; 29/07/2022
  3659 0000B8D7 29C0                <1> 	sub	eax, eax
  3660 0000B8D9 B01A                <1> 	mov	al, ERR_INV_FILE_NAME ; 26
  3661 0000B8DB F9                  <1> 	stc	
  3662 0000B8DC C3                  <1> 	retn
  3663                              <1> 
  3664                              <1> csftdf_df_valid_fname:	
  3665                              <1> 	; 21/03/2016
  3666                              <1> 	; (Capitalized file name)
  3667                              <1> 	;mov	esi, FindFile_Name ; * ; 15/10/2016
  3668 0000B8DD BF[F2830100]        <1> 	mov	edi, DestinationFile_Name
  3669 0000B8E2 A5                  <1> 	movsd
  3670 0000B8E3 A5                  <1> 	movsd	
  3671 0000B8E4 A5                  <1> 	movsd
  3672                              <1> 	;movsb
  3673                              <1> 
  3674                              <1> csftdf_check_disk_free_size_0:
  3675 0000B8E5 A1[9E830100]        <1> 	mov	eax, [SourceFile_DirEntry+DirEntry_FileSize]
  3676                              <1> 
  3677                              <1> csftdf_check_disk_free_size_1:
  3678                              <1> 	;sub	ebx, ebx
  3679                              <1> 	;mov 	esi, Logical_DOSDisks
  3680                              <1> 	;mov	bh,  [DestinationFile_Drv]
  3681                              <1> 	;add	esi, ebx
  3682                              <1> 	
  3683 0000B8EA 8B35[88840100]      <1> 	mov	esi, [csftdf_df_drv_dt] ; 23/03/2016
  3684                              <1> 
  3685 0000B8F0 0FB74E11            <1> 	movzx	ecx, word [esi+LD_BPB+BytesPerSec] ; 17, LD_BPB + 0Bh
  3686 0000B8F4 01C8                <1> 	add	eax, ecx
  3687 0000B8F6 48                  <1> 	dec	eax  ; file size (additional bytes) + 511 (round up)
  3688                              <1> csftdf_check_disk_free_size_3: ; 16/03/2016
  3689 0000B8F7 29D2                <1> 	sub	edx, edx
  3690 0000B8F9 F7F1                <1> 	div	ecx ; bytes per sector
  3691                              <1> 
  3692                              <1> csftdf_check_disk_free_size:
  3693 0000B8FB 3B4674              <1> 	cmp	eax, [esi+LD_FreeSectors]
  3694                              <1>         ;jb	csftdf_check_disk_free_size_ok
  3695                              <1> 	; 29/07/2022
  3696 0000B8FE 7208                <1> 	jb	short csftdf_check_dfs_ok
  3697 0000B900 770B                <1> 	ja	short csftdf_df_insufficient_disk_space
  3698                              <1> 
  3699 0000B902 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0 ; FS needs FDT sector also.
  3700                              <1> 	;ja	csftdf_check_disk_free_size_ok 
  3701                              <1> 	; 29/07/2022
  3702 0000B906 7605                <1> 	jna	short csftdf_df_insufficient_disk_space
  3703                              <1> csftdf_check_dfs_ok:
  3704 0000B908 E985000000          <1> 	jmp	csftdf_check_disk_free_size_ok 
  3705                              <1> 
  3706                              <1> csftdf_df_insufficient_disk_space:
  3707                              <1> 	;mov	eax, 27h ; insufficient disk space
  3708                              <1> 	; 29/07/2022
  3709 0000B90D 29C0                <1> 	sub	eax, eax
  3710 0000B90F B027                <1> 	mov	al, 27h
  3711 0000B911 EBAB                <1> 	jmp	short csftdf_df_error_stc_retn
  3712                              <1> 
  3713                              <1> csftdf_df_save_first_cluster:
  3714                              <1> 	; ESI = FindFile_DirEntry (for the old destination file)
  3715                              <1> 	; EAX = Old destination file size
  3716                              <1> 	; 24/03/2016
  3717                              <1> 	; EDI = Directory entry address (within Dir Buffer boundaries)
  3718 0000B913 81EF00000800        <1> 	sub	edi, Directory_Buffer  ; (<65536)
  3719                              <1> 	;shr	di, 5 ; Convert entry offset to entry index/number
  3720                              <1> 	; 29/07/2022
  3721 0000B919 C1EF05              <1> 	shr	edi, 5
  3722 0000B91C 66893D[2A840100]    <1> 	mov	[DestinationFile_DirEntryNumber], di ; (<2048)
  3723                              <1> 
  3724                              <1> csftdf_df_check_sf_df_fcluster:
  3725 0000B923 668B5614            <1> 	mov	dx, [esi+DirEntry_FstClusHI]
  3726 0000B927 C1E210              <1> 	shl	edx, 16
  3727 0000B92A 668B561A            <1> 	mov	dx, [esi+DirEntry_FstClusLO]
  3728 0000B92E 8915[6C840100]      <1> 	mov	[csftdf_df_cluster], edx
  3729                              <1> csftdf_df_check_sf_df_fcluster_1:
  3730 0000B934 668B15[96830100]    <1> 	mov	dx, [SourceFile_DirEntry+DirEntry_FstClusHI]
  3731 0000B93B C1E210              <1> 	shl	edx, 16
  3732 0000B93E 668B15[9C830100]    <1> 	mov	dx, [SourceFile_DirEntry+DirEntry_FstClusLO]
  3733 0000B945 3B15[6C840100]      <1> 	cmp	edx, [csftdf_df_cluster]
  3734 0000B94B 7512                <1> 	jne	short csftdf_df_check_sf_df_fcluster_ok
  3735                              <1> csftdf_df_check_sf_df_drv:
  3736 0000B94D 8A15[30830100]      <1> 	mov	dl, [SourceFile_Drv]
  3737 0000B953 3A15[B0830100]      <1> 	cmp	dl, [DestinationFile_Drv]
  3738 0000B959 7504                <1> 	jne	short csftdf_df_check_sf_df_fcluster_ok
  3739                              <1> 
  3740                              <1> 	; source and destination files are same !
  3741                              <1> 	; (they have same first cluster value on same logical disk)
  3742                              <1> 
  3743 0000B95B 31C0                <1> 	xor	eax, eax ; mov eax, 0 -> Bad command or file name !
  3744 0000B95D F9                  <1> 	stc
  3745 0000B95E C3                  <1> 	retn 
  3746                              <1>    
  3747                              <1> csftdf_df_check_sf_df_fcluster_ok:
  3748                              <1> csftdf_df_move_findfile_struct:
  3749                              <1> 	; mov	esi, FindFile_DirEntry
  3750 0000B95F BF[02840100]        <1> 	mov	edi, DestinationFile_DirEntry
  3751                              <1> 	;mov	ecx, 8
  3752 0000B964 31C9                <1> 	xor	ecx, ecx
  3753 0000B966 B108                <1> 	mov	cl, 8
  3754 0000B968 F3A5                <1> 	rep	movsd
  3755                              <1> 	
  3756                              <1> csftdf_check_disk_free_size_2:
  3757 0000B96A 89C2                <1> 	mov	edx, eax ; Old destination file size
  3758                              <1> 
  3759                              <1> 	;mov	eax, [SourceFile_DirEntry+DirEntry_FileSize]
  3760 0000B96C A1[5C840100]        <1> 	mov	eax, [csftdf_filesize] ; 23/03/2016
  3761                              <1> 
  3762                              <1> 	;;sub	ecx, ecx ; 0
  3763                              <1> 	;mov 	esi, Logical_DOSDisks
  3764                              <1> 	;mov	ch,  [DestinationFile_Drv]
  3765                              <1> 	;add	esi, ecx
  3766                              <1> 	;
  3767                              <1> 	;mov	[csftdf_df_drv_dt], esi
  3768                              <1> 
  3769 0000B971 8B35[88840100]      <1> 	mov	esi, [csftdf_df_drv_dt] ; 23/03/2016
  3770                              <1> 
  3771 0000B977 668B4E11            <1> 	mov	cx, [esi+LD_BPB+BytesPerSec] ; 17, LD_BPB + 0Bh
  3772 0000B97B 01CA                <1> 	add	edx, ecx ; + 512
  3773 0000B97D 01C8                <1> 	add	eax, ecx ; + 512
  3774 0000B97F 4A                  <1> 	dec	edx ; old file size + 511 (round up)
  3775 0000B980 48                  <1> 	dec	eax ; new file size + 511 (round up)
  3776 0000B981 F7D9                <1> 	neg	ecx ; -512 ; 0FFFFFE00h
  3777 0000B983 21CA                <1> 	and	edx, ecx ; = old sector count * 512 
  3778 0000B985 21C8                <1> 	and	eax, ecx ; = new sector count * 512 
  3779                              <1> 
  3780 0000B987 29D0                <1> 	sub	eax, edx ; new file size - old file size (on disk)
  3781 0000B989 7607                <1> 	jna	short csftdf_check_disk_free_size_ok
  3782                              <1> 
  3783 0000B98B F7D9                <1> 	neg	ecx ; 512 (bytes per sector) ; 200h
  3784                              <1> 	; check free space for additional sectors
  3785                              <1> 	; eax = number of additional sectors * bytes per sector
  3786                              <1> 	; esi = Logical DOS drive number (of destination disk)
  3787 0000B98D E965FFFFFF          <1>         jmp     csftdf_check_disk_free_size_3
  3788                              <1>  
  3789                              <1> csftdf_check_disk_free_size_ok:
  3790                              <1> 	; 18/03/2016
  3791                              <1> csftdf_df_check_copy_cmd_phase:
  3792 0000B992 A0[58840100]        <1> 	mov	al, [copy_cmd_phase]
  3793 0000B997 3C01                <1> 	cmp	al, 1
  3794 0000B999 7514                <1> 	jne	short csftdf2_check_cdrv
  3795                              <1> 	
  3796 0000B99B 31C0                <1> 	xor	eax, eax
  3797 0000B99D A2[58840100]        <1> 	mov	[copy_cmd_phase], al ; 0
  3798                              <1> 
  3799 0000B9A2 8A15[5A840100]      <1> 	mov	dl, [DestinationFileFound]            
  3800 0000B9A8 8A35[8D830100]      <1> 	mov	dh, [SourceFile_DirEntry+11] ; Attributes
  3801                              <1>  
  3802                              <1> csftdf_return:	
  3803 0000B9AE C3                  <1> 	retn
  3804                              <1> 
  3805                              <1> ; Phase 2
  3806                              <1> csftdf_ph2:
  3807                              <1> 	; 29/07/2022
  3808                              <1> csftdf2_check_cdrv:
  3809                              <1> 	; 18/03/2016
  3810                              <1> 	; Here, destination drive and directory are ready !
  3811                              <1> 	; (checking/restoring is not needed)
  3812                              <1> 	; (Since at the end of the phase 1)
  3813                              <1> 
  3814                              <1> ;	mov	dl, [DestinationFile_Drv]
  3815                              <1> ;	cmp	dl, [Current_Drv]
  3816                              <1> ;	je	short csftdf2_df_check_directory
  3817                              <1> ;
  3818                              <1> ;	call	change_current_drive
  3819                              <1> ;	jc	short csftdf2_read_error
  3820                              <1> ;
  3821                              <1> ;csftdf2_df_check_directory:
  3822                              <1> ;	mov	esi, DestinationFile_Directory  
  3823                              <1> ;	cmp	byte [esi], 20h
  3824                              <1> ;	jna	short csftdf2_df_check_found_or_not
  3825                              <1> ;
  3826                              <1> ;csftdf2_df_change_directory:
  3827                              <1> ;	inc	byte [Restore_CDIR]
  3828                              <1> ;	xor	ah, ah ; CD_COMMAND sign -> 0 
  3829                              <1> ;	call	change_current_directory
  3830                              <1> ;	jc	short csftdf2_stc_return
  3831                              <1> ;
  3832                              <1> ;;csftdf2_df_change_prompt_dir_string:
  3833                              <1> ;;	call	change_prompt_dir_string
  3834                              <1> 
  3835                              <1> csftdf2_df_check_found_or_not:
  3836                              <1> 	; 21/03/2016
  3837 0000B9AF 803D[5A840100]00    <1> 	cmp	byte [DestinationFileFound], 0 
  3838 0000B9B6 773A                <1> 	ja	short csftdf2_set_sf_percentage
  3839                              <1> 
  3840                              <1> csftdf2_create_file:
  3841 0000B9B8 BE[F2830100]        <1> 	mov	esi, DestinationFile_Name
  3842 0000B9BD A1[5C840100]        <1> 	mov	eax, [csftdf_filesize]
  3843 0000B9C2 30C9                <1> 	xor	cl, cl ; 0
  3844                              <1> 
  3845 0000B9C4 31DB                <1> 	xor	ebx, ebx ; 0
  3846 0000B9C6 4B                  <1> 	dec	ebx ; 0FFFFFFFFh 
  3847                              <1> 
  3848                              <1> 	; INPUT ->
  3849                              <1> 	; 	EAX -> File Size
  3850                              <1> 	; 	ESI = ASCIIZ File name
  3851                              <1> 	;	 CL = File attributes
  3852                              <1> 	;	EBX = FFFFFFFFh -> empty file sign for FAT fs
  3853                              <1> 	;	EBX <> FFFFFFFFh -> use file size for FAT fs 
  3854                              <1> 	;
  3855                              <1> 	; OUTPUT ->
  3856                              <1> 	;	EAX = New file's first cluster
  3857                              <1> 	;	ESI = Logical Dos Drv Descr. Table Addr.
  3858                              <1> 	;	EBX = CreateFile_Size address
  3859                              <1> 	;	ECX = Sectors per cluster (<256)
  3860                              <1> 	;	EDX = Directory Entry Index/Number (<65536)
  3861                              <1> 	;		
  3862                              <1> 	;	cf = 1 -> error code in AL (EAX)
  3863                              <1> 
  3864 0000B9C7 E8EC050000          <1> 	call	create_file
  3865                              <1> 	;pop	esi
  3866                              <1> 	;jc	csftdf2_rw_error
  3867                              <1> 	; 29/07/2022
  3868 0000B9CC 7305                <1> 	jnc	short csftdf2_create_file_OK
  3869 0000B9CE E9A3050000          <1> 	jmp	csftdf2_rw_error
  3870                              <1> 
  3871                              <1> csftdf2_create_file_OK:
  3872 0000B9D3 A3[6C840100]        <1> 	mov	[csftdf_df_cluster], eax
  3873                              <1> 	
  3874                              <1> 	; 24/03/2016
  3875 0000B9D8 668915[2A840100]    <1> 	mov	[DestinationFile_DirEntryNumber], dx 
  3876                              <1> 
  3877                              <1> 	; 21/03/2016
  3878 0000B9DF BE00000800          <1> 	mov	esi, Directory_Buffer
  3879 0000B9E4 C1E205              <1> 	shl	edx, 5 ; 32 * index number
  3880 0000B9E7 01D6                <1> 	add	esi, edx
  3881 0000B9E9 BF[02840100]        <1> 	mov	edi, DestinationFile_DirEntry	
  3882 0000B9EE B108                <1> 	mov	cl, 8 ; 32 bytes
  3883 0000B9F0 F3A5                <1> 	rep	movsd
  3884                              <1> 
  3885                              <1> csftdf2_set_sf_percentage:
  3886                              <1> 	; 17/03/2016
  3887 0000B9F2 31C0                <1> 	xor	eax, eax	
  3888 0000B9F4 A2[80840100]        <1> 	mov 	[csftdf_percentage], al ; 0, reset
  3889                              <1> 
  3890 0000B9F9 A3[78840100]        <1> 	mov	[csftdf_sf_rbytes], eax ; 0, reset
  3891 0000B9FE A3[7C840100]        <1> 	mov	[csftdf_df_wbytes], eax ; 0, reset
  3892                              <1> 
  3893 0000BA03 8A25[30830100]      <1> 	mov	ah, [SourceFile_Drv]	
  3894 0000BA09 BE00010900          <1> 	mov	esi, Logical_DOSDisks
  3895 0000BA0E 01C6                <1> 	add	esi, eax
  3896                              <1> 	
  3897 0000BA10 8935[84840100]      <1> 	mov	[csftdf_sf_drv_dt], esi ; 23/03/2016
  3898                              <1> 
  3899 0000BA16 668B15[96830100]    <1> 	mov	dx, [SourceFile_DirEntry+DirEntry_FstClusHI]
  3900 0000BA1D C1E210              <1> 	shl	edx, 16
  3901 0000BA20 668B15[9C830100]    <1> 	mov	dx, [SourceFile_DirEntry+DirEntry_FstClusLO]
  3902 0000BA27 8915[68840100]      <1> 	mov	[csftdf_sf_cluster], edx
  3903                              <1> 
  3904                              <1> 	; 16/03/2016
  3905                              <1> 	; Note: Singlix FS boot sector parameters (for cluster
  3906                              <1> 	;	related calculations) has same offset
  3907                              <1> 	;	values from LD_BPB as in FAT file system.
  3908                              <1> 	;	[esi+LD_BPB+SecPerClust] is 1 for Singlix FS.
  3909                              <1> 	;	
  3910 0000BA2D 0FB64E13            <1> 	movzx	ecx, byte [esi+LD_BPB+SecPerClust]
  3911 0000BA31 880D[AE830100]      <1> 	mov	[SourceFile_SecPerClust], cl
  3912                              <1> 
  3913                              <1> 	; 17/03/2016
  3914 0000BA37 386E03              <1> 	cmp	[esi+LD_FATType], ch ; 0
  3915 0000BA3A 7707                <1> 	ja	short csftdf2_set_sf_percent_rsize1
  3916                              <1> 
  3917 0000BA3C B800000100          <1> 	mov	eax, 65536 ; read/write buffer size for Singlix FS
  3918 0000BA41 EB06                <1> 	jmp	short csftdf2_set_sf_percent_rsize2	
  3919                              <1>  
  3920                              <1> csftdf2_set_sf_percent_rsize1:
  3921 0000BA43 668B4611            <1> 	mov	ax, [esi+LD_BPB+BytesPerSec]
  3922 0000BA47 F7E1                <1> 	mul	ecx
  3923                              <1> 	;sub	edx, edx
  3924                              <1> csftdf2_set_sf_percent_rsize2:
  3925 0000BA49 A3[70840100]        <1> 	mov	[csftdf_r_size], eax
  3926                              <1> 
  3927                              <1> csftdf2_set_df_percentage:
  3928                              <1> 	;sub	eax, eax
  3929                              <1> 	;mov	ah, [DestinationFile_Drv]	
  3930                              <1> 	;mov	edi, Logical_DOSDisks
  3931                              <1> 	;add	edi, eax
  3932                              <1> 	;mov	[csftdf_df_drv_dt], edi ; 17/03/2016
  3933                              <1> 
  3934 0000BA4E 8B3D[88840100]      <1> 	mov	edi, [csftdf_df_drv_dt] ; 23/03/2016
  3935                              <1> 
  3936                              <1> 	; 16/03/2016
  3937                              <1> 	; Note: Singlix FS boot sector parameters (for cluster
  3938                              <1> 	;	related calculations) has same offset
  3939                              <1> 	;	values from LD_BPB as in FAT file system.
  3940                              <1> 	;	[edi+LD_BPB+SecPerClust] is 1 for Singlix FS.
  3941                              <1> 	;	
  3942                              <1> 	;movzx	ecx, byte [edi+LD_BPB+SecPerClust]
  3943 0000BA54 8A4F13              <1> 	mov	cl, [edi+LD_BPB+SecPerClust]
  3944 0000BA57 880D[2E840100]      <1> 	mov	[DestinationFile_SecPerClust], cl
  3945                              <1> 
  3946                              <1> 	; 17/03/2016
  3947 0000BA5D 386F03              <1> 	cmp	[edi+LD_FATType], ch ; 0
  3948 0000BA60 7707                <1> 	ja	short csftdf2_set_df_percent_wsize1
  3949                              <1> 	
  3950 0000BA62 B800000100          <1> 	mov	eax, 65536 ; read/write buffer size for Singlix FS
  3951 0000BA67 EB06                <1> 	jmp	short csftdf2_set_df_percent_wsize2	
  3952                              <1> 
  3953                              <1> csftdf2_set_df_percent_wsize1:
  3954 0000BA69 0FB74711            <1> 	movzx	eax, word [edi+LD_BPB+BytesPerSec]
  3955 0000BA6D F7E1                <1> 	mul	ecx
  3956                              <1> 	;sub	edx, edx
  3957                              <1> csftdf2_set_df_percent_wsize2:
  3958 0000BA6F A3[74840100]        <1> 	mov	[csftdf_w_size], eax
  3959                              <1> 
  3960 0000BA74 A1[5C840100]        <1> 	mov	eax, [csftdf_filesize]
  3961                              <1> 
  3962 0000BA79 3D00000100          <1> 	cmp	eax, 65536 ; 64KB	; small file
  3963 0000BA7E 721F                <1> 	jb	short csftdf2_load_file ; do not display percentage
  3964                              <1> 	
  3965                              <1> csftdf2_reset_wf_percent_ptr_chk_64k:
  3966 0000BA80 B201                <1> 	mov	dl, 1 ; 25/03/2016
  3967                              <1> 
  3968 0000BA82 3D00000400          <1> 	cmp	eax, 65536*4 ; 256KB
  3969 0000BA87 7310                <1> 	jnb	short csftdf2_enable_percentage_display ; big file
  3970                              <1> 
  3971                              <1> 	; 64-128KB file size for floppy disks
  3972 0000BA89 3815[30830100]      <1> 	cmp	byte [SourceFile_Drv], dl ; 1 ; read from floppy disk ?
  3973 0000BA8F 7608                <1> 	jna	short csftdf2_enable_percentage_display
  3974                              <1> 
  3975 0000BA91 3815[B0830100]      <1> 	cmp	byte [DestinationFile_Drv], dl ; 1 ; write to floppy disk ?
  3976 0000BA97 7706                <1> 	ja	short csftdf2_load_file
  3977                              <1> 
  3978                              <1> csftdf2_enable_percentage_display:	
  3979 0000BA99 8815[80840100]      <1> 	mov	[csftdf_percentage], dl ; 1	
  3980                              <1> 	
  3981                              <1> csftdf2_load_file:
  3982                              <1> 	; 13/05/2016
  3983                              <1> 	; 19/03/2016
  3984                              <1> 	; 18/03/2016
  3985                              <1> 	; 17/03/2016
  3986 0000BA9F B40F                <1> 	mov	ah, 0Fh
  3987 0000BAA1 E8755CFFFF          <1> 	call	_int10h
  3988                              <1> 	; 13/05/2016
  3989 0000BAA6 883D[81840100]      <1> 	mov	[csftdf_videopage], bh ; active video page
  3990 0000BAAC B403                <1> 	mov	ah, 03h
  3991 0000BAAE E8685CFFFF          <1> 	call	_int10h
  3992 0000BAB3 668915[82840100]    <1> 	mov	[csftdf_cursorpos], dx
  3993                              <1> 
  3994 0000BABA 29C0                <1> 	sub	eax, eax
  3995 0000BABC A2[59840100]        <1> 	mov	[csftdf_rw_err], al ; 0 
  3996                              <1> 
  3997                              <1> ; ///
  3998                              <1> csftdf_sf_amb: ; 15/03/2016
  3999 0000BAC1 8B0D[5C840100]      <1> 	mov	ecx, [csftdf_filesize]	; 23/03/2016
  4000                              <1> 
  4001                              <1> 	; TRDOS 386 (TRDOS v2.0)
  4002                              <1> 	; Allocate contiguous memory block for loading the file
  4003                              <1> 	
  4004                              <1> 	;mov	ecx, [SourceFile_DirEntry+DirEntry_FileSize]
  4005                              <1> 	
  4006                              <1> 	;sub	eax, eax ; First free memory aperture
  4007                              <1> 	
  4008                              <1> 	; eax = 0 (Allocate memory from the beginning)
  4009                              <1> 	; ecx = File (Allocation) size in bytes
  4010                              <1> 	
  4011 0000BAC7 E8FFA1FFFF          <1> 	call	allocate_memory_block
  4012 0000BACC 7304                <1> 	jnc	short loc_check_sf_save_loading_parms
  4013                              <1> 
  4014 0000BACE 29C0                <1> 	sub	eax, eax
  4015 0000BAD0 29C9                <1> 	sub	ecx, ecx
  4016                              <1> 	
  4017                              <1> loc_check_sf_save_loading_parms:
  4018 0000BAD2 A3[60840100]        <1> 	mov	[csftdf_sf_mem_addr], eax ; loading address
  4019 0000BAD7 890D[64840100]      <1> 	mov	[csftdf_sf_mem_bsize], ecx ; block size
  4020                              <1> ; ///   
  4021                              <1> 	; 19/03/2016
  4022 0000BADD 8B35[84840100]      <1> 	mov	esi, [csftdf_sf_drv_dt] ; logical dos drv desc. tbl.
  4023                              <1> 
  4024                              <1> 	; 17/03/2016
  4025 0000BAE3 09C0                <1> 	or	eax, eax ; contiguous free memory block address 
  4026                              <1> 	;jz	csftdf2_read_sf_cluster
  4027                              <1> 	; 29/07/2022
  4028 0000BAE5 7505                <1> 	jnz	short csftdf2_1
  4029 0000BAE7 E95E010000          <1> 	jmp	csftdf2_read_sf_cluster
  4030                              <1> 
  4031                              <1> csftdf2_1:
  4032                              <1> 	; 18/03/2016
  4033 0000BAEC 8B1D[60840100]      <1> 	mov	ebx, [csftdf_sf_mem_addr] ; memory block address
  4034                              <1> 
  4035 0000BAF2 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  4036                              <1>         ;jna	csftdf2_load_fs_file
  4037                              <1> 	; 29/07/2022
  4038 0000BAF6 7705                <1> 	ja	short csftdf2_load_fat_file
  4039 0000BAF8 E900020000          <1> 	jmp	csftdf2_load_fs_file
  4040                              <1> 
  4041                              <1> csftdf2_load_fat_file:
  4042 0000BAFD 53                  <1> 	push	ebx ; *
  4043                              <1> 
  4044                              <1> csftdf2_load_fat_file_next:
  4045 0000BAFE BE[15370100]        <1> 	mov	esi, msg_reading
  4046 0000BB03 E842B2FFFF          <1> 	call	print_msg
  4047                              <1> 
  4048 0000BB08 803D[80840100]00    <1> 	cmp	byte [csftdf_percentage], 0
  4049 0000BB0F 7605                <1> 	jna	short csftdf2_load_fat_file_1
  4050                              <1> 	
  4051 0000BB11 E87E000000          <1> 	call	csftdf2_print_percentage ; 19/03/2016
  4052                              <1> 
  4053                              <1> csftdf2_load_fat_file_1:
  4054 0000BB16 8B35[84840100]      <1> 	mov	esi, [csftdf_sf_drv_dt]	
  4055 0000BB1C 5B                  <1> 	pop	ebx ; *
  4056                              <1> 
  4057                              <1> csftdf2_load_fat_file_2:
  4058 0000BB1D E8BA000000          <1> 	call	csftdf2_read_fat_file_sectors ; 19/03/2016
  4059                              <1> 	;jc	csftdf2_rw_error ; eocc! or disk error! 
  4060                              <1> 	; 29/07/2022
  4061 0000BB22 7305                <1> 	jnc	short csftdf2_load_fat_file_3 
  4062 0000BB24 E94D040000          <1> 	jmp	csftdf2_rw_error
  4063                              <1> csftdf2_load_fat_file_3:
  4064 0000BB29 09D2                <1> 	or	edx, edx ; edx > 0 -> EOF
  4065 0000BB2B 7520                <1> 	jnz	short csftdf2_load_fat_file_ok
  4066                              <1> 
  4067 0000BB2D 803D[80840100]00    <1> 	cmp	byte [csftdf_percentage], 0
  4068 0000BB34 76E7                <1> 	jna	short csftdf2_load_fat_file_2
  4069                              <1> 
  4070 0000BB36 53                  <1> 	push	ebx ; *	
  4071                              <1> 
  4072                              <1> 	; Set cursor position
  4073                              <1> 	; AH= 02h, BH= Page Number, DH= Row, DL= Column
  4074 0000BB37 8A3D[81840100]      <1> 	mov	bh, [csftdf_videopage]
  4075 0000BB3D 668B15[82840100]    <1> 	mov	dx, [csftdf_cursorpos]
  4076 0000BB44 B402                <1> 	mov	ah, 2
  4077 0000BB46 E8D05BFFFF          <1> 	call	_int10h
  4078 0000BB4B EBB1                <1> 	jmp	short csftdf2_load_fat_file_next
  4079                              <1> 	
  4080                              <1> csftdf2_load_fat_file_ok:
  4081 0000BB4D 803D[80840100]00    <1> 	cmp	byte [csftdf_percentage], 0
  4082                              <1> 	;jna	csftdf2_save_file ; 25/03/2016
  4083                              <1> 	; 29/07/2022
  4084 0000BB54 7705                <1> 	ja	short csftdf2_2
  4085 0000BB56 E94B020000          <1> 	jmp	csftdf2_save_file
  4086                              <1> csftdf2_2:	
  4087                              <1> 	; "Reading... 100%"
  4088 0000BB5B BF[2D370100]        <1> 	mov	edi, percentagestr
  4089 0000BB60 B031                <1> 	mov	al, '1'
  4090 0000BB62 AA                  <1> 	stosb
  4091 0000BB63 B030                <1> 	mov	al, '0'
  4092 0000BB65 AA                  <1> 	stosb
  4093 0000BB66 AA                  <1> 	stosb
  4094                              <1> 
  4095 0000BB67 8A3D[81840100]      <1> 	mov	bh, [csftdf_videopage]
  4096 0000BB6D 668B15[82840100]    <1> 	mov	dx, [csftdf_cursorpos]
  4097 0000BB74 B402                <1> 	mov	ah, 2
  4098 0000BB76 E8A05BFFFF          <1> 	call	_int10h
  4099                              <1> 
  4100 0000BB7B BE[15370100]        <1> 	mov	esi, msg_reading
  4101 0000BB80 E8C5B1FFFF          <1> 	call	print_msg
  4102                              <1> 	
  4103 0000BB85 BE[2D370100]        <1> 	mov	esi, percentagestr
  4104 0000BB8A E8BBB1FFFF          <1> 	call	print_msg
  4105                              <1> 
  4106 0000BB8F E912020000          <1>         jmp     csftdf2_save_file ; 25/03/2016
  4107                              <1> 
  4108                              <1> csftdf2_print_percentage:
  4109                              <1> 	; 09/12/2017
  4110                              <1> 	; 19/03/2016
  4111                              <1> 	; 18/03/2016
  4112 0000BB94 B020                <1> 	mov	al, 20h
  4113 0000BB96 BF[2D370100]        <1> 	mov	edi, percentagestr
  4114 0000BB9B AA                  <1> 	stosb
  4115 0000BB9C AA                  <1> 	stosb
  4116 0000BB9D A1[78840100]        <1> 	mov	eax, [csftdf_sf_rbytes]
  4117                              <1> 	;mov	edx, 100
  4118                              <1> 	; 29/07/2022
  4119 0000BBA2 29D2                <1> 	sub	edx, edx
  4120 0000BBA4 B264                <1> 	mov	dl, 100
  4121 0000BBA6 F7E2                <1> 	mul	edx
  4122 0000BBA8 8B0D[5C840100]      <1> 	mov	ecx, [csftdf_filesize]	
  4123 0000BBAE F7F1                <1> 	div	ecx
  4124 0000BBB0 B10A                <1> 	mov	cl, 10
  4125 0000BBB2 F6F1                <1> 	div	cl
  4126 0000BBB4 80C430              <1> 	add	ah, '0'
  4127 0000BBB7 8827                <1> 	mov	[edi], ah
  4128 0000BBB9 20C0                <1> 	and	al, al
  4129 0000BBBB 740A                <1> 	jz	short csftdf2_print_percent_1
  4130 0000BBBD 4F                  <1> 	dec	edi
  4131                              <1> 	;cbw
  4132 0000BBBE 28E4                <1> 	sub	ah, ah ; 09/12/2017
  4133 0000BBC0 F6F1                <1> 	div	cl
  4134 0000BBC2 80C430              <1> 	add	ah, '0'
  4135 0000BBC5 8827                <1> 	mov	[edi], ah
  4136                              <1> 	;and	al, al
  4137                              <1> 	;jz	short csftdf2_print_percent_1
  4138                              <1> 	;dec	edi
  4139                              <1> 	;mov	[edi], '1' ; 100%		
  4140                              <1> 
  4141                              <1> csftdf2_print_percent_1:
  4142 0000BBC7 BE[2D370100]        <1> 	mov	esi, percentagestr
  4143                              <1> 	;call	print_msg
  4144                              <1> 	;retn
  4145 0000BBCC E979B1FFFF          <1> 	jmp	print_msg
  4146                              <1> 
  4147                              <1> csftdf2_read_file_sectors:
  4148                              <1> 	; 19/03/2016
  4149 0000BBD1 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  4150                              <1> 	;jna	csftdf2_read_fs_file_sectors
  4151                              <1> 	; 29/07/2022
  4152 0000BBD5 7705                <1> 	ja	short csftdf2_read_fat_file_sectors
  4153 0000BBD7 E912070000          <1> 	jmp	csftdf2_read_fs_file_sectors
  4154                              <1> 
  4155                              <1> csftdf2_read_fat_file_sectors:
  4156                              <1> 	; 19/03/2016
  4157                              <1> 	; 18/03/2016
  4158                              <1> 	; return:
  4159                              <1> 	;   CF = 0 & EDX > 0 -> END OF FILE
  4160                              <1> 	;   CF = 0 & EDX = 0 -> not EOF
  4161                              <1> 	;   CF = 1 -> read error (error code in AL)	
  4162                              <1> 
  4163                              <1> csftdf2_read_fat_file_secs_0:
  4164 0000BBDC 8B15[5C840100]      <1> 	mov	edx, [csftdf_filesize]
  4165 0000BBE2 2B15[78840100]      <1> 	sub	edx, [csftdf_sf_rbytes]
  4166 0000BBE8 3B15[70840100]      <1> 	cmp	edx, [csftdf_r_size]	
  4167 0000BBEE 7306                <1> 	jnb	short csftdf2_read_fat_file_secs_1
  4168 0000BBF0 8915[70840100]      <1> 	mov	[csftdf_r_size], edx
  4169                              <1> 		
  4170                              <1> csftdf2_read_fat_file_secs_1:
  4171 0000BBF6 A1[70840100]        <1> 	mov	eax, [csftdf_r_size]
  4172 0000BBFB 29D2                <1> 	sub	edx, edx
  4173 0000BBFD 0FB74E11            <1> 	movzx	ecx, word [esi+LD_BPB+BytesPerSec]
  4174 0000BC01 01C8                <1> 	add	eax, ecx
  4175 0000BC03 48                  <1> 	dec	eax
  4176 0000BC04 F7F1                <1> 	div	ecx
  4177 0000BC06 89C1                <1> 	mov	ecx, eax ; sector count
  4178 0000BC08 A1[68840100]        <1> 	mov	eax, [csftdf_sf_cluster]
  4179                              <1> 
  4180                              <1> 	; EBX = memory block address (current)
  4181                              <1> 	
  4182 0000BC0D E8DD080000          <1> 	call	read_fat_file_sectors
  4183 0000BC12 7235                <1> 	jc	short csftdf2_read_fat_file_secs_3
  4184                              <1> 
  4185                              <1> 	; EBX = next memory address
  4186                              <1> 
  4187 0000BC14 A1[78840100]        <1> 	mov	eax, [csftdf_sf_rbytes]
  4188 0000BC19 0305[70840100]      <1> 	add	eax, [csftdf_r_size]
  4189 0000BC1F 8B15[5C840100]      <1> 	mov	edx, [csftdf_filesize]
  4190 0000BC25 39D0                <1> 	cmp	eax, edx
  4191 0000BC27 7320                <1> 	jnb	short csftdf2_read_fat_file_secs_3 ; edx > 0
  4192 0000BC29 A3[78840100]        <1> 	mov	[csftdf_sf_rbytes], eax
  4193                              <1> 
  4194 0000BC2E 53                  <1> 	push	ebx ; *
  4195                              <1> 	; get next cluster (csftdf_r_size! bytes)
  4196 0000BC2F A1[68840100]        <1> 	mov	eax, [csftdf_sf_cluster]
  4197 0000BC34 E8B6060000          <1> 	call	get_next_cluster
  4198 0000BC39 5B                  <1> 	pop	ebx ; *
  4199 0000BC3A 7306                <1> 	jnc	short csftdf2_read_fat_file_secs_2
  4200                              <1> 
  4201                              <1> 	; 15/10/2016
  4202                              <1> 	;Disk read error instad of drv not ready err
  4203 0000BC3C B811000000          <1> 	mov	eax, 17 ; Read error !
  4204 0000BC41 C3                  <1> 	retn
  4205                              <1> 
  4206                              <1> csftdf2_read_fat_file_secs_2:
  4207 0000BC42 29D2                <1> 	sub	edx, edx ; 0
  4208 0000BC44 A3[68840100]        <1> 	mov	[csftdf_sf_cluster], eax ; next cluster
  4209                              <1> 
  4210                              <1> csftdf2_read_fat_file_secs_3:
  4211 0000BC49 C3                  <1> 	retn
  4212                              <1> 
  4213                              <1> csftdf2_read_sf_cluster:
  4214                              <1> 	; 19/03/2016
  4215 0000BC4A BB00000700          <1> 	mov	ebx, Cluster_Buffer ; buffer address (64KB)
  4216                              <1> 
  4217 0000BC4F 803D[80840100]00    <1> 	cmp	byte [csftdf_percentage], 0
  4218 0000BC56 760D                <1> 	jna	short csftdf2_read_sf_clust_2
  4219                              <1> 
  4220 0000BC58 53                  <1> 	push	ebx ; *	
  4221                              <1> 
  4222                              <1> csftdf2_read_sf_clust_next:
  4223 0000BC59 E836FFFFFF          <1> 	call	csftdf2_print_percentage
  4224                              <1> 
  4225                              <1> csftdf2_read_sf_clust_0:
  4226 0000BC5E 8B35[84840100]      <1> 	mov	esi, [csftdf_sf_drv_dt]	
  4227                              <1> csftdf2_read_sf_clust_1:
  4228 0000BC64 5B                  <1> 	pop	ebx ; *
  4229                              <1> 
  4230                              <1> csftdf2_read_sf_clust_2:
  4231 0000BC65 89DA                <1> 	mov	edx, ebx
  4232 0000BC67 0315[70840100]      <1> 	add	edx, [csftdf_r_size]
  4233 0000BC6D 81FA00000800        <1> 	cmp	edx, Cluster_Buffer + 65536
  4234 0000BC73 772B                <1> 	ja	short csftdf2_write_df_cluster
  4235                              <1> 
  4236 0000BC75 E857FFFFFF          <1> 	call	csftdf2_read_file_sectors ; 19/03/2016
  4237                              <1> 	;jc	csftdf2_save_fat_file_err2 ; eocc! or disk error! 
  4238                              <1> 	; 29/07/2022
  4239 0000BC7A 7236                <1> 	jc	short csftdf2_3
  4240                              <1> 
  4241 0000BC7C 09D2                <1> 	or	edx, edx ; edx > 0 -> EOF
  4242 0000BC7E 7520                <1> 	jnz	short csftdf2_write_df_cluster
  4243                              <1> 
  4244 0000BC80 803D[80840100]00    <1> 	cmp	byte [csftdf_percentage], 0
  4245 0000BC87 76DC                <1> 	jna	short csftdf2_read_sf_clust_2
  4246                              <1> 
  4247 0000BC89 53                  <1> 	push	ebx ; *	
  4248                              <1> 
  4249                              <1> 	; Set cursor position
  4250                              <1> 	; AH= 02h, BH= Page Number, DH= Row, DL= Column
  4251 0000BC8A 8A3D[81840100]      <1> 	mov	bh, [csftdf_videopage]
  4252 0000BC90 668B15[82840100]    <1> 	mov	dx, [csftdf_cursorpos]
  4253 0000BC97 B402                <1> 	mov	ah, 2
  4254 0000BC99 E87D5AFFFF          <1> 	call	_int10h
  4255 0000BC9E EBB9                <1> 	jmp	short csftdf2_read_sf_clust_next
  4256                              <1> 
  4257                              <1> csftdf2_write_df_cluster:
  4258                              <1> 	; 19/03/2016
  4259 0000BCA0 8B35[88840100]      <1> 	mov	esi, [csftdf_df_drv_dt]	
  4260 0000BCA6 BB00000700          <1> 	mov	ebx, Cluster_Buffer ; buffer address (64KB)
  4261                              <1> 
  4262                              <1> csftdf2_write_df_clust_next:
  4263 0000BCAB E852000000          <1> 	call	csftdf2_write_file_sectors ; 19/03/2016
  4264                              <1> 	;jc	csftdf2_save_fat_file_err2 ; eocc! or disk error! 
  4265                              <1> 	; 29/07/2022
  4266 0000BCB0 7305                <1> 	jnc	short csftdf2_4
  4267                              <1> csftdf2_3:
  4268 0000BCB2 E946020000          <1> 	jmp	csftdf2_save_fat_file_err2
  4269                              <1> csftdf2_4:
  4270 0000BCB7 09D2                <1> 	or	edx, edx ; edx > 0 -> EOF
  4271 0000BCB9 750A                <1> 	jnz	short csftdf2_rw_f_clust_ok
  4272                              <1> 
  4273 0000BCBB 81FB00000800        <1> 	cmp	ebx, Cluster_Buffer + 65536
  4274 0000BCC1 72E8                <1> 	jb	short csftdf2_write_df_clust_next
  4275                              <1> 	
  4276 0000BCC3 EB85                <1> 	jmp	short csftdf2_read_sf_cluster
  4277                              <1>  
  4278                              <1> csftdf2_rw_f_clust_ok:
  4279 0000BCC5 803D[80840100]00    <1> 	cmp	byte [csftdf_percentage], 0
  4280                              <1> 	;jna	csftdf2_save_fat_file_4 ; 25/03/2016
  4281                              <1> 	; 29/07/2022
  4282 0000BCCC 762A                <1> 	jna	short csftdf2_5
  4283                              <1> 
  4284                              <1> 	; "100%"
  4285 0000BCCE BF[2D370100]        <1> 	mov	edi, percentagestr
  4286 0000BCD3 B031                <1> 	mov	al, '1'
  4287 0000BCD5 AA                  <1> 	stosb
  4288 0000BCD6 B030                <1> 	mov	al, '0'
  4289 0000BCD8 AA                  <1> 	stosb
  4290 0000BCD9 AA                  <1> 	stosb
  4291                              <1> 
  4292 0000BCDA 8A3D[81840100]      <1> 	mov	bh, [csftdf_videopage]
  4293 0000BCE0 668B15[82840100]    <1> 	mov	dx, [csftdf_cursorpos]
  4294 0000BCE7 B402                <1> 	mov	ah, 2
  4295 0000BCE9 E82D5AFFFF          <1> 	call	_int10h
  4296                              <1> 
  4297 0000BCEE BE[2D370100]        <1> 	mov	esi, percentagestr
  4298 0000BCF3 E852B0FFFF          <1> 	call	print_msg
  4299                              <1> csftdf2_5:
  4300 0000BCF8 E987010000          <1>         jmp     csftdf2_save_fat_file_4
  4301                              <1> 
  4302                              <1> csftdf2_load_fs_file:
  4303                              <1> 	; temporary - 18/03/2016
  4304 0000BCFD E972020000          <1>         jmp     csftdf2_read_error
  4305                              <1> 
  4306                              <1> csftdf2_write_file_sectors:
  4307                              <1> 	; 19/03/2016
  4308 0000BD02 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  4309                              <1> 	;jna	csftdf2_write_fs_file_sectors
  4310                              <1> 	; 29/07/2022
  4311 0000BD06 7705                <1> 	ja	short csftdf2_write_fat_file_sectors
  4312 0000BD08 E9E1050000          <1> 	jmp	csftdf2_write_fs_file_sectors
  4313                              <1> 
  4314                              <1> csftdf2_write_fat_file_sectors:
  4315                              <1> 	; 19/03/2016
  4316                              <1> 	; 18/03/2016
  4317                              <1> 	; return:
  4318                              <1> 	;   CF = 0 & EDX > 0 -> END OF FILE
  4319                              <1> 	;   CF = 0 & EDX = 0 -> not EOF
  4320                              <1> 	;   CF = 1 -> write error (error code in AL)	
  4321                              <1> 
  4322                              <1> csftdf2_write_fat_file_secs_0:
  4323 0000BD0D 8B15[5C840100]      <1> 	mov	edx, [csftdf_filesize]
  4324 0000BD13 2B15[7C840100]      <1> 	sub	edx, [csftdf_df_wbytes]
  4325 0000BD19 3B15[74840100]      <1> 	cmp	edx, [csftdf_w_size]	
  4326 0000BD1F 7306                <1> 	jnb	short csftdf2_write_fat_file_secs_1
  4327 0000BD21 8915[74840100]      <1> 	mov	[csftdf_w_size], edx		
  4328                              <1> 
  4329                              <1> csftdf2_write_fat_file_secs_1:
  4330 0000BD27 A1[74840100]        <1> 	mov	eax, [csftdf_w_size]
  4331 0000BD2C 29D2                <1> 	sub	edx, edx
  4332 0000BD2E 0FB74E11            <1> 	movzx	ecx, word [esi+LD_BPB+BytesPerSec]
  4333 0000BD32 01C8                <1> 	add	eax, ecx
  4334 0000BD34 48                  <1> 	dec	eax
  4335 0000BD35 F7F1                <1> 	div	ecx
  4336 0000BD37 89C1                <1> 	mov	ecx, eax ; sector count
  4337 0000BD39 A1[6C840100]        <1> 	mov	eax, [csftdf_df_cluster]
  4338                              <1> 
  4339                              <1> 	; EBX = memory block address (current)	
  4340                              <1> 
  4341 0000BD3E E80A0F0000          <1> 	call	write_fat_file_sectors
  4342 0000BD43 7259                <1> 	jc	short csftdf2_write_fat_file_secs_4
  4343                              <1> 
  4344                              <1> 	; EBX = next memory address
  4345                              <1> 
  4346 0000BD45 A1[7C840100]        <1> 	mov	eax, [csftdf_df_wbytes]
  4347 0000BD4A 0305[74840100]      <1> 	add	eax, [csftdf_w_size]
  4348 0000BD50 8B15[5C840100]      <1> 	mov	edx, [csftdf_filesize]
  4349 0000BD56 39D0                <1> 	cmp	eax, edx
  4350 0000BD58 7344                <1> 	jnb	short csftdf2_write_fat_file_secs_4
  4351 0000BD5A A3[7C840100]        <1> 	mov	[csftdf_df_wbytes], eax
  4352                              <1> 	;
  4353 0000BD5F A3[1E840100]        <1> 	mov	[DestinationFile_DirEntry+DirEntry_FileSize], eax
  4354                              <1> 
  4355 0000BD64 53                  <1> 	push	ebx ; *
  4356                              <1> 
  4357 0000BD65 803D[5A840100]01    <1> 	cmp	byte [DestinationFileFound], 1
  4358 0000BD6C 7210                <1> 	jb	short csftdf2_write_fat_file_secs_2
  4359                              <1> 
  4360                              <1> 	; get next cluster (csftdf_w_size! bytes)
  4361 0000BD6E A1[6C840100]        <1> 	mov	eax, [csftdf_df_cluster]
  4362 0000BD73 E877050000          <1> 	call	get_next_cluster
  4363 0000BD78 731C                <1> 	jnc	short csftdf2_write_fat_file_secs_3
  4364                              <1> 
  4365 0000BD7A 21C0                <1> 	and	eax, eax ; end of cluster chain!?
  4366 0000BD7C 7521                <1> 	jnz	short csftdf2_write_fat_file_secs_5 ; disk error !
  4367                              <1> 
  4368                              <1> csftdf2_write_fat_file_secs_2:
  4369 0000BD7E A1[6C840100]        <1> 	mov	eax, [csftdf_df_cluster] ; last cluster
  4370 0000BD83 E8F30D0000          <1> 	call	add_new_cluster		
  4371 0000BD88 7215                <1> 	jc	short csftdf2_write_fat_file_secs_5
  4372                              <1> 
  4373                              <1> 	; NOTE: Destination file size may be bigger than
  4374                              <1> 	; source file size when the last reading fails after here.
  4375                              <1> 	; (The last -empty- cluster of destination file must be 
  4376                              <1> 	; truncated and LMDT must be current date&time for partial
  4377                              <1> 	; copy result!) 
  4378 0000BD8A 8B15[74840100]      <1> 	mov	edx, [csftdf_w_size] ; bytes per cluster
  4379 0000BD90 0115[1E840100]      <1> 	add	[DestinationFile_DirEntry+DirEntry_FileSize], edx
  4380                              <1> 
  4381                              <1> csftdf2_write_fat_file_secs_3:
  4382 0000BD96 5B                  <1> 	pop	ebx ; *
  4383 0000BD97 29D2                <1> 	sub	edx, edx ; 0
  4384 0000BD99 A3[6C840100]        <1> 	mov	[csftdf_df_cluster], eax ; next cluster
  4385                              <1> 
  4386                              <1> csftdf2_write_fat_file_secs_4:
  4387 0000BD9E C3                  <1> 	retn
  4388                              <1> 
  4389                              <1> csftdf2_write_fat_file_secs_5:
  4390 0000BD9F 5B                  <1> 	pop	ebx ; *
  4391                              <1> 	; 16/10/2016 (1Dh -> 18)
  4392 0000BDA0 B812000000          <1> 	mov	eax, 18 ; Write error !
  4393 0000BDA5 C3                  <1> 	retn
  4394                              <1> 
  4395                              <1> csftdf2_save_file:
  4396                              <1> 	; 09/12/2017
  4397                              <1> 	; 25/03/2016
  4398                              <1> 	; 19/03/2016
  4399                              <1> 	; 18/03/2016
  4400 0000BDA6 8B35[88840100]      <1> 	mov	esi, [csftdf_df_drv_dt] ; logical dos drv desc. tbl.
  4401                              <1> 
  4402 0000BDAC 8B1D[60840100]      <1> 	mov	ebx, [csftdf_sf_mem_addr] ; memory block address
  4403                              <1> 
  4404 0000BDB2 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  4405                              <1> 	;jna	csftdf2_save_fs_file
  4406                              <1> 	; 29/07/2022	
  4407 0000BDB6 7705                <1> 	ja	short csftdf2_save_fat_file
  4408 0000BDB8 E9F5010000          <1> 	jmp	csftdf2_save_fs_file
  4409                              <1> 
  4410                              <1> csftdf2_save_fat_file:
  4411 0000BDBD 53                  <1> 	push	ebx; *
  4412                              <1> 
  4413 0000BDBE 803D[80840100]00    <1> 	cmp	byte [csftdf_percentage], 0
  4414 0000BDC5 7724                <1> 	ja	short csftdf2_save_fat_file_0
  4415                              <1> 
  4416                              <1> 	; Set cursor position
  4417                              <1> 	; AH= 02h, BH= Page Number, DH= Row, DL= Column
  4418 0000BDC7 8A3D[81840100]      <1> 	mov	bh, [csftdf_videopage]
  4419 0000BDCD 668B15[82840100]    <1> 	mov	dx, [csftdf_cursorpos]
  4420 0000BDD4 B402                <1> 	mov	ah, 2
  4421 0000BDD6 E84059FFFF          <1> 	call	_int10h
  4422                              <1> 	
  4423 0000BDDB BE[21370100]        <1> 	mov	esi, msg_writing
  4424 0000BDE0 E865AFFFFF          <1> 	call	print_msg
  4425                              <1> 
  4426                              <1> csftdf2_save_fat_file_next:
  4427 0000BDE5 8B35[88840100]      <1> 	mov	esi, [csftdf_df_drv_dt] ; 25/03/2016
  4428                              <1> 
  4429                              <1> csftdf2_save_fat_file_0:
  4430 0000BDEB 5B                  <1> 	pop	ebx ; *
  4431                              <1> 
  4432                              <1> csftdf2_save_fat_file_1:
  4433 0000BDEC E811FFFFFF          <1> 	call	csftdf2_write_file_sectors ; 19/03/2016	
  4434                              <1> 	;jc	csftdf2_rw_error ; eocc! or disk error! 
  4435                              <1> 	; 29/07/2022
  4436 0000BDF1 7305                <1> 	jnc	short csftdf2_6
  4437 0000BDF3 E97E010000          <1> 	jmp	csftdf2_rw_error
  4438                              <1> 
  4439                              <1> csftdf2_6:
  4440 0000BDF8 09D2                <1> 	or	edx, edx ; edx > 0 -> EOF
  4441 0000BDFA 756C                <1>         jnz     short csftdf2_save_fat_file_3 ; 25/03/2016
  4442                              <1> 
  4443 0000BDFC 803D[80840100]00    <1> 	cmp	byte [csftdf_percentage], 0
  4444 0000BE03 76E7                <1> 	jna	short csftdf2_save_fat_file_1
  4445                              <1> 
  4446 0000BE05 B020                <1> 	mov	al, 20h
  4447 0000BE07 BF[2D370100]        <1> 	mov	edi, percentagestr
  4448 0000BE0C AA                  <1> 	stosb
  4449 0000BE0D AA                  <1> 	stosb
  4450 0000BE0E A1[7C840100]        <1> 	mov	eax, [csftdf_df_wbytes]
  4451                              <1> 	;mov	edx, 100
  4452                              <1> 	; 29/07/2022
  4453 0000BE13 31D2                <1> 	xor	edx, edx
  4454 0000BE15 B264                <1> 	mov	dl, 100
  4455 0000BE17 F7E2                <1> 	mul	edx
  4456 0000BE19 8B0D[5C840100]      <1> 	mov	ecx, [csftdf_filesize]	
  4457 0000BE1F F7F1                <1> 	div	ecx
  4458 0000BE21 B10A                <1> 	mov	cl, 10
  4459 0000BE23 F6F1                <1> 	div	cl
  4460 0000BE25 80C430              <1> 	add	ah, '0'
  4461 0000BE28 8827                <1> 	mov	[edi], ah
  4462 0000BE2A 20C0                <1> 	and	al, al
  4463 0000BE2C 740A                <1> 	jz	short csftdf2_save_fat_file_2
  4464 0000BE2E 4F                  <1> 	dec	edi
  4465                              <1> 	;cbw
  4466 0000BE2F 30E4                <1> 	xor	ah, ah ; 09/12/2017
  4467 0000BE31 F6F1                <1> 	div	cl
  4468 0000BE33 80C430              <1> 	add	ah, '0'
  4469 0000BE36 8827                <1> 	mov	[edi], ah
  4470                              <1> 	;and	al, al
  4471                              <1> 	;jz	short csftdf2_save_fat_file_2
  4472                              <1> 	;dec	edi
  4473                              <1> 	;mov	[edi], '1' ; 100%		
  4474                              <1> 
  4475                              <1> csftdf2_save_fat_file_2:
  4476 0000BE38 53                  <1> 	push	ebx ; *
  4477                              <1> 
  4478 0000BE39 E802000000          <1> 	call	csftdf2_print_wr_percentage ; 25/03/2016
  4479                              <1> 
  4480 0000BE3E EBA5                <1>         jmp     csftdf2_save_fat_file_next
  4481                              <1> 
  4482                              <1> csftdf2_print_wr_percentage:
  4483                              <1> 	; Set cursor position
  4484                              <1> 	; AH= 02h, BH= Page Number, DH= Row, DL= Column
  4485 0000BE40 8A3D[81840100]      <1> 	mov	bh, [csftdf_videopage]
  4486 0000BE46 668B15[82840100]    <1> 	mov	dx, [csftdf_cursorpos]
  4487 0000BE4D B402                <1> 	mov	ah, 2
  4488 0000BE4F E8C758FFFF          <1> 	call	_int10h
  4489                              <1> 
  4490 0000BE54 BE[21370100]        <1> 	mov	esi, msg_writing
  4491 0000BE59 E8ECAEFFFF          <1> 	call	print_msg
  4492                              <1> 
  4493 0000BE5E BE[2D370100]        <1> 	mov	esi, percentagestr
  4494                              <1> 	;call	print_msg
  4495                              <1> 	;retn
  4496 0000BE63 E9E2AEFFFF          <1> 	jmp	print_msg
  4497                              <1> 
  4498                              <1> csftdf2_save_fat_file_3:
  4499 0000BE68 803D[80840100]00    <1> 	cmp	byte [csftdf_percentage], 0
  4500                              <1>         ;jna	csftdf2_save_fat_file_4 ; 25/03/2016
  4501                              <1> 	; 29/07/2022
  4502 0000BE6F 7702                <1> 	ja	short csftdf2_7
  4503 0000BE71 EB11                <1> 	jmp	csftdf2_save_fat_file_4
  4504                              <1> 
  4505                              <1> csftdf2_7:
  4506                              <1> 	; "100%"
  4507 0000BE73 BF[2D370100]        <1> 	mov	edi, percentagestr
  4508 0000BE78 B031                <1> 	mov	al, '1'
  4509 0000BE7A AA                  <1> 	stosb
  4510 0000BE7B B030                <1> 	mov	al, '0'
  4511 0000BE7D AA                  <1> 	stosb
  4512 0000BE7E AA                  <1> 	stosb
  4513                              <1> 
  4514 0000BE7F E8BCFFFFFF          <1> 	call	csftdf2_print_wr_percentage
  4515                              <1> 
  4516                              <1> csftdf2_save_fat_file_4:
  4517 0000BE84 803D[5A840100]00    <1> 	cmp	byte [DestinationFileFound], 0
  4518 0000BE8B 7647                <1> 	jna	short csftdf2_save_fat_file_6
  4519                              <1> 
  4520 0000BE8D 8B35[88840100]      <1> 	mov	esi, [csftdf_df_drv_dt] ; 31/03/2016	
  4521                              <1> 
  4522 0000BE93 A1[6C840100]        <1> 	mov	eax, [csftdf_df_cluster] ; last cluster
  4523 0000BE98 E852040000          <1> 	call	get_next_cluster
  4524 0000BE9D 7235                <1> 	jc	short csftdf2_save_fat_file_6 ; eocc! or disk error!
  4525                              <1> 
  4526 0000BE9F A1[6C840100]        <1> 	mov	eax, [csftdf_df_cluster] ; last cluster
  4527                              <1> 	;xor	ecx, ecx
  4528                              <1> 	;mov	[FAT_ClusterCounter], ecx ; 0 ; reset
  4529                              <1> 	;dec	ecx ; 0FFFFFFFFh
  4530                              <1> 	;shr	ecx, 4 ; 28 bit ; 0FFFFFFFh
  4531 0000BEA4 B9FFFFFF0F          <1> 	mov	ecx, 0FFFFFFFh
  4532 0000BEA9 E830070000          <1> 	call	update_cluster
  4533 0000BEAE 7224                <1> 	jc	short csftdf2_save_fat_file_6 ; really last cluster!?
  4534                              <1> 
  4535 0000BEB0 A3[6C840100]        <1> 	mov	[csftdf_df_cluster], eax ; next cluster
  4536                              <1> 	
  4537                              <1> 	; byte [FAT_BuffValidData] = 2 
  4538 0000BEB5 E8A7090000          <1> 	call	save_fat_buffer
  4539 0000BEBA 730E                <1> 	jnc	short csftdf2_save_fat_file_5
  4540                              <1> 	
  4541 0000BEBC 8B15[5C840100]      <1> 	mov	edx, [csftdf_filesize]
  4542 0000BEC2 8915[1E840100]      <1> 	mov	[DestinationFile_DirEntry+DirEntry_FileSize], edx
  4543 0000BEC8 EB58                <1> 	jmp	short csftdf2_save_fat_file_err3
  4544                              <1> 
  4545                              <1> csftdf2_save_fat_file_5:
  4546 0000BECA A1[6C840100]        <1> 	mov	eax, [csftdf_df_cluster]
  4547                              <1> 
  4548                              <1> 	; EAX = First cluster to be truncated/unlinked
  4549                              <1> 	; ESI = Logical dos drive description table address
  4550 0000BECF E8CB0B0000          <1> 	call	truncate_cluster_chain
  4551                              <1> 
  4552                              <1> csftdf2_save_fat_file_6:
  4553                              <1> 	; 28/03/2016
  4554 0000BED4 BE[8D830100]        <1> 	mov	esi, SourceFile_DirEntry+DirEntry_Attr ; +11 to + 18
  4555 0000BED9 BF[0D840100]        <1> 	mov	edi, DestinationFile_DirEntry+DirEntry_Attr ; +11 to + 18
  4556 0000BEDE A4                  <1> 	movsb ; +11
  4557 0000BEDF A5                  <1> 	movsd ; +12 .. +15
  4558 0000BEE0 66A5                <1> 	movsw ; +16 .. +17
  4559                              <1> 		; + 18
  4560 0000BEE2 83C604              <1> 	add	esi, 4
  4561 0000BEE5 83C704              <1> 	add	edi, 4
  4562 0000BEE8 A5                  <1> 	movsd	; DirEntry_WrtTime ; +22 .. +25
  4563                              <1> 
  4564 0000BEE9 8B15[5C840100]      <1> 	mov	edx, [csftdf_filesize]
  4565 0000BEEF 8915[1E840100]      <1> 	mov	[DestinationFile_DirEntry+DirEntry_FileSize], edx
  4566                              <1> 
  4567 0000BEF5 E8E9F0FFFF          <1> 	call	convert_current_date_time
  4568                              <1> 	; DX = Date in dos dir entry format
  4569                              <1> 	; AX = Time in dos dir entry format
  4570 0000BEFA EB4D                <1> 	jmp	short csftdf2_save_fat_file_7
  4571                              <1> 
  4572                              <1> csftdf2_save_fat_file_err1:
  4573 0000BEFC 5B                  <1> 	pop	ebx ; *	
  4574                              <1> csftdf2_save_fat_file_err2:
  4575 0000BEFD A1[7C840100]        <1> 	mov	eax, [csftdf_df_wbytes]
  4576 0000BF02 8B15[1E840100]      <1> 	mov	edx, [DestinationFile_DirEntry+DirEntry_FileSize]
  4577 0000BF08 39C2                <1> 	cmp	edx, eax
  4578 0000BF0A 7616                <1> 	jna	short csftdf2_save_fat_file_err3
  4579 0000BF0C A1[6C840100]        <1> 	mov	eax, [csftdf_df_cluster] ; last (empty) cluster
  4580                              <1> 	; ESI = Logical dos drive description table address
  4581 0000BF11 E8890B0000          <1> 	call	truncate_cluster_chain
  4582 0000BF16 720A                <1> 	jc	short csftdf2_save_fat_file_err3
  4583 0000BF18 A1[7C840100]        <1> 	mov	eax, [csftdf_df_wbytes]	
  4584 0000BF1D A3[1E840100]        <1> 	mov	[DestinationFile_DirEntry+DirEntry_FileSize], eax
  4585                              <1> csftdf2_save_fat_file_err3:
  4586 0000BF22 E8BCF0FFFF          <1> 	call	convert_current_date_time
  4587                              <1> 	; DX = Date in dos dir entry format
  4588                              <1> 	; AX = Time in dos dir entry format
  4589 0000BF27 C605[0F840100]00    <1> 	mov	byte [DestinationFile_DirEntry+DirEntry_CrtTimeTenth], 0
  4590 0000BF2E 66A3[10840100]      <1> 	mov	[DestinationFile_DirEntry+DirEntry_CrtTime], ax
  4591 0000BF34 668915[12840100]    <1> 	mov	[DestinationFile_DirEntry+DirEntry_CrtDate], dx		
  4592 0000BF3B 66A3[18840100]      <1> 	mov	[DestinationFile_DirEntry+DirEntry_WrtTime], ax
  4593 0000BF41 668915[1A840100]    <1> 	mov	[DestinationFile_DirEntry+DirEntry_WrtDate], dx
  4594 0000BF48 F9                  <1> 	stc
  4595                              <1> csftdf2_save_fat_file_7:
  4596 0000BF49 9C                  <1> 	pushf
  4597 0000BF4A 668915[14840100]    <1> 	mov	[DestinationFile_DirEntry+DirEntry_LastAccDate], dx
  4598 0000BF51 BE[02840100]        <1> 	mov	esi, DestinationFile_DirEntry
  4599 0000BF56 BF00000800          <1> 	mov	edi, Directory_Buffer
  4600 0000BF5B 0FB70D[2A840100]    <1> 	movzx	ecx, word [DestinationFile_DirEntryNumber] ; (<2048)
  4601                              <1> 	;shl	cx, 5 ; 32 * directory entry number
  4602                              <1> 	; 29/07/2022
  4603 0000BF62 C1E105              <1> 	shl	ecx, 5
  4604 0000BF65 01CF                <1> 	add	edi, ecx
  4605                              <1> 	;mov	ecx, 8
  4606                              <1> 	;mov	cx, 8
  4607                              <1> 	; 29/07/2022
  4608                              <1> 	;sub	ecx, ecx
  4609 0000BF67 28ED                <1> 	sub	ch, ch
  4610 0000BF69 B108                <1> 	mov	cl, 8
  4611 0000BF6B F3A5                <1> 	rep	movsd
  4612 0000BF6D 9D                  <1> 	popf
  4613 0000BF6E 730B                <1> 	jnc	short csftdf2_write_file_OK
  4614                              <1> 	 		
  4615                              <1> csftdf2_write_error:
  4616                              <1> 	; 18/03/2016
  4617 0000BF70 B01D                <1> 	mov	al, 1Dh ; write error
  4618 0000BF72 EB02                <1> 	jmp	short csftdf2_rw_error
  4619                              <1> 
  4620                              <1> 	; 16/03/2016
  4621                              <1> csftdf2_read_error:
  4622 0000BF74 B011                <1> 	mov	al, 17 ; ; Drive not ready or read error!
  4623                              <1> csftdf2_rw_error:
  4624 0000BF76 A2[59840100]        <1> 	mov	[csftdf_rw_err], al 
  4625                              <1> 
  4626                              <1> csftdf2_write_file_OK:
  4627                              <1> 	; 18/03/2016
  4628 0000BF7B C605[71800100]02    <1> 	mov	byte [DirBuff_ValidData], 2
  4629 0000BF82 E8F1F0FFFF          <1> 	call	save_directory_buffer
  4630                              <1> 
  4631                              <1>  	; Update last modification date&time of destination
  4632                              <1> 	; file's (parent) directory
  4633 0000BF87 E884F1FFFF          <1> 	call	update_parent_dir_lmdt
  4634                              <1> 	;
  4635 0000BF8C A1[60840100]        <1> 	mov	eax, [csftdf_sf_mem_addr] ; start address
  4636                              <1> 
  4637 0000BF91 21C0                <1> 	and	eax, eax
  4638 0000BF93 750E                <1> 	jnz	short csftdf2_dealloc_mblock
  4639                              <1> 
  4640 0000BF95 88C5                <1> 	mov	ch, al ; 0 (Cluster r/w, not full loading)
  4641                              <1> csftdf2_dealloc_retn:
  4642 0000BF97 8A0D[59840100]      <1> 	mov	cl, [csftdf_rw_err]
  4643 0000BF9D A1[6C840100]        <1> 	mov	eax, [csftdf_df_cluster]
  4644 0000BFA2 C3                  <1> 	retn
  4645                              <1> 
  4646                              <1> csftdf2_dealloc_mblock:
  4647 0000BFA3 8B0D[64840100]      <1> 	mov	ecx, [csftdf_sf_mem_bsize] ; block size	
  4648 0000BFA9 E83D9FFFFF          <1> 	call	deallocate_memory_block
  4649 0000BFAE B5FF                <1>         mov     ch, 0FFh ; (File was full loaded at memory)
  4650 0000BFB0 EBE5                <1> 	jmp	short csftdf2_dealloc_retn
  4651                              <1> 
  4652                              <1> csftdf2_save_fs_file:
  4653                              <1> 	; 16/10/2016 (1Dh -> 18)
  4654                              <1> 	; temporary - (21/03/2016)
  4655                              <1> 	;mov	eax, 18 ; write error
  4656                              <1> 	; 29/07/2022
  4657 0000BFB2 31C0                <1> 	xor	eax, eax
  4658 0000BFB4 B012                <1> 	mov	al, 18
  4659 0000BFB6 F9                  <1> 	stc
  4660 0000BFB7 C3                  <1> 	retn
  4661                              <1> 
  4662                              <1> create_file:
  4663                              <1> 	; 30/07/2022
  4664                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  4665                              <1> 	; 16/10/2016
  4666                              <1> 	; 24/03/2016, 31/03/2016
  4667                              <1> 	; 20/03/2016, 21/03/2016, 23/03/2016
  4668                              <1> 	; 19/03/2016 (TRDOS 396 = TRDOS v2.0)
  4669                              <1> 	; 03/09/2011 (FILE.ASM, 'proc_create_file')
  4670                              <1> 	; 09/08/2010
  4671                              <1> 	;
  4672                              <1> 	; INPUT ->
  4673                              <1> 	; 	EAX = File Size
  4674                              <1> 	; 	ESI = ASCIIZ File Name
  4675                              <1> 	; 	CL = File Attributes 
  4676                              <1> 	;	EBX = FFFFFFFFh -> create empty file 
  4677                              <1> 	;			 (only for FAT fs) 
  4678                              <1> 	; OUTPUT ->
  4679                              <1> 	;     CF = 0 ->
  4680                              <1> 	;	EAX = New file's first cluster
  4681                              <1> 	; 	ESI = Logical Dos Drv Descr. Table Addr.
  4682                              <1> 	; 	EBX = offset CreateFile_Size
  4683                              <1> 	; 	ECX = Sectors per cluster (<256) 
  4684                              <1> 	; 	EDX = Directory entry index/number (<65536)
  4685                              <1> 	;     CF = 1 -> error code in AL
  4686                              <1> 
  4687                              <1> ;	test	cl, 18h (directory or volume name)
  4688                              <1> ;	jnz	short loc_createfile_access_denied
  4689 0000BFB8 80E107              <1> 	and	cl, 07h ; S, H, R
  4690 0000BFBB 880D[A8840100]      <1>         mov     [createfile_attrib], cl 
  4691                              <1> 
  4692 0000BFC1 89D9                <1> 	mov	ecx, ebx
  4693 0000BFC3 89F3                <1> 	mov	ebx, esi ; ASCIIZ File Name address
  4694 0000BFC5 29D2                <1> 	sub	edx, edx
  4695 0000BFC7 8A35[4A790100]      <1>         mov     dh, [Current_Drv]
  4696 0000BFCD BE00010900          <1>         mov     esi, Logical_DOSDisks
  4697 0000BFD2 01D6                <1> 	add	esi, edx
  4698                              <1> 
  4699 0000BFD4 8815[B3840100]      <1> 	mov	[createfile_UpdatePDir], dl ; 0 ; 31/03/2016 
  4700                              <1> 
  4701                              <1> 	; LD_DiskType = 0 for write protection (read only) 
  4702 0000BFDA 807E0101            <1> 	cmp	byte [esi+LD_DiskType], 1 ; 0 = Invalid
  4703 0000BFDE 7308                <1> 	jnb	short loc_createfile_check_file_sytem
  4704                              <1> 	; 16/10/2016 (TRDOS Error code: 30, disk write protected) 
  4705                              <1> 	;mov	eax, 30 ; 13h, MSDOS err : Disk write-protected 
  4706                              <1> 	;mov	dx, 0
  4707                              <1> 	; 29/07/2022
  4708 0000BFE0 31D2                <1> 	xor	edx, edx ; 0
  4709 0000BFE2 31C0                <1> 	xor	eax, eax ; 0
  4710 0000BFE4 B01E                <1> 	mov	al, 30	
  4711 0000BFE6 F9                  <1> 	stc
  4712                              <1> 	; err retn: EDX = 0, EBX = File name offset
  4713                              <1> 	; ESI -> Dos drive description table address	
  4714 0000BFE7 C3                  <1> 	retn
  4715                              <1> 
  4716                              <1> ;loc_createfile_access_denied:
  4717                              <1> ;	mov	eax, 05h ; access denied (invalid attributes input)
  4718                              <1> ;	stc
  4719                              <1> ;	retn
  4720                              <1> 
  4721                              <1> loc_createfile_check_file_sytem:
  4722 0000BFE8 807E0301            <1> 	cmp	byte [esi+LD_FATType], 1
  4723 0000BFEC 730A                <1> 	jnb	short loc_createfile_chk_empty_FAT_file_sign1
  4724                              <1> 
  4725 0000BFEE A3[94840100]        <1> 	mov	[createfile_size], eax
  4726                              <1> 	; ESI = Logical Dos Drive Description Table address
  4727                              <1> 	; EBX = ASCIIZ File Name address
  4728 0000BFF3 E9F6020000          <1> 	jmp	create_fs_file
  4729                              <1> 
  4730                              <1> loc_createfile_chk_empty_FAT_file_sign1:
  4731                              <1> 	; ECX = FFFFFFFFh -> create empty file if drive has FAT fs
  4732 0000BFF8 41                  <1> 	inc	ecx
  4733 0000BFF9 7506                <1> 	jnz	short loc_createfile_chk_empty_FAT_file_sign2
  4734 0000BFFB 890D[94840100]      <1> 	mov	[createfile_size], ecx ; 0 ; empty file
  4735                              <1> 
  4736                              <1> loc_createfile_chk_empty_FAT_file_sign2:
  4737                              <1> 	; 23/03/2016
  4738 0000C001 668B4E11            <1> 	mov	cx, [esi+LD_BPB+BytesPerSec]
  4739 0000C005 66890D[B0840100]    <1> 	mov	[createfile_BytesPerSec], cx
  4740                              <1> 	
  4741                              <1> 	; EBX = ASCIIZ File Name address
  4742 0000C00C 0FB65613            <1> 	movzx	edx, byte [esi+LD_BPB+SecPerClust]
  4743 0000C010 8815[A9840100]      <1> 	mov	[createfile_SecPerClust], dl
  4744 0000C016 8B4E74              <1> 	mov	ecx, [esi+LD_FreeSectors]
  4745 0000C019 39D1                <1> 	cmp	ecx, edx ; byte [createfile_SecPerClust]
  4746 0000C01B 7306                <1> 	jnb	short loc_create_fat_file
  4747                              <1> 	  
  4748                              <1> loc_createfile_insufficient_disk_space:
  4749 0000C01D B827000000          <1> 	mov	eax, 27h
  4750                              <1> loc_createfile_gffc_retn:
  4751 0000C022 C3                  <1> 	retn
  4752                              <1> 
  4753                              <1> loc_create_fat_file:
  4754 0000C023 891D[8C840100]      <1> 	mov	[createfile_Name_Offset], ebx
  4755 0000C029 890D[90840100]      <1> 	mov	[createfile_FreeSectors], ecx
  4756                              <1> 
  4757                              <1> loc_createfile_gffc_1:
  4758 0000C02F E8DD040000          <1> 	call	get_first_free_cluster
  4759 0000C034 72EC                <1> 	jc	short loc_createfile_gffc_retn
  4760                              <1> 
  4761 0000C036 A3[98840100]        <1> 	mov	[createfile_FFCluster], eax
  4762                              <1> 
  4763                              <1> loc_createfile_locate_ffe_on_directory:
  4764                              <1> 	; Current directory fcluster <> Directory buffer cluster
  4765                              <1> 	; Current directory will be reloaded by
  4766                              <1> 	; 'locate_current_dir_file' procedure
  4767                              <1> 	;
  4768                              <1> 	; ESI = Logical Dos Drv Desc. Table Adress
  4769 0000C03B 56                  <1> 	push	esi ; *
  4770 0000C03C 31C0                <1> 	xor	eax, eax
  4771                              <1> 
  4772 0000C03E A3[66800100]        <1> 	mov	dword [FAT_ClusterCounter], eax ; 0
  4773                              <1> 	; 21/03/2016
  4774 0000C043 A2[B2840100]        <1> 	mov	byte [createfile_wfc], al ; 0 
  4775                              <1> 
  4776 0000C048 89C1                <1>  	mov	ecx, eax
  4777 0000C04A 6649                <1> 	dec	cx ; FFFFh  
  4778                              <1> 	; CX = FFFFh -> find first deleted or free entry
  4779                              <1> 	; ESI would be ASCIIZ filename address if the call
  4780                              <1> 	; would not be for first free or deleted dir entry  
  4781 0000C04C E852E8FFFF          <1> 	call	locate_current_dir_file
  4782                              <1> 	;jnc	loc_createfile_set_ff_dir_entry
  4783                              <1> 	; 29/07/2022
  4784 0000C051 7205                <1> 	jc	short loc_createfile_locate_file_err
  4785 0000C053 E9EC000000          <1> 	jmp	loc_createfile_set_ff_dir_entry	
  4786                              <1> 
  4787                              <1> loc_createfile_locate_file_err: ; 29/07/2022
  4788 0000C058 5E                  <1> 	pop	esi ; *
  4789                              <1> 	 ; ESI = Logical DOS Drv. Description Table Address 
  4790 0000C059 83F802              <1> 	cmp	eax, 2
  4791 0000C05C 7402                <1> 	je	short loc_createfile_add_new_cluster
  4792                              <1> loc_createfile_locate_file_stc_retn:
  4793 0000C05E F9                  <1> 	stc
  4794 0000C05F C3                  <1> 	retn
  4795                              <1> 
  4796                              <1> loc_createfile_add_new_cluster:
  4797 0000C060 803D[49790100]02    <1> 	cmp	byte [Current_FATType], 2
  4798                              <1> 	;cmp	byte [esi+LD_FATType], 2
  4799 0000C067 770C                <1> 	ja	short loc_createfile_add_new_cluster_check_fsc
  4800 0000C069 803D[48790100]01    <1> 	cmp	byte [Current_Dir_Level], 1
  4801                              <1> 	;cmp	byte [esi+LD_CDirLevel], 1
  4802 0000C070 7303                <1> 	jnb	short loc_createfile_add_new_cluster_check_fsc
  4803                              <1> 	
  4804                              <1> 	;mov	eax, 12
  4805 0000C072 B00C                <1> 	mov	al, 12 ; No more files 
  4806                              <1> 
  4807                              <1> loc_createfile_anc_retn:
  4808 0000C074 C3                  <1> 	retn
  4809                              <1> 
  4810                              <1> loc_createfile_add_new_cluster_check_fsc:
  4811 0000C075 8B0D[90840100]      <1> 	mov	ecx, [createfile_FreeSectors]
  4812 0000C07B 0FB605[A9840100]    <1> 	movzx	eax, byte [createfile_SecPerClust]
  4813                              <1> 	;shl	ax, 1 ; AX = 2 * AX
  4814                              <1> 	; 29/07/2022
  4815 0000C082 D1E0                <1> 	shl	eax, 1
  4816 0000C084 39C1                <1> 	cmp	ecx, eax
  4817 0000C086 7295                <1>         jb	short loc_createfile_insufficient_disk_space
  4818                              <1> 
  4819                              <1> loc_createfile_add_new_subdir_cluster:
  4820 0000C088 8B15[76800100]      <1> 	mov	edx, [DirBuff_Cluster]
  4821 0000C08E 8915[9C840100]      <1> 	mov	[createfile_LastDirCluster], edx	
  4822                              <1> 
  4823 0000C094 A1[98840100]        <1> 	mov	eax, [createfile_FFCluster]
  4824 0000C099 E80D040000          <1> 	call	load_FAT_sub_directory 
  4825 0000C09E 72D4                <1> 	jc	short loc_createfile_anc_retn
  4826                              <1> 
  4827                              <1> pass_createfile_add_new_subdir_cluster:
  4828                              <1> 	;movzx	eax, word [esi+LD_BPB+BytesPerSec]
  4829 0000C0A0 0FB705[B0840100]    <1> 	movzx	eax, word [createfile_BytesPerSec] ; 23/03/2016
  4830 0000C0A7 F7E1                <1> 	mul	ecx ; ecx = directory buffer sector count
  4831 0000C0A9 89C1                <1> 	mov	ecx, eax
  4832 0000C0AB C1E902              <1> 	shr	ecx, 2 ; dword count
  4833 0000C0AE 29C0                <1> 	sub	eax, eax ; 0
  4834 0000C0B0 F3AB                <1> 	rep	stosd 
  4835                              <1> 	;
  4836 0000C0B2 C605[71800100]02    <1> 	mov	byte [DirBuff_ValidData], 2 
  4837 0000C0B9 E8BAEFFFFF          <1> 	call	save_directory_buffer
  4838 0000C0BE 72B4                <1> 	jc	short loc_createfile_anc_retn
  4839                              <1> 
  4840                              <1> loc_createfile_save_added_subdir_cluster:
  4841 0000C0C0 A1[9C840100]        <1> 	mov	eax, [createfile_LastDirCluster]
  4842 0000C0C5 8B0D[98840100]      <1> 	mov	ecx, [createfile_FFCluster]
  4843 0000C0CB E80E050000          <1> 	call	update_cluster
  4844 0000C0D0 7304                <1> 	jnc	short loc_createfile_save_fat_buffer_0
  4845 0000C0D2 09C0                <1> 	or	eax, eax ; EAX = 0 -> cluster value is 0 or eocc
  4846 0000C0D4 751A                <1> 	jnz	short loc_createfile_save_fat_buffer_stc_retn
  4847                              <1> 
  4848                              <1> loc_createfile_save_fat_buffer_0:
  4849 0000C0D6 A1[98840100]        <1> 	mov	eax, [createfile_FFCluster]
  4850 0000C0DB A3[9C840100]        <1> 	mov	[createfile_LastDirCluster], eax
  4851 0000C0E0 B9FFFFFF0F          <1> 	mov	ecx, 0FFFFFFFh ; 28 bit
  4852 0000C0E5 E8F4040000          <1> 	call	update_cluster
  4853 0000C0EA 7306                <1> 	jnc	short loc_createfile_save_fat_buffer_1
  4854 0000C0EC 09C0                <1> 	or	eax, eax ; Was it free cluster
  4855 0000C0EE 7402                <1> 	jz	short loc_createfile_save_fat_buffer_1
  4856                              <1> 
  4857                              <1> loc_createfile_save_fat_buffer_stc_retn:
  4858 0000C0F0 F9                  <1> 	stc
  4859                              <1> loc_createfile_save_fat_buffer_retn:
  4860                              <1> loc_createfile_gffc_2_stc_retn:
  4861 0000C0F1 C3                  <1> 	retn
  4862                              <1> 
  4863                              <1> loc_createfile_save_fat_buffer_1:
  4864                              <1> 	; byte [FAT_BuffValidData] = 2 
  4865 0000C0F2 E86A070000          <1> 	call	save_fat_buffer
  4866 0000C0F7 72F8                <1> 	jc	short loc_createfile_save_fat_buffer_retn
  4867                              <1> 
  4868 0000C0F9 803D[66800100]01    <1> 	cmp	byte [FAT_ClusterCounter], 1
  4869 0000C100 7222                <1> 	jb	short loc_createfile_save_fat_buffer_2
  4870                              <1> 
  4871                              <1> 	; ESI = Logical DOS Drive Description Table address 
  4872 0000C102 A1[66800100]        <1> 	mov	eax, [FAT_ClusterCounter]
  4873                              <1> 
  4874 0000C107 C605[66800100]00    <1> 	mov	byte [FAT_ClusterCounter], 0 ; 21/03/2016
  4875                              <1> 
  4876 0000C10E 66BB01FF            <1> 	mov	bx, 0FF01h ; add free clusters 
  4877 0000C112 E8DB070000          <1> 	call	calculate_fat_freespace
  4878                              <1> 
  4879                              <1> 	;inc	eax ; 0FFFFFFFFh -> 0 ; recalculation is needed!
  4880                              <1> 	;jnz	short loc_createfile_save_fat_buffer_2
  4881                              <1> 
  4882                              <1> 	; ecx > 0 -> Recalculation is needed
  4883 0000C117 09C9                <1> 	or	ecx, ecx 
  4884 0000C119 7409                <1> 	jz	short loc_createfile_save_fat_buffer_2
  4885                              <1> 
  4886 0000C11B 66BB00FF            <1> 	mov	bx, 0FF00h ; ; recalculate free space
  4887 0000C11F E8CE070000          <1> 	call	calculate_fat_freespace
  4888                              <1> 
  4889                              <1> loc_createfile_save_fat_buffer_2:
  4890                              <1> 	;call	update_parent_dir_lmdt
  4891                              <1> 
  4892                              <1> loc_createfile_gffc_2:
  4893 0000C124 E8E8030000          <1> 	call	get_first_free_cluster
  4894 0000C129 72C6                <1> 	jc	short loc_createfile_gffc_2_stc_retn
  4895                              <1> 
  4896 0000C12B A3[98840100]        <1> 	mov	[createfile_FFCluster], eax
  4897                              <1> 
  4898 0000C130 A1[9C840100]        <1> 	mov	eax, [createfile_LastDirCluster]
  4899                              <1> 	
  4900 0000C135 E871030000          <1> 	call	load_FAT_sub_directory 
  4901 0000C13A 72B5                <1> 	jc	short loc_createfile_gffc_2_stc_retn
  4902                              <1> 
  4903 0000C13C BF00000800          <1> 	mov	edi, Directory_Buffer
  4904                              <1> 
  4905                              <1> 	;sub	bx, bx ; directory entry index/number = 0
  4906                              <1> 	; 29/07/2022
  4907 0000C141 29C9                <1> 	sub	ecx, ecx
  4908                              <1> 
  4909 0000C143 56                  <1> 	push	esi ; * ; 23/03/2016
  4910                              <1> 
  4911                              <1> loc_createfile_set_ff_dir_entry:
  4912                              <1> 	;mov	[createfile_DirIndex], bx
  4913                              <1> 	; 29/07/2022
  4914 0000C144 66890D[AA840100]    <1> 	mov	[createfile_DirIndex], cx ; 0
  4915                              <1> 
  4916                              <1>         ; EDI = Directory entry address
  4917 0000C14B 8B35[8C840100]      <1> 	mov	esi, [createfile_Name_Offset]
  4918 0000C151 A1[98840100]        <1> 	mov	eax, [createfile_FFCluster]
  4919 0000C156 A3[A0840100]        <1> 	mov	[createfile_Cluster], eax ; 24/03/2016
  4920                              <1> 	;mov	ch, 0FFh
  4921                              <1>         ; 29/07/2022
  4922                              <1> 	; ecx = 0
  4923 0000C15B FECD                <1> 	dec	ch ; 0 -> 0FFh
  4924 0000C15D 8A0D[A8840100]      <1> 	mov	cl, [createfile_attrib] ; file attributes
  4925                              <1> 	; CH > 0 -> File size is in [EBX]
  4926 0000C163 BB[94840100]        <1> 	mov	ebx, createfile_size
  4927                              <1>   
  4928 0000C168 E838EEFFFF          <1> 	call	make_directory_entry
  4929                              <1> 	
  4930 0000C16D 5E                  <1> 	pop	esi ; * ; ESI = Logical Dos Drv Desc. Table address
  4931                              <1> 
  4932 0000C16E C605[71800100]02    <1> 	mov	byte [DirBuff_ValidData], 2 
  4933 0000C175 E8FEEEFFFF          <1> 	call	save_directory_buffer
  4934 0000C17A 7221                <1> 	jc	short loc_createfile_set_ff_dir_entry_retn
  4935                              <1> 
  4936 0000C17C C605[B3840100]01    <1> 	mov	byte [createfile_UpdatePDir], 1 ; 31/03/2016 
  4937                              <1> 
  4938                              <1> loc_createfile_get_set_write_file_cluster:
  4939 0000C183 A1[94840100]        <1> 	mov	eax, [createfile_size]
  4940 0000C188 09C0                <1> 	or	eax, eax
  4941 0000C18A 756B                <1> 	jnz	short loc_createfile_get_set_wfc_cont
  4942 0000C18C 40                  <1> 	inc	eax
  4943                              <1> 	; 23/03/2016
  4944 0000C18D 0FB61D[A9840100]    <1> 	movzx	ebx, byte [createfile_SecPerClust]
  4945                              <1> 	;movzx	ecx, word [esi+LD_BPB+BytesPerSec] ; 512
  4946 0000C194 0FB70D[B0840100]    <1>         movzx   ecx, word [createfile_BytesPerSec] ; 512
  4947 0000C19B EB77                <1> 	jmp	loc_createfile_set_cluster_count 
  4948                              <1> 
  4949                              <1> loc_createfile_set_ff_dir_entry_retn:
  4950 0000C19D C3                  <1> 	retn
  4951                              <1> 
  4952                              <1> loc_createfile_write_fcluster_to_disk:
  4953 0000C19E 034668              <1> 	add	eax, [esi+LD_DATABegin] ; convert to physical address
  4954 0000C1A1 BB00000700          <1> 	mov	ebx, Cluster_Buffer
  4955                              <1> 	; ESI = Logical DOS Drv. Desc. Tbl. address
  4956                              <1> 	; EAX = Disk address
  4957                              <1> 	; EBX = Sector Buffer
  4958                              <1> 	; ECX = sectors per cluster
  4959 0000C1A6 E8D35C0000          <1> 	call	disk_write
  4960 0000C1AB 7211                <1> 	jc	short loc_createfile_dsk_wr_err
  4961                              <1> 
  4962                              <1> loc_createfile_update_fat_cluster:
  4963                              <1> 	; 21/03/2016	
  4964 0000C1AD 803D[B2840100]00    <1> 	cmp	byte [createfile_wfc], 0 
  4965 0000C1B4 7711                <1> 	ja	short loc_createfile_update_fat_cluster_n1
  4966                              <1> 
  4967 0000C1B6 FE05[B2840100]      <1> 	inc	byte [createfile_wfc] ; 1
  4968 0000C1BC EB1F                <1> 	jmp	short loc_createfile_update_fat_cluster_n2
  4969                              <1> 
  4970                              <1> loc_createfile_dsk_wr_err:
  4971                              <1> 	; 16/10/2016 (1Dh -> 18)
  4972                              <1> 	; 23/03/2016
  4973                              <1> 	;mov	eax, 18 ; Drive not ready or write error !
  4974                              <1> 	; 29/07/2022
  4975 0000C1BE 29C0                <1> 	sub	eax, eax
  4976 0000C1C0 B012                <1> 	mov	al, 18
  4977                              <1> loc_cf_stc_retn:
  4978 0000C1C2 E9B7000000          <1> 	jmp	loc_createfile_stc_retn
  4979                              <1> 
  4980                              <1> loc_createfile_update_fat_cluster_n1:
  4981 0000C1C7 A1[A4840100]        <1> 	mov	eax, [createfile_PCluster]
  4982 0000C1CC 8B0D[A0840100]      <1> 	mov	ecx, [createfile_Cluster]
  4983 0000C1D2 E807040000          <1> 	call	update_cluster
  4984 0000C1D7 7304                <1> 	jnc	short loc_createfile_update_fat_cluster_n2
  4985 0000C1D9 09C0                <1> 	or	eax, eax ; EAX = 0 -> cluster value is 0 or eocc
  4986                              <1> 	;jnz	loc_createfile_stc_retn
  4987                              <1> 	; 29/07/2022
  4988 0000C1DB 75E5                <1> 	jnz	short loc_cf_stc_retn
  4989                              <1> 
  4990                              <1> loc_createfile_update_fat_cluster_n2:
  4991 0000C1DD A1[A0840100]        <1>         mov	eax, [createfile_Cluster]
  4992 0000C1E2 B9FFFFFF0F          <1> 	mov	ecx, 0FFFFFFFh
  4993 0000C1E7 E8F2030000          <1> 	call	update_cluster
  4994 0000C1EC 734D                <1> 	jnc	short loc_createfile_save_fat_buffer_3
  4995 0000C1EE 09C0                <1> 	or	eax, eax ; EAX = 0 -> cluster value is 0 or eocc
  4996 0000C1F0 7449                <1> 	jz	short loc_createfile_save_fat_buffer_3
  4997                              <1> 
  4998                              <1> loc_cf_upd_fat_fcluster_stc_retn:
  4999 0000C1F2 E987000000          <1> 	jmp	loc_createfile_stc_retn
  5000                              <1> 
  5001                              <1> loc_createfile_get_set_wfc_cont:
  5002                              <1> 	;movzx	ecx, word [esi+LD_BPB+BytesPerSec] ; 512	
  5003 0000C1F7 0FB70D[B0840100]    <1> 	movzx	ecx, word [createfile_BytesPerSec] ; 512
  5004 0000C1FE 01C8                <1> 	add	eax, ecx
  5005 0000C200 48                  <1> 	dec	eax  ; add eax, 511
  5006 0000C201 29D2                <1> 	sub	edx, edx
  5007 0000C203 F7F1                <1> 	div	ecx
  5008 0000C205 0FB61D[A9840100]    <1> 	movzx	ebx, byte [createfile_SecPerClust]
  5009 0000C20C 01D8                <1> 	add	eax, ebx
  5010 0000C20E 48                  <1> 	dec	eax  ; add eax, SecPerClust - 1
  5011 0000C20F 6631D2              <1> 	xor	dx, dx
  5012 0000C212 F7F3                <1> 	div	ebx
  5013                              <1> 
  5014                              <1> loc_createfile_set_cluster_count:
  5015 0000C214 A3[AC840100]        <1> 	mov 	[createfile_CCount], eax
  5016                              <1> 	
  5017 0000C219 BF00000700          <1> 	mov	edi, Cluster_Buffer
  5018 0000C21E 89C8                <1> 	mov	eax, ecx ; Bytes per Sector
  5019 0000C220 F7E3                <1> 	mul	ebx ; Sectors per Cluster 
  5020                              <1> 	; EAX = Bytes per Cluster
  5021 0000C222 89C1                <1> 	mov	ecx, eax
  5022 0000C224 C1E902              <1> 	shr	ecx, 2 ; dword count
  5023 0000C227 31C0                <1> 	xor	eax, eax
  5024 0000C229 F3AB                <1> 	rep	stosd ; clear cluster buffer
  5025                              <1> 
  5026 0000C22B A1[A0840100]        <1> 	mov	eax, [createfile_Cluster] ; 24/03/2016
  5027                              <1> 
  5028 0000C230 89D9                <1> 	mov	ecx, ebx
  5029                              <1> 
  5030                              <1> loc_createfile_get_set_wf_fclust_cont:
  5031                              <1> 	;sub	eax, 2
  5032                              <1> 	; 30/07/2022
  5033 0000C232 48                  <1> 	dec	eax
  5034 0000C233 48                  <1> 	dec	eax
  5035 0000C234 F7E1                <1> 	mul	ecx
  5036                              <1> 	; EAX = Logical DOS disk address (offset)
  5037 0000C236 E963FFFFFF          <1>         jmp     loc_createfile_write_fcluster_to_disk
  5038                              <1> 
  5039                              <1> loc_createfile_save_fat_buffer_3:
  5040                              <1> 	; byte [FAT_BuffValidData] = 2
  5041 0000C23B E821060000          <1> 	call	save_fat_buffer
  5042                              <1> 	;jc	loc_createfile_stc_retn
  5043                              <1> 	; 29/07/2022
  5044 0000C240 72B0                <1> 	jc	short loc_cf_upd_fat_fcluster_stc_retn
  5045                              <1> 
  5046                              <1> 	; 21/03/2016
  5047 0000C242 803D[66800100]01    <1> 	cmp	byte [FAT_ClusterCounter], 1
  5048 0000C249 721B                <1> 	jb	short loc_createfile_save_fat_buffer_4
  5049                              <1> 
  5050                              <1> 	; ESI = Logical DOS Drive Description Table address 
  5051 0000C24B A1[66800100]        <1> 	mov	eax, [FAT_ClusterCounter]
  5052 0000C250 66BB01FF            <1> 	mov	bx, 0FF01h ; add free clusters 
  5053 0000C254 E899060000          <1> 	call	calculate_fat_freespace
  5054                              <1> 
  5055                              <1> 	;inc	eax ; 0FFFFFFFFh -> 0 ; recalculation is needed!
  5056                              <1> 	;jnz	short loc_createfile_save_fat_buffer_4
  5057                              <1> 
  5058                              <1> 	; ecx > 0 -> Recalculation is needed
  5059 0000C259 09C9                <1> 	or	ecx, ecx 
  5060 0000C25B 7409                <1> 	jz	short loc_createfile_save_fat_buffer_4
  5061                              <1> 
  5062 0000C25D 66BB00FF            <1> 	mov	bx, 0FF00h ; ; recalculate free space
  5063 0000C261 E88C060000          <1> 	call	calculate_fat_freespace
  5064                              <1> 
  5065                              <1> loc_createfile_save_fat_buffer_4:
  5066 0000C266 FF0D[AC840100]      <1> 	dec	dword [createfile_CCount]
  5067                              <1> 	;jz	short loc_createfile_upd_dir_modif_date_time
  5068 0000C26C 743E                <1> 	jz	short loc_createfile_stc_retn_cc ; 31/03/2016
  5069                              <1> 
  5070                              <1> loc_createfile_get_set_write_next_cluster:
  5071 0000C26E E89E020000          <1> 	call	get_first_free_cluster
  5072 0000C273 7209                <1> 	jc	short loc_createfile_stc_retn
  5073                              <1> 
  5074                              <1> loc_createfile_get_set_write_next_cluster_1:
  5075 0000C275 83F8FF              <1> 	cmp	eax, 0FFFFFFFFh
  5076 0000C278 7212                <1> 	jb	short loc_createfile_get_set_write_next_cluster_2
  5077                              <1> 
  5078                              <1> loc_createfile_wnc_insufficient_disk_space:	
  5079                              <1> 	;mov	eax, 27h ; Insufficient disk space
  5080                              <1> 	; 29/07/2022
  5081 0000C27A 31C0                <1> 	xor	eax, eax
  5082 0000C27C B027                <1> 	mov	al, 27h
  5083                              <1> 
  5084                              <1> loc_createfile_stc_retn:
  5085 0000C27E 803D[B2840100]01    <1> 	cmp	byte [createfile_wfc], 1
  5086 0000C285 7324                <1> 	jnb	short loc_createfile_err_retn
  5087 0000C287 C3                  <1> 	retn
  5088                              <1> 
  5089                              <1> loc_createfile_wnc_inv_format_retn:
  5090                              <1> 	;mov	eax, 28
  5091 0000C288 B01C                <1> 	mov	al, 28 ; Invalid format
  5092 0000C28A EBF2                <1> 	jmp	short loc_createfile_stc_retn
  5093                              <1> 	         
  5094                              <1> loc_createfile_get_set_write_next_cluster_2:
  5095 0000C28C 83F802              <1> 	cmp	eax, 2
  5096 0000C28F 72F7                <1> 	jb	short loc_createfile_wnc_inv_format_retn
  5097                              <1> 
  5098                              <1> loc_createfile_get_set_write_next_cluster_3:
  5099 0000C291 8B0D[A0840100]      <1> 	mov	ecx, [createfile_Cluster]
  5100 0000C297 A3[A0840100]        <1> 	mov	[createfile_Cluster], eax
  5101 0000C29C 890D[A4840100]      <1> 	mov	[createfile_PCluster], ecx
  5102 0000C2A2 0FB60D[A9840100]    <1> 	movzx	ecx, byte [createfile_SecPerClust]
  5103 0000C2A9 EB87                <1> 	jmp	short loc_createfile_get_set_wf_fclust_cont
  5104                              <1> 
  5105                              <1> loc_createfile_err_retn:
  5106 0000C2AB F9                  <1> 	stc
  5107                              <1> 
  5108                              <1> ;loc_createfile_upd_dir_modif_date_time:
  5109                              <1> loc_createfile_stc_retn_cc: ; 31/03/2016
  5110 0000C2AC 9C                  <1> 	pushf	; cpu is here for an error return or completion 
  5111 0000C2AD 50                  <1> 	push	eax ; error code if cf = 1
  5112                              <1> 
  5113                              <1> 	;call	update_parent_dir_lmdt
  5114                              <1> 
  5115                              <1> ;loc_createfile_stc_retn_cc:
  5116 0000C2AE A1[66800100]        <1> 	mov	eax, [FAT_ClusterCounter]
  5117 0000C2B3 09C0                <1> 	or	eax, eax
  5118 0000C2B5 741A                <1> 	jz	short loc_createfile_stc_retn_pop_eax
  5119 0000C2B7 8A3D[4A790100]      <1> 	mov	bh, [Current_Drv]
  5120 0000C2BD B301                <1> 	mov	bl, 01h ; BL = 1 -> add clusters
  5121                              <1> 	; NOTE: EAX value will be added to Free Cluster Count
  5122                              <1> 	; (If EAX value is negative, Free Cluster Count will be decreased)
  5123 0000C2BF E82E060000          <1>   	call	calculate_fat_freespace
  5124                              <1>         ; ESI = Logical DOS Drive Description Table Address 
  5125                              <1>         ;jc	short loc_createfile_stc_retn_pop_eax_cf
  5126 0000C2C4 21C9                <1> 	and	ecx, ecx ; cx = 0 -> valid free sector count
  5127 0000C2C6 7409                <1> 	jz	short loc_createfile_stc_retn_pop_eax
  5128                              <1> 
  5129                              <1> loc_createfile_stc_retn_recalc_FAT_freespace:
  5130 0000C2C8 66BB00FF            <1> 	mov	bx, 0FF00h ; bh = 0FFh -> 
  5131                              <1> 	; ESI = Logical DOS Drv DT Addr
  5132                              <1> 	; BL = 0 -> Recalculate 
  5133 0000C2CC E821060000          <1> 	call	calculate_fat_freespace
  5134                              <1> 
  5135                              <1> loc_createfile_stc_retn_pop_eax:
  5136 0000C2D1 58                  <1> 	pop	eax
  5137 0000C2D2 9D                  <1> 	popf
  5138 0000C2D3 7218                <1> 	jc	short loc_createfile_retn
  5139                              <1> 
  5140                              <1> loc_createfile_retn_fcluster:
  5141 0000C2D5 A1[98840100]        <1> 	mov	eax, [createfile_FFCluster]
  5142 0000C2DA BB[94840100]        <1> 	mov	ebx, createfile_size
  5143                              <1> 	;movzx	ecx, byte [esi+LD_BPB+SecPerClust]
  5144 0000C2DF 0FB60D[A9840100]    <1> 	movzx	ecx, byte [createfile_SecPerClust] ; 23/03/2016
  5145 0000C2E6 0FB715[AA840100]    <1> 	movzx	edx, word [createfile_DirIndex]
  5146                              <1> 
  5147                              <1> loc_createfile_retn:
  5148 0000C2ED C3                  <1> 	retn
  5149                              <1> 
  5150                              <1> ; 28/07/2022 (TRDOS 386 Kernel v2.0.5)
  5151                              <1> 
  5152                              <1> create_fs_file:
  5153                              <1> 	; temporary (21/03/2016)
  5154                              <1> 	;retn
  5155                              <1> 
  5156                              <1> delete_fs_file:
  5157                              <1> 	; temporary (28/02/2016)
  5158                              <1> 	;retn
  5159                              <1> 
  5160                              <1> rename_fs_file_or_directory:
  5161                              <1> 	;retn
  5162                              <1> 
  5163                              <1> make_fs_directory:
  5164                              <1> 	; temporary (21/02/2016)
  5165                              <1> 	;retn
  5166                              <1> 
  5167                              <1> add_new_fs_section:
  5168                              <1> 	; temporary (11/03/2016)
  5169                              <1> 	;retn
  5170                              <1> 
  5171                              <1> delete_fs_directory_entry:
  5172                              <1> 	; temporary (11/03/2016)
  5173                              <1> 	;retn
  5174                              <1> 
  5175                              <1> csftdf2_read_fs_file_sectors:
  5176                              <1> 	; temporary (19/03/2016)
  5177                              <1> 	;retn
  5178                              <1> 
  5179                              <1> csftdf2_write_fs_file_sectors:
  5180                              <1> 	; temporary (19/03/2016)
  5181 0000C2EE C3                  <1> 	retn
  3429                                  %include 'trdosk5.s' ; 24/01/2016
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.5) - File System Procedures : trdosk5s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 07/08/2022 (Previous: 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> 	; 07/08/2022
    17                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
    18                              <1> 	; 15/10/2016
    19                              <1> 	; 23/03/2016
    20                              <1> 	; 01/02/2016 (TRDOS 386 = TRDOS v2.0)
    21                              <1> 	; 05/07/2011
    22                              <1> 	; 07/07/2009
    23                              <1> 	; 2005
    24                              <1> 	; INPUT ->
    25                              <1> 	;	EAX = Cluster Number (32 bit)
    26                              <1> 	;	ESI = Logical DOS Drive Parameters Table
    27                              <1> 	; OUTPUT ->
    28                              <1> 	;	cf = 0 -> No Error, EAX valid
    29                              <1> 	;	cf = 1 & EAX = 0 -> End Of Cluster Chain
    30                              <1> 	;	cf = 1 & EAX > 0 -> Error
    31                              <1> 	;	ECX = Current/Previous cluster (if CF = 0)
    32                              <1> 	;	EAX = Next Cluster Number (32 bit)
    33                              <1> 	;
    34                              <1> 	; (Modified registers: EAX, ECX, EBX, EDX)
    35                              <1> 
    36 0000C2EF A3[5A800100]        <1> 	mov	[FAT_CurrentCluster], eax
    37                              <1> check_next_cluster_fat_type:
    38 0000C2F4 29D2                <1> 	sub	edx, edx ; 0
    39 0000C2F6 807E0302            <1> 	cmp     byte [esi+LD_FATType], 2
    40 0000C2FA 7243                <1> 	jb	short get_FAT12_next_cluster
    41                              <1> 	;ja	get_FAT32_next_cluster
    42                              <1> 	; 25/07/2022
    43 0000C2FC 7605                <1> 	jna	short get_FAT16_next_cluster
    44 0000C2FE E9B2000000          <1> 	jmp	get_FAT32_next_cluster
    45                              <1> 
    46                              <1> get_FAT16_next_cluster:
    47 0000C303 BB00030000          <1> 	mov	ebx, 300h ;768
    48 0000C308 F7F3                <1> 	div	ebx
    49                              <1> 	; EAX = Count of 3 FAT sectors
    50                              <1> 	; EDX = Cluster Offset (< 768)
    51                              <1> 	;shl	dx, 1 ; Multiply by 2
    52                              <1> 	; 25/07/2022
    53 0000C30A D1E2                <1> 	shl	edx, 1
    54 0000C30C 89D3                <1> 	mov	ebx, edx ; Byte Offset
    55 0000C30E 81C3001C0900        <1> 	add	ebx, FAT_Buffer
    56 0000C314 66BA0300            <1> 	mov	dx, 3
    57 0000C318 F7E2                <1> 	mul	edx  
    58                              <1> 	; EAX = FAT Sector (<= 256)
    59                              <1> 	; EDX = 0
    60 0000C31A 8A0E                <1> 	mov	cl, [esi+LD_Name]
    61                              <1> 	;cmp	byte [FAT_BuffValidData], 0
    62 0000C31C 3815[5E800100]      <1>         cmp	[FAT_BuffValidData], dl ; 0
    63 0000C322 7674                <1> 	jna     short load_FAT_sectors0
    64 0000C324 3A0D[5F800100]      <1> 	cmp	cl, [FAT_BuffDrvName]
    65 0000C32A 756C                <1>         jne     short load_FAT_sectors0
    66 0000C32C 3B05[62800100]      <1> 	cmp	eax, [FAT_BuffSector]
    67 0000C332 756A                <1>         jne     short load_FAT_sectors1
    68                              <1> 	;movzx	eax, word [ebx]
    69 0000C334 668B03              <1> 	mov	ax, [ebx]
    70                              <1> 	; 01/02/2016
    71                              <1> 	; DRV_FAT.ASM (21/08/2011) had a FATal bug here !
    72                              <1> 	; (cmp ah, 0Fh) ! (ax >= FF7h)
    73                              <1> 	; (how can i do a such mistake!?)
    74                              <1> 	;cmp	al, 0F7h
    75                              <1> 	;jb	short loc_pass_gnc_FAT16_eoc_check
    76                              <1> 	;cmp	ah, 0FFh
    77                              <1> 	;jb	short loc_pass_gnc_FAT16_eoc_check
    78 0000C337 6683F8F7            <1> 	cmp	ax, 0FFF7h
    79 0000C33B 724E                <1> 	jb	short loc_pass_gnc_FAT16_eoc_check
    80                              <1> 	; ax >= FFF7h (cluster 0002h to FFF6h is valid, in use)
    81 0000C33D EB4A                <1> 	jmp	short loc_pass_gnc_FAT16_eoc_check_xor_eax
    82                              <1> 
    83                              <1> get_FAT12_next_cluster:
    84 0000C33F BB00040000          <1> 	mov	ebx, 400h ;1024
    85 0000C344 F7F3                <1> 	div	ebx
    86                              <1> 	; EAX = Count of 3 FAT sectors
    87                              <1> 	; EDX = Cluster Offset (< 1024)
    88                              <1> 	; 25/07/2022
    89                              <1> 	;push	ax
    90 0000C346 50                  <1> 	push	eax
    91                              <1> 	;mov	ax, 3	
    92 0000C347 B003                <1> 	mov	al, 3
    93                              <1> 	;mul	dx    	; Multiply by 3
    94 0000C349 F7E2                <1> 	mul	edx
    95                              <1> 	;shr	ax, 1	; Divide by 2
    96 0000C34B D1E8                <1>         shr	eax, 1
    97                              <1> 	;mov	bx, ax 	; Byte Offset
    98 0000C34D 89C3                <1> 	mov	ebx, eax
    99 0000C34F 81C3001C0900        <1> 	add	ebx, FAT_Buffer
   100 0000C355 58                  <1> 	pop	eax
   101                              <1> 	;pop	ax
   102                              <1> 	;mov	dx, 3
   103 0000C356 B203                <1> 	mov	dl, 3
   104 0000C358 F7E2                <1> 	mul	edx 
   105                              <1> 	; EAX = FAT Sector (<= 12)
   106                              <1> 	; EDX = 0
   107 0000C35A 8A0E                <1> 	mov	cl, [esi+LD_Name]
   108                              <1> 	;cmp	byte [FAT_BuffValidData], 0
   109 0000C35C 3815[5E800100]      <1> 	cmp	[FAT_BuffValidData], dl ; 0
   110 0000C362 7634                <1> 	jna	short load_FAT_sectors0
   111 0000C364 3A0D[5F800100]      <1> 	cmp	cl, [FAT_BuffDrvName]
   112 0000C36A 752C                <1> 	jne	short load_FAT_sectors0
   113 0000C36C 3B05[62800100]      <1> 	cmp	eax, [FAT_BuffSector]
   114 0000C372 752A                <1> 	jne	short load_FAT_sectors1
   115 0000C374 A1[5A800100]        <1> 	mov	eax, [FAT_CurrentCluster]
   116                              <1> 	;shr	ax, 1
   117                              <1> 	; 25/07/2022
   118 0000C379 D1E8                <1> 	shr	eax, 1
   119                              <1> 	;movzx	eax, word [ebx]
   120 0000C37B 668B03              <1> 	mov	ax, [ebx]
   121 0000C37E 7313                <1> 	jnc	short get_FAT12_nc_even
   122                              <1> 	;shr	ax, 4
   123 0000C380 C1E804              <1> 	shr	eax, 4
   124                              <1> loc_gnc_fat12_eoc_check:
   125                              <1> 	;cmp	al, 0F7h
   126                              <1> 	;jb	short loc_pass_gnc_FAT16_eoc_check
   127                              <1> 	;cmp	ah, 0Fh
   128                              <1> 	;jb	short loc_pass_gnc_FAT16_eoc_check
   129 0000C383 663DF70F            <1> 	cmp	ax, 0FF7h
   130 0000C387 7202                <1> 	jb	short loc_pass_gnc_FAT16_eoc_check
   131                              <1> 	; ax >= FF7h (cluster 0002h to FF6h is valid, in use)
   132                              <1> 
   133                              <1> loc_pass_gnc_FAT16_eoc_check_xor_eax:
   134 0000C389 31C0                <1> 	xor	eax, eax ; 0
   135                              <1> loc_pass_gnc_FAT16_eoc_check:
   136                              <1> loc_pass_gnc_FAT32_eoc_check:
   137 0000C38B 8B0D[5A800100]      <1> 	mov	ecx, [FAT_CurrentCluster]
   138 0000C391 F5                  <1> 	cmc
   139 0000C392 C3                  <1> 	retn
   140                              <1> 
   141                              <1> get_FAT12_nc_even:
   142 0000C393 80E40F              <1> 	and	ah, 0Fh
   143 0000C396 EBEB                <1> 	jmp	short loc_gnc_fat12_eoc_check
   144                              <1> 
   145                              <1> load_FAT_sectors0:
   146 0000C398 880D[5F800100]      <1> 	mov	[FAT_BuffDrvName], cl
   147                              <1> load_FAT_sectors1:
   148                              <1> 	; 25/07/2022
   149                              <1> 	;sub	edx, edx
   150                              <1> 	; edx = 0
   151 0000C39E A3[62800100]        <1> 	mov	[FAT_BuffSector], eax
   152 0000C3A3 89C3                <1> 	mov	ebx, eax
   153 0000C3A5 034660              <1>         add     eax, [esi+LD_FATBegin]
   154 0000C3A8 B202                <1> 	mov	dl, 2
   155                              <1> 	;cmp	byte [esi+LD_FATType], 2
   156 0000C3AA 385603              <1>         cmp	[esi+LD_FATType], dl ; 2
   157 0000C3AD 7748                <1> 	ja      short load_FAT_sectors3
   158 0000C3AF 0FB74E1C            <1> 	movzx	ecx, word [esi+LD_BPB+BPB_FATSz16]
   159 0000C3B3 EB45                <1> 	jmp	short load_FAT_sectors4
   160                              <1> 
   161                              <1> 	; 07/08/2022
   162                              <1> get_FAT32_next_cluster:
   163 0000C3B5 BB80010000          <1> 	mov	ebx, 180h ;384
   164 0000C3BA F7F3                <1> 	div	ebx
   165                              <1> 	; EAX = Count of 3 FAT sectors
   166                              <1> 	; EDX = Cluster Offset (< 384)
   167                              <1> 	;shl	dx, 2	; Multiply by 4
   168                              <1> 	; 25/07/2022
   169 0000C3BC C1E202              <1> 	shl	edx, 2
   170 0000C3BF 89D3                <1> 	mov	ebx, edx ; Byte Offset
   171 0000C3C1 81C3001C0900        <1> 	add	ebx, FAT_Buffer
   172 0000C3C7 66BA0300            <1> 	mov	dx, 3
   173 0000C3CB F7E2                <1> 	mul	edx	
   174                              <1>         ; EAX = FAT Sector (<= 2097152) ; (FFFFFF7h * 4) / 512
   175                              <1> 	; 	for 32KB cluster size:
   176                              <1> 	;	EAX <= 1024 = (4GB / 32KB) * 4) / 512 	
   177                              <1> 	; EDX = 0
   178 0000C3CD 8A0E                <1> 	mov	cl, [esi+LD_Name]
   179                              <1> 	;cmp	byte [FAT_BuffValidData], 0
   180 0000C3CF 3815[5E800100]      <1> 	cmp	[FAT_BuffValidData], dl ; 0
   181 0000C3D5 76C1                <1> 	jna	short load_FAT_sectors0
   182 0000C3D7 3A0D[5F800100]      <1> 	cmp	cl, [FAT_BuffDrvName]
   183 0000C3DD 75B9                <1> 	jne	short load_FAT_sectors0
   184 0000C3DF 3B05[62800100]      <1> 	cmp	eax, [FAT_BuffSector] ; 0, 3, 6, 9 ...
   185 0000C3E5 75B7                <1> 	jne	short load_FAT_sectors1
   186 0000C3E7 8B03                <1> 	mov	eax, [ebx]
   187 0000C3E9 25FFFFFF0F          <1>  	and	eax, 0FFFFFFFh ; 28 bit Cluster
   188 0000C3EE 3DF7FFFF0F          <1> 	cmp	eax, 0FFFFFF7h
   189 0000C3F3 7296                <1> 	jb	short loc_pass_gnc_FAT32_eoc_check
   190                              <1> 	; eax >= FFFFFF7h (cluster 0002h to FFFFFF6h is valid)
   191 0000C3F5 EB92                <1> 	jmp	short loc_pass_gnc_FAT16_eoc_check_xor_eax
   192                              <1> 
   193                              <1> load_FAT_sectors3:
   194 0000C3F7 8B4E2A              <1> 	mov	ecx, [esi+LD_BPB+BPB_FATSz32]
   195                              <1> load_FAT_sectors4:
   196 0000C3FA 29D9                <1> 	sub	ecx, ebx ; [FAT_BuffSector]
   197                              <1> 	; 25/07/2022
   198 0000C3FC FEC2                <1> 	inc	dl
   199                              <1> 	; edx = 3
   200                              <1>         ;cmp	ecx, 3
   201 0000C3FE 39D1                <1>         cmp	ecx, edx ; 3
   202 0000C400 7602                <1> 	jna     short load_FAT_sectors5
   203                              <1> 	;mov	ecx, 3
   204                              <1> 	; 25/07/2022
   205 0000C402 89D1                <1> 	mov	ecx, edx ; 3
   206                              <1> load_FAT_sectors5:
   207 0000C404 BB001C0900          <1> 	mov	ebx, FAT_Buffer
   208 0000C409 E87F5A0000          <1> 	call	disk_read
   209 0000C40E 730C                <1> 	jnc	short load_FAT_sectors_ok
   210                              <1> 	; 15/10/2016 (15h -> 17)
   211                              <1> 	; 23/03/2016 (15h)
   212 0000C410 B811000000          <1> 	mov	eax, 17 ; Drive not ready or read error
   213                              <1> 	;mov	byte [FAT_BuffValidData], 0
   214                              <1> 	; 25/07/2022
   215 0000C415 8825[5E800100]      <1> 	mov	byte [FAT_BuffValidData], ah ; 0
   216 0000C41B C3                  <1> 	retn
   217                              <1> load_FAT_sectors_ok:
   218 0000C41C C605[5E800100]01    <1> 	mov	byte [FAT_BuffValidData], 1
   219 0000C423 A1[5A800100]        <1> 	mov	eax, [FAT_CurrentCluster]
   220 0000C428 E9C7FEFFFF          <1>         jmp     check_next_cluster_fat_type
   221                              <1> 
   222                              <1> load_FAT_root_directory:
   223                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
   224                              <1> 	; 23/10/2016
   225                              <1> 	; 15/10/2016
   226                              <1> 	; 07/02/2016
   227                              <1> 	; 02/02/2016
   228                              <1> 	; 01/02/2016 (TRDOS 386 = TRDOS v2.0)
   229                              <1> 	; 21/05/2011
   230                              <1> 	; 22/08/2009
   231                              <1> 	;
   232                              <1> 	; INPUT ->
   233                              <1> 	;	ESI = Logical DOS Drive Description Table
   234                              <1> 	; OUTPUT ->
   235                              <1> 	;	cf = 1 -> Root directory could not be loaded
   236                              <1> 	;	    EAX > 0 -> Error number
   237                              <1> 	;	cf = 0 -> EAX = 0
   238                              <1> 	;	ECX = Directory buffer size in sectors (CL)
   239                              <1> 	;	EBX = Directory buffer address
   240                              <1> 	; 	NOTE: DirBuffer_Size is in bytes ! (word)
   241                              <1> 	;
   242                              <1> 	; (Modified registers: EAX, ECX, EBX, EDX)
   243                              <1> 
   244                              <1> 	; NOTE: Only for FAT12 and FAT16 file systems !
   245                              <1> 	; (FAT32 fs root dir must be loaded as sub directory)
   246                              <1> 
   247 0000C42D 8A1E                <1> 	mov	bl, [esi+LD_Name]
   248 0000C42F 8A7E03              <1> 	mov	bh, [esi+LD_FATType]
   249                              <1> 
   250                              <1> 	;mov	[DirBuff_DRV], bl
   251                              <1> 	;mov	[DirBuff_FATType], bh
   252 0000C432 66891D[6F800100]    <1> 	mov	[DirBuff_DRV], bx
   253                              <1> 	
   254                              <1> 	;cmp	bh, 2
   255                              <1> 	;ja	short load_FAT32_root_dir0 ; FAT32 root dir
   256                              <1> 
   257                              <1> load_FAT_root_dir0: ; 23/10/2016
   258 0000C439 0FB75617            <1> 	movzx	edx, word [esi+LD_BPB+RootDirEnts]
   259                              <1> 
   260                              <1> 	;or	dx, dx ; 0 for FAT32 file systems
   261                              <1> 	;jz	short load_FAT32_root_dir0 ; FAT32 root dir
   262                              <1> 	
   263                              <1> 	; 25/07/2022
   264 0000C43D 89D0                <1> 	mov	eax, edx
   265 0000C43F 6681FA0002          <1> 	cmp	dx, 512 ; Number of Root Dir Entries
   266 0000C444 740B                <1> 	je	short lrd_mov_ecx_32
   267                              <1> 	;mov	eax, edx ; 25/07/2022
   268                              <1> 	; 23/10/2016
   269 0000C446 89C1                <1> 	mov	ecx, eax
   270 0000C448 6683C10F            <1> 	add	cx, 15 ; round up 
   271                              <1> 	;shr	cx, 4  ; 16 entries per sector (512/32)
   272                              <1> 	; 25/07/2022
   273 0000C44C C1E904              <1> 	shr	ecx, 4
   274                              <1> 	; ecx = Root directory size in sectors
   275                              <1> 	;;shl	ax, 5 ; Root directory size in bytes
   276                              <1> 	; 25/07/2022
   277                              <1> 	;shl	eax, 5
   278                              <1> 	;;dec	dx    ; Last entry number of root dir
   279                              <1> 	;dec	edx
   280                              <1> 	; cx = Dir Buffer sector count             
   281 0000C44F EB04                <1> 	jmp	short lrd_check_dir_buffer
   282                              <1> 
   283                              <1> lrd_mov_ecx_32:
   284                              <1> 	;mov	ecx, 32
   285                              <1> 	; 25/07/2022
   286 0000C451 29C9                <1> 	sub	ecx, ecx
   287 0000C453 B120                <1> 	mov	cl, 32
   288                              <1> 	;dec	dx ; 511
   289                              <1> 	;mov	ax, 32*512 
   290                              <1> 
   291                              <1> lrd_check_dir_buffer:
   292                              <1> 	; 25/07/2022
   293 0000C455 4A                  <1> 	dec	edx ; root dir entries - 1
   294 0000C456 C1E005              <1> 	shl	eax, 5 ; * 32
   295                              <1> 	;
   296 0000C459 29DB                <1> 	sub	ebx, ebx ; 0
   297 0000C45B 881D[71800100]      <1> 	mov	[DirBuff_ValidData], bl ; 0
   298 0000C461 668915[74800100]    <1> 	mov	[DirBuff_LastEntry], dx
   299 0000C468 891D[76800100]      <1> 	mov	[DirBuff_Cluster], ebx ; 0
   300 0000C46E 66A3[7A800100]      <1> 	mov	[DirBuffer_Size], ax
   301                              <1> 
   302 0000C474 8B4664              <1> 	mov	eax, [esi+LD_ROOTBegin]
   303                              <1> read_directory:
   304 0000C477 BB00000800          <1> 	mov	ebx, Directory_Buffer
   305 0000C47C 51                  <1> 	push	ecx ; Directory buffer sector count
   306 0000C47D 53                  <1> 	push	ebx
   307 0000C47E E80A5A0000          <1> 	call	disk_read
   308 0000C483 5B                  <1> 	pop	ebx
   309 0000C484 720B                <1> 	jc	short load_DirBuff_error
   310                              <1> 
   311                              <1> validate_DirBuff_and_return:
   312 0000C486 59                  <1> 	pop	ecx ; Number of loaded sectors
   313 0000C487 C605[71800100]01    <1> 	mov	byte [DirBuff_ValidData], 1
   314 0000C48E 31C0                <1> 	xor	eax, eax ; 0 = no error
   315 0000C490 C3                  <1> 	retn
   316                              <1> 
   317                              <1> load_DirBuff_error:
   318 0000C491 89C8                <1> 	mov	eax, ecx ; remaining sectors
   319 0000C493 59                  <1> 	pop	ecx ; sector count
   320 0000C494 29C1                <1> 	sub	ecx, eax ; Number of loaded sectors
   321                              <1> 	; 15/10/2016 (15h -> 17)
   322                              <1> 	;mov	eax, 17 ; DRV NOT READY OR READ ERROR !
   323                              <1> 	; 25/07/2022
   324                              <1> 	;sub	eax, eax
   325 0000C496 B011                <1> 	mov	al, 17
   326 0000C498 F9                  <1> 	stc
   327 0000C499 C3                  <1>         retn
   328                              <1> 
   329                              <1> load_FAT32_root_directory:
   330                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
   331                              <1> 	; 02/02/2016 (TRDOS 386 = TRDOS v2.0)
   332                              <1> 	;
   333                              <1> 	; INPUT ->
   334                              <1> 	;	ESI = Logical DOS Drive Description Table
   335                              <1> 	; OUTPUT ->
   336                              <1> 	;	cf = 1 -> Root directory could not be loaded
   337                              <1> 	;	    EAX > 0 -> Error number
   338                              <1> 	;	cf = 0 -> EAX = 0
   339                              <1> 	;	ECX = Directory buffer size in sectors (CL)
   340                              <1> 	;	EBX = Directory buffer address
   341                              <1> 	; 	NOTE: DirBuffer_Size is in bytes ! (word)
   342                              <1> 	;
   343                              <1> 	; (Modified registers: EAX, ECX, EBX, EDX)
   344                              <1> 
   345 0000C49A 8A1E                <1> 	mov	bl, [esi+LD_Name]
   346 0000C49C 8A7E03              <1> 	mov	bh, [esi+LD_FATType]
   347                              <1> 
   348                              <1> 	;mov	[DirBuff_DRV], bl
   349                              <1> 	;mov	[DirBuff_FATType], bh
   350 0000C49F 66891D[6F800100]    <1> 	mov	[DirBuff_DRV], bx
   351                              <1> 
   352                              <1> load_FAT32_root_dir0:
   353 0000C4A6 8B4632              <1> 	mov	eax, [esi+LD_BPB+FAT32_RootFClust]
   354 0000C4A9 EB0C                <1> 	jmp	short load_FAT_sub_dir0
   355                              <1> 	
   356                              <1> load_FAT_sub_directory:
   357                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
   358                              <1> 	; 01/02/2016 (TRDOS 386 = TRDOS v2.0)
   359                              <1> 	; 05/07/2011
   360                              <1> 	; 23/08/2009
   361                              <1> 	;
   362                              <1> 	; INPUT ->
   363                              <1> 	;	ESI = Logical DOS Drive Description Table
   364                              <1> 	;	EAX = Cluster Number
   365                              <1> 	; OUTPUT ->
   366                              <1> 	;	cf = 1 -> Sub directory could not be loaded
   367                              <1> 	;	    EAX > 0 -> Error number
   368                              <1> 	;	cf = 0 -> EAX = 0
   369                              <1> 	;	ECX = Directory buffer size in sectors (CL)
   370                              <1> 	;	EBX = Directory buffer address
   371                              <1> 	;
   372                              <1> 	; 	NOTE: DirBuffer_Size is in bytes ! (word)
   373                              <1> 	;
   374                              <1> 	; (Modified registers: EAX, ECX, EBX, EDX)
   375                              <1> 
   376 0000C4AB 8A1E                <1> 	mov	bl, [esi+LD_Name]
   377 0000C4AD 8A7E03              <1> 	mov	bh, [esi+LD_FATType]
   378                              <1> 
   379                              <1> 	;mov	[DirBuff_DRV], bl
   380                              <1> 	;mov	[DirBuff_FATType], bh
   381 0000C4B0 66891D[6F800100]    <1> 	mov	[DirBuff_DRV], bx
   382                              <1> 
   383                              <1> load_FAT_sub_dir0:
   384 0000C4B7 0FB64E13            <1> 	movzx	ecx, byte [esi+LD_BPB+SecPerClust]
   385                              <1> 
   386 0000C4BB 882D[71800100]      <1> 	mov	[DirBuff_ValidData], ch ; 0
   387 0000C4C1 A3[76800100]        <1> 	mov	[DirBuff_Cluster], eax
   388                              <1> 
   389 0000C4C6 0FB74611            <1> 	movzx	eax, word [esi+LD_BPB+BytesPerSec]
   390 0000C4CA F7E1                <1> 	mul	ecx
   391 0000C4CC C1E805              <1> 	shr	eax, 5 ; directory entry count (dir size / 32)
   392                              <1> 	;dec	ax ; last entry
   393                              <1> 	; 25/07/2022
   394 0000C4CF 48                  <1> 	dec	eax
   395 0000C4D0 66A3[74800100]      <1> 	mov	[DirBuff_LastEntry], ax
   396                              <1> 
   397 0000C4D6 A1[76800100]        <1> 	mov	eax, [DirBuff_Cluster]
   398 0000C4DB 83E802              <1> 	sub	eax, 2
   399 0000C4DE F7E1                <1> 	mul	ecx
   400 0000C4E0 034668              <1> 	add	eax, [esi+LD_DATABegin]
   401                              <1> 	; ecx = sectors per cluster (dir buffer size <= 128 sectors)
   402 0000C4E3 EB92                <1> 	jmp	short read_directory
   403                              <1> 
   404                              <1> ; DRV_FS.ASM
   405                              <1> 
   406                              <1> ; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
   407                              <1> 
   408                              <1> load_current_FS_directory:
   409                              <1> 	;retn
   410                              <1> load_FS_root_directory:
   411                              <1> 	;retn
   412                              <1> load_FS_sub_directory:
   413 0000C4E5 C3                  <1> 	retn
   414                              <1> 
   415                              <1> read_cluster:
   416                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
   417                              <1> 	; 15/10/2016
   418                              <1> 	; 18/03/2016
   419                              <1> 	; 16/03/2016
   420                              <1> 	; 17/02/2016
   421                              <1> 	; 15/02/2016 (TRDOS 386 = TRDOS v2.0)
   422                              <1> 	;
   423                              <1> 	; INPUT ->
   424                              <1> 	;	EAX = Cluster Number (Sector index for SINGLIX FS)
   425                              <1> 	;	ESI = Logical DOS Drive Description Table address
   426                              <1> 	;	EBX = Cluster (File R/W) Buffer address (max. 64KB)
   427                              <1> 	;	Only for SINGLIX FS:
   428                              <1> 	;	EDX = File Number (The 1st FDT address) 
   429                              <1> 	; OUTPUT ->
   430                              <1> 	;	cf = 1 -> Cluster can not be loaded at the buffer
   431                              <1> 	;	    EAX > 0 -> Error number
   432                              <1> 	;	cf = 0 -> Cluster has been loaded at the buffer
   433                              <1> 	;
   434                              <1> 	; (Modified registers: EAX, ECX, EBX, EDX)
   435                              <1> 	
   436 0000C4E6 0FB64E13            <1> 	movzx	ecx, byte [esi+LD_BPB+BPB_SecPerClust] 
   437                              <1> 	; CL = 1 = [esi+LD_FS_Reserved2] ; SectPerClust for Singlix FS
   438                              <1> 
   439                              <1> read_file_sectors: ; 16/03/2016
   440                              <1> 	;cmp	byte [esi+LD_FATType], 0
   441                              <1> 	; 25/07/2022
   442 0000C4EA 386E03              <1> 	cmp	[esi+LD_FATType], ch ; 0
   443 0000C4ED 761C                <1> 	jna	short read_fs_cluster
   444                              <1> 
   445                              <1> read_fat_file_sectors: ; 18/03/2016
   446 0000C4EF 83E802              <1> 	sub	eax, 2 ; Beginning cluster number is always 2
   447 0000C4F2 0FB65613            <1> 	movzx	edx, byte [esi+LD_BPB+BPB_SecPerClust] ; 18/03/2016 
   448 0000C4F6 F7E2                <1> 	mul	edx
   449 0000C4F8 034668              <1> 	add	eax, [esi+LD_DATABegin] ; absolute address of the cluster
   450                              <1> 
   451                              <1> 	; EAX = Disk sector address
   452                              <1> 	; ECX = Sector count
   453                              <1> 	; EBX = Buffer address
   454                              <1> 	; (EDX = 0)
   455                              <1> 	; ESI = Logical DOS drive description table address	
   456                              <1> 
   457 0000C4FB E88D590000          <1> 	call	disk_read
   458 0000C500 7306                <1> 	jnc	short rclust_retn
   459                              <1> 	
   460                              <1> 	; 15/10/2016 (15h -> 17)
   461 0000C502 B811000000          <1> 	mov	eax, 17 ; Drive not ready or read error !
   462 0000C507 C3                  <1> 	retn
   463                              <1> 
   464                              <1> rclust_retn:
   465 0000C508 29C0                <1> 	sub	eax, eax ; 0
   466 0000C50A C3                  <1> 	retn
   467                              <1> 
   468                              <1> read_fs_cluster:
   469                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
   470                              <1> 	; 15/02/2016 (TRDOS 386 = TRDOS v2.0)
   471                              <1> 	; Singlix FS
   472                              <1> 	
   473                              <1> 	; EAX = Cluster number is sector index number of the file (eax)
   474                              <1> 	
   475                              <1> 	; EDX = File number is the first File Descriptor Table address 
   476                              <1> 	;	of the file. (Absolute address of the FDT).
   477                              <1> 	
   478                              <1> 	; eax = sector index (0 for the first sector)
   479                              <1> 	; edx = FDT0 address
   480                              <1> 		; 64 KB buffer = 128 sectors (limit) 
   481                              <1> 	;mov	ecx, 128 ; maximum count of sectors (before eof) 
   482                              <1> 	; 25/07/2022
   483 0000C50B 29C9                <1> 	sub	ecx, ecx
   484 0000C50D B180                <1> 	mov	cl, 128
   485                              <1> 	;call	read_fs_sectors
   486                              <1> 	;retn
   487                              <1> 	;jmp	short read_fs_sectors
   488                              <1> 
   489                              <1> read_fs_sectors:
   490                              <1> 	; 15/02/2016 (TRDOS 386 = TRDOS v2.0)
   491 0000C50F F9                  <1> 	stc
   492 0000C510 C3                  <1> 	retn
   493                              <1> 
   494                              <1> get_first_free_cluster:
   495                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
   496                              <1> 	; 02/03/2016
   497                              <1> 	; 21/02/2016 (TRDOS 386 = TRDOS v2.0)
   498                              <1> 	; 26/10/2010 (DRV_FAT.ASM, 'proc_get_first_free_cluster')
   499                              <1> 	; 10/07/2010
   500                              <1> 	; INPUT ->
   501                              <1> 	;	ESI = Logical DOS Drive Description Table address
   502                              <1> 	; OUTPUT ->
   503                              <1> 	;	cf = 1 -> Error code in AL (EAX)
   504                              <1> 	;	cf = 0 -> 
   505                              <1> 	;	  EAX = Cluster number 
   506                              <1> 	;	  If EAX = FFFFFFFFh -> no free space
   507                              <1> 	;	If the drive has FAT32 fs:
   508                              <1> 	;	  EBX = FAT32 FSI sector buffer address (if > 0)
   509                              <1> 
   510 0000C511 8B4678              <1> 	mov	eax, [esi+LD_Clusters]
   511 0000C514 40                  <1> 	inc	eax ; add eax, 1
   512 0000C515 A3[F8820100]        <1> 	mov	[gffc_last_free_cluster], eax
   513                              <1> 
   514 0000C51A 31DB                <1> 	xor	ebx, ebx ; 0 ; 02/03/2016
   515                              <1> 
   516 0000C51C 807E0302            <1> 	cmp	byte [esi+LD_FATType], 2
   517 0000C520 760E                <1> 	jna	short loc_gffc_get_first_fat_free_cluster0
   518                              <1> 
   519                              <1> loc_gffc_get_first_fat32_free_cluster:
   520                              <1> 	; 02/03/2016
   521 0000C522 E8FF050000          <1> 	call	get_fat32_fsinfo_sector_parms
   522 0000C527 7207                <1> 	jc	short loc_gffc_get_first_fat_free_cluster0 
   523                              <1> 
   524                              <1> loc_gffc_check_fsinfo_parms:
   525                              <1> 	;;mov	ebx, DOSBootSectorBuff
   526                              <1> 	;cmp	dword [ebx], 41615252h
   527                              <1> 	;jne	short loc_gffc_fat32_fsinfo_err
   528                              <1> 	;cmp	dword [ebx+484], 61417272h
   529                              <1> 	;jne	short loc_gffc_fat32_fsinfo_err
   530                              <1> 	;mov	eax, [ebx+492] ; FSI_Next_Free
   531                              <1> 	;EAX = First free cluster 
   532                              <1> 	;(from FAT32 FSInfo sector)
   533 0000C529 89D0                <1> 	mov	eax, edx ; FSI_Next_Free (First Free Cluster)
   534 0000C52B 83F8FF              <1> 	cmp	eax, 0FFFFFFFFh ; invalid (unknown) !
   535 0000C52E 7204                <1> 	jb	short loc_gffc_get_first_fat_free_cluster1
   536                              <1> 
   537                              <1> 	; Start from the 1st cluster of the FAT(32) file system
   538                              <1> loc_gffc_get_first_fat_free_cluster0:
   539                              <1> 	;mov	eax, 2
   540                              <1> 	; 25/07/2022
   541 0000C530 29C0                <1> 	sub	eax, eax
   542 0000C532 B002                <1> 	mov	al, 2
   543                              <1> 	;xor	edx, edx
   544                              <1> 
   545                              <1> loc_gffc_get_first_fat_free_cluster1:
   546 0000C534 53                  <1> 	push	ebx ; 02/03/2016 
   547                              <1> 
   548                              <1> loc_gffc_get_first_fat_free_cluster2:   
   549 0000C535 A3[F4820100]        <1> 	mov	[gffc_first_free_cluster], eax
   550 0000C53A A3[F0820100]        <1> 	mov	[gffc_next_free_cluster], eax
   551                              <1> 
   552                              <1> 	; EBX = FAT32 FSINFO sector buffer address
   553                              <1> 	; (EBX = 0, if the drive has not got FAT32 fs or
   554                              <1> 	; FAT32 FSINFO sector buffer is invalid.)
   555                              <1> 
   556                              <1> loc_gffc_get_first_fat_free_cluster3:
   557 0000C53F E8ABFDFFFF          <1> 	call	get_next_cluster
   558 0000C544 7307                <1> 	jnc	short loc_gffc_get_first_fat_free_cluster4
   559 0000C546 09C0                <1> 	or	eax, eax
   560 0000C548 740B                <1> 	jz	short loc_gffc_first_free_fat_cluster_next
   561 0000C54A 5B                  <1> 	pop	ebx ; 02/03/2016
   562 0000C54B F5                  <1> 	cmc 	; stc
   563 0000C54C C3                  <1> 	retn
   564                              <1> 
   565                              <1> loc_gffc_get_first_fat_free_cluster4:
   566 0000C54D 21C0                <1> 	and	eax, eax ; next cluster value
   567 0000C54F 7504                <1> 	jnz	short loc_gffc_first_free_fat_cluster_next
   568 0000C551 89C8                <1> 	mov	eax, ecx ; current (previous cluster) value
   569 0000C553 EB22                <1> 	jmp	short loc_gffc_check_for_set
   570                              <1>  
   571                              <1> loc_gffc_first_free_fat_cluster_next:
   572 0000C555 A1[F0820100]        <1> 	mov	eax, [gffc_next_free_cluster]
   573 0000C55A 3B05[F8820100]      <1> 	cmp	eax, [gffc_last_free_cluster]
   574 0000C560 7308                <1> 	jnb	short retn_stc_from_get_first_free_cluster
   575                              <1> pass_gffc_last_cluster_eax_check:
   576 0000C562 40                  <1> 	inc	eax ; add eax, 1
   577 0000C563 A3[F0820100]        <1> 	mov	[gffc_next_free_cluster], eax
   578 0000C568 EBD5                <1> 	jmp	short loc_gffc_get_first_fat_free_cluster3
   579                              <1> 
   580                              <1> retn_stc_from_get_first_free_cluster:
   581 0000C56A A1[F4820100]        <1> 	mov	eax, [gffc_first_free_cluster]
   582 0000C56F 83F802              <1> 	cmp	eax, 2
   583 0000C572 7709                <1> 	ja	short loc_gffc_check_previous_clusters
   584 0000C574 29C0                <1> 	sub	eax, eax
   585 0000C576 48                  <1> 	dec	eax ; FFFFFFFFh
   586                              <1> 
   587                              <1> loc_gffc_check_for_set:
   588                              <1> 	; 02/03/2016
   589 0000C577 5B                  <1> 	pop	ebx
   590                              <1> 
   591                              <1> 	; EBX = FAT32 FSINFO sector buffer address
   592                              <1> 	; (EBX = 0, if the drive has not got FAT32 fs or
   593                              <1> 	; FAT32 FSINFO sector buffer is invalid.)
   594                              <1> 
   595 0000C578 09DB                <1> 	or	ebx, ebx
   596 0000C57A 750D                <1> 	jnz	short loc_gffc_set_ffree_fat32_cluster
   597                              <1> 
   598                              <1> 	;cmp	byte [esi+LD_FATType], 3
   599                              <1> 	;jnb	short loc_gffc_set_ffree_fat32_cluster
   600                              <1> 
   601                              <1> 	;xor	ebx, ebx ; 0
   602                              <1> 
   603                              <1> loc_gffc_retn:
   604 0000C57C C3                  <1> 	retn
   605                              <1> 
   606                              <1> loc_gffc_check_previous_clusters:
   607 0000C57D 48                  <1> 	dec	eax ; sub eax, 1
   608 0000C57E A3[F8820100]        <1> 	mov	[gffc_last_free_cluster], eax 
   609                              <1> 	;mov	eax, 2
   610                              <1> 	; 25/07/2022
   611 0000C583 31C0                <1> 	xor	eax, eax
   612 0000C585 B002                <1> 	mov	al, 2
   613                              <1> 	; eax = 2
   614                              <1> 	;xor	edx, edx
   615 0000C587 EBAC                <1> 	jmp	short loc_gffc_get_first_fat_free_cluster2
   616                              <1> 
   617                              <1> loc_gffc_set_ffree_fat32_cluster:
   618                              <1> 	;call	set_first_free_cluster
   619                              <1> 	;retn
   620                              <1> 	;jmp	short set_first_free_cluster	
   621                              <1> 
   622                              <1> set_first_free_cluster:
   623                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
   624                              <1> 	; 15/10/2016
   625                              <1> 	; 23/03/2016
   626                              <1> 	; 02/03/2016
   627                              <1> 	; 29/02/2016
   628                              <1> 	; 26/02/2016
   629                              <1> 	; 21/02/2016 (TRDOS 386 = TRDOS v2.0)
   630                              <1> 	; 21/08/2011 (DRV_FAT.ASM, 'proc_set_first_free_cluster')
   631                              <1> 	; 11/07/2010
   632                              <1> 	; INPUT -> 
   633                              <1> 	;	ESI = Logical DOS Drive Description Table address
   634                              <1> 	;	EAX = First free cluster
   635                              <1> 	;	EBX = FSINFO sector buffer address
   636                              <1> 	;  	;;If EBX > 0, it is FSINFO sector buffer address
   637                              <1> 	;	;;EBX = 0, if FSINFO sector is not loaded
   638                              <1> 	; OUTPUT->
   639                              <1> 	;	ESI = Logical DOS Drive Description Table address
   640                              <1> 	;  	If EBX > 0, it is FSINFO sector buffer address
   641                              <1> 	;	EBX = 0, if FSINFO sector could not be loaded
   642                              <1> 	; 	CF = 1 -> Error code in AL (EAX)
   643                              <1> 	;	CF = 0 -> first free cluster is successfully updated 
   644                              <1> 
   645                              <1> 	;cmp	byte [esi+LD_FATType], 3
   646                              <1> 	;jb	short loc_sffc_invalid_drive
   647                              <1> 
   648                              <1> 	; Save First Free Cluster value for 'update_cluster'
   649 0000C589 89463E              <1> 	mov	[esi+LD_BPB+BPB_Reserved+4], eax ; First free Cluster	
   650                              <1> 
   651                              <1> 	;or	ebx, ebx
   652                              <1> 	;jnz	short loc_sffc_read_fsinfo_sector
   653                              <1> 
   654 0000C58C 813B52526141        <1> 	cmp     dword [ebx], 41615252h
   655 0000C592 753C                <1> 	jne	short loc_sffc_read_fsinfo_sector
   656 0000C594 81BBE4010000727241- <1> 	cmp	dword [ebx+484], 61417272h
   656 0000C59D 61                  <1>
   657 0000C59E 7530                <1> 	jne	short loc_sffc_read_fsinfo_sector
   658                              <1> 
   659 0000C5A0 3B83EC010000        <1> 	cmp	eax, [ebx+492]  ; FSI_Next_Free
   660 0000C5A6 741E                <1> 	je	short loc_sffc_retn
   661                              <1> 
   662                              <1> loc_sffc_write_fsinfo_sector:
   663                              <1> 	; EBX = FSINFO sector buffer
   664                              <1> 	; [CFS_FAT32FSINFOSEC] is set in 'get_fat32_fsinfo_sector_parms'
   665 0000C5A8 8983EC010000        <1> 	mov	[ebx+492], eax
   666 0000C5AE A1[08830100]        <1> 	mov	eax, [CFS_FAT32FSINFOSEC] 
   667                              <1> 	;mov	ecx, 1
   668                              <1> 	; 25/07/2022
   669 0000C5B3 31C9                <1> 	xor	ecx, ecx
   670 0000C5B5 FEC1                <1> 	inc	cl
   671                              <1> 	; ecx = 1
   672 0000C5B7 53                  <1> 	push	ebx
   673 0000C5B8 E8C1580000          <1> 	call	disk_write
   674 0000C5BD 7208                <1> 	jc      short loc_sffc_read_fsinfo_sector_err1
   675 0000C5BF 5B                  <1> 	pop	ebx
   676                              <1> 
   677 0000C5C0 8B83EC010000        <1> 	mov	eax, [ebx+492] ; First (Next) Free Cluster
   678                              <1> 
   679                              <1> loc_sffc_retn:
   680 0000C5C6 C3                  <1> 	retn
   681                              <1> 
   682                              <1> ;loc_sffc_invalid_drive:
   683                              <1> ;	mov	eax, 0Fh ; MSDOS Error : Invalid drive
   684                              <1> ;	push	edx
   685                              <1> 
   686                              <1> loc_sffc_read_fsinfo_sector_err1:
   687                              <1> 	; 25/07/2022
   688                              <1> 	;mov	ebx, 0
   689                              <1> 	; 15/10/2016 (1Dh -> 18)
   690                              <1> 	; 23/03/2016 (1Dh)
   691                              <1> 	;mov	eax, 18 ; Drive not ready or write error
   692 0000C5C7 31C0                <1> 	xor	eax, eax
   693 0000C5C9 89C3                <1> 	mov	ebx, eax ; 0
   694 0000C5CB B012                <1> 	mov	al, 18	
   695 0000C5CD F9                  <1> 	stc
   696                              <1> loc_sffc_read_fsinfo_sector_err2:
   697 0000C5CE 5A                  <1> 	pop	edx
   698 0000C5CF C3                  <1> 	retn
   699                              <1> 	
   700                              <1> loc_sffc_read_fsinfo_sector:
   701 0000C5D0 50                  <1> 	push	eax
   702                              <1> 
   703 0000C5D1 E850050000          <1> 	call	get_fat32_fsinfo_sector_parms
   704 0000C5D6 72F6                <1> 	jc	short loc_sffc_read_fsinfo_sector_err2
   705                              <1> 
   706 0000C5D8 58                  <1> 	pop	eax
   707                              <1> 	; EDX = First (Next) Free Cluster value from FSINFO sector
   708                              <1> 	; EAX = First Free Cluster value from 'get_next_cluster'
   709                              <1> 	; (edx = old value)
   710 0000C5D9 39D0                <1> 	cmp	eax, edx ; First free Cluster (eax = new value) 
   711 0000C5DB 75CB                <1> 	jne	short loc_sffc_write_fsinfo_sector
   712                              <1> 
   713 0000C5DD C3                  <1> 	retn	
   714                              <1> 
   715                              <1> update_cluster:
   716                              <1> 	; 07/08/2022
   717                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
   718                              <1> 	; 23/10/2016
   719                              <1> 	; 23/03/2016
   720                              <1> 	; 02/03/2016
   721                              <1> 	; 01/03/2016
   722                              <1> 	; 29/02/2016
   723                              <1> 	; 27/02/2016
   724                              <1> 	; 26/02/2016
   725                              <1> 	; 22/02/2016 (TRDOS 386 = TRDOS v2.0)
   726                              <1> 	; 11/08/2011  
   727                              <1> 	; 09/02/2005
   728                              <1> 	; INPUT ->
   729                              <1> 	;	EAX = Cluster Number
   730                              <1> 	;	ECX = New Cluster Value
   731                              <1> 	;	ESI = Logical Dos Drive Parameters Table
   732                              <1> 	;
   733                              <1> 	;	/// dword [FAT_ClusterCounter] ///
   734                              <1> 	;
   735                              <1> 	; OUTPUT ->
   736                              <1> 	;	cf = 0 -> No Error, EAX is valid
   737                              <1> 	;	cf = 1 & EAX = 0 -> End Of Cluster Chain
   738                              <1> 	; 	cf = 1 & EAX > 0 -> Error
   739                              <1> 	;		(ECX -> any value)
   740                              <1> 	; 	EAX = Next Cluster
   741                              <1> 	;	ECX = New Cluster Value
   742                              <1> 	;
   743                              <1> 	;	/// [FAT_ClusterCounter] is updated,
   744                              <1> 	;	/// decreased when a free cluster is assigned,
   745                              <1> 	;	/// increased if an assigned cluster is freed.	
   746                              <1> 	;		
   747                              <1> 	;
   748                              <1> 	; (Modified registers: EAX, EBX, -ECX-, EDX)
   749                              <1> 	
   750 0000C5DE A3[5A800100]        <1> 	mov	[FAT_CurrentCluster], eax
   751 0000C5E3 890D[FC820100]      <1> 	mov	[ClusterValue], ecx
   752                              <1> 
   753                              <1> loc_update_cluster_check_fat_buffer:
   754 0000C5E9 8A1E                <1> 	mov	bl, [esi+LD_Name]
   755 0000C5EB 381D[5F800100]      <1> 	cmp	[FAT_BuffDrvName], bl
   756 0000C5F1 7418                <1> 	je	short loc_update_cluster_check_fat_type
   757 0000C5F3 803D[5E800100]02    <1> 	cmp	byte [FAT_BuffValidData], 2
   758                              <1> 	;je	loc_uc_save_fat_buffer
   759                              <1> 	; 25/07/2022
   760 0000C5FA 7502                <1> 	jne	short loc_uc_reset_fat_buffer_validation
   761 0000C5FC EB65                <1> 	jmp	loc_uc_save_fat_buffer
   762                              <1> 
   763                              <1> loc_uc_reset_fat_buffer_validation:
   764 0000C5FE C605[5E800100]00    <1> 	mov	byte [FAT_BuffValidData], 0
   765                              <1> 
   766                              <1> loc_uc_check_fat_type_reset_drvname:
   767 0000C605 881D[5F800100]      <1> 	mov	[FAT_BuffDrvName], bl
   768                              <1> 
   769                              <1> loc_update_cluster_check_fat_type:
   770 0000C60B 29D2                <1> 	sub	edx, edx ; 26/02/2016
   771 0000C60D 8A5E03              <1> 	mov	bl, [esi+LD_FATType]
   772 0000C610 83F802              <1> 	cmp	eax, 2
   773 0000C613 721D                <1>         jb	short update_cluster_inv_data
   774 0000C615 80FB02              <1> 	cmp	bl, 2 
   775                              <1>         ;ja	update_fat32_cluster
   776                              <1> 	; 25/07/2022
   777 0000C618 7605                <1> 	jna	short loc_uc_check_fat_type_1
   778 0000C61A E98D010000          <1> 	jmp	update_fat32_cluster
   779                              <1> 
   780                              <1> loc_uc_check_fat_type_1:
   781                              <1> 	;cmp	bl, 1
   782                              <1> 	;jb	short update_cluster_inv_data
   783 0000C61F 8B4E78              <1> 	mov	ecx, [esi+LD_Clusters]
   784 0000C622 41                  <1> 	inc	ecx  
   785 0000C623 890D[6A800100]      <1> 	mov	[LastCluster], ecx
   786 0000C629 39C8                <1> 	cmp	eax, ecx ; dword [LastCluster]
   787                              <1> 	;ja	return_uc_fat_stc
   788                              <1> 	; 25/07/2022
   789 0000C62B 7608                <1> 	jna	short loc_uc_check_fat_type_2
   790 0000C62D E9D6000000          <1> 	jmp	return_uc_fat_stc
   791                              <1> 
   792                              <1> 	; 25/07/2022
   793                              <1> update_cluster_inv_data:
   794                              <1> 	;mov	eax, 0Dh
   795 0000C632 B00D                <1> 	mov	al, 0Dh  ; Invalid Data
   796 0000C634 C3                  <1> 	retn 
   797                              <1> 
   798                              <1> loc_uc_check_fat_type_2:
   799                              <1> 	; TRDOS v1 has a FATal bug here ! 
   800                              <1> 		; or bl, bl ; cmp bl, 0
   801                              <1> 		; jz short update_fat12_cluster
   802                              <1> 	; !! It would destroy FAT12 floppy disk fs here !!
   803                              <1> 	; ('A:' disks of TRDOS v1 operating system project
   804                              <1> 	; had 'singlix fs', so, I could not differ this mistake
   805                              <1> 	; on a drive 'A:')
   806 0000C635 80FB01              <1> 	cmp	bl, 1 ; correct comparison is this !
   807                              <1> 	;jna	update_fat12_cluster
   808                              <1> 	; 25/07/2022
   809 0000C638 7705                <1> 	ja	short update_fat16_cluster
   810 0000C63A E9CE000000          <1> 	jmp	update_fat12_cluster	 
   811                              <1> 
   812                              <1> update_fat16_cluster:
   813                              <1> pass_uc_fat16_errc:
   814                              <1> 	;sub	edx, edx
   815 0000C63F BB00030000          <1> 	mov	ebx, 300h ;768
   816 0000C644 F7F3                <1> 	div	ebx
   817                              <1> 	; EAX = Count of 3 FAT sectors
   818                              <1> 	; DX = Cluster offset in FAT buffer
   819                              <1> 	;mov	bx, dx  
   820                              <1> 	; 25/07/2022
   821 0000C646 89D3                <1> 	mov	ebx, edx
   822                              <1> 	;shl	bx, 1 ; Multiply by 2
   823                              <1> 	; 25/07/2022
   824 0000C648 D1E3                <1> 	shl	ebx, 1
   825 0000C64A 66BA0300            <1> 	mov	dx, 3
   826 0000C64E F7E2                <1> 	mul	edx  
   827                              <1> 	; EAX = FAT Sector
   828                              <1> 	; EDX = 0
   829                              <1> 	; EBX = Byte offset in FAT buffer
   830 0000C650 8A0D[5E800100]      <1> 	mov	cl, [FAT_BuffValidData]
   831 0000C656 80F902              <1> 	cmp	cl, 2
   832 0000C659 7518                <1> 	jne	short loc_uc_check_fat16_buff_sector_load
   833                              <1> 
   834                              <1> loc_uc_check_fat16_buff_sector_save:
   835 0000C65B 3B05[62800100]      <1> 	cmp	eax, [FAT_BuffSector]
   836                              <1> 	;jne	short loc_uc_save_fat_buffer
   837                              <1> 	;jmp	short loc_update_fat16_cell
   838                              <1> 	; 07/08/2022
   839 0000C661 741D                <1> 	je	short loc_update_fat16_cell
   840                              <1> 	;jmp	loc_uc_save_fat_buffer
   841                              <1> 	
   842                              <1> 	; 07/08/2022
   843                              <1> loc_uc_save_fat_buffer:
   844                              <1> 	; byte [FAT_BuffValidData] = 2 
   845 0000C663 E8F9010000          <1> 	call	save_fat_buffer
   846 0000C668 7267                <1>         jc      short loc_fat_sectors_rw_error2
   847                              <1> 	;mov	byte [FAT_BuffValidData], 1
   848 0000C66A A1[5A800100]        <1> 	mov	eax, [FAT_CurrentCluster]
   849                              <1> 	;mov	ecx, [ClusterValue]
   850                              <1> 	;jmp	short loc_update_cluster_check_fat_buffer
   851 0000C66F 8A1E                <1> 	mov	bl, [esi+LD_Name] ; 01/03/2016
   852 0000C671 EB8B                <1>         jmp     loc_uc_reset_fat_buffer_validation
   853                              <1> 
   854                              <1> loc_uc_check_fat16_buff_sector_load:
   855 0000C673 80F901              <1> 	cmp	cl, 1 ; byte [FAT_BuffValidData]
   856 0000C676 7560                <1>         jne     short loc_uc_load_fat_sectors
   857 0000C678 3B05[62800100]      <1> 	cmp	eax, [FAT_BuffSector]
   858 0000C67E 7558                <1>         jne     short loc_uc_load_fat_sectors
   859                              <1> 
   860                              <1> loc_update_fat16_cell:
   861                              <1> loc_update_fat16_buffer:
   862 0000C680 81C3001C0900        <1> 	add	ebx, FAT_Buffer ; 26/02/2016
   863                              <1> 	;movzx	eax, word [ebx]
   864 0000C686 668B03              <1> 	mov	ax, [ebx]
   865                              <1> 	; 01/03/2016
   866 0000C689 89C2                <1> 	mov	edx, eax ; old value of the cluster
   867 0000C68B A3[5A800100]        <1> 	mov	[FAT_CurrentCluster], eax
   868 0000C690 8B0D[FC820100]      <1> 	mov	ecx, [ClusterValue] ; 32 bits
   869 0000C696 66890B              <1> 	mov	[ebx], cx ; 16 bits !
   870                              <1> 
   871 0000C699 C605[5E800100]02    <1> 	mov	byte [FAT_BuffValidData], 2
   872                              <1> 	
   873 0000C6A0 6683F802            <1> 	cmp	ax, 2
   874 0000C6A4 7262                <1> 	jb	short return_uc_fat16_stc
   875 0000C6A6 3B05[6A800100]      <1> 	cmp	eax, [LastCluster]
   876 0000C6AC 775A                <1> 	ja	short return_uc_fat16_stc
   877                              <1> 
   878                              <1> loc_fat_buffer_updated:
   879                              <1> 	; 01/03/2016
   880 0000C6AE F8                  <1> 	clc
   881                              <1> loc_fat_buffer_stc_1:
   882 0000C6AF 9C                  <1> 	pushf
   883 0000C6B0 21C9                <1> 	and	ecx, ecx
   884 0000C6B2 7506                <1> 	jnz	short loc_fat_buffer_updated_1
   885                              <1> 
   886                              <1> 	; 01/03/2016 
   887                              <1> 	; new value of the cluster = 0 (free)
   888                              <1> 	; increase free(d) cluster count
   889 0000C6B4 FF05[66800100]      <1> 	inc	dword [FAT_ClusterCounter]
   890                              <1> 
   891                              <1> loc_fat_buffer_updated_1: ; new value of the cluster > 0
   892 0000C6BA 09D2                <1> 	or	edx, edx ; 02/03/2016
   893 0000C6BC 7506                <1> 	jnz	short loc_fat_buffer_updated_2
   894                              <1> 	; old value of the cluster = 0 (it was free cluster)
   895                              <1> 	; decrease free(d) cluster count
   896 0000C6BE FF0D[66800100]      <1> 	dec	dword [FAT_ClusterCounter] ; it may be negative number
   897                              <1> 
   898                              <1> loc_fat_buffer_updated_2:
   899 0000C6C4 9D                  <1> 	popf
   900 0000C6C5 C3                  <1> 	retn
   901                              <1> 
   902                              <1> 	; 25/07/2022
   903                              <1> loc_fat_sectors_rw_error1:
   904                              <1> 	;mov	byte [FAT_BuffValidData], 0
   905                              <1> 	; 23/10/2016 (15h -> 17)
   906                              <1> 	; 23/03/2016
   907 0000C6C6 B811000000          <1> 	mov	eax, 17 ; Drive not ready or read error
   908 0000C6CB 8825[5E800100]      <1> 	mov	[FAT_BuffValidData], ah ; 0
   909                              <1> 
   910                              <1> loc_fat_sectors_rw_error2:
   911                              <1> 	;mov	eax, error code
   912                              <1> 	;mov	edx, 0
   913 0000C6D1 8B0D[FC820100]      <1> 	mov	ecx, [ClusterValue]
   914 0000C6D7 C3                  <1> 	retn
   915                              <1> 
   916                              <1> 	; 25/07/2022
   917                              <1> loc_uc_load_fat_sectors:
   918 0000C6D8 A3[62800100]        <1> 	mov	[FAT_BuffSector], eax
   919                              <1> 
   920                              <1> load_uc_fat_sectors_zero:
   921 0000C6DD 034660              <1> 	add	eax, [esi+LD_FATBegin]
   922 0000C6E0 BB001C0900          <1> 	mov	ebx, FAT_Buffer
   923 0000C6E5 B903000000          <1> 	mov	ecx, 3
   924 0000C6EA E89E570000          <1> 	call	disk_read
   925 0000C6EF 72D5                <1> 	jc	short loc_fat_sectors_rw_error1
   926                              <1> 
   927 0000C6F1 C605[5E800100]01    <1>         mov     byte [FAT_BuffValidData], 1
   928 0000C6F8 A1[5A800100]        <1> 	mov 	eax, [FAT_CurrentCluster]
   929 0000C6FD 8B0D[FC820100]      <1> 	mov	ecx, [ClusterValue]
   930 0000C703 E903FFFFFF          <1>         jmp     loc_update_cluster_check_fat_type
   931                              <1> 
   932                              <1> return_uc_fat16_stc:
   933                              <1> 	; 25/07/2022
   934                              <1> return_uc_fat_stc:
   935                              <1> 	; 01/03/2016
   936 0000C708 31C0                <1> 	xor	eax, eax
   937 0000C70A F9                  <1> 	stc
   938 0000C70B EBA2                <1> 	jmp	short loc_fat_buffer_stc_1
   939                              <1> 
   940                              <1> update_fat12_cluster:
   941                              <1> pass_uc_fat12_errc:
   942                              <1> 	;sub	edx, edx
   943 0000C70D BB00040000          <1> 	mov	ebx, 400h ;1024
   944 0000C712 F7F3                <1> 	div	ebx
   945                              <1> 	; EAX = Count of 3 FAT sectors
   946                              <1> 	; DX = Cluster offset in FAT buffer
   947                              <1> 	;mov	cx, 3
   948                              <1> 	; 25/07/2022
   949 0000C714 29C9                <1> 	sub	ecx, ecx
   950 0000C716 B103                <1> 	mov	cl, 3
   951                              <1> 	; ecx = 3
   952                              <1> 	;mov	bx, ax
   953 0000C718 89C3                <1> 	mov	ebx, eax
   954                              <1> 	;mov	ax, cx ; 3
   955 0000C71A 89C8                <1> 	mov	eax, ecx
   956                              <1> 	;mul	dx     ; Multiply by 3
   957 0000C71C F7E2                <1> 	mul	edx
   958                              <1> 	;shr	ax, 1  ; Divide by 2
   959 0000C71E D1E8                <1> 	shr	eax, 1
   960                              <1> 	;xchg	bx, ax
   961 0000C720 93                  <1> 	xchg	ebx, eax
   962                              <1> 	; EAX = Count of 3 FAT sectors
   963                              <1> 	; EBX = Byte Offset in FAT buffer   
   964                              <1> 	;mul	cx  ; 3 * AX
   965 0000C721 F7E1                <1> 	mul	ecx ; 3 * EAX
   966                              <1> 	; EAX = FAT Beginning Sector
   967                              <1> 	; EDX = 0
   968 0000C723 8A0D[5E800100]      <1> 	mov	cl, [FAT_BuffValidData]
   969                              <1> 	; TRDOS v1 has a FATal bug here ! 
   970                              <1> 	; (it does not have 'cmp cl, 2' instruction here !
   971                              <1> 	;  while 'jne' is existing !)
   972 0000C729 80F902              <1> 	cmp	cl, 2 ; 2 = dirty buffer (must be written to disk)
   973 0000C72C 750D                <1> 	jne	short loc_uc_check_fat12_buff_sector_load
   974                              <1> 
   975                              <1> loc_uc_check_fat12_buff_sector_save:
   976 0000C72E 3B05[62800100]      <1> 	cmp	eax, [FAT_BuffSector]
   977                              <1>         ;jne	short loc_uc_save_fat_buffer
   978                              <1> 	;jmp	short loc_update_fat12_cell
   979                              <1> 	; 07/08/2022
   980 0000C734 7412                <1> 	je	short loc_update_fat12_cell
   981 0000C736 E928FFFFFF          <1> 	jmp	loc_uc_save_fat_buffer
   982                              <1> 
   983                              <1> loc_uc_check_fat12_buff_sector_load:
   984 0000C73B 80F901              <1> 	cmp	cl, 1 ; byte ptr [FAT_BuffValidData]
   985 0000C73E 7598                <1>         jne     short loc_uc_load_fat_sectors
   986 0000C740 3B05[62800100]      <1> 	cmp	eax, [FAT_BuffSector]
   987 0000C746 7590                <1> 	jne	short loc_uc_load_fat_sectors
   988                              <1> 	; 07/08/2022
   989                              <1> 	;je	short loc_update_fat12_cell
   990                              <1> 	;jmp	loc_uc_load_fat_sectors
   991                              <1> 
   992                              <1> loc_update_fat12_cell:
   993 0000C748 81C3001C0900        <1> 	add	ebx, FAT_Buffer ; 26/02/2016
   994                              <1> 	;mov	cx, [FAT_CurrentCluster]
   995                              <1> 	; 25/07/2022
   996 0000C74E 8B0D[5A800100]      <1> 	mov	ecx, [FAT_CurrentCluster] 
   997                              <1> 	;shr	cx, 1
   998                              <1> 	; 25/07/2022
   999 0000C754 D1E9                <1> 	shr	ecx, 1
  1000 0000C756 668B03              <1> 	mov	ax, [ebx]
  1001                              <1> 	;mov	dx, ax
  1002 0000C759 89C2                <1> 	mov	edx, eax ; 25/07/2022
  1003 0000C75B 7336                <1> 	jnc	short uc_fat12_nc_even
  1004                              <1> 
  1005                              <1> 	;and	ax, 0Fh
  1006                              <1> 	; 25/07/2022
  1007 0000C75D 240F                <1> 	and	al, 0Fh
  1008 0000C75F 8B0D[FC820100]      <1> 	mov	ecx, [ClusterValue] ; 32 bits
  1009                              <1> 	;shl	cx, 4
  1010 0000C765 C1E104              <1> 	shl	ecx, 4
  1011                              <1> 	;or	cx, ax
  1012 0000C768 08C1                <1> 	or	cl, al ; 25/07/2022
  1013                              <1> 	;mov	ax, dx
  1014 0000C76A 89D0                <1> 	mov	eax, edx
  1015 0000C76C 66890B              <1> 	mov	[ebx], cx  ; 16 bits !
  1016                              <1> 	;shr	ax, 4 ; al(bit4..7)+ah(bit0..7)
  1017                              <1> 	; 25/07/2022
  1018 0000C76F C1E804              <1> 	shr	eax, 4
  1019                              <1> 
  1020                              <1> update_fat12_buffer:
  1021 0000C772 A3[5A800100]        <1> 	mov	[FAT_CurrentCluster], eax
  1022 0000C777 89C2                <1> 	mov	edx, eax ; 01/03/2016
  1023 0000C779 C605[5E800100]02    <1> 	mov	byte [FAT_BuffValidData], 2
  1024 0000C780 6683F802            <1> 	cmp	ax, 2
  1025 0000C784 725E                <1>         jb      short return_uc_fat12_stc
  1026 0000C786 3B05[6A800100]      <1> 	cmp	eax, [LastCluster]
  1027 0000C78C 7756                <1>         ja      short return_uc_fat12_stc
  1028 0000C78E E91BFFFFFF          <1>         jmp     loc_fat_buffer_updated
  1029                              <1> 
  1030                              <1> uc_fat12_nc_even:
  1031 0000C793 662500F0            <1> 	and	ax, 0F000h
  1032 0000C797 8B0D[FC820100]      <1> 	mov	ecx, [ClusterValue] ; 32 bits
  1033 0000C79D 80E50F              <1> 	and	ch, 0Fh
  1034                              <1> 	;or	cx, ax
  1035                              <1> 	; 25/07/2022
  1036 0000C7A0 09C1                <1> 	or	ecx, eax
  1037                              <1> 	;mov	ax, dx
  1038 0000C7A2 89D0                <1> 	mov	eax, edx
  1039 0000C7A4 66890B              <1> 	mov	[ebx], cx ; 16 bits !
  1040 0000C7A7 80E40F              <1> 	and	ah, 0Fh ; al(bit0..7)+ah(bit0..3)
  1041 0000C7AA EBC6                <1> 	jmp	short update_fat12_buffer
  1042                              <1> 
  1043                              <1> update_fat32_cluster:
  1044 0000C7AC 8B4E78              <1> 	mov	ecx, [esi+LD_Clusters]
  1045 0000C7AF 41                  <1> 	inc	ecx
  1046 0000C7B0 890D[6A800100]      <1> 	mov	[LastCluster], ecx
  1047                              <1> 
  1048 0000C7B6 39C8                <1> 	cmp	eax, ecx
  1049 0000C7B8 772A                <1>         ja      short return_uc_fat32_stc ; 25/07/2022
  1050                              <1> 
  1051                              <1> pass_uc_fat32_errc:
  1052                              <1> 	;sub	edx, edx
  1053 0000C7BA BB80010000          <1> 	mov	ebx, 180h ;384
  1054 0000C7BF F7F3                <1> 	div	ebx
  1055                              <1> 	; EAX = Count of 3 FAT sectors
  1056                              <1> 	; DX = Cluster offset in FAT buffer
  1057 0000C7C1 89D3                <1> 	mov	ebx, edx
  1058 0000C7C3 C1E302              <1> 	shl	ebx, 2 ; Multiply by 4
  1059                              <1> 	;mov	edx, 3	
  1060                              <1> 	; 25/07/2022
  1061                              <1> 	;xor	dh, dh
  1062                              <1> 	;mov	dl, 3
  1063 0000C7C6 66BA0300            <1> 	mov	dx, 3
  1064 0000C7CA F7E2                <1> 	mul	edx
  1065                              <1> 	; EBX = Cluster Offset in FAT buffer
  1066                              <1> 	; EAX = FAT Sector
  1067                              <1> 	; EDX = 0
  1068 0000C7CC 8A0D[5E800100]      <1> 	mov	cl, [FAT_BuffValidData]
  1069 0000C7D2 80F902              <1> 	cmp	cl, 2
  1070 0000C7D5 7515                <1> 	jne	short loc_uc_check_fat32_buff_sector_load
  1071                              <1> 
  1072                              <1> loc_uc_check_fat32_buff_sector_save:
  1073 0000C7D7 3B05[62800100]      <1> 	cmp	eax, [FAT_BuffSector]
  1074                              <1> 	;jne	loc_uc_save_fat_buffer
  1075                              <1> 	;jmp	short loc_update_fat32_cell
  1076                              <1> 	; 25/07/2022
  1077 0000C7DD 741F                <1> 	je	short loc_update_fat32_cell
  1078 0000C7DF E97FFEFFFF          <1> 	jmp	loc_uc_save_fat_buffer
  1079                              <1> 
  1080                              <1> return_uc_fat12_stc:
  1081                              <1> return_uc_fat32_stc:
  1082                              <1> 	; 25/07/2022
  1083 0000C7E4 29C0                <1> 	sub	eax, eax
  1084 0000C7E6 F9                  <1> 	stc
  1085 0000C7E7 E9C3FEFFFF          <1> 	jmp	loc_fat_buffer_stc_1
  1086                              <1> 
  1087                              <1> loc_uc_check_fat32_buff_sector_load:
  1088 0000C7EC 80F901              <1> 	cmp	cl, 1 ; byte [FAT_BuffValidData]
  1089                              <1> 	;jne	loc_uc_load_fat_sectors
  1090                              <1> 	; 25/07/2022
  1091 0000C7EF 7508                <1> 	jne	short loc_uc_load_fat_sects
  1092 0000C7F1 3B05[62800100]      <1> 	cmp	eax, [FAT_BuffSector]
  1093                              <1> 	;jne	loc_uc_load_fat_sectors
  1094                              <1> 	; 25/07/2022
  1095 0000C7F7 7405                <1> 	je	short loc_update_fat32_cell
  1096                              <1> loc_uc_load_fat_sects:
  1097 0000C7F9 E9DAFEFFFF          <1> 	jmp	loc_uc_load_fat_sectors	
  1098                              <1> 
  1099                              <1> loc_update_fat32_cell:
  1100                              <1> loc_update_fat32_buffer:
  1101 0000C7FE 81C3001C0900        <1> 	add	ebx, FAT_Buffer ; 26/02/2016
  1102 0000C804 8B03                <1> 	mov	eax, [ebx]
  1103 0000C806 25FFFFFF0F          <1> 	and	eax, 0FFFFFFFh ; 28 bit cluster value
  1104                              <1> 	
  1105 0000C80B 8B15[5A800100]      <1> 	mov	edx, [FAT_CurrentCluster] ; 01/03/2016
  1106                              <1> 
  1107 0000C811 A3[5A800100]        <1> 	mov 	[FAT_CurrentCluster], eax
  1108 0000C816 8B0D[FC820100]      <1> 	mov	ecx, [ClusterValue]
  1109 0000C81C 890B                <1> 	mov	[ebx], ecx ; 29/02/2016 
  1110                              <1> 
  1111 0000C81E C605[5E800100]02    <1> 	mov	byte [FAT_BuffValidData], 2
  1112                              <1> 
  1113                              <1> 	; 01/03/2016
  1114 0000C825 21C0                <1> 	and	eax, eax ; was it free cluster ?
  1115 0000C827 7513                <1> 	jnz	short loc_upd_fat32_c0
  1116                              <1> 
  1117                              <1> 	;or	ecx, ecx ; it will be left free ?!
  1118                              <1> 	;jz	short loc_upd_fat32_c3
  1119                              <1> 
  1120 0000C829 3B563E              <1> 	cmp	edx, [esi+LD_BPB+BPB_Reserved+4] ; First free cluster
  1121 0000C82C 751F                <1> 	jne	short loc_upd_fat32_c3
  1122                              <1> 
  1123 0000C82E 3B15[6A800100]      <1> 	cmp	edx, [LastCluster]
  1124 0000C834 7206                <1> 	jb	short loc_upd_fat32_c0
  1125                              <1> 
  1126                              <1> 	;mov	edx, 2 ; rewind !
  1127                              <1> 	; 25/07/2022
  1128 0000C836 29D2                <1> 	sub	edx, edx
  1129 0000C838 B202                <1> 	mov	dl, 2
  1130 0000C83A EB0E                <1> 	jmp	short loc_upd_fat32_c2
  1131                              <1> 
  1132                              <1> loc_upd_fat32_c0:
  1133 0000C83C FF463E              <1> 	inc	dword [esi+LD_BPB+BPB_Reserved+4] ; set it to next cluster		
  1134 0000C83F EB0C                <1> 	jmp	short loc_upd_fat32_c3
  1135                              <1> 
  1136                              <1> loc_upd_fat32_c1:
  1137 0000C841 09C9                <1> 	or	ecx, ecx ; will it be free cluster ?
  1138 0000C843 7508                <1> 	jnz	short loc_upd_fat32_c3
  1139                              <1> 
  1140 0000C845 3B563E              <1> 	cmp	edx, [esi+LD_BPB+BPB_Reserved+4] ; First free cluster
  1141 0000C848 7303                <1> 	jnb	short loc_upd_fat32_c3
  1142                              <1> 
  1143                              <1> loc_upd_fat32_c2:	
  1144 0000C84A 89563E              <1> 	mov	[esi+LD_BPB+BPB_Reserved+4], edx			
  1145                              <1> 
  1146                              <1> loc_upd_fat32_c3:
  1147 0000C84D 89C2                <1> 	mov	edx, eax
  1148                              <1> 
  1149                              <1> loc_upd_fat32_c4:
  1150 0000C84F 83F802              <1> 	cmp	eax, 2
  1151 0000C852 7290                <1> 	jb	short return_uc_fat32_stc ; 25/07/2022 
  1152                              <1> 
  1153                              <1> pass_uc_fat32_c_zero_check_2:
  1154 0000C854 3B05[6A800100]      <1> 	cmp	eax, [LastCluster]
  1155 0000C85A 7788                <1> 	ja	short return_uc_fat32_stc ; 25/07/2022
  1156                              <1> 	
  1157 0000C85C E94DFEFFFF          <1> 	jmp     loc_fat_buffer_updated
  1158                              <1> 
  1159                              <1> 
  1160                              <1> save_fat_buffer:
  1161                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
  1162                              <1> 	; 15/10/2016
  1163                              <1> 	; 01/03/2016
  1164                              <1> 	; 22/02/2016 (TRDOS 386 = TRDOS v2.0)
  1165                              <1> 	; 11/08/2011
  1166                              <1> 	; 09/02/2005 
  1167                              <1> 	; INPUT ->
  1168                              <1> 	;	None
  1169                              <1> 	; OUTPUT ->
  1170                              <1> 	;	cf = 0 -> OK.
  1171                              <1> 	;	cf = 1 -> error code in AL (EAX)
  1172                              <1> 	;
  1173                              <1> 	;	EBX = FAT_Buffer address
  1174                              <1> 	;
  1175                              <1> 	; (EAX, EDX, ECX will be modified)
  1176                              <1> 
  1177                              <1> 	;cmp	byte [FAT_BuffValidData], 2 
  1178                              <1> 	;je	short loc_save_fat_buff
  1179                              <1> 
  1180                              <1> ;loc_save_fat_buffer_retn:
  1181                              <1> ;	xor	eax, eax
  1182                              <1> ;	retn
  1183                              <1> 
  1184                              <1> loc_save_fat_buff:
  1185 0000C861 31D2                <1> 	xor	edx, edx
  1186 0000C863 8A35[5F800100]      <1> 	mov	dh, [FAT_BuffDrvName]
  1187 0000C869 80FE41              <1> 	cmp	dh, 'A'
  1188 0000C86C 7252                <1> 	jb	short loc_save_fat_buffer_inv_data_retn
  1189 0000C86E 80EE41              <1> 	sub	dh, 'A'
  1190 0000C871 56                  <1> 	push	esi ; *
  1191 0000C872 BE00010900          <1>         mov     esi, Logical_DOSDisks
  1192 0000C877 01D6                <1> 	add	esi, edx
  1193                              <1> 	
  1194 0000C879 8A5603              <1> 	mov	dl, [esi+LD_FATType]
  1195 0000C87C 20D2                <1> 	and	dl, dl
  1196 0000C87E 743F                <1> 	jz	short loc_save_fat_buffer_inv_data_pop_retn 
  1197                              <1> 
  1198 0000C880 A1[62800100]        <1> 	mov	eax, [FAT_BuffSector]
  1199 0000C885 80FA02              <1> 	cmp	dl, 2
  1200 0000C888 772E                <1> 	ja	short loc_save_fat32_buff
  1201                              <1> 
  1202                              <1> loc_save_fat_12_16_buff:
  1203                              <1> 	; 01/03/2016
  1204                              <1> 	; TRDOS v1 has a FATal bug here!
  1205                              <1> 	; Correct code: mov dx, word ptr [FAT_BuffSector]+2
  1206                              <1> 	; (DX:AX in TRDOS v1 -> EAX in TRDOS v2)
  1207                              <1> 	;
  1208 0000C88A 0FB74E1C            <1> 	movzx	ecx, word [esi+LD_BPB+FATSecs] 
  1209 0000C88E 29C1                <1> 	sub	ecx, eax
  1210                              <1> 	; TRDOS v1 has a bug here... ('pop esi' was forgotten!)
  1211                              <1> 	;jna	short loc_save_fat_buffer_inv_data_retn ; wrong addr!
  1212 0000C890 762D                <1> 	jna	short loc_save_fat_buffer_inv_data_pop_retn ; correct addr.
  1213                              <1> 	; 25/07/2022
  1214                              <1> 	;jmp	short loc_save_fat_buffer_check_rs3
  1215                              <1> 
  1216                              <1> loc_save_fat_buffer_check_rs3:
  1217                              <1> 	; 25/07/2022
  1218 0000C892 29DB                <1> 	sub	ebx, ebx
  1219 0000C894 B303                <1> 	mov	bl, 3
  1220                              <1> 	;cmp	ecx, 3
  1221 0000C896 39D9                <1> 	cmp	ecx, ebx ; 3
  1222 0000C898 7602                <1> 	jna	short loc_save_fat_buff_continue
  1223 0000C89A 89D9                <1> 	mov	ecx, ebx ; mov ecx, 3
  1224                              <1> loc_save_fat_buff_continue:
  1225 0000C89C BB001C0900          <1> 	mov	ebx, FAT_Buffer
  1226 0000C8A1 034660              <1> 	add	eax, [esi+LD_FATBegin]
  1227 0000C8A4 51                  <1> 	push	ecx
  1228 0000C8A5 E8D4550000          <1> 	call	disk_write
  1229 0000C8AA 59                  <1> 	pop	ecx
  1230 0000C8AB 7239                <1> 	jc	short loc_save_FAT_buff_write_err
  1231                              <1> 	
  1232 0000C8AD 807E0302            <1> 	cmp	byte [esi+LD_FATType], 2
  1233 0000C8B1 7613                <1> 	jna	short loc_calc_2nd_fat12_16_addr
  1234                              <1> 
  1235                              <1> loc_calc_2nd_fat32_addr:
  1236 0000C8B3 8B462A              <1> 	mov	eax, [esi+LD_BPB+FAT32_FAT_Size]
  1237 0000C8B6 EB12                <1> 	jmp	short loc_calc_2nd_fat_addr
  1238                              <1> 
  1239                              <1> 	; 25/07/2022
  1240                              <1> loc_save_fat32_buff:
  1241 0000C8B8 8B4E2A              <1> 	mov	ecx, [esi+LD_BPB+FAT32_FAT_Size]
  1242 0000C8BB 29C1                <1> 	sub	ecx, eax
  1243 0000C8BD 77D3                <1> 	ja	short loc_save_fat_buffer_check_rs3
  1244                              <1> 
  1245                              <1> loc_save_fat_buffer_inv_data_pop_retn:
  1246 0000C8BF 5E                  <1> 	pop	esi ; *
  1247                              <1> loc_save_fat_buffer_inv_data_retn:
  1248                              <1> 	;mov	eax, 0Dh ; Invalid DATA
  1249                              <1> 	; 25/07/2022
  1250 0000C8C0 29C0                <1> 	sub	eax, eax
  1251 0000C8C2 B00D                <1> 	mov	al, 0Dh  ; Invalid DATA
  1252 0000C8C4 F9                  <1> 	stc	; cf = 1
  1253 0000C8C5 C3                  <1> 	retn
  1254                              <1> 
  1255                              <1> loc_calc_2nd_fat12_16_addr:
  1256 0000C8C6 0FB7461C            <1> 	movzx	eax, word [esi+LD_BPB+FATSecs]
  1257                              <1> 
  1258                              <1> loc_calc_2nd_fat_addr:
  1259 0000C8CA 034660              <1> 	add	eax, [esi+LD_FATBegin]
  1260 0000C8CD 0305[62800100]      <1> 	add	eax, [FAT_BuffSector]
  1261 0000C8D3 BB001C0900          <1> 	mov	ebx, FAT_Buffer
  1262                              <1> 	; ecx = 1 to 3
  1263 0000C8D8 E8A1550000          <1> 	call	disk_write
  1264 0000C8DD 7207                <1> 	jc	short loc_save_FAT_buff_write_err
  1265                              <1>  	; Valid  buffer (1 = valid but do not save)
  1266 0000C8DF C605[5E800100]01    <1> 	mov	byte [FAT_BuffValidData], 1
  1267                              <1> 
  1268                              <1> loc_save_FAT_buff_write_err:
  1269 0000C8E6 5E                  <1> 	pop	esi ; *
  1270 0000C8E7 BB001C0900          <1> 	mov	ebx, FAT_Buffer
  1271                              <1> 	; 15/10/2016 (1Dh -> 18)
  1272                              <1> 	; 23/03/2016 (1Dh)
  1273 0000C8EC B812000000          <1> 	mov	eax, 18 ; Drive not ready or write error
  1274 0000C8F1 C3                  <1> 	retn
  1275                              <1> 
  1276                              <1> calculate_fat_freespace:
  1277                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
  1278                              <1> 	; 23/03/2016
  1279                              <1> 	; 02/03/2016
  1280                              <1> 	; 01/03/2016
  1281                              <1> 	; 29/02/2016
  1282                              <1> 	; 22/02/2016 (TRDOS 386 = TRDOS v2.0)
  1283                              <1> 	; 30/04/2011
  1284                              <1> 	; 03/04/2010
  1285                              <1> 	; 2005
  1286                              <1> 	; INPUT ->
  1287                              <1> 	;	EAX = Cluster count to be added or subtracted
  1288                              <1> 	; 	If BH = FFh, ESI = TR-DOS Logical Drive Description Table
  1289                              <1> 	; 	If BH < FFh, BH = TR-DOS Logical Drive Number
  1290                              <1> 	; 	BL: 
  1291                              <1> 	;	0 = Calculate, 1 = Add, 2 = Subtract, 3 = Get (Not Set/Calc)
  1292                              <1> 	; OUTPUT ->
  1293                              <1> 	;	EAX = Free Space in sectors
  1294                              <1> 	;	ESI = Logical Dos Drive Description Table address
  1295                              <1> 	;	BH = Logical Dos Drive Number (same with input value of BH)
  1296                              <1> 	;	BL = Type of operation (same with input value of BL)
  1297                              <1> 	;	ECX = 0 -> valid
  1298                              <1> 	;	ECX > 0 -> error or invalid
  1299                              <1> 	;	If EAX = FFFFFFFFh, it is 're-calculation needed'
  1300                              <1> 	;			          sign due to r/w error   
  1301                              <1> 
  1302 0000C8F2 66891D[02830100]    <1> 	mov	[CFS_OPType], bx
  1303 0000C8F9 A3[04830100]        <1> 	mov	[CFS_CC], eax
  1304                              <1> 	
  1305 0000C8FE 80FFFF              <1> 	cmp	bh, 0FFh
  1306 0000C901 740B                <1> 	je	short pass_calculate_freespace_get_drive_dt_offset
  1307                              <1> 
  1308                              <1> loc_calculate_freespace_get_drive_dt_offset:     
  1309 0000C903 31C0                <1> 	xor	eax, eax
  1310 0000C905 88FC                <1>         mov     ah, bh
  1311 0000C907 BE00010900          <1> 	mov	esi, Logical_DOSDisks
  1312 0000C90C 01C6                <1>         add     esi, eax
  1313                              <1> 
  1314                              <1> pass_calculate_freespace_get_drive_dt_offset:
  1315 0000C90E 08DB                <1> 	or	bl, bl
  1316 0000C910 7436                <1> 	jz	short loc_reset_fcc
  1317                              <1> 	
  1318                              <1> loc_get_free_sectors:
  1319 0000C912 8B4674              <1> 	mov	eax, [esi+LD_FreeSectors]
  1320                              <1> 
  1321                              <1> 	;xor	ecx, ecx
  1322                              <1> 	;dec	ecx ; 0FFFFFFFFh
  1323                              <1> 	;cmp	eax, ecx ; 29/02/2016
  1324                              <1> 	;je	short loc_get_free_sectors_retn ; recalculation is needed!
  1325                              <1> 	
  1326                              <1> 	; 23/03/2016
  1327 0000C915 8B4E70              <1> 	mov	ecx, [esi+LD_TotalSectors]
  1328 0000C918 39C1                <1> 	cmp	ecx, eax ; Total sectors must be greater than Free sectors !
  1329 0000C91A 7707                <1> 	ja	short loc_get_free_sectors_check_optype
  1330                              <1> 	
  1331 0000C91C 31C0                <1> 	xor	eax, eax
  1332 0000C91E 48                  <1> 	dec	eax ; 0FFFFFFFFh  ; recalculation is needed!
  1333 0000C91F 894674              <1> 	mov	[esi+LD_FreeSectors], eax ; reset (for recalculation)
  1334                              <1> 		
  1335                              <1> loc_get_free_sectors_retn:
  1336 0000C922 C3                  <1> 	retn
  1337                              <1> 	
  1338                              <1> loc_get_free_sectors_check_optype:
  1339 0000C923 80FB03              <1> 	cmp	bl, 3
  1340 0000C926 7203                <1> 	jb	short loc_set_fcc_1 ; 25/07/2022
  1341                              <1> 
  1342 0000C928 29C9                <1> 	sub	ecx, ecx ; 0
  1343                              <1> 
  1344 0000C92A C3                  <1> 	retn	
  1345                              <1> 
  1346                              <1> loc_set_fcc_1:
  1347 0000C92B 807E0302            <1> 	cmp	byte [esi+LD_FATType], 2
  1348                              <1> 	;ja	loc_update_FAT32_fs_info_fcc
  1349                              <1> 	; 25/07/2022
  1350 0000C92F 7605                <1> 	jna	short loc_set_fcc_2
  1351 0000C931 E9DD000000          <1> 	jmp	loc_update_FAT32_fs_info_fcc
  1352                              <1> 
  1353                              <1> loc_set_fcc_2:
  1354                              <1> 	;mov	eax, [esi+LD_FreeSectors]
  1355 0000C936 0FB64E13            <1> 	movzx	ecx, byte [esi+LD_BPB+SecPerClust]
  1356 0000C93A 29D2                <1> 	sub	edx, edx
  1357 0000C93C F7F1                <1> 	div	ecx
  1358                              <1> 	;or	dx, dx 
  1359                              <1> 	;	; DX -> Remain sectors < SecPerClust
  1360                              <1> 	;	; DX > 0 -> invalid free sector count
  1361                              <1> 	;jnz	short loc_reset_fcc 
  1362                              <1> 
  1363                              <1> ;pass_set_fcc_div32:
  1364 0000C93E A3[7C800100]        <1> 	mov	[FreeClusterCount], eax
  1365 0000C943 E986000000          <1>         jmp     loc_set_free_sectors_FAT12_FAT16
  1366                              <1> 
  1367                              <1> loc_reset_fcc:
  1368 0000C948 31C0                <1> 	xor	eax, eax
  1369 0000C94A A3[7C800100]        <1> 	mov	[FreeClusterCount], eax ; 0
  1370 0000C94F 8B5678              <1> 	mov	edx, [esi+LD_Clusters]
  1371 0000C952 42                  <1> 	inc	edx
  1372 0000C953 8915[6A800100]      <1> 	mov	[LastCluster], edx
  1373                              <1> 
  1374 0000C959 807E0302            <1> 	cmp	byte [esi+LD_FATType], 2
  1375 0000C95D 7645                <1> 	jna	short loc_count_free_fat_clusters_0  
  1376                              <1> 
  1377 0000C95F 48                  <1> 	dec	eax ; FFFFFFFFh
  1378 0000C960 A3[0C830100]        <1> 	mov	[CFS_FAT32FC], eax
  1379                              <1> 
  1380                              <1> 	; 29/02/2016
  1381 0000C965 89463A              <1> 	mov	[esi+LD_BPB+BPB_Reserved], eax ; reset
  1382 0000C968 89463E              <1> 	mov	[esi+LD_BPB+BPB_Reserved+4], eax ; reset
  1383                              <1> 	
  1384                              <1> 	;mov 	eax, 2
  1385                              <1> 	; 25/07/2022
  1386 0000C96B 40                  <1> 	inc	eax ; eax = 0
  1387 0000C96C B002                <1> 	mov	al, 2
  1388                              <1> 
  1389                              <1> loc_count_fc_next_cluster_0:
  1390 0000C96E 50                  <1> 	push	eax
  1391 0000C96F E87BF9FFFF          <1> 	call	get_next_cluster
  1392 0000C974 7310                <1> 	jnc	short loc_check_fat32_ff_cluster
  1393 0000C976 09C0                <1> 	or	eax, eax
  1394 0000C978 741E                <1> 	jz	short pass_inc_cfs_fcc_0
  1395                              <1> 
  1396                              <1> loc_put_fcc_unknown_sign:
  1397 0000C97A 58                  <1> 	pop	eax
  1398                              <1> 	; "Free count is Unknown" sign
  1399                              <1> 	;mov	dword [FreeClusterCount], 0FFFFFFFFh
  1400                              <1> 
  1401                              <1> 	; 29/02/2016
  1402                              <1> 	; Save Free Cluster Count value in FAT32 'BPB_Reserved' area
  1403                              <1> 	;mov	[esi+LD_BPB+BPB_Reserved], 0FFFFFFFFh ; unknown!
  1404 0000C97B 8B15[0C830100]      <1> 	mov	edx, [CFS_FAT32FC] ; First Free Cluster
  1405                              <1> 	; Save First Free Cluster value in FAT32 'BPB_Reserved+4' area
  1406 0000C981 89563E              <1> 	mov	[esi+LD_BPB+BPB_Reserved+4], edx
  1407                              <1> 	
  1408 0000C984 EB7D                <1>         jmp     loc_put_fcc_invalid_sign
  1409                              <1> 
  1410                              <1> loc_check_fat32_ff_cluster:
  1411 0000C986 09C0                <1> 	or	eax, eax
  1412 0000C988 750E                <1> 	jnz	short pass_inc_cfs_fcc_0
  1413 0000C98A 58                  <1> 	pop	eax
  1414 0000C98B A3[0C830100]        <1> 	mov	[CFS_FAT32FC], eax
  1415                              <1> 	;mov	dword [FreeClusterCount], 1
  1416 0000C990 FF05[7C800100]      <1> 	inc	dword [FreeClusterCount]
  1417 0000C996 EB27                <1> 	jmp	short pass_inc_cfs_fcc_1
  1418                              <1> 
  1419                              <1> pass_inc_cfs_fcc_0:
  1420 0000C998 58                  <1> 	pop	eax
  1421                              <1> 
  1422                              <1> pass_inc_cfs_fcc_0c:
  1423 0000C999 40                  <1> 	inc	eax ; add eax, 1
  1424 0000C99A 3B05[6A800100]      <1> 	cmp	eax, [LastCluster]
  1425 0000C9A0 76CC                <1> 	jna 	short loc_count_fc_next_cluster_0
  1426 0000C9A2 EB6F                <1> 	jmp	short loc_update_FAT32_fs_info_fcc
  1427                              <1> 
  1428                              <1> loc_count_free_fat_clusters_0:
  1429                              <1> 	;mov	eax, 2
  1430 0000C9A4 B002                <1> 	mov	al, 2
  1431                              <1> 
  1432                              <1> loc_count_fc_next_cluster:
  1433 0000C9A6 50                  <1> 	push	eax
  1434 0000C9A7 E843F9FFFF          <1> 	call	get_next_cluster
  1435 0000C9AC 720C                <1> 	jc	short loc_count_fcc_stc
  1436                              <1> 
  1437                              <1> loc_count_free_clusters_1:
  1438 0000C9AE 21C0                <1> 	and	eax, eax
  1439 0000C9B0 750C                <1> 	jnz	short pass_inc_cfs_fcc
  1440                              <1> 
  1441 0000C9B2 FF05[7C800100]      <1> 	inc	dword [FreeClusterCount]
  1442 0000C9B8 EB04                <1> 	jmp	short pass_inc_cfs_fcc
  1443                              <1> 
  1444                              <1> loc_count_fcc_stc:
  1445 0000C9BA 09C0                <1> 	or	eax, eax
  1446 0000C9BC 75BC                <1> 	jnz	short loc_put_fcc_unknown_sign ; 29/02/2016
  1447                              <1> 
  1448                              <1> pass_inc_cfs_fcc:
  1449 0000C9BE 58                  <1> 	pop	eax
  1450                              <1> 
  1451                              <1> pass_inc_cfs_fcc_1:
  1452 0000C9BF 40                  <1> 	inc	eax ; add eax, 1
  1453 0000C9C0 3B05[6A800100]      <1> 	cmp	eax, [LastCluster]
  1454 0000C9C6 76DE                <1> 	jna	short loc_count_fc_next_cluster
  1455                              <1> 
  1456                              <1> loc_set_free_sectors:
  1457 0000C9C8 807E0302            <1> 	cmp	byte [esi+LD_FATType], 2
  1458 0000C9CC 7745                <1> 	ja	short loc_update_FAT32_fs_info_fcc
  1459                              <1> 
  1460                              <1> loc_set_free_sectors_FAT12_FAT16:
  1461 0000C9CE 803D[02830100]00    <1> 	cmp	byte [CFS_OPType], 0
  1462 0000C9D5 761C                <1> 	jna	short pass_FAT_add_sub_fcc
  1463 0000C9D7 A1[04830100]        <1> 	mov	eax, [CFS_CC]
  1464 0000C9DC 803D[02830100]01    <1> 	cmp	byte [CFS_OPType], 1
  1465 0000C9E3 7708                <1> 	ja	short pass_FAT_add_fcc
  1466 0000C9E5 0105[7C800100]      <1> 	add 	[FreeClusterCount], eax
  1467 0000C9EB EB06                <1> 	jmp	short pass_FAT_add_sub_fcc
  1468                              <1> 
  1469                              <1> pass_FAT_add_fcc:
  1470 0000C9ED 2905[7C800100]      <1> 	sub	[FreeClusterCount], eax
  1471                              <1> 
  1472                              <1> pass_FAT_add_sub_fcc:
  1473 0000C9F3 0FB64613            <1> 	movzx	eax, byte [esi+LD_BPB+SecPerClust]
  1474 0000C9F7 8B15[7C800100]      <1> 	mov	edx, [FreeClusterCount]
  1475 0000C9FD F7E2                <1> 	mul	edx
  1476                              <1> 
  1477 0000C9FF 31C9                <1> 	xor	ecx, ecx 
  1478 0000CA01 EB05                <1> 	jmp	short loc_cfs_retn_params
  1479                              <1> 
  1480                              <1> loc_put_fcc_invalid_sign:
  1481 0000CA03 29C0                <1>        	sub	eax, eax ; 0
  1482 0000CA05 48                  <1> 	dec	eax ; FFFFFFFFh
  1483                              <1> loc_fat32_ffc_recalc_needed:
  1484 0000CA06 89C1                <1> 	mov	ecx, eax
  1485                              <1> 
  1486                              <1> loc_cfs_retn_params:
  1487 0000CA08 894674              <1> 	mov 	[esi+LD_FreeSectors], eax
  1488 0000CA0B 0FB71D[02830100]    <1> 	movzx	ebx, word [CFS_OPType]
  1489 0000CA12 C3                  <1> 	retn
  1490                              <1> 
  1491                              <1> loc_update_FAT32_fs_info_fcc:
  1492                              <1> loc_check_fcc_FSINFO_op:
  1493                              <1> 	; 29/02/2016
  1494                              <1> 	; EAX = Free cluster count (before this update) ; value from disk
  1495                              <1> 	; EDX = First Free Cluster (before this update) ; value from disk
  1496 0000CA13 803D[02830100]01    <1> 	cmp	byte [CFS_OPType], 1
  1497 0000CA1A 7221                <1> 	jb	short loc_cfs_FAT32_get_rcalc_parms ; 0 = recalculated
  1498 0000CA1C 7406                <1> 	je	short loc_check_fcc_FSINFO_op1 ; 1 = add
  1499                              <1> loc_check_fcc_FSINFO_op2: ; subtract
  1500 0000CA1E F71D[04830100]      <1> 	neg	dword [CFS_CC] ; prepare to subtract ; 2 = sub (add negative)
  1501                              <1> loc_check_fcc_FSINFO_op1:
  1502                              <1> 	; 01/03/2016
  1503 0000CA24 31D2                <1> 	xor	edx, edx ; 0
  1504 0000CA26 4A                  <1> 	dec	edx ; 0FFFFFFFFh
  1505 0000CA27 8B463A              <1> 	mov	eax, [esi+LD_BPB+BPB_Reserved]
  1506 0000CA2A 39D0                <1> 	cmp	eax, edx
  1507 0000CA2C 73D5                <1> 	jnb	short loc_put_fcc_invalid_sign
  1508 0000CA2E 0305[04830100]      <1>         add     eax, [CFS_CC] ; free cluster count on disk + current count
  1509 0000CA34 72CD                <1> 	jc	short loc_put_fcc_invalid_sign
  1510                              <1> 	
  1511 0000CA36 A3[7C800100]        <1> 	mov	[FreeClusterCount], eax
  1512 0000CA3B EB0E                <1> 	jmp	short loc_cfs_write_FSINFO_sector
  1513                              <1> 
  1514                              <1> loc_cfs_FAT32_get_rcalc_parms:
  1515 0000CA3D 8B15[0C830100]      <1> 	mov	edx, [CFS_FAT32FC]
  1516 0000CA43 A1[7C800100]        <1> 	mov	eax, [FreeClusterCount]
  1517 0000CA48 89563E              <1> 	mov	[esi+LD_BPB+BPB_Reserved+4], edx ; First Free Cluster
  1518                              <1> loc_cfs_write_FSINFO_sector:
  1519 0000CA4B 89463A              <1> 	mov	[esi+LD_BPB+BPB_Reserved], eax ; Free cluster count
  1520                              <1> 	; 01/03/2016
  1521 0000CA4E E8AA000000          <1> 	call	set_fat32_fsinfo_sector_parms
  1522 0000CA53 72AE                <1>         jc      short loc_put_fcc_invalid_sign
  1523                              <1> 
  1524                              <1> loc_set_FAT32_free_sectors:
  1525                              <1> 	; 29/02/2016
  1526                              <1> 	;mov	eax, [FreeClusterCount]
  1527                              <1> 	;mov	ecx, eax
  1528                              <1> 	;cmp	eax, 0FFFFFFFFh ; Invalid !
  1529                              <1> 	;je	short loc_cfs_retn_params
  1530                              <1> 	;
  1531 0000CA55 8B0D[7C800100]      <1> 	mov	ecx, [FreeClusterCount]
  1532 0000CA5B 0FB64613            <1> 	movzx	eax, byte [esi+LD_BPB+SecPerClust]
  1533 0000CA5F F7E1                <1> 	mul	ecx
  1534                              <1> 	; 29/02/2016
  1535 0000CA61 31C9                <1> 	xor	ecx, ecx ; 0
  1536 0000CA63 09D2                <1> 	or	edx, edx ; 0 ?
  1537 0000CA65 759C                <1>         jnz	short loc_put_fcc_invalid_sign ; 25/07/2022
  1538 0000CA67 394670              <1> 	cmp	[esi+LD_TotalSectors], eax ; Volume size in sectors
  1539 0000CA6A 7697                <1>         jna     short loc_put_fcc_invalid_sign
  1540                              <1> 	;
  1541                              <1> loc_set_FAT32_free_sectors_ok:
  1542 0000CA6C 31D2                <1> 	xor	edx, edx ; 0
  1543 0000CA6E EB98                <1>         jmp     short loc_cfs_retn_params 
  1544                              <1> 	;
  1545                              <1> 
  1546                              <1> get_last_cluster:
  1547                              <1> 	; 22/10/2016
  1548                              <1> 	; 27/02/2016 (TRDOS 386 = TRDOS v2.0)
  1549                              <1> 	; 12/06/2010 (DRV_FAT.ASM, 'proc_get_last_custer')
  1550                              <1> 	; 06/06/2010
  1551                              <1> 	; INPUT ->
  1552                              <1> 	;	EAX = First Cluster Number
  1553                              <1> 	; 	ESI = Logical Dos Drive Parameters Table
  1554                              <1> 	; OUTPUT ->
  1555                              <1> 	;	cf = 0 -> No Error, EAX is valid
  1556                              <1> 	;	cf = 1 -> EAX > 0 -> Error
  1557                              <1> 	;	EAX = Last Cluster Number
  1558                              <1> 	;       ECX = Previous Cluster -just before the last cluster-
  1559                              <1> 	;       ; 22/10/2016
  1560                              <1> 	;	[glc_index] = cluster index number of the last cluster	
  1561                              <1> 	;
  1562                              <1> 	; (Modified registers: EAX, ECX, EBX, EDX)
  1563                              <1> 
  1564 0000CA70 89C1                <1> 	mov	ecx, eax
  1565                              <1> 
  1566 0000CA72 C705[14830100]FFFF- <1> 	mov	dword [glc_index], 0FFFFFFFFh ; 22/10/2016	
  1566 0000CA7A FFFF                <1>
  1567                              <1> 
  1568                              <1> loc_glc_get_next_cluster_1:
  1569 0000CA7C 890D[10830100]      <1> 	mov	[glc_prevcluster], ecx
  1570                              <1>  	; 22/10/2016
  1571 0000CA82 FF05[14830100]      <1> 	inc	dword [glc_index]
  1572                              <1> 
  1573                              <1> loc_glc_get_next_cluster_2:
  1574 0000CA88 E862F8FFFF          <1> 	call	get_next_cluster
  1575                              <1> 	; ecx = current/previous cluster 
  1576                              <1> 	; eax = next/last cluster
  1577 0000CA8D 73ED                <1> 	jnc	short loc_glc_get_next_cluster_1
  1578                              <1> 
  1579 0000CA8F 09C0                <1> 	or	eax, eax
  1580 0000CA91 7509                <1> 	jnz	short loc_glc_stc_retn
  1581                              <1> 
  1582                              <1> 	; ecx = previous cluster
  1583 0000CA93 89C8                <1>         mov	eax, ecx
  1584                              <1> 
  1585                              <1> 	; previous cluster becomes last cluster (ecx -> eax)
  1586                              <1> 	; previous of previous cluster becomes previous cluster (ecx)
  1587                              <1> 
  1588                              <1> loc_glc_prev_cluster_retn:
  1589 0000CA95 8B0D[10830100]      <1> 	mov	ecx, [glc_prevcluster] 
  1590 0000CA9B C3                  <1> 	retn
  1591                              <1> 
  1592                              <1> loc_glc_stc_retn:
  1593 0000CA9C F5                  <1> 	cmc	;stc
  1594 0000CA9D EBF6                <1>         jmp	short loc_glc_prev_cluster_retn
  1595                              <1> 
  1596                              <1> truncate_cluster_chain:
  1597                              <1> 	; 01/03/2016
  1598                              <1> 	; 28/02/2016 (TRDOS 386 = TRDOS v2.0)
  1599                              <1> 	; 22/01/2011 (DRV_FAT.ASM, 'proc_truncate_cluster_chain')
  1600                              <1> 	; 11/09/2010
  1601                              <1> 	; INPUT ->
  1602                              <1> 	;	ESI = Logical dos drive description table address
  1603                              <1> 	;	EAX = First cluster to be truncated/unlinked 
  1604                              <1> 	; OUTPUT ->
  1605                              <1> 	;	ESI = Logical dos drive description table address
  1606                              <1> 	; 	ECX = Count of truncated/removed clusters
  1607                              <1> 	; 	CF = 0 -> EAX = Free sectors
  1608                              <1> 	; 	CF = 1 -> Error code in EAX (AL)
  1609                              <1> 
  1610                              <1> 	; NOTE: This procedure does not update lm date&time ! 
  1611                              <1> 
  1612                              <1> loc_truncate_cc:	
  1613 0000CA9F 31C9                <1> 	xor	ecx, ecx ; mov ecx, 0
  1614                              <1> 	;mov	byte [FAT_BuffValidData], 0
  1615 0000CAA1 890D[66800100]      <1> 	mov	[FAT_ClusterCounter], ecx ; 0 ; reset
  1616                              <1> 
  1617                              <1> loc_tcc_unlink_clusters:
  1618 0000CAA7 E832FBFFFF          <1> 	call	update_cluster
  1619                              <1> 	; EAX = Next Cluster
  1620                              <1> 	; ECX = Cluster Value
  1621                              <1> 	; Note:
  1622                              <1> 	; Returns count of unlinked clusters in
  1623                              <1> 	; dword ptr FAT_ClusterCounter
  1624 0000CAAC 73F9                <1> 	jnc	short loc_tcc_unlink_clusters
  1625                              <1> 
  1626                              <1> pass_tcc_unlink_clusters:
  1627 0000CAAE A2[1B830100]        <1> 	mov	byte [TCC_FATErr], al
  1628 0000CAB3 803D[5E800100]02    <1> 	cmp	byte [FAT_BuffValidData], 2
  1629 0000CABA 750E                <1> 	jne	short loc_tcc_calculate_FAT_freespace
  1630 0000CABC E8A0FDFFFF          <1> 	call	save_fat_buffer
  1631 0000CAC1 7307                <1> 	jnc	short loc_tcc_calculate_FAT_freespace
  1632 0000CAC3 A2[1B830100]        <1> 	mov	byte [TCC_FATErr], al ; Error
  1633                              <1> 	;mov	byte [FAT_BuffValidData], 0
  1634                              <1> 
  1635                              <1> 	; 01/03/2016
  1636 0000CAC8 EB12                <1> 	jmp	short loc_tcc_recalculate_FAT_freespace
  1637                              <1> 
  1638                              <1> loc_tcc_calculate_FAT_freespace:
  1639 0000CACA A1[66800100]        <1> 	mov	eax, [FAT_ClusterCounter] ; signed (+-) number
  1640 0000CACF 66BB01FF            <1> 	mov	bx, 0FF01h ; BH = FFh -> ESI = Dos drv desc. table
  1641                              <1> 			   ; BL = 1 -> add cluster(s)
  1642 0000CAD3 E81AFEFFFF          <1> 	call	calculate_fat_freespace
  1643 0000CAD8 21C9                <1> 	and	ecx, ecx ; cx = 0 -> valid free sector count
  1644 0000CADA 7409                <1> 	jz	short pass_truncate_cc_recalc_FAT_freespace
  1645                              <1> 
  1646                              <1> loc_tcc_recalculate_FAT_freespace:
  1647 0000CADC 66BB00FF            <1> 	mov	bx, 0FF00h ; recalculate !
  1648 0000CAE0 E80DFEFFFF          <1> 	call	calculate_fat_freespace
  1649                              <1>               
  1650                              <1> loc_tcc_calculate_FAT_freespace_err:
  1651                              <1> pass_truncate_cc_recalc_FAT_freespace:
  1652 0000CAE5 8B0D[66800100]      <1> 	mov	ecx, [FAT_ClusterCounter]
  1653                              <1> 
  1654 0000CAEB 803D[1B830100]00    <1> 	cmp	byte [TCC_FATErr], 0
  1655 0000CAF2 7608                <1> 	jna	short loc_tcc_unlink_clusters_retn
  1656                              <1> 
  1657                              <1> loc_tcc_unlink_clusters_error:
  1658 0000CAF4 0FB605[1B830100]    <1> 	movzx	eax, byte [TCC_FATErr]
  1659 0000CAFB F9                  <1> 	stc
  1660                              <1> loc_tcc_unlink_clusters_retn:
  1661 0000CAFC C3                  <1> 	retn
  1662                              <1> 
  1663                              <1> set_fat32_fsinfo_sector_parms:
  1664                              <1> 	; 15/10/2016
  1665                              <1> 	; 23/03/2016
  1666                              <1> 	; 29/02/2016 (TRDOS 386 = TRDOS v2.0)
  1667                              <1> 	; INPUT ->
  1668                              <1> 	;	ESI = Logical dos drive description table address
  1669                              <1> 	;	[esi+LD_BPB+BPB_Reserved] = Free Cluster Count
  1670                              <1> 	;	[esi+LD_BPB+BPB_Reserved+4] = First Free Cluster 
  1671                              <1> 	; OUTPUT ->
  1672                              <1> 	;	ESI = Logical dos drive description table address
  1673                              <1> 	; 	CF = 0 -> OK..
  1674                              <1> 	; 	CF = 1 -> Error code in EAX (AL)
  1675                              <1> 	;
  1676                              <1> 	; (Modified registers: EAX, EBX, ECX, EDX)
  1677                              <1> 
  1678 0000CAFD E824000000          <1> 	call	get_fat32_fsinfo_sector_parms
  1679 0000CB02 7221                <1> 	jc	short update_fat32_fsinfo_sector_retn
  1680                              <1> 
  1681 0000CB04 8B463A              <1> 	mov	eax, [esi+LD_BPB+BPB_Reserved] ; Free Cluster Count
  1682 0000CB07 8B563E              <1> 	mov	edx, [esi+LD_BPB+BPB_Reserved+4] ; First free Cluster	
  1683                              <1> 
  1684                              <1>         ;mov	ebx, DOSBootSectorBuff
  1685 0000CB0A 8983E8010000        <1> 	mov	[ebx+488], eax
  1686 0000CB10 8993EC010000        <1> 	mov	[ebx+492], edx	
  1687                              <1> 
  1688 0000CB16 A1[08830100]        <1> 	mov	eax, [CFS_FAT32FSINFOSEC]
  1689 0000CB1B B901000000          <1> 	mov	ecx, 1
  1690 0000CB20 E859530000          <1> 	call	disk_write
  1691                              <1> 	;jnc	short update_fat32_fsinfo_sector_retn
  1692                              <1> 
  1693                              <1> 	; 15/10/2016 (1Dh -> 18)
  1694                              <1> 	; 23/03/2016 (1Dh)
  1695                              <1> 	;mov	eax, 18 ; Drive not ready or write error
  1696                              <1> 
  1697                              <1> update_fat32_fsinfo_sector_retn:
  1698 0000CB25 C3                  <1> 	retn
  1699                              <1> 
  1700                              <1> get_fat32_fsinfo_sector_parms:
  1701                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
  1702                              <1> 	; 15/10/2016
  1703                              <1> 	; 23/03/2016
  1704                              <1> 	; 01/03/2016
  1705                              <1> 	; 29/02/2016 (TRDOS 386 = TRDOS v2.0)
  1706                              <1> 	; INPUT ->
  1707                              <1> 	;	ESI = Logical dos drive description table address
  1708                              <1> 	; OUTPUT ->
  1709                              <1> 	;	ESI = Logical dos drive description table address
  1710                              <1> 	;	EBX = FSINFO sector buffer address (DOSBootSectorBuff)	
  1711                              <1> 	;	CF = 0 -> OK..
  1712                              <1> 	;	   EAX = FsInfo sector address
  1713                              <1> 	;	   ECX = Free cluster count
  1714                              <1> 	;	   EDX = First free cluster 	
  1715                              <1> 	;	CF = 1 -> Error code in AL (EAX)
  1716                              <1> 	;	   EBX = 0
  1717                              <1> 	;	
  1718                              <1> 	;	[CFS_FAT32FSINFOSEC] = FAT32 FSINFO sector address
  1719                              <1>         ;
  1720                              <1> 	; (Modified registers: EAX, EBX, ECX, EDX)
  1721                              <1> 
  1722 0000CB26 0FB74636            <1> 	movzx	eax, word [esi+LD_BPB+FAT32_FSInfoSec]
  1723 0000CB2A 03466C              <1> 	add	eax, [esi+LD_StartSector]
  1724 0000CB2D A3[08830100]        <1> 	mov	[CFS_FAT32FSINFOSEC], eax
  1725                              <1> 	
  1726 0000CB32 BB[5A7E0100]        <1>         mov     ebx, DOSBootSectorBuff
  1727                              <1> 	;mov	ecx, 1
  1728                              <1> 	; 25/07/2022
  1729 0000CB37 29C9                <1> 	sub	ecx, ecx
  1730 0000CB39 FEC1                <1> 	inc	cl
  1731                              <1> 	; ecx = 1
  1732 0000CB3B E84D530000          <1> 	call	disk_read
  1733 0000CB40 722F                <1> 	jc	short loc_read_FAT32_fsinfo_sec_err
  1734                              <1> 
  1735 0000CB42 BB[5A7E0100]        <1> 	mov	ebx, DOSBootSectorBuff
  1736                              <1> 
  1737 0000CB47 813B52526141        <1> 	cmp	dword [ebx], 41615252h
  1738 0000CB4D 751E                <1> 	jne	short loc_read_FAT32_fsinfo_sec_stc
  1739                              <1> 
  1740 0000CB4F 81BBE4010000727241- <1> 	cmp	dword [ebx+484], 61417272h
  1740 0000CB58 61                  <1>
  1741 0000CB59 7512                <1> 	jne	short loc_read_FAT32_fsinfo_sec_stc
  1742                              <1> 
  1743 0000CB5B A1[08830100]        <1> 	mov	eax, [CFS_FAT32FSINFOSEC]
  1744 0000CB60 8B8BE8010000        <1> 	mov	ecx, [ebx+488] ; free cluster count
  1745 0000CB66 8B93EC010000        <1> 	mov	edx, [ebx+492] ; first (next) free cluster	
  1746                              <1> 
  1747 0000CB6C C3                  <1> 	retn
  1748                              <1> 
  1749                              <1> loc_read_FAT32_fsinfo_sec_stc: 
  1750                              <1> 	; 15/10/2016 (0Bh -> 28)
  1751                              <1> 	;mov	eax, 28 ; Invalid format!
  1752                              <1> 	; 25/07/2022
  1753 0000CB6D B31C                <1> 	mov	bl, 28
  1754 0000CB6F EB02                <1> 	jmp	short loc_read_FAT32_fsinfo_sec_stc_retn
  1755                              <1> 
  1756                              <1> loc_read_FAT32_fsinfo_sec_err:
  1757                              <1> 	; 15/10/2016 (15h -> 17)
  1758                              <1> 	; 23/03/2016 (15h)
  1759                              <1> 	;mov	eax, 17 ; Drive not ready or read error
  1760                              <1> 	; 25/07/2022
  1761 0000CB71 B311                <1> 	mov	bl, 17
  1762                              <1> loc_read_FAT32_fsinfo_sec_stc_retn:
  1763                              <1> 	; 25/07/2022
  1764 0000CB73 29C0                <1> 	sub	eax, eax
  1765 0000CB75 88D8                <1> 	mov	al, bl ; error code
  1766                              <1> 	; eax = error code
  1767 0000CB77 29DB                <1> 	sub	ebx, ebx ; 0
  1768 0000CB79 F9                  <1> 	stc
  1769 0000CB7A C3                  <1> 	retn
  1770                              <1> 
  1771                              <1> add_new_cluster:
  1772                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
  1773                              <1> 	; 15/10/2016
  1774                              <1> 	; 16/05/2016
  1775                              <1> 	; 18/03/2016, 24/03/2016
  1776                              <1> 	; 11/03/2016 (TRDOS 386 = TRDOS v2.0)
  1777                              <1> 	; 30/07/2011 (DRV_FAT.ASM)
  1778                              <1> 	; 11/09/2010
  1779                              <1> 	; INPUT ->
  1780                              <1> 	;	ESI = Logical dos drv desc. table address
  1781                              <1> 	;	EAX = Last cluster
  1782                              <1> 	; OUTPUT ->
  1783                              <1> 	;	ESI = Logical dos drv desc. table address
  1784                              <1> 	;	EAX = New Last cluster (next cluster)
  1785                              <1> 	;	cf = 1 -> error code in EAX (AL)
  1786                              <1> 	;	cf = 1 -> EBX = sectors per cluster
  1787                              <1> 	;	ECX = Free sectors
  1788                              <1> 	;;;	25/07/2022
  1789                              <1> 	;	(EBX = sectors per cluster -not used-)
  1790                              <1> 	;	EDX = 0 (if cf = 0)
  1791                              <1> 	; NOTE:
  1792                              <1> 	; This procedure does not update lm date&time !
  1793                              <1> 	;
  1794                              <1> 	; (Modified registers: EAX, EBX, ECX, EDX, EDI)
  1795                              <1> 
  1796 0000CB7B A3[38840100]        <1> 	mov	[FAT_anc_LCluster], eax
  1797                              <1> 	
  1798 0000CB80 E88CF9FFFF          <1> 	call	get_first_free_cluster
  1799 0000CB85 720A                <1> 	jc	short loc_add_new_cluster_retn
  1800                              <1> 	; EAX >= 2 and EAX < FFFFFFFFh is valid
  1801                              <1> 
  1802 0000CB87 89C2                <1> 	mov	edx, eax
  1803                              <1> 
  1804 0000CB89 42                  <1> 	inc	edx
  1805                              <1> 	;jnz	short loc_add_new_cluster_check_ffc_eax
  1806 0000CB8A 7510                <1> 	jnz	short loc_add_new_cluster_save_fcc
  1807                              <1> 
  1808                              <1> loc_add_new_cluster_no_disk_space_retn:
  1809                              <1> 	;mov	eax, 27h ; MSDOS err => insufficient disk space
  1810                              <1> 	; 25/07/2022
  1811 0000CB8C 31C0                <1> 	xor	eax, eax
  1812 0000CB8E B027                <1> 	mov	al, 27h
  1813                              <1> loc_add_new_cluster_stc_retn:
  1814 0000CB90 F9                  <1> 	stc
  1815                              <1> loc_add_new_cluster_retn:
  1816                              <1> 	; 25/07/2022
  1817                              <1> 	;movzx	ebx, byte [esi+LD_BPB+SecPerClust]
  1818 0000CB91 8B4E74              <1> 	mov	ecx, [esi+LD_FreeSectors]
  1819                              <1> 	;xor	edx, edx
  1820                              <1> 	;stc
  1821 0000CB94 C3                  <1> 	retn
  1822                              <1> 
  1823                              <1> loc_anc_invalid_format_stc_retn:
  1824 0000CB95 F9                  <1> 	stc
  1825                              <1> loc_add_new_cluster_invalid_format_retn:
  1826                              <1> 	; 15/10/2016 (0Bh -> 28)
  1827                              <1> 	;mov	eax, 28 ; Invalid format
  1828                              <1> 	;jmp	short loc_add_new_cluster_retn 
  1829                              <1> 	; 25/07/2022
  1830 0000CB96 29C0                <1> 	sub	eax, eax
  1831 0000CB98 B01C                <1> 	mov	al, 28
  1832 0000CB9A EBF4                <1> 	jmp	short loc_add_new_cluster_stc_retn
  1833                              <1> 
  1834                              <1> ;loc_add_new_cluster_check_ffc_eax:
  1835                              <1> ;	cmp	eax, 2
  1836                              <1> ;	jb	short loc_add_new_cluster_invalid_format_retn
  1837                              <1> 
  1838                              <1> loc_add_new_cluster_save_fcc:  
  1839 0000CB9C A3[3C840100]        <1> 	mov	[FAT_anc_FFCluster], eax
  1840                              <1> 
  1841 0000CBA1 83E802              <1> 	sub	eax, 2
  1842 0000CBA4 0FB65E13            <1> 	movzx   ebx, byte [esi+LD_BPB+SecPerClust]
  1843 0000CBA8 F7E3                <1> 	mul	ebx
  1844 0000CBAA 09D2                <1> 	or	edx, edx
  1845 0000CBAC 75E7                <1> 	jnz	short loc_anc_invalid_format_stc_retn
  1846                              <1> 
  1847                              <1> loc_add_new_cluster_allocate_cluster:
  1848                              <1> 	; 18/03/2016
  1849 0000CBAE 92                  <1> 	xchg	edx, eax ; eax = 0
  1850                              <1> 	; 16/05/2016
  1851                              <1> 	;cmp	[ClusterBuffer_Valid], al ; 0
  1852                              <1> 	;jna	short loc_anc_clear_cluster_buffer
  1853                              <1> 	;; 'copy' command, 
  1854                              <1> 	;; writing destination file clust after reading source file clust
  1855                              <1> 	;mov	[ClusterBuffer_Valid], al ; 0 ; reset
  1856                              <1> 	;jmp	short loc_add_new_cluster_write_nc_to_disk
  1857                              <1> 
  1858                              <1> loc_anc_clear_cluster_buffer:
  1859                              <1> 	; 11/03/2016
  1860                              <1> 	; Clear buffer
  1861 0000CBAF BF00000700          <1> 	mov	edi, Cluster_Buffer ; 70000h (for current TRDOS 386 version)
  1862 0000CBB4 89D9                <1> 	mov	ecx, ebx ; sector count
  1863 0000CBB6 C1E107              <1> 	shl	ecx, 7 ; 1 sector = 512 bytes -> 128 double words
  1864                              <1> 	;xor	eax, eax ; 0
  1865 0000CBB9 F3AB                <1> 	rep	stosd
  1866                              <1> 
  1867                              <1> loc_add_new_cluster_write_nc_to_disk:
  1868                              <1> 	; 11/03/2016
  1869                              <1> 	;xchg	eax, edx ; edx = 0, eax = sector offset
  1870 0000CBBB 89D0                <1> 	mov	eax, edx
  1871 0000CBBD 034668              <1>         add     eax, [esi+LD_DATABegin]
  1872 0000CBC0 72D4                <1> 	jc	short loc_add_new_cluster_invalid_format_retn 
  1873                              <1> 		
  1874 0000CBC2 89D9                <1> 	mov	ecx, ebx ; ECX = sectors per cluster (<256)
  1875 0000CBC4 BB00000700          <1> 	mov	ebx, Cluster_Buffer
  1876 0000CBC9 E8B0520000          <1> 	call	disk_write
  1877 0000CBCE 7306                <1> 	jnc	short loc_add_new_cluster_update_fat_nlc
  1878                              <1> 	
  1879                              <1> 	; 15/10/2016 (1Dh -> 18)
  1880                              <1> 	;mov	eax, 18 ; Write Error
  1881                              <1> 	; 25/07/2022
  1882 0000CBD0 31C0                <1> 	xor	eax, eax
  1883 0000CBD2 B012                <1> 	mov	al, 18
  1884 0000CBD4 EBBA                <1> 	jmp	short loc_add_new_cluster_stc_retn
  1885                              <1> 
  1886                              <1> loc_add_new_cluster_update_fat_nlc:
  1887 0000CBD6 A1[3C840100]        <1> 	mov	eax, [FAT_anc_FFCluster]
  1888 0000CBDB 31C9                <1> 	xor	ecx, ecx
  1889 0000CBDD 890D[66800100]      <1> 	mov	[FAT_ClusterCounter], ecx ; 0 ; reset
  1890 0000CBE3 49                  <1> 	dec	ecx ; 0FFFFFFFFh
  1891 0000CBE4 E8F5F9FFFF          <1> 	call	update_cluster
  1892 0000CBE9 7304                <1> 	jnc	short loc_add_new_cluster_update_fat_plc
  1893 0000CBEB 09C0                <1> 	or	eax, eax ; EAX = 0 -> cluster value is 0 or eocc
  1894 0000CBED 75A1                <1> 	jnz	short loc_add_new_cluster_stc_retn
  1895                              <1> 
  1896                              <1> loc_add_new_cluster_update_fat_plc:
  1897 0000CBEF A1[38840100]        <1> 	mov	eax, [FAT_anc_LCluster]
  1898 0000CBF4 8B0D[3C840100]      <1> 	mov	ecx, [FAT_anc_FFCluster]
  1899 0000CBFA E8DFF9FFFF          <1> 	call	update_cluster
  1900 0000CBFF 7314                <1> 	jnc	short loc_add_new_cluster_save_fat_buffer
  1901 0000CC01 09C0                <1> 	or	eax, eax ; EAX = 0 -> cluster value is 0 or eocc
  1902 0000CC03 7410                <1> 	jz	short loc_add_new_cluster_save_fat_buffer
  1903                              <1> 
  1904                              <1> loc_anc_save_fat_buffer_err_retn:
  1905                              <1> 	;cmp	byte [FAT_ClusterCounter], 1
  1906                              <1> 	;jb	short loc_add_new_cluster_retn
  1907                              <1> 
  1908 0000CC05 66BB00FF            <1> 	mov	bx, 0FF00h ; recalculate free space (BL = 0)
  1909                              <1> 			   ; (BH = FFh -> Use ESI as Drv Param. Tbl.)
  1910 0000CC09 50                  <1> 	push	eax
  1911 0000CC0A E8E3FCFFFF          <1> 	call	calculate_fat_freespace
  1912 0000CC0F 58                  <1> 	pop	eax
  1913 0000CC10 E97BFFFFFF          <1>         jmp     loc_add_new_cluster_stc_retn
  1914                              <1> 
  1915                              <1> loc_add_new_cluster_save_fat_buffer:
  1916                              <1> 	;cmp	byte [FAT_BuffValidData], 2
  1917                              <1> 	;jne	short loc_add_new_cluster_calc_FAT_freespace 
  1918                              <1> 	;Byte [FAT_BuffValidData] = 2 
  1919 0000CC15 E847FCFFFF          <1> 	call	save_fat_buffer
  1920 0000CC1A 72E9                <1> 	jc	short loc_anc_save_fat_buffer_err_retn
  1921                              <1> 
  1922                              <1> loc_add_new_cluster_calc_FAT_freespace:
  1923                              <1> 	;mov	eax, 1 ; Only one Cluster
  1924 0000CC1C A1[66800100]        <1> 	mov	eax, [FAT_ClusterCounter]
  1925 0000CC21 66BB01FF            <1> 	mov	bx, 0FF01h ; BH = FFh -> ESI -> Dos drv desc. table
  1926                              <1> 		; BL = 1 -> add cluster(s)
  1927 0000CC25 B301                <1> 	mov	bl, 01h
  1928                              <1> 	; NOTE: EAX value will be added to Free Cluster Count
  1929                              <1> 	; (Free Cluster Count is decreased when EAX value is negative)
  1930 0000CC27 E8C6FCFFFF          <1>         call    calculate_fat_freespace
  1931                              <1> 	; ECX = 0 -> no error, ECX > 0 -> error or invalid return
  1932 0000CC2C 21C9                <1> 	and	ecx, ecx ; ECX = 0 -> valid free sector count
  1933 0000CC2E 7409                <1> 	jz	short loc_add_new_cluster_return_cluster_number
  1934                              <1> 
  1935                              <1> loc_add_new_cluster_recalc_FAT_freespace:
  1936 0000CC30 66BB00FF            <1> 	mov	bx, 0FF00h  ; recalculate free space
  1937 0000CC34 E8B9FCFFFF          <1>         call    calculate_fat_freespace
  1938                              <1> 	; cf = 0
  1939                              <1> loc_add_new_cluster_return_cluster_number:
  1940 0000CC39 89C1                <1> 	mov	ecx, eax ; Free sector count
  1941 0000CC3B A1[3C840100]        <1> 	mov	eax, [FAT_anc_FFCluster]
  1942                              <1> 	;mov	edi, Cluster_Buffer
  1943                              <1> 	; 25/07/2022 (EBX is not used by callers of this sprocedure)
  1944                              <1> 	;movzx	ebx, byte [esi+LD_BPB+SecPerClust]
  1945 0000CC40 31D2                <1> 	xor	edx, edx ; 0
  1946 0000CC42 C3                  <1>         retn
  1947                              <1> 
  1948                              <1> write_cluster:
  1949                              <1> 	; 15/10/2016
  1950                              <1> 	; 21/03/2016 (TRDOS 386 = TRDOS v2.0)
  1951                              <1> 	;
  1952                              <1> 	; INPUT ->
  1953                              <1> 	;	EAX = Cluster Number (Sector index for SINGLIX FS)
  1954                              <1> 	;	ESI = Logical DOS Drive Description Table address
  1955                              <1> 	;	EBX = Cluster (File R/W) Buffer address (max. 64KB)
  1956                              <1> 	;	Only for SINGLIX FS:
  1957                              <1> 	;	EDX = File Number (The 1st FDT address) 
  1958                              <1> 	; OUTPUT ->
  1959                              <1> 	;	cf = 1 -> Cluster can not be written onto disk
  1960                              <1> 	;	    EAX > 0 -> Error number
  1961                              <1> 	;	cf = 0 -> Cluster has been written successfully
  1962                              <1> 	;
  1963                              <1> 	; (Modified registers: EAX, ECX, EBX, EDX)
  1964                              <1> 	
  1965 0000CC43 0FB64E13            <1> 	movzx	ecx, byte [esi+LD_BPB+BPB_SecPerClust] 
  1966                              <1> 	; CL = 1 = [esi+LD_FS_Reserved2] ; SectPerClust for Singlix FS
  1967                              <1> 
  1968                              <1> write_file_sectors: ; 16/03/2016
  1969 0000CC47 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
  1970 0000CC4B 761C                <1> 	jna	short write_fs_cluster
  1971                              <1> 
  1972                              <1> write_fat_file_sectors: 
  1973 0000CC4D 83E802              <1> 	sub	eax, 2 ; Beginning cluster number is always 2
  1974 0000CC50 0FB65613            <1> 	movzx	edx, byte [esi+LD_BPB+BPB_SecPerClust] ; 18/03/2016 
  1975 0000CC54 F7E2                <1> 	mul	edx
  1976 0000CC56 034668              <1> 	add	eax, [esi+LD_DATABegin] ; absolute address of the cluster
  1977                              <1> 
  1978                              <1> 	; EAX = Disk sector address
  1979                              <1> 	; ECX = Sector count
  1980                              <1> 	; EBX = Buffer address
  1981                              <1> 	; (EDX = 0)
  1982                              <1> 	; ESI = Logical DOS drive description table address	
  1983                              <1> 
  1984 0000CC59 E820520000          <1> 	call	disk_write
  1985 0000CC5E 7306                <1> 	jnc	short wclust_retn
  1986                              <1> 	
  1987                              <1> 	; 15/10/2016 (1Dh -> 18)
  1988 0000CC60 B812000000          <1> 	mov	eax, 18 ; Drive not ready or write error !
  1989 0000CC65 C3                  <1> 	retn
  1990                              <1> 
  1991                              <1> wclust_retn:
  1992 0000CC66 29C0                <1> 	sub	eax, eax ; 0
  1993 0000CC68 C3                  <1> 	retn
  1994                              <1> 
  1995                              <1> write_fs_cluster:
  1996                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
  1997                              <1> 	; 21/03/2016 (TRDOS 386 = TRDOS v2.0)
  1998                              <1> 	; Singlix FS
  1999                              <1> 	
  2000                              <1> 	; EAX = Cluster number is sector index number of the file (eax)
  2001                              <1> 	
  2002                              <1> 	; EDX = File number is the first File Descriptor Table address 
  2003                              <1> 	;	of the file. (Absolute address of the FDT).
  2004                              <1> 	
  2005                              <1> 	; eax = sector index (0 for the first sector)
  2006                              <1> 	; edx = FDT0 address
  2007                              <1> 		; 64 KB buffer = 128 sectors (limit) 
  2008                              <1> 	;mov	ecx, 128 ; maximum count of sectors (before eof) 
  2009                              <1> 	; 25/07/2022
  2010 0000CC69 29C9                <1> 	sub	ecx, ecx
  2011 0000CC6B B180                <1> 	mov	cl, 128
  2012                              <1> 	;call	write_fs_sectors
  2013                              <1> 	;retn
  2014                              <1> 	;jmp	short write_fs_sectors
  2015                              <1> 
  2016                              <1> write_fs_sectors:
  2017                              <1> 	; 21/03/2016 (TRDOS 386 = TRDOS v2.0)
  2018 0000CC6D F9                  <1> 	stc
  2019 0000CC6E C3                  <1> 	retn
  2020                              <1> 
  2021                              <1> get_cluster_by_index:
  2022                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
  2023                              <1> 	; 29/04/2016 (TRDOS 386 = TRDOS v2.0)
  2024                              <1> 	; INPUT ->
  2025                              <1> 	; 	EAX = Beginning cluster
  2026                              <1> 	; 	EDX = Sector index in disk/file section
  2027                              <1> 	;	      (Only for SINGLIX file system!)
  2028                              <1> 	; 	ECX = Cluster sequence number after the beginning cluster
  2029                              <1> 	; 	ESI = Logical DOS Drive Description Table address
  2030                              <1> 	; OUTPUT ->
  2031                              <1> 	;	EAX = Cluster number 
  2032                              <1> 	;	cf = 1 -> Error code in AL (EAX)
  2033                              <1> 	;
  2034                              <1> 	;(Modified registers: EAX, ECX, EBX, EDX)
  2035                              <1> 	;	
  2036 0000CC6F 807E0301            <1> 	cmp	byte [esi+LD_FATType], 1
  2037 0000CC73 721D                <1>         jb      short get_fs_section_by_index 
  2038                              <1> 
  2039 0000CC75 3B4E78              <1> 	cmp	ecx, [esi+LD_Clusters]
  2040 0000CC78 7206                <1> 	jb	short gcbi_1
  2041                              <1> gcbi_0:
  2042                              <1> 	;stc
  2043                              <1> 	;mov	eax, 23h ; Cluster not available ! 
  2044                              <1> 			 ; MSDOS error code: FCB unavailable
  2045                              <1> 	; 25/07/2022
  2046 0000CC7A 29C0                <1> 	sub	eax, eax
  2047                              <1> gcbi_4:
  2048 0000CC7C B023                <1> 	mov	al, 23h
  2049 0000CC7E F9                  <1> 	stc
  2050 0000CC7F C3                  <1> 	retn
  2051                              <1> gcbi_1:
  2052 0000CC80 51                  <1> 	push	ecx
  2053 0000CC81 E869F6FFFF          <1> 	call	get_next_cluster
  2054 0000CC86 59                  <1> 	pop	ecx
  2055 0000CC87 7203                <1> 	jc	short gcbi_3
  2056 0000CC89 E2F5                <1> 	loop	gcbi_1
  2057                              <1> gcbi_2:
  2058 0000CC8B C3                  <1> 	retn
  2059                              <1> gcbi_3:
  2060 0000CC8C 09C0                <1> 	or	eax, eax
  2061                              <1> 	;jz	short gcbi_0
  2062                              <1> 	; 25/07/2022
  2063 0000CC8E 74EC                <1> 	jz	short gcbi_4
  2064 0000CC90 F5                  <1> 	cmc 	; stc
  2065 0000CC91 C3                  <1> 	retn
  2066                              <1> 
  2067                              <1> get_fs_section_by_index:
  2068                              <1> 	; 29/04/2016 (TRDOS 386 = TRDOS v2.0)
  2069                              <1> 	; INPUT ->
  2070                              <1> 	; 	EAX = Beginning FDT number/address
  2071                              <1> 	; 	EDX = Sector index in disk/file section
  2072                              <1> 	; 	ECX = Sector sequence number after the beginning FDT
  2073                              <1> 	; 	ESI = Logical DOS Drive Description Table address
  2074                              <1> 	; OUTPUT ->
  2075                              <1> 	; 	EAX = FDT number/address
  2076                              <1> 	; 	EDX = Sector index of the section (0,1,2,3,4...)
  2077                              <1> 	;	cf = 1 -> Error code in AL (EAX)
  2078                              <1> 	;
  2079                              <1> 	;(Modified registers: EAX, ECX, EBX, EDX)
  2080                              <1> 	;
  2081 0000CC92 B8FFFFFFFF          <1> 	mov	eax, 0FFFFFFFFh
  2082 0000CC97 C3                  <1> 	retn
  2083                              <1> 
  2084                              <1> get_last_section:
  2085                              <1> 	; 22/10/2016 (TRDOS 386 = TRDOS v2.0)	
  2086                              <1> 	; INPUT ->
  2087                              <1> 	; 	EAX = (The 1st) FDT number/address
  2088                              <1> 	; 	ESI = Logical DOS Drive Description Table address
  2089                              <1> 	; OUTPUT ->
  2090                              <1> 	; 	EAX = FDT number/address of the last section
  2091                              <1> 	; 	EDX = Last sector of the section (0,1,2,3,4...)
  2092                              <1> 	;	[glc_index] = sector index number of the last sector
  2093                              <1> 	;		      (for file, not for the last section)  	
  2094                              <1> 	;		   	
  2095                              <1> 	;	cf = 1 -> Error code in AL (EAX)
  2096                              <1> 	;
  2097                              <1> 	;(Modified registers: EAX, ECX, EBX, EDX)
  2098                              <1> 	;
  2099 0000CC98 B800000000          <1> 	mov	eax, 0
  2100 0000CC9D BA00000000          <1> 	mov	edx, 0
  2101 0000CCA2 C3                  <1> 	retn
  3430                                  %include 'trdosk6.s' ; 24/01/2016
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.6) - MAIN PROGRAM : trdosk6.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 29/08/2023  (Previous: 11/08/2022)
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 24/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.15 (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> ; Ref: Retro UNIX 386 v1.2 Kernel (v0.2.2.3) - ux.s - 15/07/2022
    19                              <1> 
    20                              <1> sysent: ; < enter to system call >
    21                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5
    22                              <1> 	; 17/03/2017
    23                              <1> 	; 03/03/2017
    24                              <1> 	; 19/02/2017
    25                              <1> 	; 13/01/2017
    26                              <1> 	; 06/06/2016
    27                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
    28                              <1> 	; 16/04/2015 - 19/10/2015 (Retro UNIX 386 v1)
    29                              <1> 	; 10/04/2013 - 18/01/2014 (Retro UNIX 8086 v1)
    30                              <1> 	;
    31                              <1> 	; 'unkni' or 'sysent' is sytem entry from various traps. 
    32                              <1> 	; The trap type is determined and an indirect jump is made to 
    33                              <1> 	; the appropriate system call handler. If there is a trap inside
    34                              <1> 	; the system a jump to panic is made. All user registers are saved 
    35                              <1> 	; and u.sp points to the end of the users stack. The sys (trap)
    36                              <1> 	; instructor is decoded to get the the system code part (see
    37                              <1> 	; trap instruction in the PDP-11 handbook) and from this 
    38                              <1> 	; the indirect jump address is calculated. If a bad system call is
    39                              <1> 	; made, i.e., the limits of the jump table are exceeded, 'badsys'
    40                              <1> 	; is called. If the call is legitimate control passes to the
    41                              <1> 	; appropriate system routine.
    42                              <1> 	;
    43                              <1> 	; Calling sequence:
    44                              <1> 	;	Through a trap caused by any sys call outside the system.
    45                              <1> 	; Arguments:
    46                              <1> 	;	Arguments of particular system call.	
    47                              <1> 	; ...............................................................
    48                              <1> 	;	
    49                              <1> 	; Retro UNIX 8086 v1 modification: 
    50                              <1> 	;       System call number is in EAX register.
    51                              <1> 	;
    52                              <1> 	;       Other parameters are in EDX, EBX, ECX, ESI, EDI, EBP
    53                              <1> 	;	registers depending of function details.
    54                              <1>   	;
    55                              <1> 	; 16/04/2015
    56 0000CCA3 368925[18900100]    <1>         mov     [ss:u.sp], esp ; Kernel stack points to return address
    57                              <1> 
    58                              <1> 	; save user registers
    59 0000CCAA 1E                  <1> 	push	ds
    60 0000CCAB 06                  <1> 	push	es
    61 0000CCAC 0FA0                <1> 	push	fs
    62 0000CCAE 0FA8                <1> 	push	gs
    63 0000CCB0 60                  <1> 	pushad  ; eax, ecx, edx, ebx, esp -before pushad-, ebp, esi, edi
    64                              <1> 	;
    65                              <1> 	; ESPACE = [ss:u.sp] - esp ; 4*12 = 48 ; 17/09/2015 ; 06/06/2016
    66                              <1> 	; 	(ESPACE is size of space in kernel stack 
    67                              <1> 	;	for saving/restoring user registers.)
    68                              <1> 	;
    69 0000CCB1 50                  <1> 	push	eax ; 01/07/2015
    70 0000CCB2 66B81000            <1> 	mov     ax, KDATA
    71 0000CCB6 8ED8                <1>         mov     ds, ax
    72 0000CCB8 8EC0                <1>         mov     es, ax
    73 0000CCBA 8EE0                <1>         mov     fs, ax
    74 0000CCBC 8EE8                <1>         mov     gs, ax
    75 0000CCBE A1[88780100]        <1> 	mov	eax, [k_page_dir]
    76 0000CCC3 0F22D8              <1> 	mov	cr3, eax
    77 0000CCC6 58                  <1> 	pop	eax ; 01/07/2015
    78                              <1> 	; 19/10/2015
    79 0000CCC7 FC                  <1> 	cld
    80                              <1> 	;
    81 0000CCC8 FE05[14900100]      <1> 	inc	byte [sysflg]
    82                              <1> 		; incb sysflg / indicate a system routine is in progress
    83 0000CCCE FB                  <1>         sti 	; 18/01/2014
    84                              <1> 	;jnz	panic ; 24/05/2013
    85                              <1> 		; beq 1f
    86                              <1> 		; jmp panic ; / called if trap inside system
    87                              <1> 	; 23/07/2022
    88 0000CCCF 7405                <1> 	jz	short sysent0
    89 0000CCD1 E9D3A0FFFF          <1> 	jmp	panic
    90                              <1> ;1:
    91                              <1> sysent0:
    92                              <1> 	; 17/03/2017
    93 0000CCD6 80642438FE          <1> 	and	byte [esp+ESPACE+8], ~1 ; clear carry flag
    94                              <1> 
    95                              <1> 	; 16/04/2015
    96 0000CCDB A3[20900100]        <1> 	mov	[u.r0], eax
    97 0000CCE0 8925[1C900100]      <1> 	mov	[u.usp], esp ; kernel stack points to user's registers
    98                              <1> 
    99                              <1> 	; 13/01/2017 (TRDOS 386 Feaure only !)
   100 0000CCE6 803D[94900100]00    <1> 	cmp	byte [u.t_lock], 0 ; timer interrupt lock ?
   101                              <1> 	;ja	sysrele		   ; yes, sys release only !!!
   102                              <1> 	; 23/07/2022
   103 0000CCED 7605                <1> 	jna	short sysent1
   104 0000CCEF E9FE010000          <1> 	jmp	sysrele
   105                              <1> 		; mov $s.syst+2,clockp
   106                              <1> 		; mov r0,-(sp) / save user registers 
   107                              <1> 		; mov sp,u.r0 / pointer to bottom of users stack 
   108                              <1> 			   ; / in u.r0
   109                              <1> 		; mov r1,-(sp)
   110                              <1> 		; mov r2,-(sp)
   111                              <1> 		; mov r3,-(sp)
   112                              <1> 		; mov r4,-(sp)
   113                              <1> 		; mov r5,-(sp)
   114                              <1> 		; mov ac,-(sp) / "accumulator" register for extended
   115                              <1> 		             ; / arithmetic unit
   116                              <1> 		; mov mq,-(sp) / "multiplier quotient" register for the
   117                              <1> 		             ; / extended arithmetic unit
   118                              <1> 		; mov sc,-(sp) / "step count" register for the extended
   119                              <1> 		             ; / arithmetic unit
   120                              <1> 		; mov sp,u.sp / u.sp points to top of users stack
   121                              <1> 		; mov 18.(sp),r0 / store pc in r0
   122                              <1> 		; mov -(r0),r0 / sys inst in r0      10400xxx
   123                              <1> 		; sub $sys,r0 / get xxx code
   124                              <1> sysent1:
   125 0000CCF4 C1E002              <1> 	shl	eax, 2
   126                              <1> 		; asl r0 / multiply by 2 to jump indirect in bytes
   127 0000CCF7 3DB8000000          <1> 	cmp	eax, end_of_syscalls - syscalls
   128                              <1> 		; cmp r0,$2f-1f / limit of table (35) exceeded
   129                              <1> 	;jnb	short badsys
   130                              <1> 		; bhis badsys / yes, bad system call
   131 0000CCFC F5                  <1> 	cmc
   132 0000CCFD 9C                  <1> 	pushf	
   133 0000CCFE 50                  <1> 	push	eax
   134 0000CCFF 8B2D[18900100]      <1>  	mov 	ebp, [u.sp] ; Kernel stack at the beginning of sys call
   135 0000CD05 B0FE                <1> 	mov	al, 0FEh ; 11111110b
   136 0000CD07 1400                <1> 	adc	al, 0 ; al = al + cf
   137 0000CD09 204508              <1> 	and	[ebp+8], al ; flags (reset carry flag)
   138                              <1> 		; bic $341,20.(sp) / set users processor priority to 0 
   139                              <1> 				 ; / and clear carry bit
   140 0000CD0C 5D                  <1> 	pop	ebp ; eax
   141 0000CD0D 9D                  <1> 	popf
   142 0000CD0E 720B                <1>         jc      short badsys ; 23/07/2022
   143 0000CD10 A1[20900100]        <1> 	mov	eax, [u.r0]
   144                              <1> 	; system call registers: EAX, EDX, ECX, EBX, ESI, EDI
   145 0000CD15 FFA5[68CD0000]      <1> 	jmp	dword [ebp+syscalls]
   146                              <1> 		; jmp *1f(r0) / jump indirect thru table of addresses
   147                              <1> 		            ; / to proper system routine.
   148                              <1> 	; 30/07/2022
   149                              <1> 	; 23/07/2022
   150                              <1> badsys:
   151                              <1> 	; 25/12/2016
   152                              <1> 	; 18/04/2016 (TRDOS 386 = TRDOS v2.0)
   153                              <1> 	; 17/04/2011 (TRDOS v1.0, 'IFC.ASM')
   154                              <1> 	; 03/02/2011 ('trdos_ifc_routine')
   155                              <1> 	;
   156                              <1> 	; 16/04/2015 (Retro UNIX 386 v1, 'badsys')
   157                              <1> 	; (EIP, EAX values will be shown on screen with error message)
   158                              <1> 	; (EIP = 'CD 40h' instruction address -INT 40h-)
   159                              <1> 	; (EAX = Function number)  
   160                              <1> 	;
   161 0000CD1B FE05[70900100]      <1> 	inc	byte [u.bsys]
   162                              <1> 	;
   163 0000CD21 8B1D[18900100]      <1> 	mov	ebx, [u.sp] ; esp at the beginning of 'sysent'
   164 0000CD27 8B03                <1> 	mov	eax, [ebx] ; EIP (return address, not 'INT 30h' address)
   165                              <1> 	;sub	eax, 2 ; CDh, ##h
   166                              <1> 	; 30/07/2022
   167 0000CD29 48                  <1> 	dec	eax
   168 0000CD2A 48                  <1> 	dec	eax
   169 0000CD2B E87C74FFFF          <1> 	call	dwordtohex
   170 0000CD30 8915[D3370100]      <1> 	mov	[eip_str], edx
   171 0000CD36 A3[D7370100]        <1> 	mov	[eip_str+4], eax
   172 0000CD3B A1[20900100]        <1> 	mov	eax, [u.r0]
   173 0000CD40 E86774FFFF          <1> 	call	dwordtohex
   174 0000CD45 8915[C2370100]      <1> 	mov	[eax_str], edx
   175 0000CD4B A3[C6370100]        <1> 	mov	[eax_str+4], eax
   176                              <1> 
   177 0000CD50 66C705[B7370100]34- <1> 	mov	word [int_num_str], SYSCALL_INT_NUM ; 25/12/2016
   177 0000CD58 30                  <1>
   178                              <1> 
   179 0000CD59 BE[89370100]        <1> 	mov	esi, ifc_msg ; "invalid funtion call !" msg (trdosk9.s)
   180 0000CD5E E8E79FFFFF          <1> 	call	print_msg
   181                              <1> 
   182 0000CD63 E92C020000          <1> 	jmp	sysexit
   183                              <1> 
   184                              <1> syscalls: ; 1:
   185                              <1> 	; 31/12/2017
   186                              <1> 	; 28/02/2017
   187                              <1> 	; 20/02/2017
   188                              <1> 	; 19/02/2017
   189                              <1> 	; 15/10/2016
   190                              <1> 	; 20/05/2016
   191                              <1> 	; 19/05/2016
   192                              <1> 	; 16/05/2016
   193                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
   194                              <1> 	; 21/09/2015
   195                              <1> 	; 01/07/2015
   196                              <1> 	; 16/04/2015 (32 bit address modification) 
   197 0000CD68 [DD0D0100]          <1> 	dd sysver	; 0 ; Get TRDOS 386 version number (v2.0)	
   198 0000CD6C [94CF0000]          <1> 	dd sysexit 	; 1
   199 0000CD70 [61D10000]          <1> 	dd sysfork 	; 2
   200 0000CD74 [EED40000]          <1> 	dd sysread 	; 3
   201 0000CD78 [0DD50000]          <1> 	dd syswrite 	; 4
   202 0000CD7C [3CD30000]          <1> 	dd sysopen 	; 5
   203 0000CD80 [C4D40000]          <1> 	dd sysclose 	; 6
   204 0000CD84 [E9D00000]          <1> 	dd syswait 	; 7
   205 0000CD88 [69D20000]          <1> 	dd syscreat 	; 8
   206 0000CD8C [E91B0100]          <1> 	dd sysrename	; 9  ; TRDOS 386, Rename File (31/12/2017)
   207 0000CD90 [7C170100]          <1> 	dd sysdelete	; 10 ; TRDOS 386, Delete File (29/12/2017)
   208 0000CD94 [2B020100]          <1> 	dd sysexec 	; 11
   209 0000CD98 [98180100]          <1> 	dd syschdir 	; 12
   210 0000CD9C [531A0100]          <1> 	dd systime 	; 13 ; TRDOS 386, Get Sys Date&Time (30/12/2017)
   211 0000CDA0 [87D40000]          <1> 	dd sysmkdir 	; 14
   212 0000CDA4 [CC180100]          <1> 	dd syschmod 	; 15 ; TRDOS 386, Change Attributes (30/12/2017) 
   213 0000CDA8 [E3170100]          <1> 	dd sysrmdir 	; 16 ; TRDOS 386, Remove Directory (29/12/2017)
   214 0000CDAC [C7060100]          <1> 	dd sysbreak 	; 17
   215 0000CDB0 [A8190100]          <1> 	dd sysdrive 	; 18 ; TRDOS 386, Get/Set Current Drv (30/12/2017) 
   216 0000CDB4 [08070100]          <1> 	dd sysseek 	; 19
   217 0000CDB8 [1A070100]          <1> 	dd systell 	; 20
   218 0000CDBC [FF1C0100]          <1> 	dd sysmem 	; 21 ; TRDOS 386, Get Total&Free Mem (31/12/2017)
   219 0000CDC0 [351D0100]          <1> 	dd sysprompt 	; 22 ; TRDOS 386, Change Cmd Prompt (31/12/2017)
   220 0000CDC4 [761D0100]          <1> 	dd syspath 	; 23 ; TRDOS 386, Get/Set Run Path (31/12/2017)
   221 0000CDC8 [DB1D0100]          <1> 	dd sysenv 	; 24 ; TRDOS 386, Get/Set Env Vars (31/12/2017)
   222 0000CDCC [D41A0100]          <1> 	dd sysstime 	; 25 ; TRDOS 386, Set Sys Date&Time (30/12/2017)
   223 0000CDD0 [80070100]          <1> 	dd sysquit 	; 26
   224 0000CDD4 [74070100]          <1> 	dd sysintr 	; 27
   225 0000CDD8 [F7190100]          <1> 	dd sysdir 	; 28 ; TRDOS 386, Get Curr Drive&Dir (30/12/2017) 
   226 0000CDDC [20CE0000]          <1> 	dd sysemt 	; 29
   227 0000CDE0 [321A0100]          <1> 	dd sysldrvt	; 30 ; TRDOS 386, Get Logical DOS DDT (30/12/2017)
   228 0000CDE4 [FFD60000]          <1> 	dd sysvideo 	; 31 ; TRDOS 386 Video Functions (16/05/2016)
   229 0000CDE8 [E3240100]          <1> 	dd sysaudio 	; 32 ; TRDOS 386 Audio Functions (16/05/2016)
   230 0000CDEC [6AD50000]          <1> 	dd systimer 	; 33 ; TRDOS 386 Timer Functions (18/05/2016)
   231 0000CDF0 [8C070100]          <1> 	dd syssleep 	; 34 ; Retro UNIX 8086 v1 feature only !
   232                              <1> 			     ; 11/06/2014
   233 0000CDF4 [C6070100]          <1> 	dd sysmsg	; 35 ; Retro UNIX 386 v1 feature only !
   234                              <1> 			     ; 01/07/2015
   235 0000CDF8 [E0080100]          <1> 	dd sysgeterr	; 36 ; Retro UNIX 386 v1 feature only !
   236                              <1> 			     ; 21/09/2015 - get last error number
   237 0000CDFC [53170100]          <1> 	dd sysfpstat	; 37 ; TRDOS 386 FPU state option (28/02/2017)
   238 0000CE00 [EC0D0100]          <1> 	dd syspri 	; 38 ; change priority - TRDOS 386 (20/05/2016)
   239 0000CE04 [F2CE0000]          <1> 	dd sysrele	; 39 ; TRDOS 386 (19/05/2016) (0 -> 39)
   240 0000CE08 [170F0100]          <1> 	dd sysfff	; 40 ; Find First File - TRDOS 386 (15/10/2016)
   241 0000CE0C [EB0F0100]          <1> 	dd sysfnf	; 41 ; Find Next File - TRDOS 386 (15/10/2016)
   242 0000CE10 [41160100]          <1> 	dd sysalloc	; 42 ; Allocate contiguous memory block/pages
   243                              <1> 			     ; TRDOS 386 (19/02/2017) DMA buff fuctions		
   244 0000CE14 [FB160100]          <1> 	dd sysdalloc	; 43 ; Deallocate contiguous memory block/pages
   245                              <1> 			     ; TRDOS 386 (19/02/2017) DMA buff fuctions
   246 0000CE18 [36170100]          <1> 	dd syscalbac	; 44 ; IRQ Callback and Signal Response Byte
   247                              <1> 			     ; service setup - TRDOS 386 (20/02/2017)
   248                              <1> 			     ; 28/08/2017 (20/08/2017)	
   249 0000CE1C [7F2D0100]          <1> 	dd sysdma	; 45 ; TRDOS 386 - (ISA) DMA service
   250                              <1> 	
   251                              <1> end_of_syscalls:
   252                              <1> 
   253                              <1> sysemt: ; enable (or disable) multi tasking -time sharing-
   254                              <1> 	;
   255                              <1> 	; 08/08/2022
   256                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
   257                              <1> 	; 23/05/2016 - TRDOS 386 (TRDOS v2.0)
   258                              <1> 	; 14/05/2015 (Retro UNIX 386 v1)
   259                              <1> 	; 10/12/2013 - 20/04/2014 (Retro UNIX 8086 v1)
   260                              <1> 	;
   261                              <1> 	; Retro UNIX 8086 v1 modification: 
   262                              <1> 	;	'Enable Multi Tasking'  system call instead 
   263                              <1> 	;	of 'Emulator Trap' in original UNIX v1 for PDP-11.
   264                              <1> 	;
   265                              <1> 	; Retro UNIX 8086 v1 feature only!
   266                              <1> 	;	Using purpose: Kernel will start without time-out
   267                              <1> 	;	(internal clock/timer) functionality.
   268                              <1> 	;	Then etc/init will enable clock/timer for
   269                              <1> 	;	multi tasking. 
   270                              <1> 	;
   271                              <1> 	; INPUT ->
   272                              <1> 	;	BL = 0 -> disable multi tasking
   273                              <1> 	;	BL > 1 -> enable multi tasking (time sharing) 
   274                              <1> 	; OUTPUT ->
   275                              <1> 	;	none	
   276                              <1> 	;
   277                              <1> 	;  Note: Multi tasking is disabled during system
   278                              <1> 	;	 initialization, it must be enabled by using
   279                              <1> 	;	 this system call. (Otherwise, running proces 
   280                              <1> 	;	 will not be changed by another process within
   281                              <1> 	;	 run time sequence/schedule, if running process
   282                              <1> 	;	 will not 'release' itself. Only 'wakeup' procedure
   283                              <1> 	;	 for waiting processes and programmed timer events
   284                              <1> 	;	 for other processes can change running process 
   285                              <1> 	;	 while multi tasking is disabled.) ** 23/05/2016 **
   286                              <1> 
   287 0000CE20 803D[72900100]00    <1> 	cmp	byte [u.uid], 0 ; root ?
   288                              <1> 	;ja	short error
   289                              <1> 	; 23/07/2022
   290                              <1> 	;ja	short badsys ; 14/05/2015
   291                              <1> 	; 08/08/2022
   292 0000CE27 7605                <1> 	jna	short sysemt_root
   293 0000CE29 E9EDFEFFFF          <1> 	jmp	badsys
   294                              <1> sysemt_root:	; 08/08/2022
   295 0000CE2E FA                  <1> 	cli
   296 0000CE2F 881D[16850100]      <1> 	mov	[multi_tasking], bl ; 0 to disable, >0 to enable
   297 0000CE35 EB20                <1> 	jmp	sysret
   298                              <1> 
   299                              <1> error:
   300                              <1> 	; 18/05/2016
   301                              <1> 	; 13/05/2016
   302                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
   303                              <1> 	; 16/04/2015 - 17/09/2015 (Retro UNIX 386 v1)
   304                              <1> 	; 10/04/2013 - 07/08/2013 (Retro UNIX 8086 v1)
   305                              <1> 	;
   306                              <1> 	; 'error' merely sets the error bit off the processor status (c-bit)
   307                              <1> 	; then falls right into the 'sysret', 'sysrele' return sequence.
   308                              <1> 	;
   309                              <1> 	; INPUTS -> none
   310                              <1> 	; OUTPUTS ->
   311                              <1> 	;	processor status - carry (c) bit is set (means error)
   312                              <1> 	;
   313                              <1> 	; 26/05/2013 (Stack pointer must be reset here! 
   314                              <1> 	; 	      Because, jumps to error procedure
   315                              <1> 	;	      disrupts push-pop nesting balance)
   316                              <1> 	;
   317 0000CE37 8B2D[18900100]      <1> 	mov	ebp, [u.sp] ; interrupt (system call) return (iretd) address
   318 0000CE3D 804D0801            <1> 	or	byte [ebp+8], 1  ; set carry bit of flags register
   319                              <1> 				 ; (system call will return with cf = 1)
   320                              <1> 		; bis $1,20.(r1) / set c bit in processor status word below
   321                              <1> 		               ; / users stack
   322                              <1> 	; 17/09/2015
   323 0000CE41 83ED30              <1> 	sub	ebp, ESPACE ; 48 ; total size of stack frame ('sysdefs.inc')
   324                              <1> 				 ; for saving/restoring user registers	
   325                              <1> 	;cmp	ebp, [u.usp]
   326                              <1> 	;je	short err0	
   327 0000CE44 892D[1C900100]      <1> 	mov	[u.usp], ebp
   328                              <1> ;err0:
   329                              <1> 	; 01/09/2015
   330 0000CE4A 8B25[1C900100]      <1> 	mov	esp, [u.usp] 	    ; Retro Unix 8086 v1 modification!
   331                              <1> 				    ; 10/04/2013
   332                              <1> 				    ; (If an I/O error occurs during disk I/O,
   333                              <1> 				    ; related procedures will jump to 'error'
   334                              <1> 				    ; procedure directly without returning to 
   335                              <1> 				    ; the caller procedure. So, stack pointer
   336                              <1>                                     ; must be restored here.)
   337                              <1> 	; 13/05/2016
   338                              <1> 	; NOTE: (The last) error code is in 'u.error', it can be retrieved by
   339                              <1> 	;	'get last error' system call later. 	
   340                              <1> 
   341                              <1> 	; 03/09/2015 - 09/06/2015 - 07/08/2013
   342 0000CE50 C605[86900100]00    <1> 	mov 	byte [u.kcall], 0 ; namei_r, mkdir_w reset
   343                              <1> 
   344                              <1> sysret: ; < return from system call>
   345                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5
   346                              <1> 	; 01/03/2017
   347                              <1> 	; 28/02/2017
   348                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
   349                              <1> 	; 16/04/2015 - 10/09/2015 (Retro UNIX 386 v1)
   350                              <1> 	; 10/04/2013 - 23/02/2014 (Retro UNIX 8086 v1)
   351                              <1> 	;
   352                              <1> 	; 'sysret' first checks to see if process is about to be 
   353                              <1> 	; terminated (u.bsys). If it is, 'sysexit' is called.
   354                              <1> 	; If not, following happens:	 
   355                              <1> 	; 	1) The user's stack pointer is restored.
   356                              <1> 	;	2) r1=0 and 'iget' is called to see if last mentioned
   357                              <1> 	;	   i-node has been modified. If it has, it is written out
   358                              <1> 	;	   via 'ppoke'.
   359                              <1> 	;	3) If the super block has been modified, it is written out
   360                              <1> 	;	   via 'ppoke'.				
   361                              <1> 	;	4) If the dismountable file system's super block has been
   362                              <1> 	;	   modified, it is written out to the specified device
   363                              <1> 	;	   via 'ppoke'.
   364                              <1> 	;	5) A check is made if user's time quantum (uquant) ran out
   365                              <1> 	;	   during his execution. If so, 'tswap' is called to give
   366                              <1> 	;	   another user a chance to run.
   367                              <1> 	;	6) 'sysret' now goes into 'sysrele'. 
   368                              <1> 	;	    (See 'sysrele' for conclusion.)		
   369                              <1> 	;
   370                              <1> 	; Calling sequence:
   371                              <1> 	;	jump table or 'br sysret'
   372                              <1> 	; Arguments: 
   373                              <1> 	;	-	
   374                              <1> 	; ...............................................................
   375                              <1> 	;	
   376                              <1> 	; ((AX=r1 for 'iget' input))
   377                              <1> 	;	
   378 0000CE57 31C0                <1> 	xor	eax, eax ; 28/02/2017
   379                              <1> sysret0: ; 29/07/2015 (eax = 0, jump from sysexec)
   380 0000CE59 FEC0                <1> 	inc	al ; 04/05/2013
   381 0000CE5B 3805[70900100]      <1> 	cmp	[u.bsys], al ; 1
   382                              <1> 		; tstb u.bsys / is a process about to be terminated because
   383                              <1>         ;jnb	sysexit ; 04/05/2013
   384                              <1> 		; bne sysexit / of an error? yes, go to sysexit
   385                              <1> 	; 23/07/2022
   386 0000CE61 7205                <1> 	jb	short sysret1
   387 0000CE63 E92C010000          <1> 	jmp	sysexit
   388                              <1> sysret1:	; 23/07/2022
   389                              <1> 	;mov	esp, [u.usp] ; 24/05/2013 (that is not needed here)
   390                              <1> 		; mov u.sp,sp / no point stack to users stack
   391 0000CE68 FEC8                <1> 	dec 	al ; mov ax, 0
   392                              <1> 		; clr r1 / zero r1 to check last mentioned i-node
   393 0000CE6A E80E500000          <1> 	call	iget
   394                              <1> 		; jsr r0,iget / if last mentioned i-node has been modified
   395                              <1> 		            ; / it is written out
   396                              <1> 	; 10/01/2017
   397                              <1> 	; 09/01/2017
   398                              <1> ;sysrele: ; < release >
   399                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
   400                              <1> 	; 16/04/2015 - 14/10/2015 (Retro UNIX 386 v1)
   401                              <1> 	; 10/04/2013 - 07/03/2014 (Retro UNIX 8086 v1)
   402                              <1> 	;
   403                              <1> 	; 'sysrele' first calls 'tswap' if the time quantum for a user is
   404                              <1> 	;  zero (see 'sysret'). It then restores the user's registers and
   405                              <1> 	; turns off the system flag. It then checked to see if there is
   406                              <1> 	; an interrupt from the user by calling 'isintr'. If there is, 
   407                              <1> 	; the output gets flashed (see isintr) and interrupt action is
   408                              <1> 	; taken by a branch to 'intract'. If there is no interrupt from
   409                              <1> 	; the user, a rti is made.
   410                              <1> 	;
   411                              <1> 	; Calling sequence:
   412                              <1> 	;	Fall through a 'bne' in 'sysret' & ?
   413                              <1> 	; Arguments:
   414                              <1> 	;	-	
   415                              <1> 	; ...............................................................
   416                              <1> 	;	
   417                              <1> 	; 23/02/2014 (swapret)
   418                              <1> 	; 22/09/2013
   419                              <1> sysrel0: ;1:
   420 0000CE6F 803D[68900100]00    <1> 	cmp	byte [u.quant], 0 ; 16/05/2013
   421                              <1> 		; tstb uquant / is the time quantum 0?
   422 0000CE76 7705                <1>         ja      short swapret
   423                              <1> 		; bne 1f / no, don't swap it out
   424                              <1> sysrelease: ; 07/12/2013 (jump from 'clock')
   425 0000CE78 E8283E0000          <1> 	call	tswap
   426                              <1> 		; jsr r0,tswap / yes, swap it out
   427                              <1> 	
   428                              <1> ; Retro Unix 8086 v1 feature: return from 'swap' to 'swapret' address.
   429                              <1> swapret: ;1:
   430                              <1> 	; 10/09/2015
   431                              <1> 	; 01/09/2015
   432                              <1> 	; 14/05/2015
   433                              <1> 	; 16/04/2015 (Retro UNIX 386 v1 - 32 bit, pm modifications)
   434                              <1> 	; 26/05/2013 (Retro UNIX 8086 v1)
   435                              <1> 	; cli
   436                              <1> 	; 24/07/2015
   437                              <1> 	;
   438                              <1> 	;; 'esp' must be already equal to '[u.usp]' here ! 
   439                              <1> 	;; mov	esp, [u.usp]
   440                              <1> 
   441                              <1> 	; 22/09/2013
   442 0000CE7D E8FB4F0000          <1> 	call	isintr
   443                              <1> 	; 20/10/2013
   444 0000CE82 7405                <1> 	jz	short sysrel1
   445 0000CE84 E8F4000000          <1> 	call	intract
   446                              <1> 		; jsr r0,isintr / is there an interrupt from the user
   447                              <1> 		;     br intract / yes, output gets flushed, take interrupt
   448                              <1> 		               ; / action
   449                              <1> sysrel1:
   450 0000CE89 FA                  <1> 	cli	; 14/10/2015
   451                              <1> sysrel2:
   452                              <1> 	; 28/02/2017
   453                              <1> 	; Check if there is a (delayed) callback for current user/process
   454 0000CE8A A0[97900100]        <1> 	mov	al, [u.irqwait]
   455 0000CE8F 240F                <1> 	and	al, 0Fh ; is there a waiting IRQ callback service ?
   456 0000CE91 7444                <1> 	jz	short sysrel8 ; no
   457                              <1> 
   458                              <1> 	; Set return to IRQ callback service and return from the service
   459 0000CE93 0FB6D8              <1> 	movzx	ebx, al
   460 0000CE96 883D[97900100]      <1> 	mov 	[u.irqwait], bh ; 0 ; reset
   461 0000CE9C 8A9B[E0370100]      <1> 	mov	bl, [ebx+IRQenum] ; (available) IRQ index +1 (1 to 9)
   462                              <1> 	; 01/03/2017
   463 0000CEA2 FECB                <1> 	dec	bl ; IRQ index number, 0 to 8
   464 0000CEA4 7831                <1> 	js	short sysrel8 ; 0 -> FFh (not in use!?) 
   465                              <1> 	;
   466 0000CEA6 A0[71900100]        <1> 	mov 	al, [u.uno] ; current process (user) number 
   467 0000CEAB 3883[608A0100]      <1> 	cmp	[ebx+IRQ.owner], al
   468 0000CEB1 7524                <1> 	jne	short sysrel8 ; it is not the current user/process !?
   469 0000CEB3 F683[728A0100]01    <1> 	test	byte [ebx+IRQ.method], 1 ; callback ?
   470 0000CEBA 741B                <1> 	jz	short sysrel8 ; not a callback method !?
   471                              <1> 
   472 0000CEBC 8B93[848A0100]      <1> 	mov	edx, [ebx+IRQ.addr] ; IRQ callback service address (virtual)
   473 0000CEC2 C605[98900100]01    <1> 	mov	byte [u.r_lock], 1 ; IRQ callback service in progress flag
   474                              <1> 
   475 0000CEC9 E87F3E0000          <1> 	call	wswap ; save user's registers & status 
   476                              <1> 		      ;	(for return from IRQ callback service)
   477                              <1> 
   478 0000CECE 8B2D[18900100]      <1> 	mov	ebp, [u.sp]; kernel's stack, points to EIP (user)
   479 0000CED4 895500              <1> 	mov	[ebp], edx ; IRQ call back service address
   480                              <1> sysrel8:
   481 0000CED7 FE0D[14900100]      <1> 	dec	byte [sysflg]
   482                              <1> 		; decb sysflg / turn system flag off
   483                              <1> 	
   484 0000CEDD A1[78900100]        <1> 	mov	eax, [u.pgdir]	
   485 0000CEE2 0F22D8              <1> 	mov	cr3, eax  ; 1st PDE points to Kernel Page Table 0 (1st 4 MB)
   486                              <1> 			  ; (others are different than kernel page tables) 
   487                              <1> 	; 10/09/2015
   488 0000CEE5 61                  <1> 	popad ; edi, esi, ebp, temp (icrement esp by 4), ebx, edx, ecx, eax
   489                              <1> 		; mov (sp)+,sc / restore user registers
   490                              <1> 		; mov (sp)+,mq
   491                              <1> 		; mov (sp)+,ac
   492                              <1> 		; mov (sp)+,r5
   493                              <1> 		; mov (sp)+,r4
   494                              <1> 		; mov (sp)+,r3
   495                              <1> 		; mov (sp)+,r2
   496                              <1> 	;
   497 0000CEE6 A1[20900100]        <1> 	mov	eax, [u.r0]  ; ((return value in EAX))
   498 0000CEEB 0FA9                <1> 	pop	gs
   499 0000CEED 0FA1                <1> 	pop	fs
   500 0000CEEF 07                  <1> 	pop	es
   501 0000CEF0 1F                  <1> 	pop	ds
   502                              <1> 	;or	word [esp+8], 200h ; 22/01/2017 ; force enabling interrupts
   503 0000CEF1 CF                  <1> 	iretd	
   504                              <1> 		; rti / no, return from interrupt
   505                              <1> 
   506                              <1> sysrele:
   507                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
   508                              <1> 	; 24/03/2017
   509                              <1> 	; 28/02/2017
   510                              <1> 	; 27/02/2017
   511                              <1> 	; 29/01/2017
   512                              <1> 	; 14/01/2017
   513                              <1> 	; 13/01/2017
   514                              <1> 	; 09/01/2017 - 10/01/2017 - 12/01/2017
   515                              <1> 	; Major modification for TRDOS 386 (CallBack return)
   516                              <1> 	;
   517                              <1> 	; 'sysrele' system call restores previously saved
   518                              <1> 	; registers and addresses of the process
   519                              <1> 	; (Main purpose -in TRDOS 386- is to return from
   520                              <1> 	; timer callback service routine in ring 3 -user mode-.)
   521                              <1> 	;
   522                              <1> 	; check if the process is in timer callback phase
   523 0000CEF2 803D[94900100]00    <1> 	cmp	byte [u.t_lock], 0 ; TIMER INT LOCK
   524                              <1> 	;je	short sysrel0 ; classic (Retro UNIX 386 type) sysrele
   525 0000CEF9 7735                <1> 	ja	short sysrel3
   526                              <1> 	; 27/02/2017
   527 0000CEFB 803D[98900100]00    <1> 	cmp	byte [u.r_lock], 0 ; IRQ callback lock	
   528                              <1> 	;jna	sysrel0 ; classic sysrele ; 24/03/2017
   529                              <1> 	; 23/07/2022
   530 0000CF02 7705                <1> 	ja	short sysrel9
   531 0000CF04 E966FFFFFF          <1> 	jmp	sysrel0
   532                              <1> sysrel9:	; 23/07/2022
   533 0000CF09 E859000000          <1> 	call	sysrel7
   534 0000CF0E 803D[98900100]00    <1> 	cmp	byte [u.r_lock], 0 ; IRQ callback service lock
   535 0000CF15 7628                <1> 	jna	short sysrel4
   536 0000CF17 C605[98900100]00    <1> 	mov	byte [u.r_lock], 0 ; reset
   537                              <1> 	;mov	byte [u.irqwait], 0 ; reset ; 28/02/2017
   538 0000CF1E A0[99900100]        <1> 	mov	al, [u.r_mode]
   539 0000CF23 08C0                <1> 	or	al, al
   540 0000CF25 7518                <1> 	jnz	short sysrel4
   541 0000CF27 FEC8                <1> 	dec	al
   542 0000CF29 A2[99900100]        <1> 	mov	[u.r_mode], al ; 0FFh ; not necessary !?
   543 0000CF2E EB32                <1> 	jmp	short sysrel6		
   544                              <1> sysrel3:
   545                              <1> 	; 27/02/2017
   546 0000CF30 E832000000          <1> 	call	sysrel7
   547                              <1> 	; 14/01/2017
   548 0000CF35 28C0                <1> 	sub	al, al
   549 0000CF37 3805[94900100]      <1> 	cmp	[u.t_lock], al ; 0 ; TIMER INT LOCK
   550 0000CF3D 770E                <1> 	ja	short sysrel5 ; yes
   551                              <1> sysrel4:
   552                              <1> 	; 29/01/2017
   553 0000CF3F 8B44241C            <1> 	mov	eax, [esp+28] ; eax
   554 0000CF43 A3[20900100]        <1> 	mov	[u.r0], eax
   555 0000CF48 E93DFFFFFF          <1> 	jmp	sysrel2
   556                              <1> sysrel5:
   557 0000CF4D A2[94900100]        <1> 	mov	[u.t_lock], al ; 0 ; reset
   558 0000CF52 A0[95900100]        <1> 	mov	al, [u.t_mode]
   559 0000CF57 20C0                <1> 	and	al, al
   560                              <1> 	;jnz	short sysrel2 ; 0FFh ; user mode
   561 0000CF59 75E4                <1> 	jnz	short sysrel4 ; 29/01/2017
   562 0000CF5B FEC8                <1> 	dec	al
   563 0000CF5D A2[95900100]        <1> 	mov	[u.t_mode], al ; 0FFh ; not necessary !?
   564                              <1> sysrel6:
   565                              <1> 	; cpu will continue from the interrupted sytem call addr
   566 0000CF62 61                  <1> 	popad		; edi, esi, ebp, esp, ebx, edx, ecx, eax
   567 0000CF63 83C410              <1> 	add	esp, 16	; pass segment segisters: ds, es, fs, gs		
   568 0000CF66 CF                  <1> 	iretd		; eip, cs, eflags
   569                              <1> 
   570                              <1> sysrel7:
   571 0000CF67 0FB61D[71900100]    <1> 	movzx	ebx, byte [u.uno] ; current process number
   572                              <1> 	;shl	bx, 2
   573                              <1> 	; 23/07/2022
   574 0000CF6E C1E302              <1> 	shl	ebx, 2
   575                              <1> 	;cmp	[ebx+p.tcb-4], eax ; 0 ; is there callback address ?
   576                              <1> 	;jna	short sysrel0 
   577                              <1> 	; yes, reset callback address then restore process registers 
   578                              <1> 	;mov	[ebx+p.tcb-4], eax ; 0 ; reset
   579 0000CF71 8B83[708F0100]      <1> 	mov     eax, [ebx+p.upage-4] ; UPAGE address
   580 0000CF77 FA                  <1> 	cli	; disable interrupts till 'iretd'
   581 0000CF78 E9083E0000          <1> 	jmp	rswap ; restore process 'u' structure
   582                              <1>  
   583                              <1> intract: ; / interrupt action
   584                              <1> 	; 14/10/2015
   585                              <1> 	; 16/04/2015 (Retro UNIX 386 v1 - Beginning)
   586                              <1> 	; 09/05/2013 - 07/12/2013 (Retro UNIX 8086 v1)
   587                              <1> 	;
   588                              <1> 	; Retro UNIX 8086 v1 modification !
   589                              <1> 	; (Process/task switching and quit routine by using
   590                              <1> 	; Retro UNIX 8086 v1 keyboard interrupt output.))
   591                              <1> 	;
   592                              <1> 	; input -> 'u.quit'  (also value of 'u.intr' > 0)
   593                              <1> 	; output -> If value of 'u.quit' = FFFFh ('ctrl+brk' sign)
   594                              <1> 	;		'intract' will jump to 'sysexit'.
   595                              <1> 	;	    Intract will return to the caller 
   596                              <1> 	;		if value of 'u.quit' <> FFFFh. 	 
   597                              <1> 	; 14/10/2015
   598 0000CF7D FB                  <1> 	sti
   599                              <1> 	; 07/12/2013	
   600 0000CF7E 66FF05[6E900100]    <1> 	inc 	word [u.quit]
   601 0000CF85 7408                <1> 	jz	short intrct0 ; FFFFh -> 0
   602 0000CF87 66FF0D[6E900100]    <1> 	dec	word [u.quit]
   603                              <1> 	; 16/04/2015
   604 0000CF8E C3                  <1> 	retn
   605                              <1> intrct0:	
   606 0000CF8F 58                  <1> 	pop	eax ; call intract -> retn
   607                              <1> 	;
   608 0000CF90 31C0                <1> 	xor 	eax, eax
   609 0000CF92 FEC0                <1> 	inc	al  ; mov ax, 1
   610                              <1> ;;;
   611                              <1> 	; UNIX v1 original 'intract' routine... 
   612                              <1> 	; / interrupt action
   613                              <1> 		;cmp *(sp),$rti / are you in a clock interrupt?
   614                              <1> 		; bne 1f / no, 1f
   615                              <1> 		; cmp (sp)+,(sp)+ / pop clock pointer
   616                              <1> 	; 1: / now in user area
   617                              <1> 		; mov r1,-(sp) / save r1
   618                              <1> 		; mov u.ttyp,r1 
   619                              <1> 			; / pointer to tty buffer in control-to r1
   620                              <1> 		; cmpb 6(r1),$177
   621                              <1> 			; / is the interrupt char equal to "del"
   622                              <1> 		; beq 1f / yes, 1f
   623                              <1> 		; clrb 6(r1) 
   624                              <1> 		        ; / no, clear the byte 
   625                              <1> 			; / (must be a quit character)
   626                              <1> 		; mov (sp)+,r1 / restore r1
   627                              <1> 		; clr u.quit / clear quit flag
   628                              <1> 		; bis $20,2(sp) 
   629                              <1> 		    	; / set trace for quit (sets t bit of 
   630                              <1> 			; / ps-trace trap)
   631                              <1> 		; rti   ;  / return from interrupt
   632                              <1> 	; 1: / interrupt char = del
   633                              <1> 		; clrb 6(r1) / clear the interrupt byte 
   634                              <1> 			   ; / in the buffer
   635                              <1> 		; mov (sp)+,r1 / restore r1
   636                              <1> 		; cmp u.intr,$core / should control be 
   637                              <1> 				; / transferred to loc core?
   638                              <1> 		; blo 1f
   639                              <1> 		; jmp *u.intr / user to do rti yes, 
   640                              <1> 				; / transfer to loc core
   641                              <1> 	; 1:
   642                              <1> 		; sys 1 / exit
   643                              <1> 
   644                              <1> sysexit: ; <terminate process>
   645                              <1> 	; 30/07/2022
   646                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
   647                              <1> 	; 14/11/2017
   648                              <1> 	; 27/05/2017
   649                              <1> 	; 10/04/2017
   650                              <1> 	; 26/02/2017 - 28/02/2017
   651                              <1> 	; 02/01/2017 - 23/01/2017
   652                              <1> 	; 06/06/2016 - 10/06/2016
   653                              <1> 	; 19/05/2016 - 23/05/2016
   654                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
   655                              <1> 	; 16/04/2015 - 01/09/2015 (Retro UNIX 386 v1)
   656                              <1> 	; 19/04/2013 - 14/02/2014 (Retro UNIX 8086 v1)
   657                              <1> 	;
   658                              <1> 	; 'sysexit' terminates a process. First each file that
   659                              <1> 	; the process has opened is closed by 'flose'. The process
   660                              <1> 	; status is then set to unused. The 'p.pid' table is then
   661                              <1> 	; searched to find children of the dying process. If any of
   662                              <1> 	; children are zombies (died by not waited for), they are
   663                              <1> 	; set free. The 'p.pid' table is then searched to find the
   664                              <1> 	; dying process's parent. When the parent is found, it is
   665                              <1> 	; checked to see if it is free or it is a zombie. If it is
   666                              <1> 	; one of these, the dying process just dies. If it is waiting
   667                              <1> 	; for a child process to die, it notified that it doesn't 
   668                              <1> 	; have to wait anymore by setting it's status from 2 to 1
   669                              <1> 	; (waiting to active). It is awakened and put on runq by
   670                              <1> 	; 'putlu'. The dying process enters a zombie state in which
   671                              <1> 	; it will never be run again but stays around until a 'wait'
   672                              <1> 	; is completed by it's parent process. If the parent is not
   673                              <1> 	; found, process just dies. This means 'swap' is called with
   674                              <1> 	; 'u.uno=0'. What this does is the 'wswap' is not called
   675                              <1> 	; to write out the process and 'rswap' reads the new process
   676                              <1> 	; over the one that dies..i.e., the dying process is 
   677                              <1> 	; overwritten and destroyed.	
   678                              <1>  	;
   679                              <1> 	; Calling sequence:
   680                              <1> 	;	sysexit or conditional branch.
   681                              <1> 	; Arguments:
   682                              <1> 	;	-	
   683                              <1> 	; ...............................................................
   684                              <1> 	;	
   685                              <1> 	; Retro UNIX 8086 v1 modification: 
   686                              <1> 	;       System call number (=1) is in EAX register.
   687                              <1> 	;
   688                              <1> 	;       Other parameters are in EDX, EBX, ECX, ESI, EDI, EBP
   689                              <1> 	;       registers depending of function details.
   690                              <1> 	;
   691                              <1> 	; ('swap' procedure is mostly different than original UNIX v1.)
   692                              <1> 	;
   693                              <1> ; / terminate process
   694                              <1> 	; AX = 1
   695 0000CF94 6648                <1> 	dec 	ax ; 0
   696 0000CF96 66A3[6C900100]      <1> 	mov	[u.intr], ax ; 0
   697                              <1> 		; clr u.intr / clear interrupt control word
   698                              <1> 		; clr r1 / clear r1
   699                              <1> sysexit_0:
   700                              <1> 	; 30/07/2022
   701                              <1> 	; 23/01/2017
   702                              <1> 	; 02/01/2017
   703                              <1> 	; 10/06/2016
   704                              <1> 	; 06/06/2016
   705                              <1> 	; 23/05/2016
   706                              <1> 	; 19/05/2016 - TRDOS 386 (TRDOS v2.0)
   707                              <1> 	; Check and stop/clear timer event(s) of this (dying) process
   708                              <1> 	; if there is.
   709                              <1> 
   710                              <1> 	; 02/01/2017 
   711 0000CF9C FA                  <1> 	cli	; disable interrupts
   712                              <1> 	; 23/01/2017 - reset timer frequency (to 18.2Hz)
   713 0000CF9D B036                <1> 	mov	al, 00110110b ; 36h
   714 0000CF9F E643                <1>  	out	43h, al
   715 0000CFA1 28C0                <1> 	sub	al, al ; 0
   716 0000CFA3 E640                <1> 	out	40h, al ; LB
   717 0000CFA5 E640                <1> 	out	40h, al ; HB
   718                              <1>  	; 
   719 0000CFA7 0FB61D[71900100]    <1> 	movzx	ebx, byte [u.uno]
   720                              <1> 	;mov	bl, [u.uno] ; process number of dying process
   721 0000CFAE 3883[B38F0100]      <1> 	cmp	byte [ebx+p.timer-1], al ; 0
   722 0000CFB4 7639                <1> 	jna	short sysexit_12 ; no timer events for this process
   723 0000CFB6 8883[B38F0100]      <1> 	mov	byte [ebx+p.timer-1], al ; 0 ; reset
   724                              <1> 	;mov	al, [timer_events]
   725                              <1> 	;or	al, al
   726                              <1>  	;jz	short sysexit_12 ; no timer events
   727                              <1> 	;mov	cl, al
   728 0000CFBC 8A0D[17850100]      <1> 	mov	cl, [timer_events] ; 14/11/2017
   729                              <1> 	;cli	; disable interrupts 
   730 0000CFC2 B410                <1> 	mov	ah, 16 ; number of available timer events
   731 0000CFC4 BE[30910100]        <1> 	mov	esi, timer_set ; beginning address of timer events
   732                              <1> sysexit_7:
   733 0000CFC9 8A06                <1> 	mov	al, [esi] ; process number (of timer event)
   734 0000CFCB 38D8                <1> 	cmp	al, bl ; process number comparison
   735 0000CFCD 7411                <1> 	je	short sysexit_10
   736 0000CFCF 20C0                <1> 	and	al, al
   737 0000CFD1 7404                <1> 	jz	short sysexit_9
   738                              <1> sysexit_8:
   739 0000CFD3 FEC9                <1> 	dec	cl
   740 0000CFD5 7416                <1> 	jz	short sysexit_11
   741                              <1> sysexit_9:
   742 0000CFD7 FECC                <1> 	dec	ah
   743 0000CFD9 7414                <1> 	jz	short sysexit_12
   744 0000CFDB 83C610              <1> 	add	esi, 16
   745 0000CFDE EBE9                <1> 	jmp	short sysexit_7
   746                              <1> 
   747                              <1> sysexit_10:
   748                              <1> 	;mov	byte [esi], 0
   749 0000CFE0 66C7060000          <1> 	mov	word [esi], 0
   750                              <1> 	;mov	dword [esi+12], 0
   751                              <1> 	;
   752 0000CFE5 FE0D[17850100]      <1> 	dec	byte [timer_events] ; 02/01/2017
   753                              <1> 	;
   754 0000CFEB EBE6                <1> 	jmp	short sysexit_8
   755                              <1> 
   756                              <1> sysexit_11:
   757                              <1> 	;sub	ax, ax ; 0 ; 26/02/2017
   758                              <1> 	; 30/07/2022
   759 0000CFED 29C0                <1> 	sub	eax, eax ; 0
   760                              <1> sysexit_12:
   761                              <1> 	; 26/02/2017 (Unlink IRQ callbacks belong to the user)
   762 0000CFEF 803D[96900100]00    <1> 	cmp	byte [u.irqc], 0 ; Count of IRQ callbacks
   763 0000CFF6 7E2E                <1> 	jng	short sysexit_16 ; zero or invalid
   764                              <1> 	; 28/02/2017
   765                              <1> 	; clear IRQ callback flags (for 'sysrele' and 'sysret')
   766 0000CFF8 A2[97900100]        <1> 	mov	[u.irqwait], al ; 0 ; force to clear waiting flag
   767 0000CFFD A2[98900100]        <1> 	mov	[u.r_lock], al ; 0 ; force to clear busy flag
   768 0000D002 BE[608A0100]        <1> 	mov	esi, IRQ.owner
   769                              <1> sysexit_13:	
   770 0000D007 AC                  <1> 	lodsb
   771 0000D008 3A05[71900100]      <1> 	cmp	al, [u.uno] ; owner = current user ?
   772 0000D00E 750C                <1> 	jne	short sysexit_14
   773 0000D010 C646FF00            <1> 	mov	byte [esi-1], 0 ; owner = 0 : Free
   774 0000D014 FE0D[96900100]      <1> 	dec	byte [u.irqc]
   775 0000D01A 7408                <1> 	jz	short sysexit_15
   776                              <1> sysexit_14:
   777 0000D01C 81FE[688A0100]      <1> 	cmp	esi, IRQ.owner + 8 ; the last IRQ index number ?
   778 0000D022 76E3                <1> 	jna	short sysexit_13 ; no
   779                              <1> sysexit_15:
   780 0000D024 30C0                <1> 	xor	al, al ; 0
   781                              <1> sysexit_16: ; 2:
   782 0000D026 FB                  <1> 	sti	; enable interrupts 
   783                              <1> 	;
   784                              <1> 	; AX = 0
   785                              <1> sysexit_1: ; 1:
   786                              <1> 	; AX = File descriptor
   787                              <1> 		; / r1 has file descriptor (index to u.fp list)
   788                              <1> 		; / Search the whole list
   789 0000D027 E8D8350000          <1> 	call	fclose
   790                              <1> 		; jsr r0,fclose / close all files the process opened
   791                              <1> 	;; ignore error return
   792                              <1> 		; br .+2 / ignore error return
   793                              <1> 	;inc	ax
   794 0000D02C FEC0                <1> 	inc	al
   795                              <1> 		; inc r1 / increment file descriptor
   796                              <1> 	;cmp	ax, 10
   797 0000D02E 3C0A                <1> 	cmp	al, 10
   798                              <1> 		; cmp r1,$10. / end of u.fp list?
   799 0000D030 72F5                <1> 	jb	short sysexit_1
   800                              <1> 		; blt 1b / no, go back
   801                              <1> 	;movzx	ebx, byte [u.uno]
   802 0000D032 8A1D[71900100]      <1> 	mov	bl, [u.uno] ; 02/01/2017
   803                              <1> 		; movb	u.uno,r1 / yes, move dying process's number to r1
   804 0000D038 88A3[638F0100]      <1> 	mov	[ebx+p.stat-1], ah ; 0, SFREE
   805                              <1> 		; clrb p.stat-1(r1) / free the process
   806                              <1> 	; 10/04/2017
   807 0000D03E 381D[D98A0100]      <1> 	cmp	[audio_user], bl
   808 0000D044 7518                <1> 	jne	short sysexit_17
   809                              <1> 	; reset audio device (current) owner and 'initializated' flag
   810 0000D046 883D[D98A0100]      <1> 	mov	[audio_user], bh ; 0
   811                              <1> 	; 27/05/2017
   812 0000D04C 8B0D[C48A0100]      <1> 	mov	ecx,  [audio_buffer]
   813 0000D052 09C9                <1> 	or	ecx, ecx
   814 0000D054 7408                <1> 	jz	short sysexit_17
   815                              <1> 	; 'deallocate_user_pages' is not necessary in sysexit !!!
   816                              <1> 	;push	ebx
   817                              <1> 	;mov	ebx, ecx
   818                              <1> 	;mov	ecx, [audio_buff_size]
   819                              <1> 	;call	deallocate_user_pages
   820                              <1> 	;; (Modified Registers -> EAX, EDX, ESI, EDI, EBX, ECX, EBP)
   821 0000D056 29C9                <1> 	sub	ecx, ecx
   822 0000D058 890D[C48A0100]      <1> 	mov	[audio_buffer], ecx ; 0
   823                              <1> 	;pop	ebx
   824                              <1> sysexit_17:
   825                              <1> 	;shl	bx, 1
   826 0000D05E D0E3                <1> 	shl	bl, 1
   827                              <1> 		; asl r1 / use r1 for index into the below tables
   828 0000D060 668B8B[028F0100]    <1> 	mov	cx, [ebx+p.pid-2]
   829                              <1> 		; mov p.pid-2(r1),r3 / move dying process's name to r3
   830 0000D067 668B93[228F0100]    <1> 	mov	dx, [ebx+p.ppid-2]
   831                              <1> 		; mov p.ppid-2(r1),r4 / move its parents name to r4
   832                              <1> 	; xor 	bx, bx ; 0
   833 0000D06E 30DB                <1> 	xor	bl, bl ; 0
   834                              <1> 		; clr r2
   835 0000D070 31F6                <1> 	xor	esi, esi ; 0
   836                              <1> 		; clr r5 / initialize reg
   837                              <1> sysexit_2: ; 1:
   838                              <1> 	        ; / find children of this dying process, 
   839                              <1> 		; / if they are zombies, free them
   840                              <1> 	;add	bx, 2
   841 0000D072 80C302              <1> 	add	bl, 2
   842                              <1> 		; add $2,r2 / search parent process table 
   843                              <1> 		          ; / for dying process's name
   844 0000D075 66398B[228F0100]    <1> 	cmp	[ebx+p.ppid-2], cx
   845                              <1> 		; cmp p.ppid-2(r2),r3 / found it?
   846 0000D07C 7513                <1> 	jne	short sysexit_4
   847                              <1> 		; bne 3f / no
   848                              <1> 	;shr	bx, 1
   849 0000D07E D0EB                <1> 	shr	bl, 1
   850                              <1> 		; asr r2 / yes, it is a parent
   851 0000D080 80BB[638F0100]03    <1> 	cmp	byte [ebx+p.stat-1], 3 ; SZOMB
   852                              <1> 		; cmpb p.stat-1(r2),$3 / is the child of this 
   853                              <1> 				     ; / dying process a zombie
   854 0000D087 7506                <1> 	jne	short sysexit_3 
   855                              <1> 		; bne 2f / no
   856 0000D089 88A3[638F0100]      <1> 	mov	[ebx+p.stat-1], ah ; 0, SFREE
   857                              <1> 		; clrb p.stat-1(r2) / yes, free the child process
   858                              <1> sysexit_3: ; 2:
   859                              <1> 	;shr	bx, 1
   860 0000D08F D0E3                <1> 	shl	bl, 1
   861                              <1> 		; asl r2
   862                              <1> sysexit_4: ; 3:
   863                              <1> 		; / search the process name table 
   864                              <1> 		; / for the dying process's parent
   865 0000D091 663993[028F0100]    <1> 	cmp	[ebx+p.pid-2], dx
   866                              <1> 		; cmp p.pid-2(r2),r4 / found it?
   867 0000D098 7502                <1> 	jne	short sysexit_5
   868                              <1> 		; bne 3f / no
   869 0000D09A 89DE                <1> 	mov	esi, ebx
   870                              <1> 		; mov r2,r5 / yes, put index to p.pid table (parents
   871                              <1> 		          ; / process # x2) in r5
   872                              <1> sysexit_5: ; 3:
   873                              <1> 	;cmp	bx, nproc + nproc
   874 0000D09C 80FB20              <1> 	cmp	bl, nproc + nproc
   875                              <1> 		; cmp r2,$nproc+nproc / has whole table been searched?
   876 0000D09F 72D1                <1> 	jb	short sysexit_2
   877                              <1> 		; blt 1b / no, go back
   878                              <1> 		; mov r5,r1 / yes, r1 now has parents process # x2
   879 0000D0A1 21F6                <1> 	and	esi, esi ; r5=r1
   880 0000D0A3 7435                <1> 	jz	short sysexit_6
   881                              <1> 		; beq 2f / no parent has been found. 
   882                              <1> 		       ; / The process just dies
   883                              <1> 	;shr	si, 1
   884                              <1> 	; 23/07/2022
   885 0000D0A5 D1EE                <1> 	shr	esi, 1
   886                              <1> 		; asr r1 / set up index to p.stat
   887 0000D0A7 8A86[638F0100]      <1> 	mov	al, [esi+p.stat-1]
   888                              <1> 		; movb p.stat-1(r1),r2 / move status of parent to r2
   889 0000D0AD 20C0                <1> 	and	al, al
   890 0000D0AF 7429                <1> 	jz	short sysexit_6
   891                              <1> 		; beq 2f / if its been freed, 2f
   892 0000D0B1 3C03                <1> 	cmp	al, 3
   893                              <1> 		; cmp r2,$3 / is parent a zombie?
   894 0000D0B3 7425                <1> 	je	short sysexit_6
   895                              <1> 		; beq 2f / yes, 2f
   896                              <1> 	; BH = 0
   897 0000D0B5 8A1D[71900100]      <1> 	mov	bl, [u.uno]
   898                              <1> 		; movb u.uno,r3 / move dying process's number to r3
   899 0000D0BB C683[638F0100]03    <1> 	mov	byte [ebx+p.stat-1], 3  ; SZOMB
   900                              <1> 		; movb $3,p.stat-1(r3) / make the process a zombie
   901 0000D0C2 3C01                <1> 	cmp	al, 1 ; SRUN
   902 0000D0C4 7414                <1> 	je	short sysexit_6
   903                              <1> 	;cmp	al, 2
   904                              <1> 		; cmp r2,$2 / is the parent waiting for 
   905                              <1> 			  ; / this child to die
   906                              <1> 	;jne	short sysexit_6	
   907                              <1> 		; bne 2f / yes, notify parent not to wait any more
   908                              <1> 	; p.stat = 2 --> waiting
   909                              <1> 	; p.stat = 4 --> sleeping
   910 0000D0C6 C686[638F0100]01    <1> 	mov	byte [esi+p.stat-1], 1 ; SRUN
   911                              <1> 	;dec	byte [esi+p.stat-1]
   912                              <1> 		; decb	p.stat-1(r1) / awaken it by putting it (parent)
   913 0000D0CD 6689F0              <1> 	mov	ax, si ; r1  (process number in AL)
   914                              <1> 	; 
   915                              <1> 	;mov	ebx, runq + 4
   916                              <1> 		; mov $runq+4,r2 / on the runq
   917 0000D0D0 BB[10900100]        <1> 	mov	ebx, runq+2 ; normal run queue ; 02/01/2017
   918 0000D0D5 E8E33C0000          <1> 	call	putlu
   919                              <1> 		; jsr r0, putlu
   920                              <1> sysexit_6: 
   921                              <1> 		; / the process dies
   922 0000D0DA C605[71900100]00    <1> 	mov	byte [u.uno], 0
   923                              <1> 		; clrb u.uno / put zero as the process number, 
   924                              <1> 	           ; / so "swap" will
   925 0000D0E1 E8D93B0000          <1> 	call	swap
   926                              <1> 		; jsr r0,swap / overwrite process with another process
   927                              <1> hlt_sys:
   928                              <1> 	;sti
   929                              <1> hlts0:
   930 0000D0E6 F4                  <1> 	hlt
   931 0000D0E7 EBFD                <1> 	jmp	short hlts0
   932                              <1> 		; 0 / and thereby kill it; halt?
   933                              <1> 
   934                              <1> syswait: ; < wait for a processs to die >
   935                              <1> 	; 30/07/2022
   936                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
   937                              <1> 	; 17/09/2015
   938                              <1> 	; 02/09/2015
   939                              <1> 	; 01/09/2015
   940                              <1> 	; 16/04/2015 (Retro UNIX 386 v1 - Beginning)
   941                              <1> 	; 24/05/2013 - 05/02/2014 (Retro UNIX 8086 v1)
   942                              <1> 	;
   943                              <1> 	; 'syswait' waits for a process die. 
   944                              <1> 	; It works in following way:
   945                              <1> 	;    1) From the parent process number, the parent's 
   946                              <1> 	; 	process name is found. The p.ppid table of parent
   947                              <1> 	;	names is then searched for this process name.
   948                              <1> 	;	If a match occurs, r2 contains child's process
   949                              <1> 	;	number. The child status is checked to see if it is
   950                              <1> 	;	a zombie, i.e; dead but not waited for (p.stat=3)
   951                              <1> 	;	If it is, the child process is freed and it's name
   952                              <1> 	;	is put in (u.r0). A return is then made via 'sysret'.
   953                              <1> 	;	If the child is not a zombie, nothing happens and
   954                              <1> 	;	the search goes on through the p.ppid table until
   955                              <1> 	;	all processes are checked or a zombie is found.
   956                              <1> 	;    2) If no zombies are found, a check is made to see if
   957                              <1> 	;	there are any children at all. If there are none,
   958                              <1> 	;	an error return is made. If there are, the parent's
   959                              <1> 	;	status is set to 2 (waiting for child to die),
   960                              <1> 	;	the parent is swapped out, and a branch to 'syswait'
   961                              <1> 	;	is made to wait on the next process.
   962                              <1> 	;
   963                              <1> 	; Calling sequence:
   964                              <1> 	;	?
   965                              <1> 	; Arguments:
   966                              <1> 	;	-
   967                              <1> 	; Inputs: - 
   968                              <1> 	; Outputs: if zombie found, it's name put in u.r0.	
   969                              <1> 	; ...............................................................
   970                              <1> 	;				
   971                              <1> 	
   972                              <1> ; / wait for a process to die
   973                              <1> 
   974                              <1> syswait_0:
   975 0000D0E9 0FB61D[71900100]    <1> 	movzx	ebx, byte [u.uno] ; 01/09/2015
   976                              <1> 		; movb u.uno,r1 / put parents process number in r1
   977 0000D0F0 D0E3                <1> 	shl	bl, 1
   978                              <1> 	;shl	bx, 1
   979                              <1> 		; asl r1 / x2 to get index into p.pid table
   980 0000D0F2 668B83[028F0100]    <1> 	mov	ax, [ebx+p.pid-2]
   981                              <1> 		; mov p.pid-2(r1),r1 / get the name of this process
   982 0000D0F9 31F6                <1> 	xor	esi, esi
   983                              <1> 		; clr r2
   984 0000D0FB 31C9                <1> 	xor	ecx, ecx ; 30/10/2013
   985                              <1> 	;xor 	cl, cl
   986                              <1> 		; clr r3 / initialize reg 3
   987                              <1> syswait_1: ; 1:
   988                              <1> 	;add	si, 2
   989                              <1> 	; 23/07/2022
   990 0000D0FD 46                  <1> 	inc	esi
   991 0000D0FE 46                  <1> 	inc	esi
   992                              <1> 		; add $2,r2 / use r2 for index into p.ppid table
   993                              <1> 			  ; / search table of parent processes 
   994                              <1> 			  ; / for this process name
   995 0000D0FF 663B86[228F0100]    <1> 	cmp	ax, [esi+p.ppid-2]
   996                              <1> 		; cmp p.ppid-2(r2),r1 / r2 will contain the childs 
   997                              <1> 			            ; / process number
   998 0000D106 7531                <1> 	jne	short syswait_3
   999                              <1> 		;bne 3f / branch if no match of parent process name
  1000                              <1> 	;inc	cx
  1001 0000D108 FEC1                <1> 	inc	cl
  1002                              <1> 		;inc r3 / yes, a match, r3 indicates number of children
  1003                              <1> 	;shr	si, 1
  1004                              <1> 	; 23/07/2022
  1005 0000D10A D1EE                <1> 	shr	esi, 1 
  1006                              <1> 		; asr r2 / r2/2 to get index to p.stat table
  1007                              <1> 	; The possible states ('p.stat' values) of a process are:
  1008                              <1> 	;	0 = free or unused
  1009                              <1> 	;	1 = active
  1010                              <1> 	;	2 = waiting for a child process to die
  1011                              <1> 	;	3 = terminated, but not yet waited for (zombie).	
  1012 0000D10C 80BE[638F0100]03    <1> 	cmp	byte [esi+p.stat-1], 3 ; SZOMB, 05/02/2014
  1013                              <1> 		; cmpb p.stat-1(r2),$3 / is the child process a zombie?
  1014 0000D113 7522                <1> 	jne	short syswait_2
  1015                              <1> 		; bne 2f / no, skip it
  1016 0000D115 88BE[638F0100]      <1> 	mov	[esi+p.stat-1], bh ; 0
  1017                              <1> 		; clrb p.stat-1(r2) / yes, free it
  1018                              <1> 	;shl	si, 1
  1019                              <1> 	; 23/07/2022
  1020 0000D11B D1E6                <1> 	shl	esi, 1
  1021                              <1> 		; asl r2 / r2x2 to get index into p.pid table
  1022 0000D11D 0FB786[028F0100]    <1> 	movzx	eax, word [esi+p.pid-2]
  1023 0000D124 A3[20900100]        <1> 	mov	[u.r0], eax
  1024                              <1> 		; mov p.pid-2(r2),*u.r0 
  1025                              <1> 			      ; / put childs process name in (u.r0)
  1026                              <1> 	;
  1027                              <1> 	; Retro UNIX 386 v1 modification ! (17/09/2015)
  1028                              <1> 	;
  1029                              <1> 	; Parent process ID -p.ppid- field (of the child process)
  1030                              <1> 	; must be cleared in order to prevent infinitive 'syswait'
  1031                              <1> 	; system call loop from the application/program if it calls
  1032                              <1> 	; 'syswait' again (mistakenly) while there is not a zombie
  1033                              <1> 	; or running child process to wait. ('forktest.s', 17/09/2015)
  1034                              <1> 	;
  1035                              <1> 	; Note: syswait will return with error if there is not a
  1036                              <1> 	;       zombie or running process to wait.	
  1037                              <1> 	
  1038                              <1> 	;sub	ax, ax
  1039                              <1> 	; 30/07/2022
  1040 0000D129 29C0                <1> 	sub	eax, eax ; 0
  1041 0000D12B 668986[228F0100]    <1> 	mov 	[esi+p.ppid-2], ax ; 0 ; 17/09/2015
  1042 0000D132 E922FDFFFF          <1> 	jmp	sysret0 ; ax = 0
  1043                              <1> 	;
  1044                              <1> 	;jmp	sysret
  1045                              <1> 		; br sysret1 / return cause child is dead
  1046                              <1> syswait_2: ; 2:
  1047                              <1> 	;shl	si, 1
  1048                              <1> 	; 23/07/2022
  1049 0000D137 D1E6                <1> 	shl	esi, 1
  1050                              <1> 		; asl r2 / r2x2 to get index into p.ppid table
  1051                              <1> syswait_3: ; 3:
  1052 0000D139 6683FE20            <1> 	cmp	si, nproc+nproc
  1053                              <1> 		; cmp r2,$nproc+nproc / have all processes been checked?
  1054 0000D13D 72BE                <1> 	jb	short syswait_1
  1055                              <1> 		; blt 1b / no, continue search
  1056                              <1> 	;and	cx, cx
  1057 0000D13F 20C9                <1> 	and	cl, cl
  1058                              <1> 		; tst r3 / one gets here if there are no children 
  1059                              <1> 		       ; / or children that are still active
  1060                              <1> 	; 30/10/2013
  1061 0000D141 750B                <1> 	jnz	short syswait_4
  1062                              <1> 	;jz	error
  1063                              <1> 		; beq error1 / there are no children, error
  1064 0000D143 890D[20900100]      <1> 	mov	[u.r0], ecx ; 0
  1065 0000D149 E9E9FCFFFF          <1> 	jmp	error
  1066                              <1> syswait_4:
  1067 0000D14E 8A1D[71900100]      <1> 	mov	bl, [u.uno]
  1068                              <1> 		; movb u.uno,r1 / there are children so put 
  1069                              <1> 			      ; / parent process number in r1
  1070 0000D154 FE83[638F0100]      <1> 	inc	byte [ebx+p.stat-1] ; 2, SWAIT, 05/02/2014
  1071                              <1> 		; incb p.stat-1(r1) / it is waiting for 
  1072                              <1> 				  ; / other children to die
  1073                              <1> 	; 04/11/2013
  1074 0000D15A E8603B0000          <1> 	call	swap
  1075                              <1> 		; jsr r0,swap / swap it out, because it's waiting
  1076 0000D15F EB88                <1> 	jmp	syswait_0
  1077                              <1> 		; br syswait / wait on next process
  1078                              <1> 
  1079                              <1> sysfork: ; < create a new process >
  1080                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5
  1081                              <1> 	; 02/01/2017 (TRDOS 386 modification)
  1082                              <1> 	; 04/09/2015 - 18/05/2015
  1083                              <1> 	; 28/08/2015 - 01/09/2015 - 02/09/2015
  1084                              <1> 	; 09/05/2015 - 10/05/2015 - 14/05/2015
  1085                              <1> 	; 06/05/2015 (Retro UNIX 386 v1 - Beginning)
  1086                              <1> 	; 24/05/2013 - 14/02/2014 (Retro UNIX 8086 v1)
  1087                              <1> 	;
  1088                              <1> 	; 'sysfork' creates a new process. This process is referred
  1089                              <1> 	; to as the child process. This new process core image is
  1090                              <1> 	; a copy of that of the caller of 'sysfork'. The only
  1091                              <1> 	; distinction is the return location and the fact that (u.r0)
  1092                              <1> 	; in the old process (parent) contains the process id (p.pid)
  1093                              <1> 	; of the new process (child). This id is used by 'syswait'.
  1094                              <1> 	; 'sysfork' works in the following manner: 	
  1095                              <1> 	;    1) The process status table (p.stat) is searched to find
  1096                              <1> 	;	a process number that is unused. If none are found
  1097                              <1> 	;	an error occurs.
  1098                              <1> 	;    2) when one is found, it becomes the child process number
  1099                              <1> 	;	and it's status (p.stat) is set to active.
  1100                              <1> 	;    3) If the parent had a control tty, the interrupt 
  1101                              <1> 	;	character in that tty buffer is cleared.
  1102                              <1> 	;    4) The child process is put on the lowest priority run 
  1103                              <1> 	;	queue via 'putlu'.
  1104                              <1> 	;    5) A new process name is gotten from 'mpid' (actually 
  1105                              <1> 	;	it is a unique number) and is put in the child's unique
  1106                              <1> 	;	identifier; process id (p.pid).
  1107                              <1> 	;    6) The process name of the parent is then obtained and
  1108                              <1> 	;	placed in the unique identifier of the parent process
  1109                              <1> 	;	name is then put in 'u.r0'.	
  1110                              <1> 	;    7) The child process is then written out on disk by
  1111                              <1> 	;	'wswap',i.e., the parent process is copied onto disk
  1112                              <1> 	;	and the child is born. (The child process is written 
  1113                              <1> 	;	out on disk/drum with 'u.uno' being the child process
  1114                              <1> 	;	number.)
  1115                              <1> 	;    8) The parent process number is then restored to 'u.uno'.
  1116                              <1> 	;    9) The child process name is put in 'u.r0'.
  1117                              <1> 	;   10) The pc on the stack sp + 18 is incremented by 2 to
  1118                              <1> 	;	create the return address for the parent process.
  1119                              <1> 	;   11) The 'u.fp' list as then searched to see what files
  1120                              <1> 	;	the parent has opened. For each file the parent has
  1121                              <1> 	;	opened, the corresponding 'fsp' entry must be updated
  1122                              <1> 	;	to indicate that the child process also has opened
  1123                              <1> 	;	the file. A branch to 'sysret' is then made.	 			 				
  1124                              <1> 	;
  1125                              <1> 	; Calling sequence:
  1126                              <1> 	;	from shell ?
  1127                              <1> 	; Arguments:
  1128                              <1> 	;	-
  1129                              <1> 	; Inputs: -
  1130                              <1> 	; Outputs: *u.r0 - child process name
  1131                              <1> 	; ...............................................................
  1132                              <1> 	;	
  1133                              <1> 	; Retro UNIX 8086 v1 modification: 
  1134                              <1> 	;	AX = r0 = PID (>0) (at the return of 'sysfork')
  1135                              <1> 	;	= process id of child a parent process returns
  1136                              <1> 	;	= process id of parent when a child process returns
  1137                              <1> 	;
  1138                              <1> 	;       In original UNIX v1, sysfork is called and returns as
  1139                              <1> 	;	in following manner: (with an example: c library, fork)
  1140                              <1> 	;	
  1141                              <1> 	;	1:
  1142                              <1> 	;		sys	fork
  1143                              <1> 	;			br 1f  / child process returns here
  1144                              <1> 	;		bes	2f     / parent process returns here
  1145                              <1> 	;		/ pid of new process in r0
  1146                              <1> 	;		rts	pc
  1147                              <1> 	;	2: / parent process condionally branches here
  1148                              <1> 	;		mov	$-1,r0 / pid = -1 means error return
  1149                              <1> 	;		rts	pc
  1150                              <1> 	;
  1151                              <1> 	;	1: / child process brances here
  1152                              <1> 	;		clr	r0   / pid = 0 in child process
  1153                              <1> 	;		rts	pc
  1154                              <1> 	;
  1155                              <1> 	;	In UNIX v7x86 (386) by Robert Nordier (1999)
  1156                              <1> 	;		// pid = fork();
  1157                              <1> 	;		//
  1158                              <1> 	;		// pid == 0 in child process; 
  1159                              <1> 	;		// pid == -1 means error return
  1160                              <1> 	;		// in child, 
  1161                              <1> 	;		//	parents id is in par_uid if needed
  1162                              <1> 	;		
  1163                              <1> 	;		_fork:
  1164                              <1> 	;			mov	$.fork,eax
  1165                              <1> 	;			int	$0x30
  1166                              <1> 	;			jmp	1f
  1167                              <1> 	;			jnc	2f
  1168                              <1> 	;			jmp	cerror
  1169                              <1> 	;		1:
  1170                              <1> 	;			mov	eax,_par_uid
  1171                              <1> 	;			xor	eax,eax
  1172                              <1> 	;		2:
  1173                              <1> 	;			ret
  1174                              <1> 	;
  1175                              <1> 	;	In Retro UNIX 8086 v1,
  1176                              <1> 	;	'sysfork' returns in following manner:
  1177                              <1> 	;	
  1178                              <1> 	;		mov	ax, sys_fork
  1179                              <1> 	;		mov	bx, offset @f ; routine for child
  1180                              <1> 	;		int	20h
  1181                              <1> 	;		jc	error
  1182                              <1> 	;		
  1183                              <1> 	;	; Routine for parent process here (just after 'jc')
  1184                              <1> 	;		mov	word ptr [pid_of_child], ax
  1185                              <1> 	;		jmp	next_routine_for_parent	
  1186                              <1> 	;
  1187                              <1> 	;	@@: ; routine for child process here				
  1188                              <1> 	;		....	
  1189                              <1> 	;	NOTE: 'sysfork' returns to specified offset
  1190                              <1> 	;	       for child process by using BX input.
  1191                              <1> 	;	      (at first, parent process will return then 
  1192                              <1> 	;	      child process will return -after swapped in-
  1193                              <1> 	;	      'syswait' is needed in parent process
  1194                              <1> 	;	      if return from child process will be waited for.)
  1195                              <1> 	;	  				
  1196                              <1> 	
  1197                              <1> ; / create a new process
  1198                              <1> 	; EBX = return address for child process 
  1199                              <1> 	     ; (Retro UNIX 8086 v1 modification !)
  1200 0000D161 31F6                <1> 	xor 	esi, esi
  1201                              <1> 		; clr r1
  1202                              <1> sysfork_1: ; 1: / search p.stat table for unused process number
  1203 0000D163 46                  <1> 	inc	esi
  1204                              <1> 		; inc r1
  1205 0000D164 80BE[638F0100]00    <1> 	cmp	byte [esi+p.stat-1], 0 ; SFREE, 05/02/2014
  1206                              <1> 		; tstb p.stat-1(r1) / is process active, unused, dead
  1207 0000D16B 760B                <1> 	jna	short sysfork_2	
  1208                              <1> 		; beq 1f / it's unused so branch
  1209 0000D16D 6683FE10            <1> 	cmp	si, nproc
  1210                              <1> 		; cmp r1,$nproc / all processes checked
  1211 0000D171 72F0                <1> 	jb	short sysfork_1
  1212                              <1> 		; blt 1b / no, branch back
  1213                              <1> 	;
  1214                              <1> 	; Retro UNIX 8086 v1. modification:
  1215                              <1> 	;	Parent process returns from 'sysfork' to address 
  1216                              <1> 	;	which is just after 'sysfork' system call in parent
  1217                              <1> 	;	process. Child process returns to address which is put
  1218                              <1> 	;	in BX register by parent process for 'sysfork'. 
  1219                              <1> 	;
  1220                              <1> 		; add $2,18.(sp) / add 2 to pc when trap occured, points
  1221                              <1> 		             ; / to old process return
  1222                              <1> 		; br error1 / no room for a new process
  1223                              <1> sysfork_err:
  1224 0000D173 E9BFFCFFFF          <1> 	jmp	error
  1225                              <1> sysfork_2: ; 1:
  1226 0000D178 E83B86FFFF          <1> 	call	allocate_page
  1227                              <1> 	;jc	error
  1228                              <1> 	; 23/07/2022
  1229 0000D17D 72F4                <1> 	jc	short sysfork_err
  1230 0000D17F 50                  <1> 	push	eax   ; UPAGE (user structure page) address
  1231                              <1> 	; Retro UNIX 386 v1 modification!
  1232 0000D180 E82388FFFF          <1> 	call	duplicate_page_dir
  1233                              <1> 		; EAX = New page directory 
  1234 0000D185 730B                <1> 	jnc	short sysfork_3
  1235 0000D187 58                  <1> 	pop	eax   ; UPAGE (user structure page) address
  1236 0000D188 E8EA87FFFF          <1> 	call 	deallocate_page
  1237 0000D18D E9A5FCFFFF          <1> 	jmp	error
  1238                              <1> sysfork_3:
  1239                              <1> 	; Retro UNIX 386 v1 modification !
  1240 0000D192 56                  <1> 	push	esi
  1241 0000D193 E8B53B0000          <1> 	call	wswap ; save current user (u) structure, user registers
  1242                              <1> 		      ; and interrupt return components (for IRET)
  1243 0000D198 8705[78900100]      <1> 	xchg	eax, [u.pgdir] ; page directory of the child process
  1244 0000D19E A3[7C900100]        <1> 	mov	[u.ppgdir], eax ; page directory of the parent process
  1245 0000D1A3 5E                  <1> 	pop	esi
  1246 0000D1A4 58                  <1> 	pop	eax   ; UPAGE (user structure page) address
  1247                              <1> 		; [u.usp] = esp
  1248 0000D1A5 89F7                <1> 	mov	edi, esi
  1249                              <1> 	;shl	di, 2
  1250                              <1> 	; 23/07/2022
  1251 0000D1A7 C1E702              <1> 	shl	edi, 2
  1252 0000D1AA 8987[708F0100]      <1> 	mov	[edi+p.upage-4], eax ; memory page for 'user' struct
  1253 0000D1B0 A3[74900100]        <1> 	mov	[u.upage], eax ; memory page for 'user' struct (child)
  1254                              <1> 	; 28/08/2015
  1255 0000D1B5 0FB605[71900100]    <1> 	movzx	eax, byte [u.uno] ; parent process number
  1256                              <1> 		; movb u.uno,-(sp) / save parent process number
  1257 0000D1BC 89C7                <1> 	mov	edi, eax
  1258 0000D1BE 50                  <1>         push	eax ; ** 
  1259 0000D1BF 8A87[438F0100]      <1> 	mov     al, [edi+p.ttyc-1] ; console tty (parent)
  1260                              <1> 	; 18/09/2015
  1261                              <1> 	;;mov	[esi+p.ttyc-1], al ; set child's console tty
  1262                              <1> 	;;mov	[esi+p.waitc-1], ah ; 0 ; reset child's wait channel
  1263                              <1> 	;mov    [esi+p.ttyc-1], ax ; al - set child's console tty
  1264                              <1> 				   ; ah - reset child's wait channel	
  1265                              <1> 	; 23/07/2022
  1266 0000D1C5 8886[438F0100]      <1> 	mov	[esi+p.ttyc-1], al ; set child's console tty
  1267 0000D1CB 89F0                <1> 	mov	eax, esi
  1268 0000D1CD A2[71900100]        <1> 	mov	[u.uno], al ; child process number
  1269                              <1> 		;movb r1,u.uno / set child process number to r1
  1270 0000D1D2 FE86[638F0100]      <1>         inc     byte [esi+p.stat-1] ; 1, SRUN, 05/02/2014
  1271                              <1> 		; incb p.stat-1(r1) / set p.stat entry for child 
  1272                              <1> 				; / process to active status
  1273                              <1> 		; mov u.ttyp,r2 / put pointer to parent process' 
  1274                              <1> 			      ; / control tty buffer in r2
  1275                              <1>                 ; beq 2f / branch, if no such tty assigned
  1276                              <1> 		; clrb 6(r2) / clear interrupt character in tty buffer
  1277                              <1> 	; 2:
  1278 0000D1D8 53                  <1> 	push	ebx  ; * return address for the child process
  1279                              <1> 		     ; * Retro UNIX 8086 v1 feature only !	
  1280                              <1> 	; (Retro UNIX 8086 v1 modification!)
  1281                              <1> 		; mov $runq+4,r2
  1282 0000D1D9 BB[10900100]        <1> 	mov	ebx, runq+2 ; normal run queue ; 02/01/2017  
  1283 0000D1DE E8DA3B0000          <1> 	call	putlu
  1284                              <1>  		; jsr r0,putlu / put child process on lowest priority 
  1285                              <1> 			   ; / run queue
  1286                              <1> 	; 23/07/2022
  1287 0000D1E3 D1E6                <1> 	shl	esi, 1
  1288                              <1> 	;shl	si, 1
  1289                              <1> 		; asl r1 / multiply r1 by 2 to get index 
  1290                              <1> 		       ; / into p.pid table
  1291 0000D1E5 66FF05[08900100]    <1> 	inc	word [mpid]
  1292                              <1> 		; inc mpid / increment m.pid; get a new process name
  1293 0000D1EC 66A1[08900100]      <1> 	mov	ax, [mpid]
  1294 0000D1F2 668986[028F0100]    <1> 	mov	[esi+p.pid-2], ax
  1295                              <1> 		;mov mpid,p.pid-2(r1) / put new process name 
  1296                              <1> 				    ; / in child process' name slot
  1297 0000D1F9 5A                  <1> 	pop	edx  ; * return address for the child process
  1298                              <1> 		     ; * Retro UNIX 8086 v1 feature only !	
  1299 0000D1FA 5B                  <1>   	pop	ebx  ; **
  1300                              <1> 	;mov	ebx, [esp] ; ** parent process number
  1301                              <1> 		; movb (sp),r2 / put parent process number in r2
  1302                              <1> 	; 23/07/2022
  1303 0000D1FB D1E3                <1> 	shl	ebx, 1
  1304                              <1> 	;shl 	bx, 1
  1305                              <1> 		;asl r2 / multiply by 2 to get index into below tables
  1306                              <1> 	;movzx eax, word [ebx+p.pid-2]
  1307 0000D1FD 668B83[028F0100]    <1> 	mov	ax, [ebx+p.pid-2]
  1308                              <1> 		; mov p.pid-2(r2),r2 / get process name of parent
  1309                              <1> 				   ; / process
  1310 0000D204 668986[228F0100]    <1> 	mov	[esi+p.ppid-2], ax
  1311                              <1> 		; mov r2,p.ppid-2(r1) / put parent process name 
  1312                              <1> 			  ; / in parent process slot for child
  1313 0000D20B A3[20900100]        <1> 	mov	[u.r0], eax	
  1314                              <1> 		; mov r2,*u.r0 / put parent process name on stack 
  1315                              <1> 			     ; / at location where r0 was saved
  1316 0000D210 8B2D[18900100]      <1> 	mov 	ebp, [u.sp] ; points to return address (EIP for IRET)
  1317 0000D216 895500              <1> 	mov	[ebp], edx ; *, CS:EIP -> EIP
  1318                              <1> 			   ; * return address for the child process
  1319                              <1> 		; mov $sysret1,-(sp) /
  1320                              <1> 		; mov sp,u.usp / contents of sp at the time when 
  1321                              <1> 			      ; / user is swapped out
  1322                              <1> 		; mov $sstack,sp / point sp to swapping stack space
  1323                              <1> 	; 04/09/2015 - 01/09/2015
  1324                              <1> 	; [u.usp] = esp
  1325 0000D219 68[57CE0000]        <1> 	push	sysret ; ***
  1326 0000D21E 8925[1C900100]      <1> 	mov	[u.usp], esp ; points to 'sysret' address (***)
  1327                              <1> 			     ; (for child process)	
  1328 0000D224 31C0                <1> 	xor 	eax, eax
  1329 0000D226 66A3[54900100]      <1> 	mov 	[u.ttyp], ax ; 0
  1330                              <1> 	;
  1331 0000D22C E81C3B0000          <1> 	call	wswap ; Retro UNIX 8086 v1 modification !
  1332                              <1> 		; jsr r0,wswap / put child process out on drum
  1333                              <1> 		; jsr r0,unpack / unpack user stack
  1334                              <1> 		; mov u.usp,sp / restore user stack pointer
  1335                              <1> 		; tst (sp)+ / bump stack pointer
  1336                              <1> 	; Retro UNIX 386 v1 modification !
  1337 0000D231 58                  <1> 	pop	eax ; ***
  1338                              <1> 	;shl	bx, 1
  1339                              <1> 	; 23/07/2022
  1340 0000D232 D1E3                <1> 	shl	ebx, 1
  1341 0000D234 8B83[708F0100]      <1> 	mov     eax, [ebx+p.upage-4] ; UPAGE address ; 14/05/2015
  1342 0000D23A E8463B0000          <1> 	call	rswap ; restore parent process 'u' structure, 
  1343                              <1> 		      ; registers and return address (for IRET)
  1344                              <1> 		;movb (sp)+,u.uno / put parent process number in u.uno
  1345 0000D23F 0FB705[08900100]    <1>         movzx   eax, word [mpid]
  1346 0000D246 A3[20900100]        <1> 	mov	[u.r0], eax
  1347                              <1> 		; mov mpid,*u.r0 / put child process name on stack 
  1348                              <1> 			       ; / where r0 was saved
  1349                              <1> 		; add $2,18.(sp) / add 2 to pc on stack; gives parent
  1350                              <1> 			          ; / process return
  1351                              <1> 	;xor	ebx, ebx
  1352 0000D24B 31F6                <1> 	xor     esi, esi
  1353                              <1> 		;clr r1
  1354                              <1> sysfork_4: ; 1: / search u.fp list to find the files 
  1355                              <1> 	      ; / opened by the parent process
  1356                              <1> 	; 01/09/2015
  1357                              <1> 	;xor	bh, bh
  1358                              <1> 	;mov 	bl, [esi+u.fp]
  1359 0000D24D 8A86[2A900100]      <1> 	mov 	al, [esi+u.fp]
  1360                              <1> 		; movb u.fp(r1),r2 / get an open file for this process
  1361                              <1>         ;or	bl, bl
  1362 0000D253 08C0                <1> 	or	al, al
  1363 0000D255 7406                <1> 	jz	short sysfork_5	
  1364                              <1> 		; beq 2f / file has not been opened by parent, 
  1365                              <1> 		       ; / so branch
  1366                              <1> 	;mov	ah, 10 ; Retro UNIX 386 v1 fsp structure size = 10 bytes
  1367                              <1> 	;mul	ah
  1368                              <1> 	; 23/07/2022
  1369                              <1> 	; Retro UNIX 386 v2 & TRDOS 386 v2.0.5 fsp struc size = 16 bytes
  1370                              <1> 	;mov	ebx, eax 	
  1371                              <1> 	;shl	ebx, 4 ; * 16
  1372                              <1> 	;inc	byte [ebx+fsp-10]
  1373                              <1> 
  1374                              <1> 	; 23/07/2022 (BugFix)
  1375 0000D257 FE80[24860100]      <1> 	inc	byte [OF_OPENCOUNT+eax] 
  1376                              <1> 
  1377                              <1> 	;;movzx	ebx, ax
  1378                              <1> 	;mov	bx, ax
  1379                              <1> 	;shl	bx, 3
  1380                              <1> 		; asl r2 / multiply by 8
  1381                              <1>        		; asl r2 / to get index into fsp table
  1382                              <1>        		; asl r2
  1383                              <1>   	;inc	byte [ebx+fsp-2]
  1384                              <1> 		; incb fsp-2(r2) / increment number of processes
  1385                              <1> 			     ; / using file, because child will now be
  1386                              <1> 			     ; / using this file
  1387                              <1> sysfork_5: ; 2:
  1388 0000D25D 46                  <1>         inc     esi
  1389                              <1> 		; inc r1 / get next open file
  1390                              <1> 	; 23/07/2022
  1391 0000D25E 6683FE20            <1> 	cmp	si, OPENFILES ; = 10
  1392                              <1> 	;cmp	si, 10
  1393                              <1> 		; cmp r1,$10. / 10. files is the maximum number which
  1394                              <1> 			    ; / can be opened
  1395 0000D262 72E9                <1> 	jb	short sysfork_4	
  1396                              <1> 		; blt 1b / check next entry
  1397 0000D264 E9EEFBFFFF          <1> 	jmp	sysret
  1398                              <1> 		; br sysret1
  1399                              <1> 
  1400                              <1> syscreat: ; < create file >
  1401                              <1> 	; 08/08/2022
  1402                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5
  1403                              <1> 	; 13/11/2017
  1404                              <1> 	; 27/10/2016
  1405                              <1> 	; 25/10/2016 - 26/10/2016
  1406                              <1> 	; 15/10/2016 - 16/10/2016 - 17/10/2016
  1407                              <1> 	; 10/10/2016 (TRDOS 386 = TRDOS v2.0) 
  1408                              <1> 	;	     -derived from INT_21H.ASM-
  1409                              <1> 	;            ("loc_INT21h_create_file")
  1410                              <1>         ; 	10/07/2011 (12/03/2011)
  1411                              <1>         ;	INT 21h Function AH = 3Ch
  1412                              <1>         ;	Create File
  1413                              <1>         ;	INPUT
  1414                              <1>         ;	   CX = Attributes
  1415                              <1>         ;          DS:DX= Address of zero terminaned path name
  1416                              <1>         ;
  1417                              <1> 	; 27/12/2015 (Retro UNIX 386 v1.1)
  1418                              <1> 	; 14/05/2015 (Retro UNIX 386 v1 - Beginning)
  1419                              <1> 	; 27/05/2013 (Retro UNIX 8086 v1)
  1420                              <1> 	;
  1421                              <1> 	; 'syscreat' called with two arguments; name and mode.
  1422                              <1> 	; u.namep points to name of the file and mode is put
  1423                              <1> 	; on the stack. 'namei' is called to get i-number of the file.		
  1424                              <1> 	; If the file aready exists, it's mode and owner remain 
  1425                              <1> 	; unchanged, but it is truncated to zero length. If the file
  1426                              <1> 	; did not exist, an i-node is created with the new mode via
  1427                              <1> 	; 'maknod' whether or not the file already existed, it is
  1428                              <1> 	; open for writing. The fsp table is then searched for a free
  1429                              <1> 	; entry. When a free entry is found, proper data is placed
  1430                              <1> 	; in it and the number of this entry is put in the u.fp list.
  1431                              <1> 	; The index to the u.fp (also know as the file descriptor)
  1432                              <1> 	; is put in the user's r0. 			
  1433                              <1> 	;
  1434                              <1> 	; Calling sequence:
  1435                              <1> 	;	syscreate; name; mode
  1436                              <1> 	; Arguments:
  1437                              <1> 	;	name - name of the file to be created
  1438                              <1> 	;	mode - mode of the file to be created
  1439                              <1> 	; Inputs: (arguments)
  1440                              <1> 	; Outputs: *u.r0 - index to u.fp list 
  1441                              <1> 	;		   (the file descriptor of new file)
  1442                              <1> 	; ...............................................................
  1443                              <1> 	;				
  1444                              <1> 	; Retro UNIX 8086 v1 modification: 
  1445                              <1> 	;       'syscreate' system call has two arguments; so,
  1446                              <1> 	;	* 1st argument, name is pointed to by BX register
  1447                              <1> 	;	* 2nd argument, mode is in CX register
  1448                              <1> 	;
  1449                              <1> 	;	AX register (will be restored via 'u.r0') will return
  1450                              <1> 	;	to the user with the file descriptor/number 
  1451                              <1> 	;	(index to u.fp list).
  1452                              <1> 	;
  1453                              <1> 	;call	arg2
  1454                              <1> 	; * name - 'u.namep' points to address of file/path name
  1455                              <1> 	;          in the user's program segment ('u.segmnt')
  1456                              <1> 	;          with offset in BX register (as sysopen argument 1).
  1457                              <1> 	; * mode - sysopen argument 2 is in CX register 
  1458                              <1> 	;          which is on top of stack.
  1459                              <1> 	;
  1460                              <1> 	; TRDOS 386 (10/10/2016)
  1461                              <1> 	;	
  1462                              <1>         ; INPUT ->
  1463                              <1>         ;	   CL = File Attributes
  1464                              <1> 	;     	      bit 0 (1) - Read only file (R)
  1465                              <1> 	;             bit 1 (1) - Hidden file (H)
  1466                              <1>         ;             bit 2 (1) - System file (R)
  1467                              <1> 	;             bit 3 (1) - Volume label/name (V)
  1468                              <1>         ;             bit 4 (1) - Subdirectory (D)
  1469                              <1> 	;	      bit 5 (1) - File has been archived (A)	 	
  1470                              <1>         ;          EBX = Pointer to filename (ASCIIZ) -path-
  1471                              <1> 	;	
  1472                              <1> 	; OUTPUT ->
  1473                              <1> 	;          eax = File/Device Handle/Number (index) (AL)
  1474                              <1> 	;          cf = 1 -> Error code in AL
  1475                              <1> 	;
  1476                              <1> 	; Modified Registers: EAX (at the return of system call)
  1477                              <1> 	;  
  1478                              <1> 	; Note: If the file is existing and it has not any one
  1479                              <1> 	;	of S,H,R,V,D attributes, it will be truncated 
  1480                              <1> 	;	to zero length; otherwise, access error will be 
  1481                              <1> 	;	returned. 
  1482                              <1> 
  1483                              <1> sysmkdir_0:
  1484 0000D269 F6C108              <1> 	test	cl, 08h ; Volume name 
  1485 0000D26C 740A                <1> 	jz	short syscreat_0
  1486                              <1> 
  1487                              <1> 	; Volume name or long name creation
  1488                              <1> 	; is not permitted (in TRDOS 386)!
  1489 0000D26E B80B000000          <1> 	mov	eax, ERR_FILE_ACCESS  ; 11 ; 'permission denied !'
  1490 0000D273 E9CE000000          <1>         jmp	sysopen_dev_err ; 08/08/2022
  1491                              <1> syscreat_0:
  1492                              <1>         ;mov	[u.namep], ebx
  1493 0000D278 51                  <1> 	push	ecx
  1494 0000D279 89DE                <1> 	mov	esi, ebx
  1495                              <1> 	; file name is forced, change directory as temporary
  1496                              <1> 	;mov	ax, 1
  1497                              <1> 	;mov	[FFF_Valid], ah ; 0 ; reset ; 17/10/2016
  1498                              <1> 	;call	set_working_path 
  1499 0000D27B E8D54E0000          <1> 	call	set_working_path_x ; 17/10/2016	
  1500                              <1> 	;jc	short syscreat_err
  1501                              <1> 	; 23/07/2022
  1502 0000D280 7305                <1> 	jnc	short syscreat_3
  1503 0000D282 E9D8000000          <1> 	jmp	syscreat_err
  1504                              <1> 
  1505                              <1> syscreat_3:
  1506                              <1> 	; 16/10/2016
  1507 0000D287 803D[3B850100]00    <1> 	cmp	byte [SWP_inv_fname], 0
  1508 0000D28E 776C                <1> 	ja	short  syscreat_inv_fname ; invalid file name !
  1509                              <1> 
  1510                              <1> 	; Here, we have a valid path and also a valid file name
  1511                              <1> 	; (Working dir has been changed if the path
  1512                              <1> 	;  -file name string- had contained a dir name.)
  1513                              <1> 
  1514 0000D290 6631C0              <1> 	xor	ax, ax 
  1515                              <1> 	;mov	esi, FindFile_Name
  1516 0000D293 E8E0B8FFFF          <1> 	call	find_first_file
  1517 0000D298 59                  <1> 	pop	ecx
  1518                              <1> 		; ESI = Directory Entry (FindFile_DirEntry) Location
  1519                              <1> 		; EDI = Directory Buffer Directory Entry Location
  1520                              <1> 		; EAX = File Size
  1521                              <1> 		;  BL = Attributes of The File/Directory
  1522                              <1> 		;  BH = Long Name Yes/No Status (>0 is YES)
  1523                              <1> 		;  DX > 0 : Ambiguous filename chars are used
  1524 0000D299 7269                <1> 	jc	short syscreat_1 ; file not found (the good!) 
  1525                              <1> 				 ; or another error (the bad!) 
  1526                              <1> 
  1527                              <1> 	; (& the uggly!) truncate file to zero length before open
  1528                              <1> 
  1529                              <1> 	;'*' and '?' already checked at 'set_working_path' stage
  1530                              <1> 	;and	dx, dx
  1531                              <1> 	;jnz	short sysmkdir_err ; permission denied 
  1532                              <1> 				   ; invalid filename chars
  1533                              <1> 
  1534                              <1> 	;test	cl, 10h ; subdirectory ?
  1535                              <1> 	;jnz	short sysmkdir_err	
  1536                              <1> 
  1537                              <1> 	; BL = File Attributes:	
  1538                              <1> 	;     	      bit 0 (1) - Read only file (R)
  1539                              <1> 	;             bit 1 (1) - Hidden file (H)
  1540                              <1>         ;             bit 2 (1) - System file (R)
  1541                              <1> 	;             bit 3 (1) - Volume label/name (V)
  1542                              <1>         ;             bit 4 (1) - Subdirectory (D)
  1543                              <1> 	;	      bit 5 (1) - File has been archived	 	
  1544                              <1> 
  1545                              <1> 	; * existing directory must not be truncated
  1546                              <1> 	;   (we don't know it is empty or not, at this stage) 
  1547                              <1> 	; * existing volume name (or a long name) can not be
  1548                              <1> 	;   re-created or truncated by 'syscreat' 	
  1549                              <1> 	; * A file with S, H, R attributes must not be truncated
  1550                              <1> 	;   (change attributes to normal, if you need truncate it)
  1551                              <1> 
  1552 0000D29B F6C31F              <1> 	test	bl, 00011111b  ; check attributes of existing file
  1553 0000D29E 754E                <1> 	jnz	short sysmkdir_err
  1554                              <1> 
  1555                              <1> 	;; normal file, OK to continue...
  1556                              <1> 
  1557                              <1> 	; ESI = FindFile_DirEntry
  1558 0000D2A0 668B4614            <1> 	mov	ax, [esi+DirEntry_FstClusHI] ; 20
  1559 0000D2A4 C1E010              <1> 	shl	eax, 16 ; 13/11/2017
  1560 0000D2A7 668B461A            <1> 	mov	ax, [esi+DirEntry_FstClusLO] ; 26 
  1561                              <1> 	; EAX = First cluster to be truncated/unlinked
  1562 0000D2AB 57                  <1> 	push	edi
  1563 0000D2AC 51                  <1> 	push	ecx
  1564 0000D2AD BE00010900          <1> 	mov	esi, Logical_DOSDisks
  1565 0000D2B2 29C9                <1> 	sub	ecx, ecx
  1566 0000D2B4 8A2D[4A790100]      <1> 	mov	ch, [Current_Drv]
  1567 0000D2BA 01CE                <1> 	add	esi, ecx
  1568                              <1> 	; ESI = Logical dos drive description table address
  1569 0000D2BC E8DEF7FFFF          <1> 	call	truncate_cluster_chain
  1570 0000D2C1 59                  <1> 	pop	ecx
  1571 0000D2C2 5F                  <1> 	pop	edi
  1572 0000D2C3 7230                <1> 	jc	short syscreate_truncate_err
  1573                              <1> 
  1574                              <1> 	; 26/10/2016
  1575                              <1> 	; EDI = Directory entry address in directory buffer
  1576                              <1> 	; Update directory entry
  1577 0000D2C5 E819DDFFFF          <1> 	call	convert_current_date_time
  1578                              <1> 	; OUTPUT -> DX = Date in dos dir entry format
  1579                              <1>         ; 	    AX = Time in dos dir entry format	
  1580 0000D2CA 66894716            <1> 	mov	[edi+DirEntry_WrtTime], ax
  1581 0000D2CE 66895718            <1> 	mov	[edi+DirEntry_WrtDate], dx	
  1582 0000D2D2 66895712            <1> 	mov	[edi+DirEntry_LastAccDate], dx
  1583 0000D2D6 31C0                <1> 	xor	eax, eax ; file size = 0 
  1584 0000D2D8 89471C              <1> 	mov	[edi+DirEntry_FileSize], eax ; 0
  1585 0000D2DB C605[71800100]02    <1> 	mov	byte [DirBuff_ValidData], 2 ; data changed sign	
  1586 0000D2E2 BE[3C820100]        <1> 	mov	esi, FindFile_DirEntry
  1587 0000D2E7 B201                <1> 	mov	dl, 1 ; open file for writing
  1588 0000D2E9 E9AB000000          <1> 	jmp	sysopen_2 ; 08/08/2022
  1589                              <1> 
  1590                              <1> sysmkdir_err:
  1591                              <1> 	; 1 = write, 2 = read & write, >2 = invalid
  1592 0000D2EE B80B000000          <1>         mov	eax, ERR_FILE_ACCESS  ; 11 ; 'permission denied !'
  1593 0000D2F3 EB74                <1>         jmp	short sysopen_err
  1594                              <1> 
  1595                              <1> syscreate_truncate_err:
  1596 0000D2F5 B812000000          <1> 	mov	eax, ERR_DRV_WRITE ; 18 ; 'disk write error !'
  1597 0000D2FA EB6D                <1>         jmp	short sysopen_err
  1598                              <1> 
  1599                              <1> syscreat_inv_fname:  ; invalid file name chars 
  1600                              <1> 	; 16/10/2016
  1601 0000D2FC B81A000000          <1> 	mov	eax, ERR_INV_FILE_NAME  ; 26 ; invalid file name chars 
  1602 0000D301 59                  <1> 	pop	ecx
  1603 0000D302 EB65                <1> 	jmp	short sysopen_err
  1604                              <1> 
  1605                              <1> syscreat_1:
  1606                              <1> 	; Error code in EAX
  1607 0000D304 3C02                <1>         cmp	al, 02h ; 'File not found' error
  1608 0000D306 7561                <1>         jne	short sysopen_err
  1609                              <1> 
  1610 0000D308 F6C110              <1> 	test	cl, 10h ; Directory
  1611                              <1> 	;jnz	sysmkdir_2
  1612                              <1> 	; 23/07/2022
  1613 0000D30B 7405                <1> 	jz	short syscreat_2
  1614 0000D30D E992010000          <1> 	jmp	sysmkdir_2
  1615                              <1> 
  1616                              <1> syscreat_2:
  1617 0000D312 BE[2C820100]        <1> 	mov	esi, FindFile_Name 
  1618                              <1>         ;xor	edx, edx
  1619 0000D317 31C0                <1>         xor	eax, eax ; File Size  = 0
  1620 0000D319 31DB                <1> 	xor	ebx, ebx
  1621 0000D31B 4B                  <1> 	dec 	ebx ; FFFFFFFFh -> create empty file 
  1622                              <1> 	            ;              (only for FAT fs) 
  1623                              <1> 	; CL = File Attributes
  1624 0000D31C E897ECFFFF          <1> 	call	create_file
  1625 0000D321 7246                <1> 	jc	short sysopen_err
  1626                              <1> 		; EAX = New file's first cluster
  1627                              <1> 		; ESI = Logical Dos Drv Descr. Table Addr.
  1628                              <1> 		; EBX = offset CreateFile_Size
  1629                              <1> 		; ECX = Sectors per cluster (<256) 
  1630                              <1> 		; EDX = Directory entry index/number (<65536)
  1631                              <1> 	; 26/10/2016
  1632                              <1> 	;mov	esi, Directory_Buffer
  1633                              <1> 	;shl	dx, 5 ; *32
  1634                              <1> 	;add	esi, edx
  1635                              <1> 	;; esi = directory entry address in directory buffer
  1636                              <1> 
  1637                              <1> 	; Here, directory entry has been created but last
  1638                              <1> 	; modification date & time of the parent dir has not
  1639                              <1> 	; been updated, yet! 
  1640                              <1> 	; (Note: Directory and FAT buffers have been updated...)
  1641                              <1>  	
  1642 0000D323 E8E8DDFFFF          <1> 	call	update_parent_dir_lmdt ; now, it is OK too!
  1643                              <1> 
  1644                              <1> 	; 25/10/2016
  1645 0000D328 66B80018            <1> 	mov	ax, 1800h
  1646 0000D32C BE[2C820100]        <1> 	mov	esi, FindFile_Name
  1647 0000D331 E842B8FFFF          <1> 	call	find_first_file
  1648 0000D336 7231                <1> 	jc	short sysopen_err
  1649                              <1> 
  1650                              <1> 	; Only possible error after here is 
  1651                              <1> 	; "too many open files !" error.
  1652                              <1> 	;
  1653                              <1> 	; If "syscreat" will return with that error,
  1654                              <1> 	; (the file has been created but it could not be opened)
  1655                              <1> 	; the user must retry to open this file again
  1656                              <1> 	; or must close another file before using 
  1657                              <1> 	; "sysopen" system call.
  1658                              <1> 
  1659 0000D338 B201                <1> 	mov	dl, 1 ; open file for writing
  1660                              <1> 	; ESI = Directory Entry (FindFile_DirEntry) Location
  1661                              <1> 	; EAX = File Size (= 0)
  1662 0000D33A EB5D                <1> 	jmp	short sysopen_2
  1663                              <1> 
  1664                              <1> sysopen: ;<open file>
  1665                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
  1666                              <1> 	; 17/04/2021 - TRDOS 386 v2.0.4
  1667                              <1> 	;	(temporary modifications)
  1668                              <1> 	; 26/10/2016
  1669                              <1> 	; 24/10/2016
  1670                              <1> 	; 17/10/2016
  1671                              <1> 	; 15/10/2016
  1672                              <1> 	; 06/10/2016, 07/10/2016, 08/10/2016
  1673                              <1> 	; 05/10/2016 (TRDOS 386 = TRDOS v2.0) 
  1674                              <1> 	;	     -derived from INT_21H.ASM-
  1675                              <1> 	;            ("loc_INT21h_open_file")
  1676                              <1>         ; 	26/02/2011 
  1677                              <1>         ;	INT 21h Function AH = 3Dh
  1678                              <1>         ;	Open File
  1679                              <1>         ;	INPUT
  1680                              <1>         ;	   AL= File Access Value
  1681                              <1> 	;     	     0- Open for reading
  1682                              <1> 	;            1- Open for writing
  1683                              <1>         ;            2- Open for reading and writing
  1684                              <1>         ;          DS:DX= Pointer to filename (ASCIIZ)
  1685                              <1>         ;
  1686                              <1> 	; 14/05/2015 (Retro UNIX 386 v1 - Beginning)
  1687                              <1> 	; 22/05/2013 - 27/05/2013 (Retro UNIX 8086 v1)
  1688                              <1> 	;
  1689                              <1> 	; 'sysopen' opens a file in following manner:
  1690                              <1> 	;    1) The second argument in a sysopen says whether to
  1691                              <1> 	;	open the file ro read (0) or write (>0).
  1692                              <1> 	;    2) I-node of the particular file is obtained via 'namei'.
  1693                              <1> 	;    3) The file is opened by 'iopen'.
  1694                              <1> 	;    4) Next housekeeping is performed on the fsp table
  1695                              <1> 	;	and the user's open file list - u.fp.
  1696                              <1> 	;	a) u.fp and fsp are scanned for the next available slot.
  1697                              <1> 	;	b) An entry for the file is created in the fsp table.
  1698                              <1> 	;	c) The number of this entry is put on u.fp list.
  1699                              <1> 	;	d) The file descriptor index to u.fp list is pointed
  1700                              <1> 	;	   to by u.r0.
  1701                              <1> 	;
  1702                              <1> 	; Calling sequence:
  1703                              <1> 	;	sysopen; name; mode
  1704                              <1> 	; Arguments:
  1705                              <1> 	;	name - file name or path name
  1706                              <1> 	;	mode - 0 to open for reading
  1707                              <1> 	;	       1 to open for writing
  1708                              <1> 	; Inputs: (arguments)
  1709                              <1> 	; Outputs: *u.r0 - index to u.fp list (the file descriptor)
  1710                              <1> 	;		  is put into r0's location on the stack.	
  1711                              <1> 	; ...............................................................
  1712                              <1> 	;				
  1713                              <1> 	; Retro UNIX 8086 v1 modification: 
  1714                              <1> 	;       'sysopen' system call has two arguments; so,
  1715                              <1> 	;	* 1st argument, name is pointed to by BX register
  1716                              <1> 	;	* 2nd argument, mode is in CX register
  1717                              <1> 	;
  1718                              <1> 	;	AX register (will be restored via 'u.r0') will return
  1719                              <1> 	;	to the user with the file descriptor/number 
  1720                              <1> 	;	(index to u.fp list).
  1721                              <1> 	;
  1722                              <1> 	;call	arg2
  1723                              <1> 	; * name - 'u.namep' points to address of file/path name
  1724                              <1> 	;          in the user's program segment ('u.segmnt')
  1725                              <1> 	;          with offset in BX register (as sysopen argument 1).
  1726                              <1> 	; * mode - sysopen argument 2 is in CX register 
  1727                              <1> 	;          which is on top of stack.
  1728                              <1> 	;
  1729                              <1> 	; jsr r0,arg2 / get sys args into u.namep and on stack
  1730                              <1> 	;
  1731                              <1>        	; system call registers: ebx, ecx (through 'sysenter')
  1732                              <1> 	;
  1733                              <1> 	; TRDOS 386 (05/10/2016)
  1734                              <1> 	;	
  1735                              <1>         ; INPUT ->
  1736                              <1>         ;	   CL = File Access Value (Open Mode)
  1737                              <1> 	;     	      0 - Open file for reading
  1738                              <1> 	;             1 - Open file for writing
  1739                              <1>         ;             2 - Open device for reading
  1740                              <1> 	;	      3 - Open device for writing
  1741                              <1>         ;          EBX = Pointer to filename/devicename (ASCIIZ)
  1742                              <1> 	; OUTPUT ->
  1743                              <1> 	;          eax = File/Device Handle/Number (index) (AL)
  1744                              <1> 	;          cf = 1 -> Error code in AL
  1745                              <1> 	;
  1746                              <1> 	; Modified Registers: EAX (at the return of system call)
  1747                              <1> 	;  
  1748                              <1> 
  1749 0000D33C 80F901              <1> 	cmp	cl, 1 ; read file (0), write file (1)
  1750 0000D33F 7614                <1> 	jna	short sysopen_0
  1751                              <1> 
  1752                              <1> 	; 17/04/2021 (temporary)
  1753                              <1> 	;cmp	cl, 3
  1754                              <1> 	;jna	sysopen_device
  1755                              <1> 
  1756                              <1> 	; Invalid access code
  1757 0000D341 B817000000          <1> 	mov	eax, ERR_INV_PARAMETER
  1758                              <1> 	;jmp	sysopen_dev_err
  1759                              <1> 
  1760                              <1> sysopen_dev_err:
  1761 0000D346 A3[20900100]        <1> 	mov	[u.r0], eax
  1762 0000D34B A3[88900100]        <1> 	mov	[u.error], eax
  1763 0000D350 E9E2FAFFFF          <1> 	jmp	error
  1764                              <1> 
  1765                              <1> sysopen_0:
  1766                              <1> 	;mov	[u.namep], ebx
  1767 0000D355 51                  <1> 	push	ecx
  1768 0000D356 89DE                <1> 	mov	esi, ebx
  1769                              <1> 	; file name is forced, change directory as temporary
  1770                              <1> 	;mov	ax, 1
  1771                              <1> 	;mov	[FFF_Valid], ah ; 0 ; reset ; 17/10/2016
  1772                              <1> 	;call	set_working_path 
  1773 0000D358 E8F84D0000          <1> 	call	set_working_path_x ; 17/10/2016	
  1774 0000D35D 731E                <1> 	jnc	short sysopen_1
  1775                              <1> 
  1776                              <1> syscreat_err: ; ecx = file attributes (for 'syscreat')
  1777 0000D35F 59                  <1> 	pop	ecx ; open mode  
  1778 0000D360 21C0                <1> 	and	eax, eax  ; 0 -> Bad Path!  
  1779 0000D362 7505                <1> 	jnz	short sysopen_err
  1780                              <1> 	; eax = 0
  1781 0000D364 B80C000000          <1> 	mov	eax, ERR_DIR_NOT_FOUND ; Directory not found !
  1782                              <1> sysopen_err:
  1783 0000D369 A3[20900100]        <1> 	mov	[u.r0], eax
  1784 0000D36E A3[88900100]        <1> 	mov	[u.error], eax
  1785 0000D373 E8B24E0000          <1> 	call 	reset_working_path
  1786 0000D378 E9BAFAFFFF          <1> 	jmp	error
  1787                              <1> 
  1788                              <1> sysopen_1:
  1789                              <1> 	;mov	esi, FindFile_Name
  1790 0000D37D 66B80018            <1>         mov	ax, 1800h ; Only files 
  1791 0000D381 E8F2B7FFFF          <1> 	call	find_first_file
  1792 0000D386 5A                  <1> 	pop	edx
  1793 0000D387 72E0                <1> 	jc	short sysopen_err ; eax = 2 (File not found !)
  1794                              <1> 
  1795                              <1> 	; check_open_file_attr_access_code
  1796                              <1> 
  1797 0000D389 F6C307              <1>         test	bl, 7  ; system, hidden, readonly 
  1798 0000D38C 740B                <1>         jz	short sysopen_2
  1799                              <1> 
  1800 0000D38E 20D2                <1> 	and	dl, dl ; 0 = read mode
  1801 0000D390 7407                <1> 	jz	short sysopen_2
  1802                              <1> 
  1803                              <1> 	; 1 = write, 2 = read & write, >2 = invalid
  1804 0000D392 B80B000000          <1>         mov	eax, ERR_FILE_ACCESS ; 11 = 'permission denied !'
  1805 0000D397 EBD0                <1>         jmp	short sysopen_err
  1806                              <1> 
  1807                              <1> sysopen_2:
  1808                              <1> 	; esi = Directory Entry (FindFile_DirEntry) Location
  1809 0000D399 89F3                <1> 	mov	ebx, esi
  1810 0000D39B 31F6                <1>         xor     esi, esi ; 0
  1811 0000D39D 31FF                <1>         xor     edi, edi ; 0
  1812                              <1> sysopen_3: ; scan the list of entries in fsp table
  1813 0000D39F 80BE[2A900100]00    <1>         cmp     byte [esi+u.fp], 0
  1814 0000D3A6 760F                <1>         jna     short sysopen_4 ; empty slot
  1815 0000D3A8 6646                <1>         inc     si
  1816 0000D3AA 6683FE0A            <1>         cmp     si, 10
  1817 0000D3AE 72EF                <1> 	jb	short sysopen_3
  1818                              <1> toomanyf:
  1819 0000D3B0 B80D000000          <1> 	mov	eax, ERR_TOO_MANY_FILES ; too many open files !
  1820 0000D3B5 EBB2                <1> 	jmp	short sysopen_err
  1821                              <1> 
  1822                              <1> sysopen_4: 
  1823 0000D3B7 80BF[E4850100]00    <1>         cmp     byte [edi+OF_MODE], 0 ; Scan open files table 
  1824 0000D3BE 760A                <1> 	jna     short sysopen_5
  1825 0000D3C0 6647                <1> 	inc	di
  1826 0000D3C2 6683FF20            <1> 	cmp     di, OPENFILES ; max. number of open files (sytem)
  1827 0000D3C6 72EF                <1> 	jb	short sysopen_4
  1828 0000D3C8 EBE6                <1> 	jmp	short toomanyf
  1829                              <1> 
  1830                              <1> sysopen_5:
  1831 0000D3CA FEC2                <1> 	inc	dl
  1832 0000D3CC 8897[E4850100]      <1>         mov     [edi+OF_MODE], dl
  1833 0000D3D2 8A15[EA810100]      <1> 	mov	dl, [FindFile_Drv]
  1834 0000D3D8 8897[C4850100]      <1>         mov     [edi+OF_DRIVE], dl ; Logical DOS drive number
  1835                              <1> 	;shl	di, 2 ; *4 (dword offset)
  1836                              <1> 	; 23/07/2022
  1837 0000D3DE C1E702              <1> 	shl	edi, 2
  1838                              <1> 
  1839 0000D3E1 8987[C4860100]      <1> 	mov	[edi+OF_SIZE], eax ; File size in bytes
  1840                              <1> 
  1841 0000D3E7 668B4314            <1>         mov 	ax, [ebx+DirEntry_FstClusHI]
  1842 0000D3EB C1E010              <1> 	shl	eax, 16
  1843 0000D3EE 668B431A            <1> 	mov 	ax, [ebx+DirEntry_FstClusLO]
  1844 0000D3F2 8987[44850100]      <1> 	mov     [edi+OF_FCLUSTER], eax ; First cluster
  1845 0000D3F8 8987[C4880100]      <1> 	mov     [edi+OF_CCLUSTER], eax ; Current cluster
  1846                              <1> 
  1847 0000D3FE 31DB                <1>         xor	ebx, ebx
  1848 0000D400 899F[44860100]      <1>         mov     [edi+OF_POINTER], ebx ; offset pointer (0)
  1849 0000D406 899F[44890100]      <1>         mov     [edi+OF_CCINDEX], ebx ; cluster index (0)
  1850                              <1> 
  1851 0000D40C A1[5C820100]        <1> 	mov	eax, [FindFile_DirFirstCluster]
  1852 0000D411 8987[44870100]      <1> 	mov	[edi+OF_DIRFCLUSTER], eax
  1853                              <1> 
  1854 0000D417 A1[60820100]        <1> 	mov	eax, [FindFile_DirCluster]
  1855 0000D41C 8987[C4870100]      <1> 	mov	[edi+OF_DIRCLUSTER], eax
  1856                              <1> 
  1857                              <1> 	; Get (& Save) Volume ID 
  1858                              <1> 	; Important for files of removable drives
  1859                              <1> 	; (In order to check the drive has same volume/disk)
  1860 0000D422 88D7                <1> 	mov	bh, dl
  1861 0000D424 81C300010900        <1>         add	ebx, Logical_DOSDisks
  1862 0000D42A 8A4303              <1>         mov	al, [ebx+LD_FATType]
  1863 0000D42D 3C01                <1>         cmp	al, 1
  1864 0000D42F 7209                <1>         jb	short sysopen_6_fs
  1865 0000D431 3C02                <1>         cmp	al, 2
  1866 0000D433 770A                <1>         ja	short sysopen_6_fat32
  1867                              <1> sysopen_6_fat:
  1868 0000D435 8B432D              <1>         mov	eax, [ebx+LD_BPB+VolumeID]
  1869 0000D438 EB08                <1>         jmp	short sysopen_7
  1870                              <1> sysopen_6_fs:
  1871 0000D43A 8B4328              <1>         mov	eax, [ebx+LD_FS_VolumeSerial]
  1872 0000D43D EB03                <1>         jmp	short sysopen_7
  1873                              <1> sysopen_6_fat32:
  1874 0000D43F 8B4349              <1>         mov	eax, [ebx+LD_BPB+FAT32_VolID]
  1875                              <1> sysopen_7:
  1876 0000D442 A3[40790100]        <1>         mov	[Current_VolSerial], eax
  1877                              <1> 
  1878 0000D447 8987[44880100]      <1> 	mov	[edi+OF_VOLUMEID], eax
  1879                              <1> 
  1880                              <1> 	; 24/10/2016
  1881                              <1> 	;shr	di, 1 ; 4/2, word offset
  1882                              <1> 	; 23/07/2022
  1883 0000D44D D1EF                <1> 	shr	edi, 1
  1884 0000D44F 668B1D[64820100]    <1> 	mov	bx, [FindFile_DirEntryNumber]
  1885 0000D456 66899F[C4890100]    <1> 	mov	[edi+OF_DIRENTRY], bx
  1886                              <1> 
  1887 0000D45D 31D2                <1> 	xor	edx, edx
  1888                              <1> 	;;shr	di, 2 ; /4 (byte offset)
  1889                              <1> 	;shr	di, 1 ; 2/2, byte offset
  1890                              <1> 	; 23/07/2022
  1891 0000D45F D1EF                <1> 	shr	edi, 1
  1892 0000D461 8897[24860100]      <1> 	mov	byte [edi+OF_OPENCOUNT], dl ; 0
  1893 0000D467 8897[04860100]      <1> 	mov	byte [edi+OF_STATUS], dl ; 0
  1894                              <1> 
  1895 0000D46D 89FB                <1> 	mov	ebx, edi
  1896 0000D46F FEC3                <1> 	inc	bl
  1897                              <1> 
  1898 0000D471 889E[2A900100]      <1>         mov     [esi+u.fp], bl ; Open File Entry Number
  1899 0000D477 8935[20900100]      <1> 	mov     [u.r0], esi ; move index to u.fp list 
  1900                              <1> 			    ; into eax on stack
  1901                              <1> 
  1902 0000D47D E8A84D0000          <1>         call 	reset_working_path
  1903                              <1>         
  1904 0000D482 E9D0F9FFFF          <1> 	jmp	sysret
  1905                              <1> 
  1906                              <1> 
  1907                              <1> ; fsp table (original UNIX v1)
  1908                              <1> ;
  1909                              <1> ;Entry
  1910                              <1> ;          15                                      0
  1911                              <1> ;  1     |---|---------------------------------------|
  1912                              <1> ;        |r/w|       i-number of open file           |
  1913                              <1> ;        |---|---------------------------------------| 
  1914                              <1> ;        |               device number               |
  1915                              <1> ;        |-------------------------------------------|
  1916                              <1> ;    (*) | offset pointer, i.e., r/w pointer to file |
  1917                              <1> ;        |-------------------------------------------| 
  1918                              <1> ;        |  flag that says    | number of processes  |
  1919                              <1> ;        |   file deleted     | that have file open  |
  1920                              <1> ;        |-------------------------------------------| 
  1921                              <1> ;  2     |                                           |
  1922                              <1> ;        |-------------------------------------------| 
  1923                              <1> ;        |                                           |
  1924                              <1> ;        |-------------------------------------------|
  1925                              <1> ;        |                                           |
  1926                              <1> ;        |-------------------------------------------|
  1927                              <1> ;        |                                           |
  1928                              <1> ;        |-------------------------------------------| 
  1929                              <1> ;  3     |                                           | 
  1930                              <1> ;        |                                           |  
  1931                              <1> ;
  1932                              <1> ; (*) Retro UNIX 386 v1 modification: 32 bit offset pointer 
  1933                              <1> 
  1934                              <1> ; 27/03/2020 - Retro UNIX 386 v2 - FSP (OPEN FILES) TABLE 
  1935                              <1> 
  1936                              <1> ;Entry
  1937                              <1> ;         15                    7                   0
  1938                              <1> ;  1     |-------------------------------------------|
  1939                              <1> ;        |   	     i-number of open file           |
  1940                              <1> ;        |-------------------------------------------| 
  1941                              <1> ;        |        high word of 32 bit i-number       |
  1942                              <1> ;        |-------------------------------------------|
  1943                              <1> ;        | open mode & status  |   device number     |
  1944                              <1> ;        |-------------------------------------------|
  1945                              <1> ;        |    reserved byte    |     open count      |
  1946                              <1> ;        |-------------------------------------------| 
  1947                              <1> ;        | offset pointer, i.e., r/w pointer to file |
  1948                              <1> ;        |-------------------------------------------|
  1949                              <1> ;        |   64 bit file offset pointer (bit 16-31)  | 
  1950                              <1> ;        |-------------------------------------------|
  1951                              <1> ;        |   64 bit file offset pointer (bit 32-47)  | 
  1952                              <1> ;        |-------------------------------------------|
  1953                              <1> ;        |   64 bit file offset pointer (bit 48-63)  | 
  1954                              <1> ;        |-------------------------------------------|
  1955                              <1> ;  2     |                                           |
  1956                              <1> ;        |-------------------------------------------| 
  1957                              <1> ;        |                                           |
  1958                              <1> ;        |-------------------------------------------|
  1959                              <1> ;        |                                           |
  1960                              <1> ;        |-------------------------------------------|
  1961                              <1> ;        |                                           |
  1962                              <1> ;        |-------------------------------------------| 
  1963                              <1> ;        |                                           | 
  1964                              <1> 
  1965                              <1> ; 23/07/2022 - TRDOS 386 Kernel v2.0.5
  1966                              <1> ; OPENFILES equ 10 (sysdefs.s)
  1967                              <1> ;; 06/10/2016
  1968                              <1> ;; Open File Parameters (trdoskx.s)
  1969                              <1> ;OF_FCLUSTER:	resd OPENFILES  ; First clusters of open files
  1970                              <1> ;OF_DRIVE:	resb OPENFILES  ; Logical DOS drive numbers of open files 
  1971                              <1> ;OF_MODE:	resb OPENFILES  ; Open mode (1 = read, 2 = write, 3 = r&w) 
  1972                              <1> ;OF_STATUS:	resb OPENFILES  ; (bit 0 = read, bit 1 = write)
  1973                              <1> ;OF_OPENCOUNT:	resb OPENFILES  ; Open counts of open files
  1974                              <1> ;OF_POINTER:	resd OPENFILES	; File seek/read/write pointer
  1975                              <1> ;OF_SIZE:	resd OPENFILES	; File sizes of open files (in bytes)
  1976                              <1> ;OF_DIRFCLUSTER: resd OPENFILES  ; Directory First Clusters of open files
  1977                              <1> ;OF_DIRCLUSTER:	resd OPENFILES  ; Directory (Entry) Clusters of open files
  1978                              <1> ;OF_VOLUMEID:	resd OPENFILES  ; Vol ID for removable drives of open files
  1979                              <1> ;OF_CCLUSTER:	resd OPENFILES  ; Current clusters of open files
  1980                              <1> ;OF_CCINDEX:	resd OPENFILES  ; Cluster index numbers of current clusters
  1981                              <1> ;; 24/10/2016
  1982                              <1> ;OF_DIRENTRY:	resw OPENFILES  ; Directory entry index no. in dir cluster
  1983                              <1> 
  1984                              <1> ; 17/04/2021
  1985                              <1> ; ('sysopen_device' procedure is disabled as temporary)
  1986                              <1> 
  1987                              <1> ;sysopen_device:
  1988                              <1> ;	; 15/10/2016
  1989                              <1> ;	; 08/10/2016
  1990                              <1> ;	; 07/10/2016 (TRDOS 386 = TRDOS v2.0)
  1991                              <1> ;	push	ecx ; open mode
  1992                              <1> ;	mov	ebp, esp
  1993                              <1> ;	mov	ecx, 16 ; transfer length = 16 bytes 
  1994                              <1> ;	sub	esp, ecx
  1995                              <1> ;	mov	edi, esp ; destination address 
  1996                              <1> ;	mov 	esi, ebx ; dev name in user's memory space
  1997                              <1> ;	call	transfer_from_user_buffer
  1998                              <1> ;	jnc	short sysopen_dev_0
  1999                              <1> ;	; eax = ERR_OUT_OF_MEMORY = 4 = ERR_MINOR_IM
  2000                              <1> ;	pop	ecx
  2001                              <1> ;sysopen_dev_err:
  2002                              <1> ;	mov	[u.r0], eax
  2003                              <1> ;	mov	[u.error], eax
  2004                              <1> ;	jmp	error
  2005                              <1> ;sysopen_dev_0:
  2006                              <1> ;	mov	esi, edi ; Device name addr (max. 16 bytes, ASCIIZ) 
  2007                              <1> ;			 ; for example: "tty, TTY, /dev/tty"
  2008                              <1> ;	call	get_device_number
  2009                              <1> ;	mov	esp, ebp
  2010                              <1> ;	pop	ecx
  2011                              <1> ;	jnc	short sysopen_dev_1
  2012                              <1> ;	mov	eax, ERR_INV_DEV_NAME ; 24 ; 'invalid device name !'
  2013                              <1> ;	jmp	short sysopen_dev_err
  2014                              <1> ;sysopen_dev_1:
  2015                              <1> ;	; eax = Device Number (AL)
  2016                              <1> ;	;  cl = Open mode (2 = device read, 3 = device write)
  2017                              <1> ;       xor     ebx, ebx ; 0
  2018                              <1> ;sysopen_dev_2: ; scan the list of entries
  2019                              <1> ;       cmp     [ebx+u.fp], bl ; 0
  2020                              <1> ;       jna     short sysopen_dev_3 ; empty slot
  2021                              <1> ;       inc     bl
  2022                              <1> ;       cmp     bl, 10
  2023                              <1> ;	jb	short sysopen_dev_2
  2024                              <1> ;	;
  2025                              <1> ;	mov	eax, ERR_TOO_MANY_FILES ; too many open files !
  2026                              <1> ;	jmp	short sysopen_dev_err
  2027                              <1> ;sysopen_dev_3:
  2028                              <1> ;	mov 	[u.r0], ebx ; File/Device index/handle/descriptor
  2029                              <1> ;	; eax = device number (entry offset)
  2030                              <1> ;	mov	ch, [eax+DEV_ACCESS] ; bit 0 = accessable by users
  2031                              <1> ;				     ; bit 1 = read access perm
  2032                              <1> ;				     ; bit 2 = write access perm
  2033                              <1> ;				     ; bit 3 = IOCTL permit to users
  2034                              <1> ;				     ; bit 4 = block device if set
  2035                              <1> ;				     ; bit 5 = 16 bit or 1024 byte
  2036                              <1> ;				     ; bit 6 = 32 bit or 2048 byte
  2037                              <1> ;				     ; bit 7 = installable device drv
  2038                              <1> ;	test 	ch, 1 ; accessable by normal users (except root)
  2039                              <1> ;	jnz	short sysopen_dev_4 ; yes, permission has been given
  2040                              <1> ;	cmp	byte [u.uid], 0 ; root?
  2041                              <1> ;	jna	short sysopen_dev_4 ; superuser can open all devices
  2042                              <1> ;sysopen_dev_perm_err:
  2043                              <1> ;	mov	eax, ERR_DEV_ACCESS  ; 11 = 'permission denied !'
  2044                              <1> ;	jmp	short sysopen_dev_err
  2045                              <1> ;sysopen_dev_4:
  2046                              <1> ;	shr	ch, 1 ; result: 1 = read, 2 = write, 3 = r & w 
  2047                              <1> ;	dec	cl  ; result: 1 = read, 2 = write
  2048                              <1> ;	test	cl, ch
  2049                              <1> ;	jz	short sysopen_dev_perm_err 
  2050                              <1> ;
  2051                              <1> ;	shl	ch, 1 ; bit 0 = 0
  2052                              <1> ;	; eax = device number (entry offset)
  2053                              <1> ;	call	device_open
  2054                              <1> ;	jc	short sysopen_dev_perm_err 
  2055                              <1> ;
  2056                              <1> ;	; eax = device number (entry offset)
  2057                              <1> ;	or	al, 80h ; set device bit (set bit 7 to 1)
  2058                              <1> ;	mov	ebx, [u.r0]
  2059                              <1> ;	mov	[ebx+u.fp], al	; bit 7 (=1) points to device	
  2060                              <1> ;	
  2061                              <1> ;	jmp	sysret
  2062                              <1> 
  2063                              <1> sysmkdir: ; < make directory >
  2064                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5 
  2065                              <1> 	; 15/10/2016
  2066                              <1> 	; 10/10/2016 (TRDOS 386 = TRDOS v2.0) 
  2067                              <1> 	;	     -derived from INT_21H.ASM-
  2068                              <1> 	;            ("loc_INT21h_create_file")
  2069                              <1>         ; 	10/07/2011 (12/03/2011)
  2070                              <1>         ;	INT 21h Function AH = 3Ch
  2071                              <1>         ;	Create File
  2072                              <1>         ;	INPUT
  2073                              <1>         ;	   CX = Attributes
  2074                              <1>         ;          DS:DX= Address of zero terminaned path name
  2075                              <1>         ;
  2076                              <1>         ;
  2077                              <1> 	; 14/05/2015 (Retro UNIX 386 v1 - Beginning)
  2078                              <1> 	; 27/05/2013 - 02/08/2013 (Retro UNIX 8086 v1)
  2079                              <1> 	;
  2080                              <1> 	; 'sysmkdir' creates an empty directory whose name is
  2081                              <1> 	; pointed to by arg 1. The mode of the directory is arg 2.	
  2082                              <1> 	; The special entries '.' and '..' are not present.
  2083                              <1> 	; Errors are indicated if the directory already exists or		
  2084                              <1> 	; user is not the super user. 
  2085                              <1> 	;
  2086                              <1> 	; Calling sequence:
  2087                              <1> 	;	sysmkdir; name; mode
  2088                              <1> 	; Arguments:
  2089                              <1> 	;	name - points to the name of the directory
  2090                              <1> 	;	mode - mode of the directory
  2091                              <1> 	; Inputs: (arguments)
  2092                              <1> 	; Outputs: -
  2093                              <1> 	;    (sets 'directory' flag to 1; 
  2094                              <1> 	;    'set user id on execution' and 'executable' flags to 0)
  2095                              <1> 	; ...............................................................
  2096                              <1> 	;				
  2097                              <1> 	; Retro UNIX 8086 v1 modification: 
  2098                              <1> 	;       'sysmkdir' system call has two arguments; so,
  2099                              <1> 	;	* 1st argument, name is pointed to by BX register
  2100                              <1> 	;	* 2nd argument, mode is in CX register
  2101                              <1> 	;
  2102                              <1> 	; TRDOS 386 (10/10/2016)
  2103                              <1> 	;	
  2104                              <1>         ; INPUT ->
  2105                              <1>         ;	   CL = Directory Attributes
  2106                              <1> 	;     	      bit 0 (1) - Read only file/dir (R)
  2107                              <1> 	;             bit 1 (1) - Hidden file/dir (H)
  2108                              <1>         ;             bit 2 (1) - System file/dir (R)
  2109                              <1> 	;             bit 3 (1) - Volume label/name (V)
  2110                              <1>         ;             bit 4 (1) - Subdirectory (D)
  2111                              <1> 	;	      bit 5 (1) - File/Dir has been archived (A)
  2112                              <1> 	;	   CX = 0 -> create normal directory	 	
  2113                              <1>         ;          EBX = Pointer to directory name (ASCIIZ) -path-
  2114                              <1> 	;	
  2115                              <1> 	; OUTPUT ->
  2116                              <1> 	;          eax = First cluster of the new directory
  2117                              <1> 	;          cf = 1 -> Error code in AL
  2118                              <1> 	;
  2119                              <1> 	; Modified Registers: EAX (at the return of system call)
  2120                              <1> 	;  
  2121                              <1> 	; Note: If the file or directory is existing
  2122                              <1> 	;	an access error will be returned. 
  2123                              <1> 
  2124 0000D487 6621C9              <1> 	and	cx, cx ; if cx = 0 -> create a normal subdir
  2125 0000D48A 7414                <1> 	jz	short sysmkdir_1
  2126                              <1> 
  2127 0000D48C F6C110              <1> 	test	cl, 10h ; if dir flags set, also use other flags
  2128                              <1> 	;jnz	sysmkdir_0 ; jump to head of 'syscreat'
  2129                              <1> 	; 23/07/2022
  2130 0000D48F 7405                <1> 	jz	short sysmkdir_invf
  2131                              <1> sysmkdir_3:
  2132 0000D491 E9D3FDFFFF          <1> 	jmp	sysmkdir_0
  2133                              <1> 
  2134                              <1> sysmkdir_invf:
  2135                              <1> 	; CX has wrong flags
  2136 0000D496 B817000000          <1> 	mov 	eax, ERR_INV_FLAGS
  2137 0000D49B E9A6FEFFFF          <1> 	jmp	sysopen_dev_err
  2138                              <1> 
  2139                              <1> sysmkdir_1:
  2140 0000D4A0 B110                <1> 	mov	cl, 10h ; set subdir flag and reset other flags
  2141                              <1> 	;jmp	sysmkdir_0
  2142                              <1> 	; 23/07/2022
  2143 0000D4A2 EBED                <1> 	jmp	short sysmkdir_3 ; jump to head of 'syscreat'
  2144                              <1> sysmkdir_2: 
  2145                              <1> 	; jump from 'syscreat' ; from 'syscreat_1'
  2146                              <1> 	;  CL = Directory attributes/flags  
  2147 0000D4A4 BE[2C820100]        <1> 	mov	esi, FindFile_Name 
  2148 0000D4A9 E882D8FFFF          <1> 	call	make_sub_directory
  2149                              <1> 	;jc	sysopen_err       ; NOTE: Old type (TRDOS 8086)
  2150                              <1> 				  ; error codes must be modified
  2151                              <1> 				  ; for next TRDOS 386 versions
  2152                              <1> 				  ; (10/10/2016)
  2153                              <1> 				  ; Old (MSDOS type)
  2154                              <1> 				  ; error codes (2011):
  2155                              <1> 				  ;  2 = file not found
  2156                              <1> 				  ;  3 = directory not found
  2157                              <1> 				  ;  5 = access denied
  2158                              <1> 				  ; 12 = no more files
  2159                              <1> 			          ; 19 = disk write protected   
  2160                              <1> 				  ; 39 = insufficient disk space
  2161                              <1> 				  ; 'sysdefs.s' ; 10/10/2016  	
  2162                              <1> 	; 23/07/2022
  2163 0000D4AE 7305                <1> 	jnc	short sysmkdir_4
  2164 0000D4B0 E9B4FEFFFF          <1> 	jmp	sysopen_err
  2165                              <1> 
  2166                              <1> sysmkdir_4:	
  2167 0000D4B5 A3[20900100]        <1> 	mov	[u.r0], eax ; New sub dir's first cluster
  2168 0000D4BA E86B4D0000          <1>         call 	reset_working_path
  2169 0000D4BF E993F9FFFF          <1> 	jmp	sysret	
  2170                              <1> 
  2171                              <1> sysclose: ;<close file>
  2172                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
  2173                              <1> 	; 06/10/2016 (TRDOS 386 = TRDOS v2.0) 
  2174                              <1> 	;
  2175                              <1> 	; 14/05/2015 (Retro UNIX 386 v1 - Beginning)
  2176                              <1> 	; 22/05/2013 - 26/05/2013 (Retro UNIX 8086 v1)
  2177                              <1> 	;
  2178                              <1> 	; 'sysclose', given a file descriptor in 'u.r0', closes the
  2179                              <1> 	; associated file. The file descriptor (index to 'u.fp' list)
  2180                              <1> 	; is put in r1 and 'fclose' is called.
  2181                              <1> 	;
  2182                              <1> 	; Calling sequence:
  2183                              <1> 	;	sysclose
  2184                              <1> 	; Arguments:
  2185                              <1> 	;	-  
  2186                              <1> 	; Inputs: *u.r0 - file descriptor
  2187                              <1> 	; Outputs: -
  2188                              <1> 	; ...............................................................
  2189                              <1> 	;				
  2190                              <1> 	; Retro UNIX 8086 v1 modification:
  2191                              <1> 	;	 The user/application program puts file descriptor
  2192                              <1> 	;        in BX register as 'sysclose' system call argument.
  2193                              <1> 	; 	 (argument transfer method 1)
  2194                              <1> 
  2195                              <1> 	; TRDOS 386 (06/10/2016)
  2196                              <1> 	;	
  2197                              <1>         ; INPUT ->
  2198                              <1>         ;	   EBX = File Handle/Number (file index) (AL)
  2199                              <1> 	; OUTPUT ->
  2200                              <1> 	;          cf = 0 -> EAX = 0
  2201                              <1> 	;          cf = 1 -> Error code in EAX (ERR_FILE_NOT_OPEN)
  2202                              <1> 	;
  2203                              <1> 	; Modified Registers: EAX (at the return of system call)
  2204                              <1> 	;  
  2205                              <1> 
  2206 0000D4C4 89D8                <1> 	mov 	eax, ebx
  2207 0000D4C6 31DB                <1> 	xor	ebx, ebx	
  2208 0000D4C8 891D[20900100]      <1> 	mov	[u.r0], ebx ; 0  ; return value of EAX
  2209 0000D4CE E831310000          <1> 	call 	fclose
  2210                              <1> 	;jnc	sysret
  2211                              <1> 	; 23/07/2022
  2212 0000D4D3 7205                <1> 	jc	short sysclose_err
  2213 0000D4D5 E97DF9FFFF          <1> 	jmp	sysret
  2214                              <1> sysclose_err:
  2215 0000D4DA B80A000000          <1> 	mov	eax, ERR_FILE_NOT_OPEN ; file not open !
  2216 0000D4DF A3[88900100]        <1> 	mov	[u.error], eax ;
  2217 0000D4E4 A3[20900100]        <1> 	mov	[u.r0], eax ; ! invalid handle !
  2218 0000D4E9 E949F9FFFF          <1> 	jmp	error
  2219                              <1> 
  2220                              <1> sysread: ; < read from file >
  2221                              <1> 	; 11/10/2016 (TRDOS 386 = TRDOS v2.0) 
  2222                              <1> 	;	     -derived from INT_21H.ASM-
  2223                              <1> 	;            ("loc_INT21h_read_file")
  2224                              <1>         ; 	13/03/2011 (05/03/2011)
  2225                              <1>         ;	INT 21h Function AH = 3Fh
  2226                              <1>         ;	Read from a File
  2227                              <1>         ;	INPUT
  2228                              <1> 	;	   BX = File Handle
  2229                              <1>         ;	   CX = Number of bytes to read
  2230                              <1>         ;          DS:DX= Buffer address
  2231                              <1>         ;
  2232                              <1> 	; Note: TRDOS 386 'sysread' has been derived from 
  2233                              <1> 	;	Retro UNIX 386 v1 'sysread', except a few 
  2234                              <1> 	;	code modifications.
  2235                              <1> 	;
  2236                              <1> 	; 13/05/2015 (Retro UNIX 386 v1)
  2237                              <1> 	; 11/05/2015 (Retro UNIX 386 v1 - Beginning)
  2238                              <1> 	; 23/05/2013 (Retro UNIX 8086 v1)
  2239                              <1> 	;
  2240                              <1> 	; 'sysread' is given a buffer to read into and the number of
  2241                              <1> 	; characters to be read. If finds the file from the file
  2242                              <1> 	; descriptor located in *u.r0 (r0). This file descriptor
  2243                              <1> 	; is returned from a successful open call (sysopen).
  2244                              <1> 	; The i-number of file is obtained via 'rw1' and the data
  2245                              <1> 	; is read into core via 'readi'.
  2246                              <1> 	;
  2247                              <1> 	; Calling sequence:
  2248                              <1> 	;	sysread; buffer; nchars
  2249                              <1> 	; Arguments:
  2250                              <1> 	;	buffer - location of contiguous bytes where 
  2251                              <1> 	;		 input will be placed.
  2252                              <1> 	;	nchars - number of bytes or characters to be read.
  2253                              <1> 	; Inputs: *u.r0 - file descriptor (& arguments)
  2254                              <1> 	; Outputs: *u.r0 - number of bytes read.	
  2255                              <1> 	; ...............................................................
  2256                              <1> 	;				
  2257                              <1> 	; Retro UNIX 8086 v1 modification: 
  2258                              <1> 	;       'sysread' system call has three arguments; so,
  2259                              <1> 	;	* 1st argument, file descriptor is in BX register
  2260                              <1> 	;	* 2nd argument, buffer address/offset in CX register
  2261                              <1> 	;	* 3rd argument, number of bytes is in DX register
  2262                              <1> 	;
  2263                              <1> 	;	AX register (will be restored via 'u.r0') will return
  2264                              <1> 	;	to the user with number of bytes read. 
  2265                              <1> 	;
  2266                              <1> 	; TRDOS 386 (05/10/2016)
  2267                              <1> 	;	
  2268                              <1>         ; INPUT ->
  2269                              <1>         ;	   EBX = File handle (descriptor/index)
  2270                              <1> 	;	   ECX = Buffer address		
  2271                              <1>         ;          EDX = Number of bytes
  2272                              <1> 	; OUTPUT ->
  2273                              <1> 	;          EAX = Number of bytes have been read
  2274                              <1> 	;          cf = 1 -> Error code in AL
  2275                              <1> 	;
  2276                              <1> 	; Modified Registers: EAX (at the return of system call)
  2277                              <1> 	; 
  2278                              <1> 
  2279                              <1> 	; EBX = File descriptor
  2280 0000D4EE E85F310000          <1> 	call	getf1 
  2281 0000D4F3 7273                <1> 	jc	short device_read ; read data from device
  2282                              <1> 	; EAX = First cluster of the file
  2283                              <1> 
  2284 0000D4F5 E83F000000          <1> 	call	rw1
  2285 0000D4FA 730A                <1> 	jnc	short sysread_0
  2286                              <1> 
  2287 0000D4FC A3[20900100]        <1> 	mov	[u.r0], eax ; error code
  2288 0000D501 E931F9FFFF          <1> 	jmp	error
  2289                              <1> 	 
  2290                              <1> sysread_0:
  2291 0000D506 E8CC340000          <1> 	call	readi
  2292 0000D50B EB1D                <1> 	jmp	short rw0
  2293                              <1> 
  2294                              <1> syswrite: ; < write to file >
  2295                              <1> 	; 23/10/2016
  2296                              <1> 	; 11/10/2016 (TRDOS 386 = TRDOS v2.0) 
  2297                              <1> 	;	     -derived from INT_21H.ASM-
  2298                              <1> 	;            ("loc_INT21h_write_file")
  2299                              <1>         ; 	13/03/2011 (05/03/2011)
  2300                              <1>         ;	INT 21h Function AH = 40h
  2301                              <1>         ;	Write to a File
  2302                              <1>         ;	INPUT
  2303                              <1> 	;	   BX = File Handle
  2304                              <1>         ;	   CX = Number of bytes to write
  2305                              <1>         ;          DS:DX= Buffer address
  2306                              <1>         ;
  2307                              <1> 	; Note: TRDOS 386 'sysrwrite' has been derived from 
  2308                              <1> 	;	Retro UNIX 386 v1 'syswrite', except a few 
  2309                              <1> 	;	code modifications.
  2310                              <1> 	;
  2311                              <1> 
  2312                              <1> 	; 13/05/2015 (Retro UNIX 386 v1)
  2313                              <1> 	; 11/05/2015 (Retro UNIX 386 v1 - Beginning)
  2314                              <1> 	; 23/05/2013 (Retro UNIX 8086 v1)
  2315                              <1> 	;
  2316                              <1> 	; 'syswrite' is given a buffer to write onto an output file
  2317                              <1> 	; and the number of characters to write. If finds the file
  2318                              <1> 	; from the file descriptor located in *u.r0 (r0). This file 
  2319                              <1> 	; descriptor is returned from a successful open or create call
  2320                              <1> 	; (sysopen or syscreat). The i-number of file is obtained via
  2321                              <1> 	; 'rw1' and buffer is written on the output file via 'write'.
  2322                              <1> 	;
  2323                              <1> 	; Calling sequence:
  2324                              <1> 	;	syswrite; buffer; nchars
  2325                              <1> 	; Arguments:
  2326                              <1> 	;	buffer - location of contiguous bytes to be writtten.
  2327                              <1> 	;	nchars - number of characters to be written.
  2328                              <1> 	; Inputs: *u.r0 - file descriptor (& arguments)
  2329                              <1> 	; Outputs: *u.r0 - number of bytes written.	
  2330                              <1> 	; ...............................................................
  2331                              <1> 	;				
  2332                              <1> 	; Retro UNIX 8086 v1 modification: 
  2333                              <1> 	;       'syswrite' system call has three arguments; so,
  2334                              <1> 	;	* 1st argument, file descriptor is in BX register
  2335                              <1> 	;	* 2nd argument, buffer address/offset in CX register
  2336                              <1> 	;	* 3rd argument, number of bytes is in DX register
  2337                              <1> 	;
  2338                              <1> 	;	AX register (will be restored via 'u.r0') will return
  2339                              <1> 	;	to the user with number of bytes written. 
  2340                              <1> 	;
  2341                              <1> 	; INPUT ->
  2342                              <1>         ;	   EBX = File handle (descriptor/index)
  2343                              <1> 	;	   ECX = Buffer address		
  2344                              <1>         ;          EDX = Number of bytes
  2345                              <1> 	; OUTPUT ->
  2346                              <1> 	;          EAX = Number of bytes have been written
  2347                              <1> 	;          cf = 1 -> Error code in AL
  2348                              <1> 	;
  2349                              <1> 	; Modified Registers: EAX (at the return of system call)
  2350                              <1> 	;  
  2351                              <1> 
  2352                              <1> 	; EBX = File descriptor
  2353 0000D50D E840310000          <1> 	call	getf1 
  2354 0000D512 7254                <1> 	jc	short device_write ; write data to device
  2355                              <1> 	; EAX = First cluster of the file
  2356                              <1> 	; EBX = File number  (Open file number) ; 23/10/2016
  2357                              <1> 
  2358 0000D514 E820000000          <1> 	call	rw1
  2359 0000D519 730A                <1> 	jnc	short syswrite_0
  2360 0000D51B A3[20900100]        <1> 	mov	[u.r0], eax ; error code
  2361 0000D520 E912F9FFFF          <1> 	jmp	error
  2362                              <1> 	 
  2363                              <1> syswrite_0:
  2364 0000D525 E8C63B0000          <1> 	call	writei
  2365                              <1> rw0: ; 1:
  2366 0000D52A A1[4C900100]        <1>         mov	eax, [u.nread]
  2367 0000D52F A3[20900100]        <1> 	mov	[u.r0], eax
  2368 0000D534 E91EF9FFFF          <1> 	jmp	sysret
  2369                              <1> rw1:	
  2370                              <1> 	; 17/04/2021 (TRDOS 386 v2.0.4)
  2371                              <1> 	; 11/10/2016 (TRDOS 386 = TRDOS v2.0) 
  2372                              <1> 	; 14/05/2015 (Retro UNIX 386 v1)
  2373                              <1> 	; 11/05/2015 (Retro UNIX 386 v1 - Beginning)
  2374                              <1> 	; 23/05/2013 - 24/05/2013 (Retro UNIX 8086 v1)
  2375                              <1> 	; System call registers: ebx, ecx, edx (through 'sysenter')
  2376                              <1> 	;
  2377                              <1> 	; EBX = File descriptor
  2378                              <1> 	;call	getf1 ; calling point in 'getf' from 'rw1'
  2379                              <1> 	;jc	short device_rw ; read/write data from/to device
  2380                              <1> 	; EAX = First cluster of the file
  2381                              <1> 
  2382 0000D539 83F802              <1> 	cmp 	eax, 2
  2383 0000D53C 7217                <1> 	jb	short rw2
  2384                              <1> 	;
  2385 0000D53E 890D[44900100]      <1> 	mov	[u.base], ecx 	; buffer address/offset 
  2386                              <1> 				;(in the user's virtual memory space)
  2387 0000D544 8915[48900100]      <1> 	mov	[u.count], edx 
  2388                              <1> 
  2389 0000D54A C705[88900100]0000- <1>         mov	dword [u.error], 0 ; reset the last error code
  2389 0000D552 0000                <1>
  2390 0000D554 C3                  <1> 	retn
  2391                              <1> rw2:
  2392 0000D555 B80A000000          <1> 	mov	eax, ERR_FILE_NOT_OPEN ; file not open !
  2393                              <1> 	;mov	dword [u.error], eax
  2394                              <1> 	;retn
  2395                              <1> 	; 17/04/2021
  2396 0000D55A EB06                <1> 	jmp	short rw4
  2397                              <1> rw3: 
  2398 0000D55C B80B000000          <1> 	mov	eax, ERR_FILE_ACCESS ; permission denied !
  2399 0000D561 F9                  <1> 	stc
  2400                              <1> rw4:	; 17/04/2021
  2401 0000D562 A3[88900100]        <1> 	mov	dword [u.error], eax
  2402 0000D567 C3                  <1> 	retn
  2403                              <1> 
  2404                              <1> 	; 17/04/2021 (temporary)
  2405                              <1> device_write:
  2406                              <1> device_read:
  2407                              <1> 	; 17/04/2021 - TRDOS 386 v2.0.4
  2408                              <1> 	;	(temporary modifications)
  2409                              <1> 	;
  2410                              <1> 	; 11/10/2016 (TRDOS 386 = TRDOS v2.0)
  2411                              <1> 	; cl = DEV_OPENMODE ; open mode
  2412                              <1> 	; ch = DEV_ACCESS   ; access flags   
  2413                              <1> 	; al = DEV_DRIVER   ; device number (eax)
  2414                              <1> 
  2415                              <1> 	; 17/04/2021 (temporary)
  2416 0000D568 EBEB                <1> 	jmp	short rw2 ; file not open
  2417                              <1> 
  2418                              <1> ;	test	cl, 1 ; 1 = read, 2 = write, 3 = read&write
  2419                              <1> ;	jz	short rw3
  2420                              <1> ;
  2421                              <1> ;	mov	ebx, eax
  2422                              <1> ;	shl	bx, 2 ; *4
  2423                              <1> ;
  2424                              <1> ;	test	ch, 80h ; bit 7, installable device driver flag
  2425                              <1> ;	jz	short d_read_2 ; Kernel device
  2426                              <1> ;	; installable device
  2427                              <1> ;d_read_1:
  2428                              <1> ;       jmp	dword [ebx+IDEV_RADDR-4]
  2429                              <1> ;d_read_2:
  2430                              <1> ;	jmp	dword [ebx+KDEV_RADDR-4]
  2431                              <1> 
  2432                              <1> ;device_write:
  2433                              <1> 	; 17/04/2021 - TRDOS 386 v2.0.4
  2434                              <1> 	;	(temporary modifications)
  2435                              <1> 	;
  2436                              <1> 	; 11/10/2016 (TRDOS 386 = TRDOS v2.0)
  2437                              <1> 	; cl = DEV_OPENMODE ; open mode
  2438                              <1> 	; ch = DEV_ACCESS   ; access flags   
  2439                              <1> 	; al = DEV_DRIVER   ; device number (eax)
  2440                              <1> 
  2441                              <1> 	; 17/04/2021 (temporary)
  2442                              <1> 	;jmp	short rw2 ; file not open
  2443                              <1> 
  2444                              <1> ;	test	cl, 2 ; 1 = read, 2 = write, 3 = read&write
  2445                              <1> ;	jz	short rw3	
  2446                              <1> ;
  2447                              <1> ;	mov	ebx, eax
  2448                              <1> ;	shl	bx, 2 ; *4
  2449                              <1> ;
  2450                              <1> ;	test	ch, 80h ; bit 7, installable device driver flag
  2451                              <1> ;	jz	short d_write_2 ; Kernel device
  2452                              <1> ;	; installable device
  2453                              <1> ;d_write_1:
  2454                              <1> ;       jmp	dword [ebx+IDEV_WADDR-4]
  2455                              <1> ;d_write_2:
  2456                              <1> ;	jmp	dword [ebx+KDEV_WADDR-4]
  2457                              <1> 
  2458                              <1> systimer:
  2459                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5
  2460                              <1> 	; 02/01/2017
  2461                              <1> 	; 21/12/2016
  2462                              <1> 	; 19/12/2016
  2463                              <1> 	; 10/12/2016 (callback)
  2464                              <1> 	; 10/06/2016
  2465                              <1> 	; 07/06/2016
  2466                              <1> 	; 06/06/2016
  2467                              <1> 	; 21/05/2016
  2468                              <1> 	; 19/05/2016
  2469                              <1> 	; 18/05/2016 - TRDOS 386 (TRDOS v2.0)
  2470                              <1> 	; (TRDOS 386 feature only!)
  2471                              <1> 	;
  2472                              <1> 	; (start or stop timer event(s))	
  2473                              <1> 	;
  2474                              <1> 	; INPUT ->
  2475                              <1> 	;	BL = Signal return byte (response byte)
  2476                              <1> 	;	     (Any requested value between 0 and 255)
  2477                              <1> 	;	     (Kernel will put it at the requested address)
  2478                              <1> 	;	BH = Time count unit
  2479                              <1> 	;	     0 = Stop timer event
  2480                              <1> 	;	     1 = 18.2 ticks per second
  2481                              <1> 	;	     2 = 10 milliseconds
  2482                              <1> 	;	     3 = 1 second (for real time clock interrupt)
  2483                              <1> 	;	     4 = time/tick count in current time count unit
  2484                              <1> 	;	    // 10/12/2016
  2485                              <1> 	;	    80h = Stop timer event (callback method)
  2486                              <1> 	;	    81h = 18.2 ticks per second, callback method
  2487                              <1> 	;	    82h = 10 milliseconds, callback method
  2488                              <1> 	;	    83h = 1 second (for RTC int), callback method
  2489                              <1> 	;	    84h = current time count unit, callback method
  2490                              <1> 	;
  2491                              <1> 	;	    Note: Only 03h or 83h will set real time clock
  2492                              <1> 	;		  (RTC) events (Others are for PIT events)!
  2493                              <1> 	;	
  2494                              <1> 	;	NOTE: If callback (user service) method is used,
  2495                              <1> 	;	    EDX will point to the return address (of service
  2496                              <1> 	;	    procedure) in user's space instead of signal 
  2497                              <1> 	;	    response byte address. (TRDOS 386 kernel will
  2498                              <1> 	;	    direct the cpu to that address -in user's space-
  2499                              <1> 	;	    at the return of system call or interrupt 
  2500                              <1> 	;	    just after the adjusted count/time is elapsed.)
  2501                              <1> 	;	    User's sevice routine must be ended with a
  2502                              <1> 	;	    'iret'. Normal return addresses from system 
  2503                              <1> 	;	    calls or and interrupts will be kept same except
  2504                              <1> 	;	    the timer returns.
  2505                              <1>      	;
  2506                              <1> 	;	BH = 0 -> Stop timer event
  2507                              <1> 	;	BL = Timer event number (1 to 255) if BH = 0
  2508                              <1> 	;	     If BL = 0, all timer events (which are belongs
  2509                              <1> 	;	      to running process) will be stopped
  2510                              <1> 	;	ECX = Time/Tick count (depending on time count unit)
  2511                              <1> 	;	EDX = Signal return (Response) byte address
  2512                              <1> 	;	      (virtual address in user's memory space)
  2513                              <1> 	; OUTPUT ->
  2514                              <1> 	;	AL = Timer event number	(1 to 255) (max. value = 16)
  2515                              <1> 	;	IF BH Input = 0 & CF = 0 & AL = 0 -> 
  2516                              <1> 	;	     timer event(s) has/have been stopped/finished
  2517                              <1> 	;	CF = 1 & AL = 0 -> no timer setting space to set
  2518                              <1> 	;	CF = 1 & AL > 0 -> timer count unit is not usable
  2519                              <1> 	;
  2520                              <1> 	;	NOTE: To modify a time count for a user function,
  2521                              <1> 	;	      at first, current timer event must be stopped
  2522                              <1> 	;	      then a new timer event (which is related with
  2523                              <1> 	;	      same user function) must be started.
  2524                              <1> 	;		
  2525                              <1> 	;	      Signal return (response) byte may be used for 
  2526                              <1> 	;	      several purposes. Kernel will put this value 
  2527                              <1> 	;	      to requested address during timer interrupt,
  2528                              <1> 	;	      program/user can check this value to understand
  2529                              <1> 	;	      which event has been occurred and what is changed.
  2530                              <1> 	;	      (Multi timer events can share same signal address)
  2531                              <1> 	;	
  2532                              <1> 	;	NOTE: If the process is running while the time count
  2533                              <1> 	;	      is reached, kernel will put signal return (response)
  2534                              <1> 	;	      byte value at requested address during timer
  2535                              <1> 	;	      interrupt and the process will continue to run.
  2536                              <1> 	;	      Program/process must call (jump to) it's timer event
  2537                              <1> 	;	      function as required, for checking the timer event
  2538                              <1> 	;	      status via signal return (response) byte address. 
  2539                              <1> 	;
  2540                              <1> 	;	      If the process is not running (waiting or sleeping
  2541                              <1> 	;	      or released) while the time count is reached,
  2542                              <1> 	;	      it is restarted from where it left, to ensure
  2543                              <1> 	;	      proper multi media (video, audio, clock, timer)
  2544                              <1> 	;	      functionality.
  2545                              <1> 	;
  2546                              <1> 	;	      (It is better to use 'syswait' or 'syssleep',
  2547                              <1> 	;	      or 'sysrele' system call just after the timer
  2548                              <1> 	;	      function. Otherwise, timer events may block other
  2549                              <1> 	;	      processes which are not using timer events.)  	 		 			 		 	
  2550                              <1> 	;	     	      		 			
  2551                              <1> 	; Timer Event Structure: (max. 16 timer events, 16*16 bytes)
  2552                              <1> 	;       Owner:	        resb 1 ; 0 = free
  2553                              <1> 	;		  	       ;>0 = process number (u.uno)
  2554                              <1> 	;	Calback:	resb 1 ; 1 = callback, 0 = response byte
  2555                              <1> 	;	Interrupt:      resb 1 ; 0 = Timer interrupt (or none)
  2556                              <1> 	;		   	       ; 1 = Real Time Clock interrupt 
  2557                              <1> 	;	Response:       resb 1 ; 0 to 255, signal return value
  2558                              <1> 	;	Count Limit:	resd 1 ; count of ticks (total/set)
  2559                              <1> 	;	Current Count: 	resd 1 ; count of ticks (current)
  2560                              <1> 	;	Response Addr:  resd 1 ; response byte (pointer) address
  2561                              <1> 	;
  2562                              <1> 
  2563                              <1> 	; 19/12/2016 (timer callback)
  2564 0000D56A C605[1C8A0100]00    <1> 	mov	byte [tcallback], 0 
  2565 0000D571 C605[1D8A0100]00    <1> 	mov	byte [trtc], 0
  2566 0000D578 C705[90900100]0000- <1> 	mov	dword [u.tcb], 0 ; this is not necessary...
  2566 0000D580 0000                <1>
  2567                              <1> 
  2568 0000D582 80FF80              <1> 	cmp	bh, 80h
  2569 0000D585 7224                <1> 	jb	short systimer_cb2
  2570 0000D587 7704                <1> 	ja	short systimer_cb0
  2571                              <1> 
  2572 0000D589 31D2                <1> 	xor	edx, edx ; 0, reset callback address
  2573 0000D58B EB0B                <1> 	jmp	short systimer_cb1
  2574                              <1> 
  2575                              <1> systimer_cb0:
  2576 0000D58D 80FF84              <1> 	cmp	bh, 84h	
  2577 0000D590 7764                <1> 	ja	short systimer_5 ;  undefined, error
  2578                              <1> 
  2579                              <1> 	;mov	byte [tcallback], 1 ; 19/12/2016
  2580 0000D592 FE05[1C8A0100]      <1> 	inc	byte [tcallback]
  2581                              <1> 
  2582                              <1> systimer_cb1:
  2583 0000D598 0FB635[71900100]    <1> 	movzx	esi, byte [u.uno] ; process number
  2584                              <1> 	;shl	si, 2	
  2585                              <1> 	; 23/07/2022
  2586 0000D59F C1E602              <1> 	shl	esi, 2
  2587 0000D5A2 8996[C08F0100]      <1> 	mov	[esi+p.tcb-4], edx ; set process timer callback address
  2588                              <1> 				   ; (overwrite prev value if it is set!)
  2589 0000D5A8 80E77F              <1> 	and	bh, 7Fh
  2590                              <1> 
  2591                              <1> systimer_cb2:
  2592 0000D5AB 80FF02              <1> 	cmp	bh, 2
  2593 0000D5AE 7446                <1>         je      short systimer_5  ; only 18.2 ticks per second is usable
  2594                              <1> 				  ; 10 milliseconds (100 Hertz) timer 
  2595                              <1> 				  ; will be set later (18/05/2016)
  2596 0000D5B0 774C                <1>         ja      short systimer_6 
  2597                              <1> 
  2598 0000D5B2 20FF                <1> 	and	bh, bh
  2599                              <1> 	;jz	systimer_9        ; stop timer event(s)
  2600                              <1> 	; 23/07/2022
  2601 0000D5B4 7505                <1> 	jnz	short systimer_19
  2602 0000D5B6 E9BA000000          <1> 	jmp	systimer_9
  2603                              <1> 
  2604                              <1> 	; bh = 1 (timer interrupt, 18.2 Hz, IBM PC/AT ROMBIOS default)
  2605                              <1> 
  2606                              <1> systimer_19:
  2607 0000D5BB B00A                <1> 	mov	al, 10 ; (*)
  2608                              <1> 
  2609                              <1> systimer_0:
  2610 0000D5BD B710                <1> 	mov	bh, 16
  2611                              <1> 	;
  2612 0000D5BF 383D[17850100]      <1> 	cmp	[timer_events], bh ; 16 ; 07/06/2016
  2613 0000D5C5 7319                <1> 	jnb 	short systimer_3  ; max. 16 timer events
  2614                              <1> 	;
  2615 0000D5C7 50                  <1> 	push	eax ; (*)
  2616                              <1> 
  2617 0000D5C8 BF[30910100]        <1> 	mov	edi, timer_set  ; beginning address of timer events
  2618                              <1> 				; setting space
  2619 0000D5CD 30C0                <1> 	xor	al, al ; 0
  2620                              <1> systimer_1:
  2621 0000D5CF FEC0                <1> 	inc	al
  2622 0000D5D1 803F00              <1> 	cmp	byte [edi], 0 	; is it free space ?
  2623 0000D5D4 7639                <1> 	jna	short systimer_7 ; yes
  2624 0000D5D6 FECF                <1> 	dec	bh
  2625 0000D5D8 7405                <1> 	jz	short systimer_2
  2626 0000D5DA 83C710              <1> 	add	edi, 16
  2627 0000D5DD EBF0                <1> 	jmp	short  systimer_1 ; next event space
  2628                              <1> 
  2629                              <1> systimer_2:
  2630 0000D5DF 58                  <1> 	pop	eax ; (*) discard
  2631                              <1> systimer_3:
  2632 0000D5E0 C605[20900100]00    <1> 	mov	byte [u.r0], 0
  2633                              <1> systimer_4:
  2634 0000D5E7 C705[88900100]1B00- <1>         mov     dword [u.error], ERR_MISC
  2634 0000D5EF 0000                <1>
  2635                              <1>                                 ; one of miscellaneous/other errors
  2636 0000D5F1 E941F8FFFF          <1> 	jmp	error ; cf -> 1
  2637                              <1> 
  2638                              <1> systimer_5:
  2639 0000D5F6 883D[20900100]      <1> 	mov	[u.r0], bh ; Time count unit (=2 or >3)
  2640 0000D5FC EBE9                <1> 	jmp	short systimer_4 ; 07/06/2016
  2641                              <1> 
  2642                              <1> systimer_6:
  2643 0000D5FE 80FF04              <1> 	cmp	bh, 4
  2644 0000D601 77F3                <1>         ja      short systimer_5  ; undefined time count unit
  2645                              <1> 	;jb	short systimer_16	
  2646                              <1> 
  2647                              <1> 	;mov	al, 1	; default (use current timer unit)
  2648                              <1> 			; countdown value is in ECX ! 
  2649                              <1> 			; max. value of ecx = 4294967296/10
  2650                              <1>         ;jmp    short systimer_0
  2651                              <1> 	;jmp	short systimer_19	
  2652 0000D603 74B6                <1> 	je	short systimer_19
  2653                              <1> 
  2654                              <1> systimer_16:
  2655                              <1> 	; bh = 3
  2656                              <1> 	; timer event via real time clock interrupt
  2657                              <1> 	; interrupt/update frequency: 1 Hz (1 tick per second)
  2658                              <1> 	
  2659 0000D605 B0B6                <1> 	mov	al, 182 ; (*) ; 18.2 * 10
  2660 0000D607 FE05[1D8A0100]      <1> 	inc	byte [trtc] ; timer event via real time clock
  2661 0000D60D EBAE                <1>         jmp     short systimer_0
  2662                              <1> 
  2663                              <1> systimer_7:
  2664 0000D60F A2[20900100]        <1> 	mov	[u.r0], al ; timer event number
  2665                              <1> 	;
  2666                              <1> 	; edi = address of empty timer event area
  2667 0000D614 A0[71900100]        <1> 	mov	al, [u.uno]
  2668 0000D619 FA                  <1> 	cli 	; disable interrupts 
  2669 0000D61A AA                  <1> 	stosb	; process number
  2670 0000D61B A0[1C8A0100]        <1> 	mov	al, [tcallback] ; timer callback flag
  2671 0000D620 AA                  <1> 	stosb 	; 1= callback method, 0= signal response byte method
  2672 0000D621 A0[1D8A0100]        <1> 	mov	al, [trtc] ; timer interrupt type
  2673 0000D626 AA                  <1> 	stosb	; 1= real time clock, 0= programmable interval timer
  2674 0000D627 88D8                <1> 	mov	al, bl ; Signal return (Response) value
  2675 0000D629 AA                  <1> 	stosb   ; response byte
  2676 0000D62A 58                  <1> 	pop	eax ; (*) ; 10 or 182
  2677 0000D62B 89D3                <1> 	mov	ebx, edx ; virtual address for response/signal byte
  2678 0000D62D F7E1                <1> 	mul	ecx
  2679                              <1> 	; (eax = 10 * count of 18.2 Hz timer ticks)
  2680                              <1> 	; (count down step = 10)
  2681 0000D62F AB                  <1> 	stosd  ; count limit (reset value)
  2682 0000D630 AB                  <1> 	stosd  ; current count value
  2683                              <1> 
  2684                              <1> 	; 19/12/2016
  2685 0000D631 803D[1C8A0100]00    <1> 	cmp	byte [tcallback], 0 ; timer callback method ?
  2686 0000D638 7604                <1> 	jna	short systimer_17 ; no	
  2687 0000D63A 89D8                <1> 	mov	eax, ebx ; virtual address for callback routine 
  2688 0000D63C EB0D                <1> 	jmp	short systimer_18
  2689                              <1> 
  2690                              <1> systimer_17: ; signal response byte method
  2691                              <1> 	; ebx = virtual address
  2692                              <1> 	; [u.pgdir] = page directory's physical address
  2693                              <1> 	; 20/02/2017
  2694 0000D63E FE05[1E8A0100]      <1> 	inc	 byte [no_page_swap] ; 1 
  2695                              <1> 			; Do not add this page to swap queue
  2696                              <1> 			; and remove it from swap queue if it is
  2697                              <1> 			; on the queue.
  2698 0000D644 E84D85FFFF          <1> 	call	get_physical_addr
  2699 0000D649 721A                <1> 	jc	short systimer_8 ; 07/06/2016
  2700                              <1> 	; eax = physical address of the virtual address in user's space
  2701                              <1> systimer_18:
  2702 0000D64B AB                  <1> 	stosd	; response addr (physical) or callback addr (virtual)
  2703 0000D64C FE05[17850100]      <1> 	inc	byte [timer_events] ; 07/06/201
  2704                              <1> 	; 02/01/2017
  2705 0000D652 0FB605[71900100]    <1> 	movzx	eax, byte [u.uno]
  2706 0000D659 FE80[B38F0100]      <1> 	inc	byte [eax+p.timer-1]	
  2707                              <1> 	;
  2708 0000D65F FB                  <1> 	sti 	; enable interrupts
  2709 0000D660 E9F2F7FFFF          <1> 	jmp	sysret
  2710                              <1> 
  2711                              <1> systimer_8:
  2712                              <1> 	; 10/06/2016
  2713                              <1> 	; 07/06/2016
  2714 0000D665 28C0                <1> 	sub	al, al ; 0
  2715 0000D667 8847F4              <1> 	mov	[edi-12], al ; clear process number (free timer event)
  2716                              <1> 	;mov	dword [edi], eax ; 0
  2717 0000D66A FB                  <1> 	sti
  2718 0000D66B A2[20900100]        <1> 	mov	[u.r0], al ; 0
  2719 0000D670 E9C2F7FFFF          <1> 	jmp	error
  2720                              <1> 
  2721                              <1> systimer_9:
  2722                              <1> 	; 10/06/2016
  2723                              <1> 	; 07/06/2016
  2724 0000D675 28C0                <1> 	sub	al, al
  2725 0000D677 A2[20900100]        <1> 	mov	byte [u.r0], al ; 0
  2726 0000D67C 3805[17850100]      <1> 	cmp     byte [timer_events], al ;  0
  2727 0000D682 7631                <1> 	jna	short systimer_12
  2728                              <1> 
  2729                              <1> 	; Note: ecx and edx are undefined here
  2730                              <1> 	;	(for stop timer function)
  2731                              <1> 
  2732 0000D684 BE[30910100]        <1> 	mov	esi, timer_set  ; beginning address of timer events
  2733                              <1> 				; setting space	 
  2734 0000D689 A0[71900100]        <1> 	mov	al, [u.uno]
  2735                              <1> 	
  2736 0000D68E B710                <1> 	mov	bh, 16
  2737                              <1> 
  2738 0000D690 08DB                <1> 	or	bl, bl
  2739 0000D692 7544                <1> 	jnz	short systimer_15
  2740                              <1> 
  2741                              <1> 	; clear timer event areas belong to current process
  2742                              <1> 	; (for stopping all timer events belong to current process) 
  2743 0000D694 FA                  <1> 	cli 	; disable interrupts
  2744                              <1> systimer_10:
  2745                              <1> 	; 10/06/2016
  2746                              <1> 	; 07/06/2016 	
  2747 0000D695 8A26                <1> 	mov	ah, [esi]
  2748 0000D697 08E4                <1> 	or	ah, ah ; 0 ?
  2749 0000D699 7411                <1> 	jz	short systimer_11
  2750 0000D69B 38C4                <1> 	cmp	ah, al ; is the process number (owner) same ?
  2751 0000D69D 750D                <1>         jne     short systimer_11 ; no
  2752                              <1> 
  2753                              <1> 	;mov	byte [esi], 0
  2754 0000D69F 66C7060000          <1> 	mov	word [esi], 0 ; clear
  2755                              <1> 	;mov	dword [esi+12], 0 ; clear
  2756                              <1> 
  2757 0000D6A4 FE0D[17850100]      <1> 	dec	byte [timer_events]
  2758 0000D6AA 7409                <1> 	jz	short systimer_12
  2759                              <1> 
  2760                              <1> systimer_11:
  2761 0000D6AC FECF                <1> 	dec	bh
  2762 0000D6AE 7405                <1> 	jz	short systimer_12
  2763 0000D6B0 83C610              <1> 	add	esi, 16
  2764 0000D6B3 EBE0                <1> 	jmp	short systimer_10
  2765                              <1> 
  2766                              <1> systimer_12:
  2767 0000D6B5 0FB635[71900100]    <1> 	movzx	esi, byte [u.uno]
  2768 0000D6BC 08DB                <1> 	or	bl, bl ; all timer events or one timer event ?
  2769 0000D6BE 740C                <1> 	jz	short systimer_13
  2770 0000D6C0 8A9E[B38F0100]      <1> 	mov	bl, [esi+p.timer-1]
  2771 0000D6C6 20DB                <1> 	and	bl, bl	; previous number of timer events for the process
  2772 0000D6C8 7408                <1> 	jz	short systimer_14
  2773 0000D6CA FECB                <1> 	dec	bl  ; previous number of timer events for the process - 1
  2774                              <1> systimer_13:
  2775 0000D6CC 889E[B38F0100]      <1> 	mov	[esi+p.timer-1], bl ; 0 ; no timer events for process
  2776                              <1> systimer_14:
  2777 0000D6D2 FB                  <1> 	sti	; enable interrupts
  2778 0000D6D3 E97FF7FFFF          <1> 	jmp	sysret
  2779                              <1> 
  2780                              <1> systimer_15:
  2781 0000D6D8 38FB                <1> 	cmp	bl, bh ; 16
  2782                              <1>         ;ja	systimer_4      ; max. 16 timer events !
  2783                              <1> 	; 23/07/2022
  2784 0000D6DA 7605                <1> 	jna	short systimer_21
  2785                              <1> systimer_20:
  2786 0000D6DC E906FFFFFF          <1> 	jmp	systimer_4
  2787                              <1> systimer_21:	; 23/07/2022
  2788 0000D6E1 88DA                <1> 	mov	dl, bl
  2789 0000D6E3 FECA                <1> 	dec	dl  ; 16 -> 15 ... 1 -> 0 
  2790 0000D6E5 C0E204              <1> 	shl	dl, 4 ; * 16
  2791 0000D6E8 0FB6FA              <1> 	movzx	edi, dl
  2792 0000D6EB 01F7                <1> 	add	edi, esi ; timer_set 
  2793                              <1> 	
  2794 0000D6ED 3A07                <1> 	cmp	al, [edi] ; process number
  2795                              <1>         ;jne	systimer_4
  2796                              <1> 	; 23/07/2022
  2797 0000D6EF 75EB                <1> 	jne	short systimer_20 ; jmp systimer_4
  2798                              <1> 	
  2799                              <1> 	; same process ID
  2800 0000D6F1 FA                  <1> 	cli	; disable interrupts
  2801                              <1>  	; 10/06/2016 ; 02/01/2017
  2802                              <1> 	;mov	byte [edi], 0 
  2803 0000D6F2 66C7070000          <1> 	mov	word [edi], 0 ; clear
  2804                              <1> 	;mov	dword [edi+12], 0 ; clear
  2805 0000D6F7 FE0D[17850100]      <1> 	dec	byte [timer_events]
  2806 0000D6FD EBB6                <1> 	jmp	short systimer_12
  2807                              <1> 
  2808                              <1> sysvideo: ; VIDEO DATA TRANSFER FUNCTIONS
  2809                              <1> 	; 11/08/2022
  2810                              <1> 	; 08/08/2022
  2811                              <1> 	; 23/07/2022 (TRDOS 386 v2.0.5)
  2812                              <1> 	; 06/03/2021
  2813                              <1> 	; 02/03/2021
  2814                              <1> 	; 28/02/2021
  2815                              <1> 	; 27/02/2021
  2816                              <1> 	; 26/02/2021
  2817                              <1> 	; 25/02/2021
  2818                              <1> 	; 21/02/2021, 22/02/2021, 23/02/2021
  2819                              <1> 	; 15/02/2021, 16/02/2021, 18/02/2021
  2820                              <1> 	; 10/02/2021, 11/02/2021, 12/02/2021
  2821                              <1> 	; 07/02/2021, 08/02/2021
  2822                              <1> 	; 01/02/2021, 02/02/2021, 05/02/2021
  2823                              <1> 	; 29/01/2021, 30/01/2021, 31/01/2021
  2824                              <1> 	; 23/01/2021, 24/01/2021, 28/01/2021
  2825                              <1> 	; 18/01/2021, 19/01/2021, 22/01/2021
  2826                              <1> 	; 04/01/2021, 10/01/2021, 11/01/2021
  2827                              <1> 	; 01/01/2021, 02/01/2021, 03/01/2021
  2828                              <1> 	; 28/12/2020, 29/12/2020, 30/12/2020
  2829                              <1> 	; 25/12/2020, 26/12/2020
  2830                              <1> 	; 21/12/2020, 23/12/2020
  2831                              <1> 	; 12/12/2020, 14/12/2020
  2832                              <1> 	; 10/12/2020, 11/12/2020
  2833                              <1> 	; 03/12/2020, 04/12/2020
  2834                              <1> 	; 22/11/2020, 23/11/2020
  2835                              <1> 	; 21/11/2020 (TRDOS 386 v2.0.3)
  2836                              <1> 	; 12/05/2017
  2837                              <1> 	; 11/07/2016
  2838                              <1> 	; 13/06/2016
  2839                              <1> 	; 16/05/2016 - TRDOS 386 (TRDOS v2.0)
  2840                              <1> 	;
  2841                              <1> 	; VIDEO DATA TRANSFER FUNCTIONS:
  2842                              <1> 	;
  2843                              <1> 	; Inputs:
  2844                              <1> 	;		; 07/02/2021
  2845                              <1> 	;	BH = 0 = VIDEO BIOS Mode 3, tty/text mode data transfers
  2846                              <1> 	;	     BL = 
  2847                              <1> 	;		Bits 0&1, Transfer direction
  2848                              <1> 	;	     	 	0 - System to system
  2849                              <1> 	;			1 - User to system
  2850                              <1> 	;			2 - System to user
  2851                              <1> 	;			3 - Exhange (Swap) - 28/01/2021
  2852                              <1> 	;		Bits 2, Transfer Type
  2853                              <1> 	;			0 - Display page (complete) transfer
  2854                              <1> 	;	     		1 - Display page window (col,row) transfer
  2855                              <1> 	;		; 28/01/2021
  2856                              <1> 	;		Bits 3..7 - Reserved, undefined (must be 0)
  2857                              <1> 	;	        ; 28/01/2021	
  2858                              <1> 	;	     /// BL = 0 -> System to system (display page) transfer
  2859                              <1> 	;		 CL = Source page (0FFh = current video page)
  2860                              <1> 	;		 DL = Destination page (0FFh = current video page)
  2861                              <1> 	;		 (Note: Nothing to do if src & dest are same page)
  2862                              <1> 	;	     /// BL = 1&2 -> user to system & system to user transfer
  2863                              <1> 	;		 ECX = User's buffer address
  2864                              <1> 	;		 DL = Video page (0FFh = current video page)
  2865                              <1> 	;	     /// BL = 3 -> exchange (swap) display page ; 28/01/2021
  2866                              <1> 	;		 ECX = User's buffer address
  2867                              <1> 	;		 DL = Video page (0FFh = current video page)
  2868                              <1> 	;		 EDI = Swap address in user's memory (must be > 0)
  2869                              <1> 	;	     /// BL = 5&6&7 -> user to system, system to user transfer 
  2870                              <1> 	;		(system window is in current/active display page)
  2871                              <1> 	;		 ESI = User's buffer address
  2872                              <1> 	;		 ECX Low 16 bits = Top left column (X1 position)
  2873                              <1> 	;		 ECX High 16 bits = Top row (Y1 position)
  2874                              <1> 	;		 EDX Low 16 bits = Bottom right column (X2 position)
  2875                              <1> 	;		 EDX High 16 bits = Bottom row (Y2 position)
  2876                              <1>         ;                If BL = 5 or BL bit 0 & bit 1 are 1 ; 28/01/2021
  2877                              <1> 	;		 EDI = Swap address (in user's memory space)
  2878                              <1> 	;		 (If swap address > 0, previous content of the window
  2879                              <1> 	;		 will be saved into swap area in user's memory space)
  2880                              <1> 	;	     /// BL = 4 -> system to system transfer
  2881                              <1> 	;		 ESI = System's source buffer (video page) address
  2882                              <1> 	;		 ECX Low 16 bits = Top left column (X1 position)
  2883                              <1> 	;		 ECX High 16 bits = Top row (Y1 position)
  2884                              <1> 	;		 EDX Low 16 bits = Bottom right column (X2 position)
  2885                              <1> 	;		 EDX High 16 bits = Bottom row (Y2 position)
  2886                              <1> 	;		 EDI = System's destination buffer (video page) addr
  2887                              <1> 	;
  2888                              <1> 	;		; 06/02/2021
  2889                              <1> 	;		; 05/02/2021
  2890                              <1> 	;		; 01/02/2021, 02/02/2021
  2891                              <1> 	;		; 30/01/2021, 31/02/2021
  2892                              <1> 	;		; 29/01/2021 (major modification)
  2893                              <1> 	;		; 23/11/2020 (major modification)
  2894                              <1> 	;		; 22/11/2020 (bugfixes and extensions)
  2895                              <1> 	;	BH = 1 = VGA Graphics (0A0000h) data transfers
  2896                              <1> 	;		BL bit 7
  2897                              <1> 	;		   resolution (screen width) option
  2898                              <1> 	;		   0 = 320 pixels
  2899                              <1> 	;		   1 = 640 pixels
  2900                              <1> 	;		.. followings are same with SVGA transfer function
  2901                              <1> 	;		BL bit 6
  2902                              <1> 	;		   direction option
  2903                              <1> 	;		   0 = user to system (video memory)
  2904                              <1> 	;		   1 = system to user
  2905                              <1> 	;		BL bit 5
  2906                              <1> 	;		   masked/direct (non-masked) operations
  2907                              <1> 	;		   1 = masked, 0 = non-masked (direct)
  2908                              <1> 	;		BL bit 4
  2909                              <1> 	;		   page/window option
  2910                              <1> 	;		   1 = window, 0 = display page (screen)
  2911                              <1> 	;		BL bit 0 to 3 (pixel operation types)
  2912                              <1> 	;		   0 = Copy pixels (colors) ((mask color))
  2913                              <1> 	;		   1 = Change (New, Fill) color
  2914                              <1> 	;		   2 = Add color
  2915                              <1> 	;		   3 = Sub color
  2916                              <1> 	;		   4 = OR color
  2917                              <1> 	;		   5 = AND color
  2918                              <1> 	;		   6 = XOR color
  2919                              <1> 	;		   7 = NOT color
  2920                              <1> 	;		   8 = NEG color
  2921                              <1> 	;		   9 = INC color
  2922                              <1> 	;		  10 = DEC color
  2923                              <1> 	;		  11 = Mix (Average) colors
  2924                              <1> 	;		  12 = Replace pixel colors
  2925                              <1> 	;		  13 = Copy pixel block(s)
  2926                              <1> 	;		  14 = Write line(s)
  2927                              <1> 	;		  15 = Write character (font)
  2928                              <1> 	;
  2929                              <1> 	;	   Input Registers for pixel operations:
  2930                              <1> 	;		 Same with LFB data transfer function below
  2931                              <1> 	;
  2932                              <1> 	;		; 25/02/2021		
  2933                              <1> 	;		; 05/02/2021, 06/02/2021
  2934                              <1> 	;		; 01/02/2021, 02/02/2021
  2935                              <1> 	;		; 30/01/2021, 31/02/2021
  2936                              <1> 	; 		; 29/01/2021 (major modification)
  2937                              <1> 	;		; 23/11/2020 (major modification)
  2938                              <1> 	;		; 22/11/2020 (bugfixes and extensions)
  2939                              <1> 	;	BH = 2 = Super VGA, LINEAR FRAME BUFFER data transfers
  2940                              <1> 	;		BL bit 7
  2941                              <1> 	;		   unused (invalid), must be 0
  2942                              <1> 	;		BL bit 6
  2943                              <1> 	;		   direction option
  2944                              <1> 	;		   0 = user to system (video memory)
  2945                              <1> 	;		   1 = system to user
  2946                              <1> 	;		BL bit 5
  2947                              <1> 	;		   masked/direct (non-masked) operations
  2948                              <1> 	;		   1 = masked, 0 = non-masked (direct)
  2949                              <1> 	;		BL bit 4
  2950                              <1> 	;		   page/window option
  2951                              <1> 	;		   1 = window, 0 = display page (screen)
  2952                              <1> 	;		BL bit 0 to 3 (pixel operation types)
  2953                              <1> 	;		   0 = Copy pixels (colors) ((mask color))
  2954                              <1> 	;		   1 = Change (New, Fill) color
  2955                              <1> 	;		   2 = Add color
  2956                              <1> 	;		   3 = Sub color
  2957                              <1> 	;		   4 = OR color
  2958                              <1> 	;		   5 = AND color
  2959                              <1> 	;		   6 = XOR color
  2960                              <1> 	;		   7 = NOT color
  2961                              <1> 	;		   8 = NEG color
  2962                              <1> 	;		   9 = INC color
  2963                              <1> 	;		  10 = DEC color
  2964                              <1> 	;		  11 = Mix (Average) colors
  2965                              <1> 	;		  12 = Replace pixel colors
  2966                              <1> 	;		  13 = Copy pixel block(s)
  2967                              <1> 	;		  14 = Write line(s)
  2968                              <1> 	;		  15 = Write character (font)
  2969                              <1> 	;
  2970                              <1> 	;	   Note: If HW of EBX > 0, it is VESA VBE mode number
  2971                              <1> 	;		 otherwise, function will be applied
  2972                              <1> 	;		 to current (VESA VBE) video mode.
  2973                              <1> 	;		
  2974                              <1> 	;	   Input Registers for pixel operations:
  2975                              <1> 	;		-- user to system & system to system --
  2976                              <1> 	;		-- (BL = 0 to 0Fh) -- non-masked, screen --
  2977                              <1> 	;		-- (BL = 10h to 1Fh) -- non-masked, window --
  2978                              <1> 	;		-- (BL = 20h to 2Fh) -- masked, screen --
  2979                              <1> 	;		-- (BL = 30h to 3Fh) -- masked, window --
  2980                              <1> 	;		(*) window, (**) masked (***) sys to sys
  2981                              <1> 	;		for BL bit 0 to 3
  2982                              <1> 	;		00h: COPY PIXELS
  2983                              <1> 	;		  If BL bit 4 = 0 ; 21/02/2021
  2984                              <1> 	;		     full screen copy	
  2985                              <1>    	;		     ECX & EDX will not be used
  2986                              <1> 	;		    (user buffer must fit to display page)	  	
  2987                              <1> 	;		  If BL bit 4 = 1 ; 21/02/2021		
  2988                              <1> 	;		    ECX = start position (row, column) (*)
  2989                              <1> 	;			  (HW = row, CX = column)
  2990                              <1> 	;		    EDX = size (rows, colums) (*)
  2991                              <1> 	;			  (HW = rows, DX = columns)
  2992                              <1> 	;		          (0 -> invalid)
  2993                              <1> 	;		          (1 -> horizontal or vertical line)
  2994                              <1> 	;		    ESI = user's buffer address
  2995                              <1> 	;		    EDI = mask color (**) ; 25/02/2021
  2996                              <1> 	;			  (this color will be excluded)
  2997                              <1> 	;		01h: CHANGE PIXEL COLORS
  2998                              <1> 	;		02h: ADD PIXEL COLORS
  2999                              <1> 	;		03h: SUB PIXEL COLORS
  3000                              <1> 	;		04h: OR PIXEL COLORS
  3001                              <1> 	;		05h: AND PIXEL COLORS
  3002                              <1> 	;		06h: XOR PIXEL COLORS
  3003                              <1> 	;		0Bh: MIX PIXEL COLORS
  3004                              <1> 	;		     CL = color (8 bit, 256 colors)
  3005                              <1> 	;		    ECX = color (16 bit and true colors)
  3006                              <1> 	;		    EDX = start position (row, column) (*)
  3007                              <1> 	;			 (HW = row, DX = column)
  3008                              <1> 	;		    ESI = size (rows, colums) (*)
  3009                              <1> 	;			  (HW = rows, SI = columns)
  3010                              <1> 	;		    EDI = mask color (**) ; 25/02/2021
  3011                              <1> 	;			  (this color will be excluded)
  3012                              <1> 	;		07h: NOT PIXEL COLORS
  3013                              <1> 	;		08h: NEG PIXEL COLORS
  3014                              <1> 	;		09h: INC PIXEL COLORS
  3015                              <1> 	;		0Ah: DEC PIXEL COLORS
  3016                              <1> 	;		    ECX = start position (row, column) (*)
  3017                              <1> 	;			  (HW = row, CX = column)
  3018                              <1> 	;		    EDX = size (rows, colums) (*)
  3019                              <1> 	;			  (HW = rows, DX = columns)
  3020                              <1> 	;		          (0 -> invalid)
  3021                              <1> 	;		          (1 -> horizontal or vertical line)
  3022                              <1> 	;		    EDI = mask color (**) ; 25/02/2021
  3023                              <1> 	;			  (this color will be excluded)
  3024                              <1> 	;		0Ch: REPLACE PIXEL COLORS
  3025                              <1> 	;		     CL = current color (8 bit, 256 colors)
  3026                              <1> 	;		    ECX = current color (16 bit and true colors)
  3027                              <1> 	;		     DL = new color (8 bit, 256 colors)
  3028                              <1> 	;		    EDX = new color (16 bit and true colors)
  3029                              <1> 	;		    ESI = start position (row, column) (*)
  3030                              <1> 	;			  (HW = row, SI = column)
  3031                              <1> 	;		    EDI = size (rows, colums) (*)
  3032                              <1> 	;			  (HW = rows, DI = columns)
  3033                              <1> 	;		0Dh: COPY PIXEL BLOCK(S) -full screen-
  3034                              <1> 	;		   -If BL bit 5 is 0-
  3035                              <1> 	;		    ECX = start position (row, column) (*)
  3036                              <1> 	;			  (HW = row, CX = column)
  3037                              <1> 	;		    EDX = size (rows, colums) (*)
  3038                              <1> 	;			  (HW = rows, DX = columns)
  3039                              <1> 	;		          (0 -> invalid)
  3040                              <1> 	;		          (1 -> horizontal or vertical line)
  3041                              <1> 	;		    ESI = destination (row, column) (***)
  3042                              <1> 	;		   -If BL bit 5 is 1-
  3043                              <1> 	;	               CL = color (8 bit, 256 colors)
  3044                              <1> 	;		      ECX = color (16 bit and true colors)
  3045                              <1> 	;	   	      EDX = count of blocks (not bytes)
  3046                              <1> 	;			    (limit: 2048 blocks)
  3047                              <1> 	;		      ESI = user's buffer address 
  3048                              <1> 	;			  contains 64 bits block data
  3049                              <1> 	;			  BLOCK ADDRESS - (row, col), dword
  3050                              <1> 	;			  (first 32 bits)
  3051                              <1> 	;			  BLOCK SIZE - (rows, cols), dword
  3052                              <1> 	;			  (second 32 bits)
  3053                              <1> 	;		; 10/02/2021
  3054                              <1> 	;		0Eh: WRITE LINE(s) -full screen- 
  3055                              <1> 	;		   -If BL bit 5 is 0-	
  3056                              <1> 	; 		    CL = color (8 bit, 256 colors)
  3057                              <1> 	; 		   ECX = color (16 bit and true colors)
  3058                              <1> 	; 		    DX = low 12 bits - size (length)
  3059                              <1> 	;			 high 4 bits - direction or type
  3060                              <1> 	;			     0 - Horizontal line
  3061                              <1> 	;			     1 - Vertical line
  3062                              <1> 	;			   > 1 - undefined, invalid
  3063                              <1> 	; 		   ESI = start position (row, column)
  3064                              <1> 	;			 (HW = row, SI = column)
  3065                              <1> 	;		   -If BL bit 5 is 1-
  3066                              <1> 	;		     CL = color (8 bit, 256 colors)
  3067                              <1> 	;		    ECX = color (16 bit and true colors)
  3068                              <1> 	;		     DX = number of lines (in user buffer)
  3069                              <1> 	;			   (limit: 2048 lines)	
  3070                              <1> 	;		    ESI = user's buffer
  3071                              <1> 	;		          contains 64 bit data for lines
  3072                              <1> 	;			   START POINT: 32 bit (row, col)
  3073                              <1> 	;			   LENGTH: 32 bit
  3074                              <1> 	;			   high 16 bits - 0
  3075                              <1> 	;			   bit 0-11 - length
  3076                              <1> 	;			   bit 12-15 - type (length)
  3077                              <1> 	;		0Fh: WRITE CHARACTER (FONT)
  3078                              <1> 	;		     CL = char's color (8 bit, 256 colors)
  3079                              <1> 	;		    ECX = char's color (16 bit and true colors)
  3080                              <1> 	;		     DL = Character's ASCII code
  3081                              <1> 	;		     DH bit 0 -> font height
  3082                              <1> 	;			  0 -> 8x16 character font
  3083                              <1> 	;			  1 -> 8x8 character font
  3084                              <1> 	;		     DH bit 1 & 2 -> scale	
  3085                              <1> 	;			  0 = 1/1 (8 pixels per char row)
  3086                              <1> 	;			  1 = 2/1 (16 pixels per char row)
  3087                              <1> 	;			  2 = 3/1 (24 pixels per char row)
  3088                              <1> 	;			  3 = 4/1 (32 pixels per char row) 
  3089                              <1> 	;		     DH bit 6 -> [ufont] option (1 = use [ufont])
  3090                              <1> 	;		     If DH bit 7 = 1
  3091                              <1> 	;			 USER FONT (from user buffer)
  3092                              <1> 	;			    DL = 0 -> 8x8 (width: 1 byte per row)
  3093                              <1> 	;			    DL = 1 -> 8x16
  3094                              <1> 	;			    DL = 2 -> 16x16 (width: 2 bytes)
  3095                              <1> 	;			    DL = 3 -> 16x32
  3096                              <1> 	;			    DL = 4 -> 24x24 (width: 3 bytes)
  3097                              <1> 	;			    DL = 5 -> 24x48
  3098                              <1> 	;			    DL = 6 -> 32x32 (width: 4 bytes)
  3099                              <1> 	;			    DL = 7 -> 32x64
  3100                              <1> 	;			    DL > 7 -> invalid (unused)
  3101                              <1> 	;			 EDI = user's font buffer address
  3102                              <1> 	;			    (NOTE: byte order is as row0,row1,row2..)
  3103                              <1> 	; 		    ESI = start position (row, column) (*)
  3104                              <1> 	;			     (HW = row, SI = column)
  3105                              <1> 	;
  3106                              <1> 	;		-- system to user --
  3107                              <1> 	;		   BL (bit 0 to 7) 
  3108                              <1> 	;	 	40h: COPY PIXELS (full screen, display page)
  3109                              <1> 	;		    EDI = user's buffer address
  3110                              <1> 	;		41h: COPY PIXELS (window)
  3111                              <1> 	;		    ECX = start position (row, column) (*)
  3112                              <1> 	;			  (HW = row, CX = column)
  3113                              <1> 	;		    EDX = size (rows, colums) (*)
  3114                              <1> 	;			  (HW = rows, DX = columns)
  3115                              <1> 	;		          (<=1 -> horizontal or vertical line)
  3116                              <1> 	;		    EDI = user's buffer address
  3117                              <1> 	;
  3118                              <1> 	;		Example: (29/01/2021)
  3119                              <1> 	;		    ecx = 00400064h (start at row 64, column 100) 
  3120                              <1> 	;		    edx = 00320048h (size: 50 rows, 72 columns)
  3121                              <1> 	;				    (end at row 114, column 172)
  3122                              <1> 	;		    If video memory starts at 0A0000h
  3123                              <1> 	;		    and if resolution is 320x200 (256 colors) ..
  3124                              <1> 	;		    window start offset: (64*320)+100 = 20580
  3125                              <1> 	;		    window size: 16072 bytes (pixels) 
  3126                              <1> 	;		    window end offset: 20580+16072 = 36652
  3127                              <1> 	;		    window start address: 0A0000h+564h = 0A5064h
  3128                              <1> 	; Outputs:
  3129                              <1> 	;	EAX = transfer/byte count
  3130                              <1> 	;
  3131                              <1> 	;	NOTE: If the source or destination address passes out of
  3132                              <1> 	;	video pages (display memory limits), data will not be transferred
  3133                              <1> 	;	and EAX will return as 0.
  3134                              <1> 	;
  3135                              <1> 	; 08/02/2021
  3136                              <1> 	; 07/02/2021	
  3137                              <1> 	; 04/01/2021
  3138                              <1> 	; PIXEL READ/WRITE (in current/active video mode)
  3139                              <1> 	;
  3140                              <1> 	;	BH = 3 = Read/Write pixel(s) -for all graphics modes-
  3141                              <1> 	;	     BL = 
  3142                              <1> 	;		0 = Read pixel
  3143                              <1> 	;		1 = Write pixel
  3144                              <1> 	;	     	2 = swap pixel colors
  3145                              <1> 	;		3 = mix pixel colors
  3146                              <1> 	;	     29/01/2021	
  3147                              <1> 	;		4 = read pixels from user defined positions 
  3148                              <1> 	;		5 = write single color pixels to user defined positions
  3149                              <1> 	;		6 = write multi color pixels to user defined positions 
  3150                              <1> 	; 
  3151                              <1> 	;	      > 6 = invalid/unimplemented	
  3152                              <1> 	;	
  3153                              <1> 	;	     .. for BL = 0 to 5		
  3154                              <1> 	;	     CL = color for writing pixel(s) or
  3155                              <1>  	;	     ECX = color for writing pixel(s) in true color modes
  3156                              <1> 	;
  3157                              <1> 	;	     EDX = Offset from start of video memory (0A0000h)
  3158                              <1> 	;		   or start of linear frame buffer
  3159                              <1> 	;
  3160                              <1> 	;	     07/02/2021	
  3161                              <1> 	;	     .. for BL = 4
  3162                              <1> 	;	     EDI = user's destination buffer address for pixel colors 	
  3163                              <1> 	;	     29/01/2021
  3164                              <1> 	;	     .. for BL = 4 & 5		
  3165                              <1> 	;	     ESI = user's source buffer address for BL = 4 & 5
  3166                              <1> 	;	     (buffer contains dword offset positions for pixels)
  3167                              <1> 	;	     EDX = number of pixels
  3168                              <1> 	;	     .. for BL = 6	 		
  3169                              <1> 	;	     ESI = user's buffer address for BL = 6
  3170                              <1> 	;	     (buffer contains dword offset position and dword color
  3171                              <1> 	;	      value for each pixel)
  3172                              <1> 	;	     EDX = number of pixels  
  3173                              <1> 	;	
  3174                              <1> 	; Note:
  3175                              <1> 	;	Pixel read/write will be performed in current video mode. 
  3176                              <1> 	;	If [CRT_MODE] < 0FFh, 0A0000h will be used 
  3177                              <1> 	;	   as video memory and limit will be 65536
  3178                              <1> 	;	   (new/mix pixel color will be in CL)  	
  3179                              <1> 	;	if [CRT_MODE] = 0FFh (VESA VBE video mode)
  3180                              <1> 	;	   LFB base address will be used as video memory
  3181                              <1> 	;	   and limit will be video page size
  3182                              <1> 	;	   (new/mix pixel color will be in CL)  
  3183                              <1> 	;
  3184                              <1> 	; Outputs:
  3185                              <1> 	;	EAX = pixel color (according to BL and ECX input)
  3186                              <1> 	;	EAX = 0 (pixel color is 0 or there is an error)
  3187                              <1> 	;	     (BL will return as 0FFh if there is an error)
  3188                              <1> 	;	; 29/01/2021 	
  3189                              <1> 	;	EAX = number of pixels (for BL input = 4&5&6)
  3190                              <1> 	;
  3191                              <1> 	; DIRECT (STANDARD VGA/CGA) DISPLAY MEMORY ACCESS FUNCTIONS:
  3192                              <1> 	;
  3193                              <1> 	;	BH = 4 = CGA direct video memory (0B8000h, 32K) access
  3194                              <1> 	;		Page directory & page tables of the user's
  3195                              <1> 	;		program will be updated to direct access to
  3196                              <1> 	;		0B8000h (32K) video (CGA, color) memory; if
  3197                              <1> 	;		there is not a permission conflict or lock!  
  3198                              <1> 	;	        (User's program/process will have permission to
  3199                              <1> 	;		access locked display memory if the owner is
  3200                              <1> 	;		it's parent.)
  3201                              <1>         ;
  3202                              <1> 	;	    Screen width = 320	
  3203                              <1> 	;
  3204                              <1> 	;	BH = 5 = VGA direct video memory (0A0000h, 64K) access
  3205                              <1> 	;		Page directory & page tables of the user's
  3206                              <1> 	;		program will be updated to direct access to
  3207                              <1> 	;		0A0000h (64K) video (VGA) memory; if there is not
  3208                              <1> 	;		a permission conflict or lock!  
  3209                              <1> 	;	        (User's program/process will have permission to
  3210                              <1> 	;		access locked display memory if the owner is
  3211                              <1> 	;		it's parent.)
  3212                              <1> 	;	
  3213                              <1> 	;	    ; 23/11/2020		
  3214                              <1> 	;	    Screen width options = 320, 640, 800 
  3215                              <1> 	;			
  3216                              <1> 	; Outputs:
  3217                              <1> 	;	EAX = Display memory address for direct access
  3218                              <1> 	;	      0A0000h for VGA, 0B8000h for CGA	
  3219                              <1> 	;	(Display memory size: 32K for CGA, 64K for VGA)
  3220                              <1> 	; 	EAX = 0 if display page access permission has been denied.
  3221                              <1> 	;	      (Locked!) 	
  3222                              <1> 	;	      	 	
  3223                              <1> 	; LINEAR FRAME BUFFER ACCESS FUNCTIONS:
  3224                              <1> 	;
  3225                              <1> 	;	BH = 6 = Linear Frame Buffer direct video memory access
  3226                              <1> 	;
  3227                              <1> 	;		Page directory & page tables of the user's
  3228                              <1> 	;		program will be updated to direct access to
  3229                              <1> 	;		the configured LFB (Linear Frame Buffer) address,
  3230                              <1> 	;		if there is not a permission conflict or lock!  
  3231                              <1> 	;	        (User's program/process will have permission to
  3232                              <1> 	;		access locked display memory if the owner is
  3233                              <1> 	;		it's parent.)
  3234                              <1> 	;
  3235                              <1> 	;	   ; 10/12/2020
  3236                              <1> 	;	   BL = 0FFh -> Direct LFB access for current video mode
  3237                              <1> 	;	   BL = XXh < 0FFh -> Direct LFB access
  3238                              <1> 	; 			      for VESA video mode 1XXh	
  3239                              <1> 	;		
  3240                              <1> 	;		Return: EAX = Linear Frame Buffer address
  3241                              <1> 	;			(EAX = 0 -> error)
  3242                              <1> 	;		     If EAX > 0
  3243                              <1> 	;			EDX = Frame Buffer Size in bytes
  3244                              <1> 	;		         BH = Requested Video Mode - 100h
  3245                              <1> 	;		              (VESA VBE video modes)	
  3246                              <1> 	;		         BL = bits per pixel
  3247                              <1> 	;			      8 = 256 colors, 8
  3248                              <1> 	;		             16 = 65536 colors, 5-6(G)-5 
  3249                              <1> 	;		             24 = RGB, 16M colors, 8-8-8
  3250                              <1> 	;		             32 = RGB + alpha bytes, 8-8-8-8
  3251                              <1> 	;		     If BH = 0FFh
  3252                              <1> 	;		        BL = VGA/CGA video mode (also EAX = 0)
  3253                              <1> 	;
  3254                              <1> 	;		** Function will return with EAX = 0 if the mode
  3255                              <1> 	;		is not a valid VESA VBE video mode as 1??h ** 	
  3256                              <1> 	;
  3257                              <1> 	;		ECX = Pixel resolution
  3258                              <1> 	;		      CX = Width (320, 640, 800, 1024, 1366, 1920)
  3259                              <1> 	;		      High 16 bits of ECX = Height 
  3260                              <1> 	;
  3261                              <1> 	; 	23/11/2020
  3262                              <1> 	; ***	GET VIDEO MODE & LINEAR FRAME BUFFER INFO   
  3263                              <1> 	;	(This function -7- also is used for VGA and CGA modes)
  3264                              <1> 	; 	
  3265                              <1> 	;	BH = 7 = Get Linear Frame Buffer info
  3266                              <1> 	;
  3267                              <1> 	;	   ; 22/01/2021	
  3268                              <1> 	;	   ; 10/12/2020
  3269                              <1> 	;	   BL = any -not used- (22/01/2021)
  3270                              <1> 	;	
  3271                              <1> 	;		Return:
  3272                              <1> 	;		EAX = Frame Buffer Address (0 = is not in use)
  3273                              <1> 	;		EDX = Frame Buffer Size in bytes
  3274                              <1> 	;		 BH = Current Video Mode - 100h  ; 22/01/2021
  3275                              <1> 	;		     (VESA VBE video modes)	
  3276                              <1> 	;		 BL = bits per pixel
  3277                              <1> 	;			8 = 256 colors, 8
  3278                              <1> 	;		       16 = 65536 colors, 5-6(G)-5 
  3279                              <1> 	;		       24 = RGB, 16M colors, 8-8-8
  3280                              <1> 	;		       32 = RGB + alpha bytes, 8-8-8-8
  3281                              <1> 	;		If BH = 0FFh
  3282                              <1> 	;		   BL = VGA/CGA video mode (also EAX = 0)
  3283                              <1> 	;
  3284                              <1> 	;		Note:	
  3285                              <1> 	;		Alpha byte will be used as virtual color index.
  3286                              <1> 	;		(32 bit pixel colors.. byte 0,1,2 rgb and 3 alpha)
  3287                              <1> 	;
  3288                              <1> 	;		** Function will return with EAX = 0 if the mode
  3289                              <1> 	;		is not a valid VESA VBE video mode as 1??h ** 	
  3290                              <1> 	;
  3291                              <1> 	;		ECX = Pixel resolution
  3292                              <1> 	;		      CX = Width (320, 640, 800, 1024, 1366, 1920)
  3293                              <1> 	;		      High 16 bits of ECX = Height  
  3294                              <1> 	;
  3295                              <1> 	;	NOTE: Each process will have it's own frame buffer
  3296                              <1> 	;	      address and resolution parameters in 'u' area.
  3297                              <1> 	;	      Then, if the current frame buffer & resolution
  3298                              <1> 	;	      is different, frame buffer r/w functions
  3299                              <1> 	;	      will use scale factor to convert process's
  3300                              <1>         ;             pixel coordinates to actual screen coordinates.
  3301                              <1> 	;	      resolution -> dimensional scale
  3302                              <1> 	;	      color size -> color scale
  3303                              <1> 	;	     * RGB (TRUE) colors to 256 colors conversion:
  3304                              <1>         ;             TRUE Colors -> 8,8,8 (R,G,B; byte 0 is R)
  3305                              <1> 	;	      256 colors -> 2,2,2,2 (R,G,B,L; bit 0&1 is R)
  3306                              <1> 	; 		  bit 6&7 -> luminosity base level (0,1,2,3)
  3307                              <1> 	;		  bit 4&5 -> blue level (0,1,2,3)
  3308                              <1> 	;		  bit 2%3 -> green level (0,1,2,3)
  3309                              <1> 	;		  bit 0&1 -> red level (0,1,2,3)
  3310                              <1> 	;	      Example: total red level : luminosity + red level
  3311                              <1> 	;	      Luminosity base level: 0 -> 16
  3312                              <1> 	;		 		     1 -> 32
  3313                              <1> 	;				     2 -> 64
  3314                              <1> 	;				     3 -> 128
  3315                              <1> 	;	      Color level:	
  3316                              <1> 	;				    0 -> 0
  3317                              <1> 	;				    1 -> luminosity level
  3318                              <1> 	;				    2 -> luminosity level + 64
  3319                              <1> 	;				    3 -> 255
  3320                              <1> 	;	     Luminosity base level = min (R,G,B)
  3321                              <1> 	;			if it is <16, it will be set to 16
  3322                              <1> 	;	     Color levels: Color values are fixed to (nearest) 
  3323                              <1> 	;		   one of all possible set level (step) values
  3324                              <1> 	;		   (according to luminosity base level); then
  3325                              <1> 	;		   color levels are set to R-L, G-L, B-L.
  3326                              <1> 	;	 For example: If luminosity base level is 32
  3327                              <1> 	;		  all possible set values are 0, 32, 96, 255.
  3328                              <1> 	;
  3329                              <1> 	;	    * RGB (TRUE) colors to 16 colors conversion:
  3330                              <1> 	;	    16 colors: R,B,G,L bits (4 bits)
  3331                              <1> 	;	    	   If any one of R,G,B >= 128 L = 1	
  3332                              <1>  	;		   If max. value of (R,G,B) >= 32, it is 1
  3333                              <1> 	;		      else all color bits (R&G&B&L) are 0
  3334                              <1> 	;		   If the second value >= max. value / 2
  3335                              <1> 	;		      it is 1
  3336                              <1> 	;		   If the third value >= max. value / 2
  3337                              <1> 	;		      it is 1
  3338                              <1> 	;	    Example: R = 132, G = 64, B = 78
  3339                              <1> 	;		     L = 1, R = 1
  3340                              <1> 	;		     G < 66 --> G = 0
  3341                              <1> 	;		     B >= 66 --> B = 1
  3342                              <1> 	;
  3343                              <1> 	; 10/12/2020
  3344                              <1> 	; SET VIDEO MODE (& RETURN LFB INFO for VESA VBE VIDEO MODES)
  3345                              <1> 	;	
  3346                              <1> 	;	BH = 8 = Set Video Mode
  3347                              <1> 	;		
  3348                              <1> 	;		BL = Requested Video Mode (method)
  3349                              <1> 	;		If BL = 0FFh
  3350                              <1> 	;		   CX = VESA VBE Video Mode
  3351                              <1> 	;		   ; 11/12/2020
  3352                              <1> 	;		   If EDX > 0 -> LFB INFO (user) buffer addr
  3353                              <1> 	;		If BL < 0FFh, it is VGA/CGA video mode and
  3354                              <1> 	;			CX & EDX will not be used
  3355                              <1> 	;
  3356                              <1> 	;	    NOTE: The last VESA VBE video mode is 11Bh but
  3357                              <1> 	;	    TRDOS 386 will permit to set video mode upto 11Fh.
  3358                              <1> 	;	    Above 11Fh, from 140h to 1FEh, it will be accepted
  3359                              <1> 	;	    as Bochs/Plex86 emulator video mode and it will be
  3360                              <1> 	;	    used only if [vbe3] = 2 and detected
  3361                              <1> 	;	    video bios is BOCHS/PLEX86/QEMU/VIRTUALBOX vbios.
  3362                              <1> 	;	 	  	 		 	
  3363                              <1> 	; Outputs:
  3364                              <1> 	;	EAX = Requested (Proper) video mode number + 1
  3365                              <1> 	;	      ("dec eax" by user will give requested video mode),
  3366                              <1> 	;
  3367                              <1> 	;	If BL input is 0FFh
  3368                              <1> 	;	   EDX = LFBINFO table/structure (in user's buffer addr)
  3369                              <1> 	;	   EDX = 0 -> Invalid LFBINFO (do not use it)
  3370                              <1> 	;
  3371                              <1> 	;	EAX = 0 -> Error (but EDX will not be changed)
  3372                              <1> 	;
  3373                              <1> 	; 03/12/2020
  3374                              <1> 	; VESA VBE3 VIDEO BIOS (32 bit) PROTECTED MODE INTERFACE SETTINGS
  3375                              <1> 	;	
  3376                              <1> 	;	BH = 9 = set/get VBE3 Protected Mode Interface parameters
  3377                              <1> 	;		
  3378                              <1> 	;		BL = 0 - Disable protected mode interface
  3379                              <1> 	;			([pmi32] = 0)
  3380                              <1> 	;		 	Return: AL = 1	
  3381                              <1> 	;		BL = 1 - Enable protected mode Interface
  3382                              <1> 	;			([pmi32] = 1)
  3383                              <1> 	;			Return: AL = 2
  3384                              <1> 	;		BL = 2 - Get protected mode interface status
  3385                              <1> 	;			Return: AL = [pmi32] + 1 (AL = 1 or 2)
  3386                              <1> 	;
  3387                              <1> 	;		If [vbe3] <> 3 --> AL = 0
  3388                              <1> 	;
  3389                              <1> 	;		; 17/01/2021
  3390                              <1> 	;		BL = 3 - Disable/Cancel restore permission to user
  3391                              <1> 	;			Return: AL = 1 (if disabled) or 0
  3392                              <1> 	;		BL = 4 - Enable/Give restore permission to user
  3393                              <1> 	;			Return: AL = 2 (if enabled) or 0
  3394                              <1> 	;		BL = 5 - Get video state save/restore status
  3395                              <1> 	;			 (permission status)
  3396                              <1> 	;		        Return: AL = Status (enabled = 1)
  3397                              <1> 	;				; 22/01/2021
  3398                              <1> 	;				AH = state options ([srvso])
  3399                              <1> 	;		BL = 6 - Return VESA VBE number/status
  3400                              <1> 	;		        Return: AX = status
  3401                              <1> 	;			      if AH =  2, AL > 0 : Emulator
  3402                              <1> 	;				 AH =  3, VESA VBE3 video bios
  3403                              <1> 	;		; 28/02/2021 	 
  3404                              <1> 	;		BL = 7 - Set true color mode as 32bpp (default)
  3405                              <1> 	;			Return: AX = 32 (if VBE3) 
  3406                              <1> 	;		NOTE: Initial/default value is 32bpp for vbe3.
  3407                              <1> 	;			Return: AX = 0 -> error 	 
  3408                              <1> 	;		BL = 8 - Set true color mode as 24bpp (default)
  3409                              <1> 	;			Return: AX = 24
  3410                              <1> 	;			;Return: AX = 0 -> error 
  3411                              <1> 	;		BL = 9 - Return default/current true color mode
  3412                              <1> 	;			Return: AX = 32 (32 bpp)
  3413                              <1> 	;			Return: AX = 24 (24 bpp)
  3414                              <1> 	;			Return: AX = 0 -> error (not VESA bios)
  3415                              <1> 	;		 
  3416                              <1> 	;		BL > 9 : not implemented (28/02/2021)
  3417                              <1> 	;
  3418                              <1> 	;	; 19/01/2021 ([u.uid] check)	
  3419                              <1> 	;	Note: Enabling/Disabling are done by root ([u.uid] = 0)
  3420                              <1> 	;	      while [multi_tasking] = 0.
  3421                              <1> 	;
  3422                              <1>     	; 23/12/2020
  3423                              <1> 	; VIDEO MEMORY MAPPING:
  3424                              <1> 	;	BH = 10 = Map video memory to user's buffer
  3425                              <1> 	;
  3426                              <1> 	;	   BL = 0 : CGA memory (0B8000h) map (32K)
  3427                              <1> 	;	   BL = 1 : VGA memory (0A0000h) map (64K)
  3428                              <1> 	;	   BL = 2 : SVGA memory (LFB) map to user's buffer
  3429                              <1> 	;
  3430                              <1> 	;	ECX = User's buffer addr (low 12 bits will be cleared)
  3431                              <1> 	;	EDX = Buffer size in bytes (if BL = 2)
  3432                              <1> 	;		(will be trimmed if LFB size < EDX)
  3433                              <1> 	; Return:				
  3434                              <1>         ;	EAX = physical address of video memory (buffer)
  3435                              <1> 	;	EBX = mapped (actual) size of video memory (bytes)
  3436                              <1> 	;	ECX = virtual start address of user's video buffer 
  3437                              <1> 	;	EDX is same with EDX input
  3438                              <1> 	;
  3439                              <1> 	;	(Note: Memory page boundaries will be applied 
  3440                              <1> 	;	 to buffer size and buff start addr by rounding down.
  3441                              <1> 	;	 Rounded size & address values must not be zero.) 
  3442                              <1> 	;	-Normally, it is expected to request mapping by using
  3443                              <1> 	;	 correct buffer size of current or desired video mode-
  3444                              <1> 	;
  3445                              <1> 	;	EAX = 0 -> error ! memory can not mapped to user
  3446                              <1> 	;
  3447                              <1> 	; 04/01/2021
  3448                              <1> 	; SET/READ COLOR PALETTE (set/read DAC color registers)
  3449                              <1> 	;	((256 colors (8bpp) VGA/CGA video hardware feature))
  3450                              <1> 	;
  3451                              <1> 	;	BH = 11 = Set/Read DAC color registers
  3452                              <1> 	;
  3453                              <1> 	;	   (BL<4 Original method for std VGA video hardware)
  3454                              <1> 	;	   BL = 0 : Read all DAC color registers (256 colors)
  3455                              <1> 	;	       (6 bit colors, in RGB order)
  3456                              <1> 	;	   BL = 1 : Set all DAC color registers (256 colors)
  3457                              <1> 	;	       (6 bit colors, in RGB order)
  3458                              <1> 	;	   BL = 2 : Read single DAC color register
  3459                              <1> 	;	       (6 bit color, in RGB order)
  3460                              <1> 	;		((EAX will return with color value))
  3461                              <1> 	;		CL = DAC color register (index)
  3462                              <1> 	;	   BL = 3 : Set/Write single DAC color register
  3463                              <1> 	;	       (6 bit color, in RGB order, bit 6&7 are 0)
  3464                              <1> 	;		ECX byte 0 - DAC color register
  3465                              <1> 	;		ECX byte 1 - Red (6 bit)
  3466                              <1> 	;		ECX byte 2 - Green (6 bit)
  3467                              <1> 	;		ECX byte 3 - Blue (6 bit)
  3468                              <1> 	;	   (BL>3 Alternative method for BMP files etc.)	
  3469                              <1> 	;	   BL = 4 : Read all DAC color registers (256 colors)
  3470                              <1> 	;	       (8 bit colors, in BGR order, bit 0&1 is 0)
  3471                              <1> 	;	   BL = 5 : Set all DAC color registers (256 colors)
  3472                              <1> 	;	       (8 bit colors, in BGR order, bit 0&1 is 0)
  3473                              <1> 	;	   BL = 6 : Read single DAC color register
  3474                              <1> 	;	       (8 bit color, in BGR order, bit 0&1 is 0)
  3475                              <1> 	;		((EAX will return with color value))
  3476                              <1> 	;		CL = DAC color register (index)
  3477                              <1> 	;	   BL = 7 : Set/Write single DAC color register
  3478                              <1> 	;	       (8 bit color, bit 0&1 are 0)
  3479                              <1> 	;		ECX byte 0 - DAC color register
  3480                              <1> 	;		ECX byte 1 - Blue (8 bit)
  3481                              <1> 	;		ECX byte 2 - Green (8 bit)
  3482                              <1> 	;		ECX byte 3 - Red (8 bit)
  3483                              <1> 	;
  3484                              <1> 	;	  BL > 7 : invalid (not implemented)
  3485                              <1> 	;
  3486                              <1> 	;   if BL bit 2 is 1, 6 bit colors converted to 8 bit colors
  3487                              <1> 	;	(low two bits of color bytes will be 0)
  3488                              <1> 	;     ((color byte 00111111b will be converted to 11111100b))
  3489                              <1> 	;	and RGB byte order will be 
  3490                              <1> 	;		byte 0 - Blue (low 2 bits are 0)
  3491                              <1> 	;		byte 1 - Green (low 2 bits are 0)
  3492                              <1> 	;		byte 2 - Red (low 2 bits are 0)
  3493                              <1> 	;		byte 3 - pad (or zero byte)
  3494                              <1> 	;	and 256 colors buffer size must be 256*4 = 1024 bytes
  3495                              <1> 	;   if BL bit 2 is 0, 6 bit colors will be used directly
  3496                              <1> 	;	  (high two bits of 8 bit color bytes will be 0)
  3497                              <1> 	;     ((dac color 111111b will be converted to 00111111b))
  3498                              <1> 	;		byte 0 - Red (high 2 bits are 0)
  3499                              <1> 	;		byte 1 - Green (high 2 bits are 0)
  3500                              <1> 	;		byte 2 - Blue (high 2 bits are 0)
  3501                              <1> 	;	and 256 colors buffer size must be 256*3 = 768 bytes
  3502                              <1> 	;
  3503                              <1> 	;	ECX = User's buffer addr (256*3 = 768 bytes) or
  3504                              <1> 	;	      Color 
  3505                              <1> 	;
  3506                              <1> 	; Return:				
  3507                              <1>         ;	EAX = buffer size (for BL input = 0,1,4,5)
  3508                              <1> 	;	      or color value (for BL input = 2,3,6,7)
  3509                              <1> 	;
  3510                              <1> 	; 10/01/2021
  3511                              <1> 	; SET/READ FONT DATA
  3512                              <1> 	;
  3513                              <1> 	;	BH = 12 = Set/Read Character Font Data
  3514                              <1> 	;
  3515                              <1> 	;	   BL = 0 : Disable system font overwrite
  3516                              <1> 	;	   BL = 1 : Enable system font overwrite
  3517                              <1> 	;	   BL = 2 : Read system font 8x8
  3518                              <1> 	;	   BL = 3 : Read system font 8x14
  3519                              <1> 	;	   BL = 4 : Read system font 8x16
  3520                              <1> 	;	   BL = 5 : Read user defined font 8x8
  3521                              <1> 	;	   BL = 6 : Read user defined font 8x16
  3522                              <1> 	;	   BL = 7 : Write system font 8x8
  3523                              <1> 	;	   BL = 8 : Write system font 8x14
  3524                              <1> 	;	   BL = 9 : Write system font 8x16
  3525                              <1> 	;	   BL = 10 : Write user defined font 8x8
  3526                              <1> 	;	   BL = 11 : Write user defined font 8x16
  3527                              <1> 	;
  3528                              <1> 	;	  BL > 11 : invalid (not implemented)
  3529                              <1> 	;
  3530                              <1> 	;	For BL = 1 to 11
  3531                              <1> 	;	   ECX = number of characters (<= 256)
  3532                              <1> 	;	   EDX = first character (ascii code in DL)
  3533                              <1> 	;	   ESI = user's buffer address
  3534                              <1> 	;
  3535                              <1> 	; Return:				
  3536                              <1>         ;	EAX = number of characters (ecx input)
  3537                              <1> 	;	EAX = 0 -> error
  3538                              <1> 	;	(EAX = 256 for BL = 0 and 1 if successful)
  3539                              <1> 	;	
  3540                              <1> 	; Note: system font overwrite permission will be
  3541                              <1> 	;       given if [multi_tasking] = 0 
  3542                              <1> 	;	and [u.uid] = 0 (BL = 1) ; 19/01/2021
  3543                              <1> 	;       and if [ufont] bit 7 is 1 (BL = 7,8,9)
  3544                              <1> 	;
  3545                              <1> 	; 18/01/2021
  3546                              <1> 	; SAVE/RESTORE STANDARD VGA VIDEO STATE
  3547                              <1> 	;
  3548                              <1> 	;	BH = 13 = Save/Restore std VGA video state
  3549                              <1> 	;
  3550                              <1> 	;	   BL = 0 : Save VGA state (without DAC regs)
  3551                              <1> 	;		Return: EAX = VideoStateID (>0)
  3552                              <1> 	;			EAX = 0 (failed!)
  3553                              <1> 	;	       (size: 110 bytes for TRDOS 386 v2.0.3)
  3554                              <1> 	;	   BL = 1 : Restore VGA state (without DAC regs)
  3555                              <1> 	;		ECX = VideoStateID (to be verified)
  3556                              <1> 	;	        Return: EAX = Restore size (>0)
  3557                              <1> 	;	   BL = 2 : Save VGA state (complete)
  3558                              <1> 	;		Return: EAX = VideoStateID (>0)
  3559                              <1> 	;			EAX = 0 (failed!)
  3560                              <1> 	;	       (size: 882 bytes for TRDOS 386 v2.0.3) 
  3561                              <1> 	;	   BL = 3 : Restore VGA state (complete)
  3562                              <1> 	;		ECX = VideoStateID (to be verified)
  3563                              <1> 	;	        Return: EAX = Restore size (>0)
  3564                              <1> 	;
  3565                              <1> 	;	* Above options are for saving
  3566                              <1> 	;	*       video state to system memory
  3567                              <1> 	;	*	(location: VBE3VIDEOSTATE, 2048 bytes)
  3568                              <1> 	;	
  3569                              <1> 	;	   BL = 4 : Save VGA state (without DAC regs)
  3570                              <1> 	;		ECX = buffer address  
  3571                              <1> 	;		Return: EAX = transfer count
  3572                              <1> 	;	       (size: 110 bytes for TRDOS 386 v2.0.3)
  3573                              <1> 	;		ECX = buffer address  
  3574                              <1> 	;	   BL = 5 : Restore VGA state (without DAC regs)
  3575                              <1> 	;		ECX = buffer address  
  3576                              <1> 	;	        Return: EAX = transfer count
  3577                              <1> 	;	   BL = 6 : Save VGA state (complete)
  3578                              <1> 	;		ECX = buffer address  
  3579                              <1> 	;		Return: EAX = transfer count
  3580                              <1> 	;	       (size: 882 bytes for TRDOS 386 v2.0.3)
  3581                              <1> 	;	   BL = 7 : Restore VGA state (complete)
  3582                              <1> 	;		ECX = buffer address  
  3583                              <1> 	;	        Return: EAX = transfer count
  3584                              <1> 	;
  3585                              <1> 	;	* Above options are for saving
  3586                              <1> 	;	*       video state to user's buffer
  3587                              <1> 	;	*	(buffer size: 110 bytes or 882 bytes)
  3588                              <1> 	;
  3589                              <1> 	;	  BL > 7 : invalid (not implemented)
  3590                              <1> 	;
  3591                              <1> 	; 18/01/2021
  3592                              <1> 	; SAVE/RESTORE SUPER VGA (VESA VBE 2/3) VIDEO STATE
  3593                              <1> 	;
  3594                              <1> 	;	BH = 14 = Save/Restore SVGA video state
  3595                              <1> 	;
  3596                              <1> 	;	   BL = options
  3597                              <1> 	;		bit 0 - Save (0) or Restore (1)	
  3598                              <1> 	;		bit 1 - controller hardware state
  3599                              <1> 	;		bit 2 - BIOS data state
  3600                              <1> 	;		bit 3 - DAC state
  3601                              <1> 	;		bit 4 - (extended) Register state
  3602                              <1> 	;		bit 5 - system (0) or user (1) memory
  3603                              <1> 	;		bit 6 - verify without transfer
  3604                              <1> 	;		bit 7 - not used (must be 0)
  3605                              <1> 	;			
  3606                              <1> 	;	     if bit 0 = 0 and bit 5 = 0
  3607                              <1> 	;		Return:	EAX = VideoStateID (>0)	
  3608                              <1> 	;	     if bit 0 = 1
  3609                              <1> 	;		ECX = VideoStateID (bit 5 = 0)
  3610                              <1> 	;		Return: EAX = restore (transfer) size
  3611                              <1> 	;	     if bit 5 = 1
  3612                              <1> 	;		ECX = Buffer address
  3613                              <1> 	;		Return: EAX = transfer count (size)
  3614                              <1> 	;
  3615                              <1> 	;	     ECX = Buffer address or VideoStateID
  3616                              <1> 	;
  3617                              <1> 	;	  BL > 127 : invalid (not implemented)
  3618                              <1> 	;
  3619                              <1> 	;  Note: Required buffer size may be > 2048 bytes
  3620                              <1> 	;	 (function fails when buff size > 2048 bytes)
  3621                              <1> 	;	 proper option must be used
  3622                              <1> 	;
  3623                              <1> 	; 18/01/2021
  3624                              <1> 	; READ VESA EDID (EXTENDED DISPLAY IDENTIFICATION DATA)
  3625                              <1> 	;
  3626                              <1> 	;	BH = 15 = Read VESA EDID for connected monitor  
  3627                              <1> 	;		  (copy EDID to user)	
  3628                              <1> 	;
  3629                              <1> 	;	   BL = any
  3630                              <1> 	;
  3631                              <1> 	;	Input:
  3632                              <1> 	;	    ECX = user's (EDID) buffer address 
  3633                              <1> 	;		 (buffer size: 128 bytes)
  3634                              <1> 	;	Output:
  3635                              <1> 	;	    EAX = 128 (EDID size)
  3636                              <1> 	;	    or EAX = 0 -> Error!
  3637                              <1> 	;	       (EDID not ready or buffer addr error)	
  3638                              <1> 	;
  3639                              <1>  	
  3640                              <1> 	; 16/05/2016
  3641 0000D6FF 31C0                <1> 	xor	eax, eax
  3642 0000D701 A3[20900100]        <1> 	mov	[u.r0], eax
  3643 0000D706 20FF                <1> 	and	bh, bh
  3644                              <1> 	;jnz	sysvideo_13 ; 11/07/2016
  3645                              <1> 	; 23/07/2022
  3646 0000D708 7405                <1> 	jz	short sysvideo_40
  3647 0000D70A E974020000          <1> 	jmp	sysvideo_13
  3648                              <1> 
  3649                              <1> sysvideo_40:	; 23/07/2022
  3650                              <1> 	;; 21/11/2020 (TRDOS 386 v2.0.3)
  3651                              <1> 	;; tty/text mode transfers are only for video mode 3
  3652                              <1> 
  3653                              <1> 	; 22/11/2020
  3654                              <1> 	;cmp	byte [CRT_MODE], 3 ; 80x25 text, 16 colors
  3655                              <1> 	;jne	sysret ; invalid (nothing to do), [u.r0] = 0	
  3656                              <1> 	
  3657                              <1> 	; 23/11/2020
  3658                              <1> 	; bit 7,6,5,4 of BL are reserved and it must be 0
  3659                              <1> 	;	 	 for current 'sysvideo' version
  3660                              <1> 	;test	bl, 0F0h
  3661                              <1> 	;;jnz	sysret ; invalid (undefined) ! 
  3662                              <1> 	;; 28/01/2021
  3663                              <1> 	;jnz	short sysvideo_1_2 ; invalid (undefined) !
  3664                              <1> 	; 28/01/2021
  3665 0000D70F 80FB07              <1> 	cmp	bl, 7
  3666 0000D712 776E                <1> 	ja	short sysvideo_1_2 ; invalid (undefined) !	
  3667                              <1> 
  3668                              <1> 	; Video mode 0, 80*25 text mode, CGA 16 colors  
  3669                              <1> 	; [CRT_MODE] = 3
  3670                              <1> 	;mov	bh, bl
  3671                              <1> 	;shr	bh, 2 ; 4..7 -> 1, 8..11 -> 2, 12..15 -> 3
  3672                              <1> 	;; 21/11/2020
  3673                              <1> 	;;and	bh, bh
  3674                              <1>         ;jnz	sysvideo_4  ; Display page window transfer etc.
  3675                              <1> 
  3676                              <1> 	; 28/01/2021
  3677 0000D714 F6C304              <1> 	test	bl, 4 ; bit 2
  3678                              <1> 	;jnz	sysvideo_4 ; Display page window transfer
  3679                              <1> 	; 23/07/2022
  3680 0000D717 7405                <1> 	jz	short sysvideo_41
  3681 0000D719 E9A1000000          <1> 	jmp	sysvideo_4
  3682                              <1> sysvideo_41:	; 23/07/2022
  3683                              <1> 	; Display page (complete) transfer
  3684 0000D71E 80FA07              <1> 	cmp	dl, 7
  3685                              <1> 	;jnz	sysret ; invalid (nothing to do), [u.r0] = 0
  3686 0000D721 760A                <1> 	jna	short sysvideo_0 ; 28/01/2021	
  3687 0000D723 FEC2                <1> 	inc	dl ; 0FFh -> 0 ("use current video page")
  3688 0000D725 755B                <1> 	jnz	short sysvideo_1_2  ; invalid
  3689                              <1> 	; dl = 0 -> use current current page
  3690 0000D727 8A15[B6780100]      <1> 	mov	dl, [ACTIVE_PAGE]
  3691                              <1> sysvideo_0:
  3692                              <1> 	; 28/01/2021 
  3693 0000D72D 80FB03              <1> 	cmp	bl, 3
  3694 0000D730 7206                <1> 	jb	short sysvideo_0_0
  3695 0000D732 09FF                <1> 	or	edi, edi
  3696 0000D734 744C                <1> 	jz	short sysvideo_1_2  ; invalid
  3697 0000D736 89FE                <1> 	mov	esi, edi ; save swap/exchange buffer addr
  3698                              <1> 	; ecx = user buffer for new video page content
  3699                              <1> 	; esi = user (swap) buffer for saving current video page  
  3700                              <1> sysvideo_0_0:
  3701 0000D738 BF00800B00          <1> 	mov	edi, 0B8000h
  3702                              <1> 	; dl = display page number, destination
  3703 0000D73D 66B80010            <1> 	mov	ax, 4096 ; 21/11/2020
  3704 0000D741 20D2                <1> 	and	dl, dl
  3705 0000D743 7408                <1> 	jz	short sysvideo_1
  3706                              <1> 	; 07/02/2021
  3707 0000D745 88D6                <1> 	mov	dh, dl
  3708                              <1> sysvideo_0_1:
  3709                              <1> 	; page length = 4096 bytes (but page content is 80*25*2 bytes)
  3710 0000D747 01C7                <1> 	add	edi, eax ; 21//11/2020 ([CRT_LEN] = 1000h for mode 3)
  3711 0000D749 FECE                <1> 	dec	dh
  3712 0000D74B 75FA                <1> 	jnz	short sysvideo_0_1
  3713                              <1> sysvideo_1:	
  3714 0000D74D 80E303              <1> 	and	bl, 3
  3715 0000D750 7535                <1> 	jnz	short sysvideo_2 ; user to system display page transfer
  3716                              <1> 	; system to system video page (content) transfer
  3717                              <1> 	; cl = display page number, source
  3718 0000D752 80F907              <1> 	cmp	cl, 7
  3719                              <1> 	;ja	sysret ; invalid (nothing to do), [u.r0] = 0
  3720 0000D755 760A                <1> 	jna	short sysvideo_1_0
  3721 0000D757 FEC1                <1> 	inc	cl ; 0FFh -> 0 ("use current video page")
  3722 0000D759 7527                <1> 	jnz	short sysvideo_1_2  ; invalid
  3723 0000D75B 8A0D[B6780100]      <1> 	mov	cl, [ACTIVE_PAGE]
  3724                              <1> sysvideo_1_0:
  3725                              <1> 	; 28/01/2021
  3726 0000D761 38D1                <1> 	cmp	cl, dl
  3727 0000D763 741D                <1> 	je	short sysvideo_1_2  ; same video page !
  3728                              <1> 
  3729                              <1> 	; system to system video/display page transfer (mode 0)
  3730                              <1> 	; 21/11/2020
  3731                              <1> 	;mov	esi, 0B8000h
  3732                              <1> 	;movzx	eax, cl
  3733                              <1> 	;mov	edx, 4096 ; [CRT_LEN] = 1000h for video mode 3
  3734                              <1> 	;mov	ecx, edx
  3735                              <1> 	;mul	edx
  3736                              <1> 	;add	esi, eax
  3737                              <1> 	; 28/01/2021
  3738                              <1> 	;movzx	esi, cl
  3739                              <1> 	;shl	si, 12 ; * 4096
  3740                              <1> 	;add	esi, 0B8000h 
  3741                              <1> 	
  3742                              <1> 	; 28/01/2021
  3743 0000D765 A3[20900100]        <1> 	mov	[u.r0], eax ; 4096
  3744 0000D76A BE00800B00          <1> 	mov	esi, 0B8000h
  3745 0000D76F 08C9                <1> 	or	cl, cl
  3746 0000D771 7409                <1> 	jz	short sysvideo_1_1
  3747                              <1> 	; 07/02/2021
  3748                              <1> 	;mov	al, cl ; display/video page
  3749                              <1> 	;xor	ah, ah
  3750                              <1> 	;shl	ax, 12 ; * 4096
  3751                              <1> 	; 23/07/2022
  3752 0000D773 30C0                <1>  	xor	al, al
  3753                              <1> 	;xor	eax, eax
  3754 0000D775 88CC                <1> 	mov	ah, cl ; CL * 256
  3755 0000D777 C1E004              <1> 	shl	eax, 4 ; * 16 = CL * 4096
  3756 0000D77A 01C6                <1> 	add	esi, eax
  3757                              <1> sysvideo_1_1:
  3758                              <1> 	; 21/11/2020
  3759                              <1> 	;;mov	ecx, 4096
  3760                              <1> 	;mov	ecx, eax ; 4096
  3761                              <1> 	;;mov	[u.r0], ecx ; 4096 bytes
  3762                              <1> 	; 28/01/2021	
  3763                              <1> 	;mov	[u.r0], cx
  3764 0000D77C 31C9                <1> 	xor	ecx, ecx
  3765 0000D77E B504                <1> 	mov	ch, 4 ; mov ecx, 1024
  3766                              <1> 	;shr	cx, 2 ; / 4
  3767 0000D780 F3A5                <1> 	rep	movsd
  3768                              <1> sysvideo_1_2:
  3769 0000D782 E9D0F6FFFF          <1> 	jmp	sysret
  3770                              <1> sysvideo_2:  
  3771 0000D787 80FB02              <1> 	cmp	bl, 2
  3772                              <1>         ;ja	sysret; invalid (user to user), [u.r0] = 0
  3773                              <1> 	; 28/01/2021
  3774 0000D78A 7226                <1> 	jb	short sysvideo_3 ; user to system
  3775 0000D78C 7404                <1> 	je	short sysvideo_2_0 ; system to user
  3776                              <1> 	; bl = 3
  3777 0000D78E 89CA                <1> 	mov	edx, ecx ; save user's buffer addr
  3778 0000D790 89F1                <1> 	mov	ecx, esi ; save swap address
  3779                              <1> sysvideo_2_0:
  3780                              <1> 	; bl = 2 (or bl = 3, stage 1)
  3781                              <1> 	; system to user video/display page transfer (mode 0)
  3782 0000D792 89FE                <1> 	mov	esi, edi
  3783 0000D794 89CF                <1> 	mov	edi, ecx ; user buffer ; 28/01/2021
  3784                              <1> 	; 21/11/2020
  3785 0000D796 89C1                <1> 	mov	ecx, eax ; 4096
  3786 0000D798 E8F4360000          <1> 	call	transfer_to_user_buffer ; fast transfer
  3787                              <1> 	;jc	sysret ; [u.r0] = 0
  3788 0000D79D 72E3                <1> 	jc	short sysvideo_1_2 ; 28/01/2021
  3789                              <1> 	; 28/01/2021
  3790 0000D79F 80FB03              <1> 	cmp	bl, 3
  3791 0000D7A2 7408                <1> 	je	short sysvideo_2_2
  3792                              <1> sysvideo_2_1:
  3793                              <1> 	; 21/11/2020
  3794 0000D7A4 890D[20900100]      <1> 	mov	[u.r0], ecx
  3795                              <1> 	;;mov	[u.r0], cx
  3796                              <1> 	;jmp	sysret
  3797 0000D7AA EBD6                <1> 	jmp	short sysvideo_1_2
  3798                              <1> 
  3799                              <1> sysvideo_2_2:
  3800                              <1> 	; bl = 3 (exchange/swap) complete display page
  3801                              <1> 	; esi = video page start address
  3802                              <1> 	; edx = user's buffer address
  3803                              <1> 	
  3804                              <1> 	;mov	ecx, 4096
  3805 0000D7AC 89F7                <1> 	mov	edi, esi ; video page start address
  3806 0000D7AE 89D6                <1> 	mov	esi, edx ; user's (new page) buffer address
  3807 0000D7B0 EB04                <1> 	jmp	short sysvideo_2_3
  3808                              <1> sysvideo_3: 
  3809                              <1> 	; bl = 1 (or bl = 3, stage 2)
  3810                              <1> 	; user to system video/display page transfer (mode 0)	
  3811 0000D7B2 89CE                <1> 	mov	esi, ecx ; user buffer
  3812                              <1> 	; edi = video page address
  3813                              <1> 	; 21/11/2020
  3814 0000D7B4 89C1                <1> 	mov	ecx, eax ; 4096
  3815                              <1> sysvideo_2_3:
  3816 0000D7B6 E820370000          <1> 	call	transfer_from_user_buffer ; fast transfer
  3817                              <1> 	;jc	sysret ; [u.r0] = 0
  3818 0000D7BB 72C5                <1> 	jc	short sysvideo_1_2 ; 28/01/2021
  3819 0000D7BD EBE5                <1> 	jmp	short sysvideo_2_1
  3820                              <1> 
  3821                              <1> 	; 21/11/2020
  3822                              <1> 	;mov	[u.r0], ecx
  3823                              <1> 	;;mov	[u.r0], cx
  3824                              <1> 	;;jmp	sysret
  3825                              <1> 	;jmp	short sysvideo_1_2 ; 28/01/2021
  3826                              <1> 
  3827                              <1> sysvideo_4:
  3828                              <1> 	; 23/07/2022
  3829                              <1> 	; 23/11/2020 (TRDOS 386 v2.0.3)
  3830                              <1> 
  3831                              <1> 	; Display page window transfer etc.
  3832 0000D7BF 80E303              <1> 	and	bl, 3
  3833                              <1>         ;jnz	sysvideo_9 ; user to system or system to user
  3834                              <1> 	; 23/07/2022
  3835 0000D7C2 7405                <1> 	jz	short sysvideo_4_0
  3836 0000D7C4 E9E3000000          <1> 	jmp	sysvideo_9
  3837                              <1> sysvideo_4_0:
  3838                              <1> 	; 21/11/2020
  3839                              <1> 	; system to system video/display page window transfer (mode 0)
  3840 0000D7C9 81FE00800B00        <1> 	cmp	esi, 0B8000h	; source buffer address (system)
  3841                              <1> 	;jb	sysret
  3842                              <1> 	; 23/07/2022
  3843 0000D7CF 7245                <1> 	jb	short sysvideo_4_3  ; jmp sysret
  3844 0000D7D1 81FE00000C00        <1> 	cmp	esi, 0B8000h+(4096*8)
  3845                              <1> 	; 23/07/2022
  3846                              <1> 	;jnb	sysret
  3847 0000D7D7 733D                <1> 	jnb	short sysvideo_4_3  ; jmp sysret
  3848 0000D7D9 81FF00800B00        <1> 	cmp	edi, 0B8000h	; destination buffer address (system)	
  3849                              <1> 	;jb	sysret
  3850                              <1> 	; 23/07/2022
  3851 0000D7DF 7235                <1> 	jb	short sysvideo_4_3  ; jmp sysret
  3852 0000D7E1 81FF00000C00        <1>         cmp     edi, 0B8000h+(4096*8)
  3853                              <1> 	; 23/07/2022
  3854                              <1> 	;jnb	sysret
  3855 0000D7E7 732D                <1> 	jnb	short sysvideo_4_3  ; jmp sysret
  3856                              <1> 	;
  3857 0000D7E9 51                  <1> 	push	ecx ; X1 and Y1 position - top left column, row
  3858 0000D7EA 0FB7C1              <1> 	movzx	eax, cx ; top left column
  3859                              <1> 	; 21/11/2020
  3860 0000D7ED C1E910              <1> 	shr	ecx, 16 ; top row
  3861 0000D7F0 740E                <1> 	jz	short sysvideo_4_1 ; bypass following code
  3862 0000D7F2 52                  <1> 	push	edx ; X2 and Y2 position - bottom right column, row
  3863 0000D7F3 50                  <1> 	push	eax
  3864 0000D7F4 66B8A000            <1> 	mov	ax, 80*2 ; 80 colums, 160 bytes per row
  3865 0000D7F8 F7E1                <1> 	mul	ecx
  3866                              <1> 		; eax = offset for start row number 
  3867 0000D7FA 01C6                <1> 	add	esi, eax
  3868 0000D7FC 01C7                <1> 	add	edi, eax
  3869 0000D7FE 58                  <1> 	pop	eax
  3870 0000D7FF 5A                  <1> 	pop	edx
  3871                              <1> sysvideo_4_1:
  3872                              <1> 	;shl	ax, 1 ; * 2 ; convert start column number to offset
  3873                              <1> 	; 23/07/2022
  3874 0000D800 D1E0                <1> 	shl	eax, 1
  3875 0000D802 7404                <1> 	jz	short sysvideo_4_2	
  3876 0000D804 01C6                <1> 	add	esi, eax
  3877 0000D806 01C7                <1> 	add	edi, eax
  3878                              <1> 		; esi = source page window start offset
  3879                              <1> 		; edi = destination page window start offset
  3880                              <1> sysvideo_4_2:
  3881 0000D808 59                  <1> 	pop	ecx
  3882                              <1> 	;mov	eax, 0B8000h+(80*25*2*8)
  3883                              <1> 	; 21/11/2020
  3884 0000D809 B800000C00          <1> 	mov	eax, 0B8000h+(4096*8)
  3885 0000D80E 39C6                <1> 	cmp	esi, eax
  3886                              <1> 	;jnb	sysret ; out of video page
  3887                              <1> 	; 23/07/2022
  3888 0000D810 7304                <1> 	jnb	short sysvideo_4_3  ; jmp sysret
  3889 0000D812 39C6                <1> 	cmp	esi, eax
  3890                              <1> 	;jnb	sysret  ;out of video page
  3891                              <1> 	; 23/07/2022
  3892 0000D814 7205                <1> 	jb	short sysvideo_4_4
  3893                              <1> sysvideo_4_3:
  3894 0000D816 E93CF6FFFF          <1> 	jmp	sysret
  3895                              <1> sysvideo_4_4:
  3896 0000D81B 56                  <1> 	push	esi ; ****
  3897 0000D81C 57                  <1> 	push	edi ; ***
  3898 0000D81D 52                  <1> 	push	edx ; **
  3899 0000D81E 51                  <1> 	push	ecx ; *
  3900 0000D81F C1E910              <1> 	shr	ecx, 16 ; top row
  3901 0000D822 C1EA10              <1> 	shr	edx, 16 ; bottom row
  3902                              <1> 	; 21/11/2020
  3903                              <1> 	;cmp	ecx, 24 ; max. 25 rows
  3904 0000D825 6683F918            <1> 	cmp	cx, 24
  3905 0000D829 7778                <1> 	ja	short sysvideo_6 ; invalid, [u.r0] = 0
  3906                              <1> 	;cmp	edx, 24 ; max. 25 rows
  3907 0000D82B 6683FA18            <1> 	cmp	dx, 24
  3908 0000D82F 7772                <1> 	ja	short sysvideo_6 ; invalid, [u.r0] = 0		
  3909 0000D831 28CA                <1> 	sub	dl, cl ; end >= start
  3910 0000D833 726E                <1> 	jc	short sysvideo_6 ; invalid, [u.r0] = 0
  3911                              <1> 	; 21/11/2020
  3912 0000D835 89D3                <1> 	mov	ebx, edx ; row count - 1
  3913 0000D837 7415                <1> 	jz	short sysvideo_4_5
  3914 0000D839 50                  <1> 	push	eax ; *****
  3915 0000D83A B8A0000000          <1> 	mov	eax, 80*2 ; bytes per row
  3916 0000D83F F7E3                <1> 	mul	ebx ; 21/11/2020
  3917                              <1> 		; eax = window end offset 
  3918                              <1> 		; (for the last row, before adding column bytes)
  3919 0000D841 01C6                <1> 	add	esi, eax
  3920 0000D843 01C7                <1> 	add	edi, eax
  3921 0000D845 58                  <1> 	pop	eax ; ***** ; mode 3 video memory end (0C000h)
  3922 0000D846 39C6                <1> 	cmp	esi, eax
  3923                              <1> 	;ja	short sysvideo_6 ; invalid, [u.r0] = 0
  3924 0000D848 7359                <1> 	jnb	short sysvideo_6 ; 21/11/2020
  3925 0000D84A 39C7                <1> 	cmp	edi, eax
  3926                              <1> 	;ja	short sysvideo_6 ; invalid, [u.r0] = 0
  3927 0000D84C 7355                <1> 	jnb	short sysvideo_6 ; 21/11/2020
  3928                              <1> sysvideo_4_5:
  3929 0000D84E 59                  <1> 	pop	ecx ; *
  3930 0000D84F 5A                  <1> 	pop	edx ; **
  3931 0000D850 81E1FFFF0000        <1> 	and	ecx, 0FFFFh
  3932 0000D856 81E2FFFF0000        <1> 	and	edx, 0FFFFh
  3933                              <1> 	; 21/11/2020
  3934                              <1> 	;cmp	ecx, 79 ; max. 80 columns
  3935 0000D85C 6683F94F            <1> 	cmp	cx, 79
  3936 0000D860 7743                <1> 	ja	short sysvideo_7 ; invalid, [u.r0] = 0
  3937                              <1> 	;cmp	edx, 79 ; max. 80 columns
  3938 0000D862 6683FA4F            <1> 	cmp	dx, 79 
  3939 0000D866 773D                <1> 	ja	short sysvideo_7 ; invalid, [u.r0] = 0
  3940 0000D868 28CA                <1> 	sub	dl, cl
  3941 0000D86A 7639                <1> 	jna	short sysvideo_7 ; invalid, [u.r0] = 0
  3942                              <1> 	; 21/11/2020
  3943 0000D86C 740E                <1> 	jz	short sysvideo_4_6 
  3944                              <1> 	; edx = column count (width) - 1
  3945 0000D86E D0E2                <1> 	shl	dl, 1 ; * 2 ; byte offset (in end row)
  3946 0000D870 01D6                <1> 	add	esi, edx
  3947 0000D872 01D7                <1> 	add	edi, edx
  3948                              <1> 		; esi = source page window end offset
  3949                              <1> 		; edi = destination page window end offset
  3950 0000D874 39C6                <1> 	cmp	esi, eax ; video memory end
  3951                              <1> 	;ja	short sysvideo_7
  3952 0000D876 732D                <1> 	jnb	short sysvideo_7 ; 21/11/2020
  3953 0000D878 39C7                <1> 	cmp	edi, eax ; video memory end
  3954                              <1> 	;ja	short sysvideo_7
  3955 0000D87A 7329                <1> 	jnb	short sysvideo_7 ; 21/11/2020
  3956                              <1> sysvideo_4_6:
  3957 0000D87C 5F                  <1> 	pop	edi ; ***
  3958 0000D87D 5E                  <1> 	pop	esi ; ****
  3959 0000D87E FEC3                <1> 	inc	bl ; row count - 1 -> row count	
  3960 0000D880 FEC2                <1> 	inc	dl ; column count
  3961 0000D882 88D7                <1> 	mov	bh, dl
  3962 0000D884 D0E2                <1> 	shl	dl, 1 ; convert column count to byte offset
  3963                              <1> 	; 21/11/2020
  3964                              <1> 	; esi = source page window start offset
  3965                              <1> 	; edi = destination page window start offset
  3966 0000D886 B8A0000000          <1> 	mov	eax, 80*2 ; bytes per row
  3967                              <1> 	; Note: 160 bytes per row (even if move count < 160)
  3968                              <1> sysvideo_5:	
  3969 0000D88B 88F9                <1> 	mov	cl, bh ; move/transfer -word- count per row
  3970 0000D88D 0115[20900100]      <1> 	add	[u.r0], edx ; transfer count in bytes
  3971 0000D893 F366A5              <1> 	rep	movsw
  3972 0000D896 01C6                <1> 	add	esi, eax ; + 160 bytes to next row
  3973 0000D898 01C7                <1> 	add	edi, eax ; + 160 bytes to next row
  3974 0000D89A FECB                <1> 	dec	bl ; remain count of rows
  3975 0000D89C 75ED                <1> 	jnz	short sysvideo_5
  3976 0000D89E E9B4F5FFFF          <1> 	jmp	sysret
  3977                              <1> 
  3978                              <1> sysvideo_6:
  3979 0000D8A3 59                  <1> 	pop	ecx ; *
  3980 0000D8A4 5A                  <1> 	pop	edx ; **
  3981                              <1> sysvideo_7:	
  3982 0000D8A5 5F                  <1> 	pop	edi ; ***
  3983 0000D8A6 5E                  <1> 	pop	esi ; ****
  3984                              <1> sysvideo_8:
  3985 0000D8A7 E9ABF5FFFF          <1> 	jmp	sysret
  3986                              <1> 
  3987                              <1> sysvideo_9:
  3988                              <1> 	; user to system or system to user window transfer
  3989                              <1> 	; 28/01/2021 (bl = 3 -> swap/exchange)
  3990                              <1> 	;cmp	bl, 2
  3991                              <1> 	;;ja	sysret	; user to user transfer is invalid
  3992                              <1> 	;		; [u.r0] = 0
  3993                              <1> 	;ja	short sysvideo_8 ; 26/12/2020
  3994                              <1> 
  3995                              <1> 	; 28/01/2021
  3996 0000D8AC 80FB02              <1> 	cmp	bl, 2
  3997 0000D8AF 7604                <1> 	jna	short sysvideo_9_8 
  3998                              <1> 
  3999                              <1> 	; swap/ exchange video memory and user mem windows
  4000                              <1> 	; edi = swap address in user's memory space
  4001 0000D8B1 21FF                <1> 	and	edi, edi
  4002 0000D8B3 74F2                <1> 	jz	short sysvideo_8 ; invalid ; 28/01/2021
  4003                              <1>  
  4004                              <1> sysvideo_9_8:		
  4005 0000D8B5 56                  <1> 	push	esi ; ****
  4006 0000D8B6 57                  <1> 	push	edi ; ***
  4007 0000D8B7 52                  <1> 	push	edx ; **
  4008 0000D8B8 51                  <1> 	push	ecx ; *
  4009                              <1> 
  4010 0000D8B9 C1E910              <1> 	shr	ecx, 16 ; top row
  4011 0000D8BC C1EA10              <1> 	shr	edx, 16 ; bottom row
  4012                              <1> 	
  4013                              <1> 	; 21/11/2020
  4014                              <1> 	;cmp	ecx, 24 ; max. 25 rows
  4015 0000D8BF 6683F918            <1> 	cmp	cx, 24
  4016 0000D8C3 77DE                <1> 	ja	short sysvideo_6 ; invalid, [u.r0] = 0
  4017                              <1> 	;cmp	edx, 24 ; max. 25 rows
  4018 0000D8C5 6683FA18            <1> 	cmp	dx, 24
  4019 0000D8C9 77D8                <1> 	ja	short sysvideo_6 ; invalid, [u.r0] = 0	
  4020 0000D8CB 28CA                <1> 	sub	dl, cl
  4021 0000D8CD 72D4                <1> 	jc	short sysvideo_6 ; invalid, [u.r0] = 0
  4022                              <1> 
  4023                              <1> 	;mov	ch, cl ; top row
  4024                              <1> 	;mov	cl, [ACTIVE_PAGE]
  4025                              <1> 
  4026                              <1> 	;mov	edi, 80*25*2 ; 4000
  4027                              <1> 	; 21/11/2020
  4028                              <1> 	;mov	edi, 4096 ; [CRT_LEN = 4096 for video mode 3 
  4029                              <1> 	;shl	edi, cl  ; ! wrong for page 2 to page 7 !
  4030                              <1> 	;;add	edi, 0B8000h - 80*25*2
  4031                              <1> 	;add	edi, 0B8000h - 1000h ; - 4096
  4032                              <1> 	
  4033                              <1> 	; 21/11/2020
  4034                              <1> 	;xor	eax, eax
  4035                              <1> 	;mov	edi, 0B8000h
  4036                              <1> 	;and	cl, cl ; is video page = 0 ?
  4037                              <1> 	;jz	short sysvideo_9_1 ; yes
  4038                              <1> 	; eax = 0
  4039                              <1> 
  4040                              <1> ;sysvideo_9_0:
  4041                              <1> 	;add	ax, 4096
  4042                              <1> 	;dec	cl
  4043                              <1> 	;jnz	short sysvideo_9_0
  4044                              <1> 	;add	edi, eax
  4045                              <1> 	;	; edi = video page start address
  4046                              <1> 
  4047                              <1> 	; 21/11/2020
  4048 0000D8CF BF00800B00          <1> 	mov	edi, 0B8000h
  4049 0000D8D4 803D[B6780100]00    <1> 	cmp	byte [ACTIVE_PAGE], 0
  4050 0000D8DB 760C                <1> 	jna	short sysvideo_9_1
  4051                              <1> stsvideo_9_0:
  4052 0000D8DD B010                <1> 	mov	al, 16 ; 4096/256
  4053 0000D8DF F625[B6780100]      <1> 	mul	byte [ACTIVE_PAGE] 
  4054 0000D8E5 86E0                <1> 	xchg	ah, al ; * 256
  4055 0000D8E7 01C7                <1> 	add	edi, eax
  4056                              <1> 		; edi = video page start address
  4057                              <1> sysvideo_9_1:
  4058                              <1> 	; bl = transfer direction 
  4059                              <1> 	;     (1 = from user, 2 = to user)
  4060                              <1> 	;     (3 = swap) ; 28/01/2021
  4061 0000D8E9 88D7                <1> 	mov	bh, dl ; row count - 1
  4062                              <1> 	;mov	dl, ch ; top row
  4063                              <1> 	; 21/11/2020
  4064 0000D8EB 08C9                <1> 	or	cl, cl ; top row number
  4065 0000D8ED 7408                <1> 	jz	short sysvideo_9_2
  4066                              <1> 
  4067                              <1> 	;mov	eax, 80*2
  4068 0000D8EF 66B8A000            <1> 	mov	ax, 80*2 ; 160, bytes per row
  4069 0000D8F3 F7E1                <1> 	mul	ecx ; 22/11/2020
  4070 0000D8F5 01C7                <1> 	add	edi, eax
  4071                              <1> 		; edi = window start address for top row
  4072                              <1> sysvideo_9_2:
  4073 0000D8F7 59                  <1> 	pop	ecx ; *
  4074 0000D8F8 5A                  <1> 	pop	edx ; **
  4075 0000D8F9 81E1FFFF0000        <1> 	and	ecx, 0FFFFh
  4076 0000D8FF 81E2FFFF0000        <1> 	and	edx, 0FFFFh
  4077                              <1> 	; 21/11/2020
  4078                              <1> 	;cmp	ecx, 79 ; max. 80 columns
  4079 0000D905 6683F94F            <1> 	cmp	cx, 79
  4080 0000D909 779A                <1> 	ja	short sysvideo_7 ; invalid, [u.r0] = 0
  4081                              <1> 	;cmp	edx, 79 ; max. 80 columns
  4082 0000D90B 6683FA4F            <1> 	cmp	dx, 79
  4083 0000D90F 7794                <1> 	ja	short sysvideo_7 ; invalid, [u.r0] = 0
  4084                              <1> 	
  4085 0000D911 28CA                <1> 	sub	dl, cl
  4086 0000D913 7290                <1> 	jc	short sysvideo_7 ; invalid, [u.r0] = 0
  4087                              <1> 	
  4088 0000D915 08C9                <1> 	or	cl, cl ; left column 
  4089 0000D917 7404                <1> 	jz	short sysvideo_9_3 ; 0
  4090                              <1> 
  4091                              <1> 	; 21/11/2020
  4092 0000D919 D0E1                <1> 	shl	cl, 1  ; column * 2
  4093 0000D91B 01CF                <1> 	add	edi, ecx
  4094                              <1> 		; edi = window start addr for top left column
  4095                              <1> sysvideo_9_3:
  4096 0000D91D 88D1                <1> 	mov	cl, dl
  4097 0000D91F FEC1                <1> 	inc	cl ; column count
  4098 0000D921 D0E1                <1> 	shl	cl, 1 ; column count * 2
  4099                              <1> 		; ecx = transfer count per row
  4100                              <1> 
  4101 0000D923 58                  <1> 	pop	eax ; *** (swap address)
  4102 0000D924 5E                  <1> 	pop	esi ; ****
  4103                              <1> 
  4104 0000D925 FEC7                <1> 	inc	bh  ; row count	
  4105                              <1> 	
  4106                              <1> 	;mov	edx, 80*2
  4107 0000D927 B2A0                <1> 	mov	dl, 80*2  ; bytes per row
  4108                              <1> 	;
  4109                              <1> 	;cmp	bl, 1 ; transfer direction
  4110                              <1> 	;ja	short sysvideo_11 ; system to user transfer
  4111                              <1> 	; 28/01/2021
  4112 0000D929 F6C301              <1> 	test	bl, 1
  4113 0000D92C 7439                <1> 	jz	short sysvideo_11 ; system to user transfer
  4114                              <1> 
  4115                              <1> 	; user to system video/display page window transfer (mode 0)	
  4116 0000D92E 21C0                <1> 	and	eax, eax ; swap address
  4117 0000D930 741B                <1> 	jz	short sysvideo_10 ; no window swap
  4118                              <1> sysvideo_9_7: ; 28/01/2021
  4119                              <1> 	; save previous window content in user's buffer (swap address)
  4120 0000D932 56                  <1> 	push	esi ; user buffer
  4121 0000D933 57                  <1> 	push	edi ; beginning address of the window
  4122                              <1> 	; 21/11/2020
  4123 0000D934 53                  <1> 	push	ebx ; save bh
  4124 0000D935 89FE                <1> 	mov	esi, edi
  4125 0000D937 89C7                <1> 	mov	edi, eax
  4126                              <1> sysvideo_9_4:
  4127 0000D939 E853350000          <1> 	call	transfer_to_user_buffer ; fast transfer
  4128 0000D93E 7208                <1> 	jc	short sysvideo_9_5
  4129                              <1> 	; ecx = actual transfer count (must be same with input)
  4130 0000D940 01D6                <1> 	add	esi, edx ; next row address of (video page) window 
  4131 0000D942 01CF                <1> 	add	edi, ecx ; next row address of user's window
  4132                              <1> 		; Note: ecx may be less than row length of video page
  4133                              <1> 		; user's window uses offset according to window width
  4134 0000D944 FECF                <1> 	dec	bh
  4135 0000D946 75F1                <1> 	jnz	short sysvideo_9_4 ; repeat for next row
  4136                              <1> sysvideo_9_5:
  4137 0000D948 5B                  <1> 	pop	ebx ; restore bh
  4138 0000D949 5F                  <1> 	pop	edi
  4139 0000D94A 5E                  <1> 	pop	esi
  4140                              <1> 	;jnc	short sysvideo_10
  4141 0000D94B 7215                <1> 	jc	short sysvideo_9_6 ; 28/01/2021
  4142                              <1> ;sysvideo_9_6:
  4143                              <1> ;	jmp	sysret ; [u.r0] = 0
  4144                              <1> 
  4145                              <1> sysvideo_10:
  4146                              <1> 	; user to system video/display page window transfer (mode 0)	
  4147                              <1> 	; esi =	user buffer
  4148 0000D94D E889350000          <1> 	call	transfer_from_user_buffer ; fast transfer
  4149                              <1> 	;jc	sysret
  4150 0000D952 720E                <1> 	jc	short sysvideo_9_6 ; 28/01/2021
  4151                              <1> 	; ecx = actual transfer count (must be same with input)
  4152 0000D954 010D[20900100]      <1> 	add	[u.r0], ecx ; actual transfer count
  4153 0000D95A 01D7                <1> 	add	edi, edx ; next row address of (video page) window 
  4154 0000D95C 01CE                <1> 	add	esi, ecx ; next row address of user's window
  4155                              <1> 		; Note: ecx may be less than row length of video page
  4156                              <1> 		; user's window uses offset according to window width
  4157 0000D95E FECF                <1> 	dec	bh
  4158 0000D960 75EB                <1> 	jnz	short sysvideo_10 ; repeat for next row
  4159                              <1> 	;jmp	sysret
  4160                              <1> sysvideo_9_6:
  4161 0000D962 E9F0F4FFFF          <1> 	jmp	sysret
  4162                              <1> 	
  4163                              <1> sysvideo_11:
  4164                              <1> 	; system to user video/display page window transfer (mode 0)
  4165 0000D967 87FE                <1> 	xchg	edi, esi
  4166                              <1> sysvideo_12:
  4167                              <1> 	; esi = beginning addr of the (screen, video page) window
  4168                              <1> 	; edi =	user's buffer	
  4169 0000D969 E823350000          <1> 	call	transfer_to_user_buffer ; fast transfer
  4170                              <1> 	;jc	sysret
  4171                              <1> 	; 23/07/2022
  4172 0000D96E 72F2                <1> 	jc	short sysvideo_9_6 ; jmp sysret	
  4173                              <1> 
  4174                              <1> 	; ecx = actual transfer count (must be same with input)
  4175 0000D970 010D[20900100]      <1> 	add	[u.r0], ecx
  4176 0000D976 01D6                <1> 	add	esi, edx ; next row (edx = 160)
  4177 0000D978 01CF                <1> 	add	edi, ecx ; next row of the user's window 
  4178                              <1> 			 ; (ecx <= 160)
  4179 0000D97A FECF                <1> 	dec	bh
  4180 0000D97C 75EB                <1> 	jnz	short sysvideo_12
  4181                              <1> sysvideo_12_0:
  4182 0000D97E E9D4F4FFFF          <1> 	jmp	sysret
  4183                              <1> 
  4184                              <1> sysvideo_13:
  4185                              <1> 	; 28/12/2020
  4186 0000D983 80FF01              <1> 	cmp	bh, 1
  4187 0000D986 7752                <1>         ja      short sysvideo_15 ; 23/11/2020
  4188                              <1> 
  4189                              <1> 	; 25/02/2021
  4190                              <1> 	; 12/02/2021
  4191                              <1> 	; 29/01/2021, 31/01/2021
  4192                              <1> 	; 23/11/2020 (TRDOS 386 v2.0.3)
  4193                              <1> 	; (major modification, from mode 13h to all VGA modes,
  4194                              <1> 	;  except super VGA modes and liner frame buffer method)
  4195                              <1> 
  4196                              <1> 	; BH = 1 = VGA Graphics mode (0A0000h) data transfers
  4197                              <1> 
  4198                              <1> 	; 29/01/2021
  4199 0000D988 66B84001            <1> 	mov	ax, 320	; 320 pixels
  4200 0000D98C F6C380              <1> 	test	bl, 80h	; bit 7 (screen width, 640 pixels)		
  4201 0000D98F 7407                <1> 	jz	short sysvideo_13_0
  4202                              <1> 	;shl	ax, 1	; 640 pixels
  4203                              <1> 	; 23/07/2022
  4204 0000D991 D1E0                <1> 	shl	eax, 1
  4205                              <1> 	;
  4206 0000D993 80E37F              <1> 	and	bl, 7Fh
  4207 0000D996 7405                <1> 	jz	short sysvideo_14
  4208                              <1> sysvideo_13_0:
  4209                              <1> 	; 29/01/2021
  4210 0000D998 80FB41              <1> 	cmp	bl, 41h
  4211 0000D99B 77E1                <1> 	ja	short sysvideo_12_0 ; invalid (unknown) sub function
  4212                              <1> sysvideo_14:
  4213 0000D99D 66A3[3E9F0100]      <1> 	mov	[v_width], ax	; save screen width
  4214 0000D9A3 C705[429F0100]0000- <1> 	mov	dword [v_mem], 0A0000h  ; save video memory address
  4214 0000D9AB 0A00                <1>
  4215 0000D9AD C705[469F0100]0000- <1> 	mov	dword [v_siz], 65536	; save video memory size
  4215 0000D9B5 0100                <1>
  4216 0000D9B7 C705[4E9F0100]0000- <1> 	mov	dword [v_end], 0B0000h	; save end of video page
  4216 0000D9BF 0B00                <1>
  4217 0000D9C1 B708                <1> 	mov	bh, 8
  4218 0000D9C3 883D[419F0100]      <1> 	mov	[v_bpp], bh ; 8	; bits per pixel (256 colors)
  4219 0000D9C9 881D[409F0100]      <1> 	mov	[v_ops], bl	; VGA data transfer options
  4220                              <1> 	;mov	[maskbuff], edi ; 25/02/2021 
  4221 0000D9CF 893D[529F0100]      <1> 	mov	[maskcolor], edi ; 25/02/2021
  4222                              <1> 			; save mask color or bitmask buffer address
  4223 0000D9D5 E9BE000000          <1> 	jmp	sysvideo_15_7
  4224                              <1> 
  4225                              <1> sysvideo_15:
  4226                              <1> 	; 23/07/2022
  4227                              <1> 	; 28/12/2020
  4228 0000D9DA 80FF02              <1> 	cmp	bh, 2
  4229                              <1>         ;ja	sysvideo_16
  4230                              <1> 	; 23/07/2022
  4231 0000D9DD 7605                <1> 	jna	short sysvideo_15_17
  4232 0000D9DF E9ED1E0000          <1> 	jmp	sysvideo_16
  4233                              <1> sysvideo_15_17:	; 23/07/2022
  4234                              <1> 	; 25/02/2021
  4235                              <1> 	; 12/02/2021
  4236                              <1> 	; 30/01/2021 - 31/01/2021
  4237                              <1> 	; 01/01/2021 - 29/01/2021
  4238                              <1> 	; 26/12/2020 - 27/12/2020
  4239                              <1> 	; 25/12/2020 (TRDOS 386 v2.0.3)
  4240                              <1> 	;
  4241                              <1> 	; BH = 2 = SVGA (VESA VBE) Graphics mode (LFB) data transfers
  4242                              <1> 
  4243                              <1> 	; 25/12/2020
  4244                              <1> 	; resolution table entry will be saved into EBP register
  4245                              <1> 
  4246 0000D9E4 803D[86090000]02    <1> 	cmp	byte [vbe3], 2 ; VESA VBE 3 video bios 
  4247                              <1> 			  ; or BOCHS/QEMU/VIRTUALBOX emu video bios
  4248 0000D9EB 724E                <1> 	jb	short sysvideo_15_4 ; no, nothing to do !
  4249 0000D9ED 770B                <1> 	ja	short sysvideo_15_0 ; yes
  4250                              <1> 
  4251                              <1> 	; Only Bochs/Plex86 (emu) vbe2 video bios is usable in pmid
  4252                              <1> 	; (if [vbe3] = 2) 
  4253 0000D9EF A0[87090000]        <1> 	mov	al, [vbe2bios] ; Bochs vbios sign is from C0h to C5h
  4254 0000D9F4 24F0                <1> 	and	al, 0F0h
  4255 0000D9F6 3CC0                <1> 	cmp	al, 0C0h
  4256 0000D9F8 7541                <1> 	jne	short sysvideo_15_4 ; unknown (vbe2) video bios
  4257                              <1> sysvideo_15_0:
  4258                              <1> 	; 29/01/2021
  4259 0000D9FA 80FB41              <1> 	cmp	bl, 41h
  4260 0000D9FD 773C                <1> 	ja	short sysvideo_15_4 ; invalid (unknown) sub function
  4261                              <1> 	; 29/01/2021
  4262 0000D9FF 881D[409F0100]      <1> 	mov	[v_ops], bl	; SVGA data transfer options
  4263                              <1> 
  4264 0000DA05 89D8                <1> 	mov	eax, ebx ; hw of ebx is vesa vbe video mode
  4265 0000DA07 C1E810              <1> 	shr	eax, 16 ; ax = vesa vbe video mode
  4266 0000DA0A 7513                <1> 	jnz	short sysvideo_15_2 
  4267                              <1> 	; ax = 0
  4268                              <1> 
  4269                              <1> 	; check & use current video mode
  4270 0000DA0C 803D[BE670000]FF    <1> 	cmp	byte [CRT_MODE], 0FFh ; extended (SVGA) mode ?
  4271 0000DA13 7526                <1> 	jne	short sysvideo_15_4 ; no
  4272                              <1> sysvideo_15_1:
  4273                              <1> 	; use current vbe (svga) video mode
  4274 0000DA15 66A1[D69E0100]      <1> 	mov	ax, [video_mode] ; extended (SVGA, VESA VBE) mode
  4275 0000DA1B 6625FF01            <1> 	and	ax, 1FFh ; vesa vbe video mode: 1XXh
  4276                              <1> sysvideo_15_2:
  4277                              <1> 	; 29/01/2021
  4278                              <1> 	;mov	[maskbuff], edi ; 25/02/2021
  4279 0000DA1F 893D[529F0100]      <1> 	mov	[maskcolor], edi ; 25/02/2021
  4280                              <1> 			; save mask color or bitmask buffer address
  4281 0000DA25 BD[4A6B0000]        <1> 	mov	ebp, b_vbe_modes ; vbe mode table (in 'vidata.s')
  4282                              <1> sysvideo_15_3:
  4283 0000DA2A 663B4500            <1> 	cmp	ax, [ebp]
  4284 0000DA2E 7410                <1> 	je	short sysvideo_15_5
  4285 0000DA30 83C508              <1> 	add	ebp, 8 ; vbe mode table entry size
  4286 0000DA33 81FD[0A6C0000]      <1> 	cmp	ebp, end_of_b_vbe_modes
  4287 0000DA39 72EF                <1>  	jb	short sysvideo_15_3	
  4288                              <1> sysvideo_15_4:
  4289                              <1> 	; desired video mode is not a valid (implemented)
  4290                              <1> 	;	  extended (VESA VBE, SVGA) video mode
  4291                              <1> 	;
  4292                              <1> 	; nothing to do !
  4293                              <1> 
  4294                              <1>  	; [u.r0] = 0  ; return value of EAX
  4295 0000DA3B E917F4FFFF          <1>  	jmp	sysret
  4296                              <1> 
  4297                              <1> sysvideo_15_5:
  4298                              <1> 	; get LFB address
  4299 0000DA40 A1[E49E0100]        <1> 	mov	eax, [LFB_ADDR] ; [LFB_Info+LFBINFO.LFB_addr]
  4300 0000DA45 09C0                <1> 	or	eax, eax
  4301 0000DA47 7509                <1> 	jnz	short sysvideo_15_6
  4302 0000DA49 66A1[110F0000]      <1> 	mov	ax, [def_LFB_addr] ; default LFB addr 
  4303                              <1> 				   ; (for vbe mode 118h)
  4304 0000DA4F C1E010              <1> 	shl	eax, 16
  4305                              <1> 	; 27/12/2020
  4306                              <1> 	;jz	short sysvideo_15_4
  4307                              <1> sysvideo_15_6:
  4308                              <1> 	; 29/01/2021
  4309 0000DA52 A3[429F0100]        <1> 	mov	[v_mem], eax ; save video memory address
  4310                              <1> 	
  4311                              <1> 	; 27/12/2020
  4312                              <1> 	; 26/12/2020
  4313 0000DA57 8B4502              <1> 	mov	eax, [ebp+2] ; width, height
  4314                              <1> 	; 29/01/2021
  4315 0000DA5A 66A3[3E9F0100]      <1> 	mov	[v_width], ax ; save screen width
  4316                              <1> 	; 28/12/2020
  4317 0000DA60 8A7D06              <1> 	mov	bh, [ebp+6] ; bpp
  4318                              <1> 	; 28/02/2021
  4319                              <1> 	; check default truecolor bpp value and use
  4320                              <1> 	; 32bpp instead of 24bpp if the default value
  4321                              <1> 	; has been set to 32bpp.
  4322 0000DA63 80FF18              <1> 	cmp	bh, 24
  4323 0000DA66 750B                <1> 	jne	short sysvideo_15_16
  4324 0000DA68 803D[4F750100]20    <1> 	cmp	byte [truecolor], 32
  4325                              <1> 		; Default truecolor bpp value,
  4326                              <1> 		; it is 32 for VBE3 video bios
  4327                              <1> 		; (it can be set to 32 or 24)
  4328 0000DA6F 7502                <1> 	jne	short sysvideo_15_16 ; not VBE3 !
  4329                              <1> 				; or it is set to 24  	
  4330 0000DA71 B720                <1> 	mov	bh, 32
  4331                              <1> 	; 28/02/2021
  4332                              <1> sysvideo_15_16:
  4333                              <1> 	; 29/01/2021
  4334 0000DA73 883D[419F0100]      <1> 	mov	[v_bpp], bh ; bits per pixel
  4335                              <1> 
  4336 0000DA79 52                  <1> 	push	edx ; *
  4337 0000DA7A 0FB7D0              <1> 	movzx	edx, ax  ; width
  4338 0000DA7D C1E810              <1> 	shr	eax, 16  ; height
  4339 0000DA80 F7E2                <1> 	mul	edx
  4340                              <1> 	; eax = linear frame buffer size (pixels)
  4341                              <1> 	; 29/01/2021
  4342 0000DA82 A3[469F0100]        <1> 	mov	[v_siz], eax ; save video page size
  4343 0000DA87 E8FD000000          <1> 	call	pixels_to_byte_count
  4344 0000DA8C 0305[429F0100]      <1> 	add	eax, [v_mem]
  4345 0000DA92 A3[4E9F0100]        <1> 	mov	[v_end], eax ; save end of video page 
  4346 0000DA97 5A                  <1> 	pop	edx ; *
  4347                              <1> 
  4348                              <1> 	; bh = bits per pixel
  4349                              <1> 	; (bh will not be used after here, 29/01/2021)
  4350                              <1> 
  4351                              <1> 	; bl = pixel operations & options
  4352                              <1> 	; ecx, edx, esi, edi input parameters
  4353                              <1> 	; [maskcolor] = edi input ; 25/02/2021
  4354                              <1> 
  4355                              <1> sysvideo_15_7:
  4356                              <1> 	; 29/01/2021
  4357                              <1> 	;test	byte [v_ops], 40h  ; system to user ?
  4358 0000DA98 F6C340              <1> 	test	bl, 40h
  4359 0000DA9B 7517                <1> 	jnz	short sysvideo_15_9
  4360                              <1> 
  4361 0000DA9D 31C0                <1> 	xor	eax, eax
  4362 0000DA9F 88D8                <1> 	mov	al, bl
  4363 0000DAA1 BB[C7DB0000]        <1> 	mov	ebx, pixel_ops
  4364 0000DAA6 240F                <1> 	and	al, 0Fh ; isolate 16 pixel operations
  4365 0000DAA8 C0E002              <1> 	shl	al, 2 ; * 4 for dword table pointers 
  4366 0000DAAB 01C3                <1> 	add	ebx, eax
  4367                              <1> 
  4368                              <1> 	; ebx = subroutine address
  4369                              <1> 
  4370                              <1> 	; ecx, edx, esi, edi input parameters
  4371                              <1> 	; [maskbuff] = edi input
  4372                              <1> 	; [maskcolor] = edi input ; 25/02/2021
  4373                              <1> 
  4374 0000DAAD FF13                <1> 	call	[ebx]		
  4375                              <1> sysvideo_15_8:
  4376 0000DAAF E9A3F3FFFF          <1> 	jmp	sysret
  4377                              <1> 
  4378                              <1> sysvideo_15_9:
  4379                              <1> 	; system to user display page or window copy
  4380                              <1> 	;test	byte [v_ops], 1 ; window copy ?
  4381 0000DAB4 F6C301              <1> 	test	bl, 1	
  4382 0000DAB7 7521                <1> 	jnz	short sysvideo_15_10
  4383                              <1> 
  4384                              <1> 	; display page (full screen copy)
  4385 0000DAB9 8B35[429F0100]      <1> 	mov	esi, [v_mem] ; LFB start address
  4386 0000DABF A1[469F0100]        <1> 	mov	eax, [v_siz]
  4387 0000DAC4 E8C0000000          <1> 	call	pixels_to_byte_count
  4388 0000DAC9 89C1                <1> 	mov	ecx, eax ; transfer count in bytes
  4389                              <1> 	;edi = user's buffer address
  4390 0000DACB E8C1330000          <1> 	call	transfer_to_user_buffer
  4391 0000DAD0 72DD                <1> 	jc	short sysvideo_15_8	
  4392 0000DAD2 890D[20900100]      <1> 	mov	[u.r0], ecx
  4393 0000DAD8 EBD5                <1> 	jmp	short sysvideo_15_8
  4394                              <1> 
  4395                              <1> sysvideo_15_10:
  4396 0000DADA E820000000          <1> 	call	sysvideo_15_12 ; window preparations
  4397 0000DADF 72CE                <1> 	jc	short sysvideo_15_8
  4398                              <1> 
  4399 0000DAE1 8B35[4A9F0100]      <1> 	mov	esi, [v_str]
  4400                              <1> sysvideo_15_11:
  4401                              <1> 	; esi = window's current row address (video mem)
  4402                              <1> 	; edi = current row (virtual) addr in user's buff
  4403                              <1> 	; ecx = transfer count per row
  4404 0000DAE7 E8A5330000          <1> 	call	transfer_to_user_buffer
  4405 0000DAEC 72C1                <1> 	jc	short sysvideo_15_8
  4406 0000DAEE 010D[20900100]      <1>  	add	[u.r0], ecx
  4407 0000DAF4 4B                  <1> 	dec	ebx
  4408 0000DAF5 74B8                <1> 	jz	short sysvideo_15_8 ; ok.
  4409                              <1> 	; next row
  4410 0000DAF7 01CF                <1> 	add	edi, ecx ; next row in user's buffer
  4411 0000DAF9 01D6                <1> 	add	esi, edx ; next row of window (system)
  4412 0000DAFB EBEA                <1> 	jmp	short sysvideo_15_11
  4413                              <1> 
  4414                              <1> sysvideo_15_14:
  4415 0000DAFD F9                  <1> 	stc	 ; error !
  4416                              <1> sysvideo_15_15:
  4417 0000DAFE C3                  <1> 	retn
  4418                              <1> 
  4419                              <1> sysvideo_15_12:
  4420                              <1> 	; 30/01/2021
  4421                              <1> 	; 29/01/2021
  4422                              <1> 	; Window address preparations for window copy
  4423 0000DAFF 6621D2              <1> 	and	dx, dx
  4424 0000DB02 74F9                <1> 	jz	short sysvideo_15_14 ; invalid (zero columns)
  4425                              <1> 	;test	edx, 0FFFF0000h
  4426                              <1> 	;jz	short sysvideo_15_14 ; invalid (zero rows)
  4427 0000DB04 81FA00000100        <1> 	cmp	edx, 65536
  4428 0000DB0A 72F2                <1> 	jb	short sysvideo_15_15 ; invalid (zero rows)
  4429 0000DB0C 89C8                <1> 	mov	eax, ecx ; start position (row, column)
  4430 0000DB0E E899000000          <1> 	call	calc_pixel_offset
  4431 0000DB13 3B05[469F0100]      <1> 	cmp	eax, [v_siz]
  4432 0000DB19 73E2                <1> 	jnb	short sysvideo_15_14 ; out of display page
  4433                              <1> 				; nothing to do
  4434 0000DB1B E869000000          <1> 	call	pixels_to_byte_count
  4435 0000DB20 0305[429F0100]      <1> 	add	eax, [v_mem]
  4436 0000DB26 A3[4A9F0100]        <1> 	mov	[v_str], eax ; window start address
  4437                              <1> 			     ; (addr of top left corner)
  4438                              <1> 	; check column limit
  4439 0000DB2B 89C8                <1> 	mov	eax, ecx
  4440 0000DB2D 6601D0              <1> 	add	ax, dx  ; add columns to start column
  4441 0000DB30 72CC                <1> 	jc	short sysvideo_15_15 ; cf = 1
  4442 0000DB32 663B05[3E9F0100]    <1> 	cmp	ax, [v_width]
  4443 0000DB39 77C2                <1> 	ja	short sysvideo_15_14
  4444                              <1> 
  4445 0000DB3B 89D0                <1> 	mov	eax, edx ; size
  4446 0000DB3D 2D00000100          <1> 	sub	eax, 65536 ; row count -> 0 based row #
  4447 0000DB42 E865000000          <1> 	call	calc_pixel_offset
  4448 0000DB47 3B05[469F0100]      <1> 	cmp	eax, [v_siz] ; video (display) page size
  4449 0000DB4D 77AE                <1> 	ja	short sysvideo_15_14 ; out of display page
  4450                              <1> 				; nothing to do
  4451 0000DB4F E835000000          <1> 	call	pixels_to_byte_count
  4452 0000DB54 0305[4A9F0100]      <1> 	add	eax, [v_str] ; window start address
  4453 0000DB5A 3B05[4E9F0100]      <1> 	cmp	eax, [v_end] ; window end address (+1)
  4454                              <1> 			 ; (addr of bottom right corner +1)	
  4455 0000DB60 779B                <1> 	ja	short sysvideo_15_14 ; out of display page
  4456                              <1> 				; nothing to do
  4457 0000DB62 89D3                <1> 	mov	ebx, edx
  4458 0000DB64 C1EB10              <1> 	shr	ebx, 16 
  4459                              <1> 	; ebx = row count
  4460 0000DB67 81E2FFFF0000        <1> 	and	edx, 0FFFFh
  4461                              <1> 	; edx = transfer count per row (from user's buffer)
  4462                              <1> 	;	(in pixels, window width)
  4463 0000DB6D 89D0                <1> 	mov	eax, edx
  4464 0000DB6F A3[569F0100]        <1> 	mov	[pixcount], eax ; 27/02/2021
  4465 0000DB74 E810000000          <1> 	call	pixels_to_byte_count
  4466 0000DB79 89C1                <1> 	mov	ecx, eax
  4467                              <1> 	; ecx = transfer count per row (from user's buffer)
  4468                              <1> 	;	(in bytes, window width)
  4469 0000DB7B 66A1[3E9F0100]      <1> 	mov	ax, [v_width]
  4470 0000DB81 E803000000          <1> 	call	pixels_to_byte_count
  4471 0000DB86 89C2                <1> 	mov	edx, eax
  4472                              <1> 	; edx = byte count per row
  4473 0000DB88 C3                  <1> 	retn ; cf = 0
  4474                              <1> 
  4475                              <1> pixels_to_byte_count:
  4476                              <1> 	; 29/01/2021
  4477                              <1> 	; INPUT:
  4478                              <1> 	;   eax = pixel count
  4479                              <1> 	; OUTPUT:
  4480                              <1> 	;   eax = byte count
  4481                              <1> 	;
  4482 0000DB89 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8
  4483 0000DB90 7619                <1> 	jna	short pixtobc_3 ; 8 bit colors
  4484 0000DB92 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24
  4485 0000DB99 720A                <1> 	jb	short pixtobc_1 ; 16 bit colors
  4486 0000DB9B 770B                <1> 	ja	short pixtobc_2 ; 32 bit colors
  4487                              <1> 	; 24 bit pixels
  4488                              <1> 	; eax = eax * 3
  4489                              <1> 	;push	edx
  4490                              <1> 	;mov	edx, eax
  4491                              <1> 	;shl	eax, 1
  4492                              <1> 	;add	eax, edx
  4493                              <1> 	;pop	edx
  4494 0000DB9D 50                  <1> 	push	eax
  4495 0000DB9E D1E0                <1> 	shl	eax, 1
  4496 0000DBA0 010424              <1> 	add	[esp], eax
  4497 0000DBA3 58                  <1> 	pop	eax
  4498 0000DBA4 C3                  <1> 	retn		
  4499                              <1> pixtobc_1:
  4500                              <1> 	; 32 bit pixels
  4501                              <1> 	; eax = eax * 2
  4502 0000DBA5 D1E0                <1> 	shl	eax, 1
  4503 0000DBA7 C3                  <1> 	retn
  4504                              <1> pixtobc_2:
  4505                              <1> 	; 16 bit pixels
  4506                              <1> 	; eax = eax * 4
  4507 0000DBA8 C1E002              <1> 	shl	eax, 2
  4508                              <1> pixtobc_3:
  4509 0000DBAB C3                  <1> 	retn
  4510                              <1> 
  4511                              <1> calc_pixel_offset:
  4512                              <1> 	; 29/01/2021
  4513                              <1> 	; INPUT:
  4514                              <1> 	;   eax = pixel position (row, column)
  4515                              <1> 	; OUTPUT:
  4516                              <1> 	;   eax = pixel offset (linear address)
  4517                              <1> 	;
  4518 0000DBAC 52                  <1> 	push	edx
  4519 0000DBAD 50                  <1> 	push	eax
  4520 0000DBAE C1E810              <1> 	shr	eax, 16
  4521 0000DBB1 7409                <1> 	jz	short cpixo_0
  4522                              <1> 	; eax = row 
  4523 0000DBB3 0FB715[3E9F0100]    <1> 	movzx	edx, word [v_width]
  4524 0000DBBA F7E2                <1> 	mul	edx
  4525                              <1> cpixo_0:
  4526                              <1> 	; eax = row * screen width
  4527 0000DBBC 5A                  <1> 	pop	edx
  4528 0000DBBD 81E2FFFF0000        <1> 	and	edx, 0FFFFh
  4529                              <1> 	; edx = column
  4530 0000DBC3 01D0                <1> 	add	eax, edx
  4531                              <1> 	; eax = (row * screen width) + column		
  4532 0000DBC5 5A                  <1> 	pop	edx
  4533 0000DBC6 C3                  <1> 	retn
  4534                              <1> 
  4535                              <1> 	; 02/02/2021
  4536                              <1> 	; 29/01/2021
  4537                              <1> pixel_ops:
  4538 0000DBC7 [07DC0000]          <1> 	dd	pix_op_cpy ; copy pixels (user to system)
  4539 0000DBCB [52E10000]          <1> 	dd	pix_op_new ; change (new, fill) color
  4540 0000DBCF [6FDC0000]          <1> 	dd	pix_op_add ; add color (up to 0FFh)
  4541 0000DBD3 [21DD0000]          <1> 	dd	pix_op_sub ; sub color (down to 0)
  4542 0000DBD7 [3CDF0000]          <1> 	dd	pix_op_orc ; or color
  4543 0000DBDB [EEDF0000]          <1> 	dd	pix_op_and ; and color
  4544 0000DBDF [A0E00000]          <1> 	dd	pix_op_xor ; xor color
  4545 0000DBE3 [16E20000]          <1> 	dd	pix_op_not ; not color
  4546 0000DBE7 [C0E20000]          <1> 	dd	pix_op_neg ; neg color
  4547 0000DBEB [6AE30000]          <1> 	dd	pix_op_inc ; inc color
  4548 0000DBEF [14E40000]          <1> 	dd	pix_op_dec ; dec color
  4549 0000DBF3 [D3DD0000]          <1> 	dd	pix_op_mix ; mix color
  4550 0000DBF7 [9ADE0000]          <1> 	dd	pix_op_rpl ; replace color
  4551 0000DBFB [BEE40000]          <1> 	dd	pix_op_blk ; copy pixel block(s) (sys)
  4552 0000DBFF [6CE50000]          <1> 	dd	pix_op_lin ; write line(s)
  4553 0000DC03 [4FE90000]          <1> 	dd	pix_op_chr ; write character (font)
  4554                              <1> 
  4555                              <1> pix_op_cpy:
  4556                              <1> 	; 21/02/2021
  4557                              <1> 	; 06/02/2021
  4558                              <1> 	; 30/01/2021
  4559                              <1> 	; COPY PIXELS
  4560                              <1> 	;
  4561                              <1> 	; INPUT:
  4562                              <1> 	;  If bit 4 of BL or [v_ops] = 1 -window copy-
  4563                              <1> 	;  ECX = start position (row, column)
  4564                              <1> 	;        (HW = row, CX = column)
  4565                              <1> 	;  EDX = size (rows, colums)
  4566                              <1> 	;        (HW = rows, DX = columns)
  4567                              <1> 	;	 (0 -> invalid 	
  4568                              <1> 	;        (1 -> horizontal or vertical line)
  4569                              <1> 	;  If bit 4 of BL or [v_ops] = 0 -full screen-
  4570                              <1> 	;     ECX and EDX will not be used
  4571                              <1>   	;  ESI = user's buffer address
  4572                              <1> 	;  [maskcolor] = mask color (to be excluded)
  4573                              <1> 	;
  4574                              <1> 	; OUTPUT:
  4575                              <1> 	; 	[u.r0] will be > 0 if succesful
  4576                              <1> 
  4577 0000DC07 F605[409F0100]10    <1> 	test	byte [v_ops], 10h ; display page or window ?
  4578 0000DC0E 752E                <1> 	jnz	short pix_op_cpy_w ; window
  4579                              <1> 
  4580 0000DC10 8B3D[429F0100]      <1> 	mov	edi, [v_mem] ; 21/02/2021
  4581                              <1> 	
  4582                              <1> 	; Copy user's buffer content do display page
  4583                              <1> 	; (full screen copy)
  4584 0000DC16 A1[469F0100]        <1> 	mov	eax, [v_siz] ; video page size
  4585 0000DC1B E869FFFFFF          <1> 	call	pixels_to_byte_count
  4586 0000DC20 89C1                <1> 	mov	ecx, eax ; transfer count
  4587                              <1> 	; esi = user's buffer address (virtual)
  4588 0000DC22 F605[409F0100]20    <1> 	test	byte [v_ops], 20h ; masked copy ?
  4589 0000DC29 7405                <1> 	jz	short pix_op_cpy_0 ; no	
  4590 0000DC2B E96F0F0000          <1> 	jmp	m_pix_op_cpy ; copy pixels except mask color
  4591                              <1> pix_op_cpy_0:
  4592                              <1> 	; esi = user buffer for full screen copy
  4593                              <1> 	; edi = start of video memory 
  4594                              <1> 	;	(start of display page)
  4595                              <1> 	; ecx = byte count (display page size in bytes)
  4596 0000DC30 E8A6320000          <1> 	call	transfer_from_user_buffer
  4597 0000DC35 7206                <1> 	jc	short pix_op_cpy_1
  4598 0000DC37 890D[20900100]      <1> 	mov	[u.r0], ecx
  4599                              <1> pix_op_cpy_1:
  4600 0000DC3D C3                  <1> 	retn	; 06/02/2021
  4601                              <1> 
  4602                              <1> pix_op_cpy_w:
  4603 0000DC3E E8BCFEFFFF          <1> 	call	sysvideo_15_12 ; window preparations
  4604 0000DC43 72F8                <1> 	jc	short pix_op_cpy_1
  4605                              <1> 	; ecx = bytes per row (to be applied)
  4606                              <1> 	; edx = screen width in bytes
  4607                              <1> 	; ebx = row count
  4608 0000DC45 8B3D[4A9F0100]      <1> 	mov	edi, [v_str]
  4609 0000DC4B F605[409F0100]20    <1> 	test	byte [v_ops], 20h ; masked copy ?
  4610 0000DC52 7405                <1> 	jz	short pix_op_cpy_w_0 ; no
  4611 0000DC54 E909100000          <1> 	jmp	m_pix_op_cpy_w ; window copy except mask color
  4612                              <1> pix_op_cpy_w_0:
  4613                              <1> 	; esi = current row (virtual) addr in user's buff
  4614                              <1> 	; edi = window's current row address (video mem)
  4615                              <1> 	; ecx = transfer count per row
  4616 0000DC59 E87D320000          <1> 	call	transfer_from_user_buffer
  4617 0000DC5E 72DD                <1> 	jc	short pix_op_cpy_1
  4618 0000DC60 010D[20900100]      <1>  	add	[u.r0], ecx
  4619 0000DC66 4B                  <1> 	dec	ebx
  4620 0000DC67 74D4                <1> 	jz	short pix_op_cpy_1 ; ok.
  4621                              <1> 	; next row
  4622 0000DC69 01CE                <1> 	add	esi, ecx ; next row in user's buffer
  4623 0000DC6B 01D7                <1> 	add	edi, edx ; next row of window (system)
  4624 0000DC6D EBEA                <1> 	jmp	short pix_op_cpy_w_0
  4625                              <1> 
  4626                              <1> pix_op_add:
  4627                              <1> 	; 31/01/2021
  4628                              <1> 	; 30/01/2021
  4629                              <1> 	; ADD COLOR
  4630                              <1> 	;
  4631                              <1> 	; INPUT:
  4632                              <1> 	;   CL = color (8 bit, 256 colors)
  4633                              <1> 	;  ECX = color (16 bit and true colors)
  4634                              <1> 	;  EDX = start position (row, column)
  4635                              <1> 	;        (HW = row, DX = column)
  4636                              <1> 	;  ESI = size (rows, colums)
  4637                              <1> 	;        (HW = rows, SI = columns)
  4638                              <1> 	;
  4639                              <1> 	;  [maskcolor] = mask color (to be excluded)
  4640                              <1> 	;
  4641                              <1> 	; OUTPUT:
  4642                              <1> 	; 	[u.r0] will be > 0 if succesful
  4643                              <1> 	
  4644 0000DC6F F605[409F0100]10    <1> 	test	byte [v_ops], 10h ; display page or window ?
  4645 0000DC76 7555                <1> 	jnz	short pix_op_add_w ; window
  4646                              <1> 	
  4647 0000DC78 8B3D[429F0100]      <1> 	mov	edi, [v_mem]
  4648 0000DC7E 89FE                <1> 	mov	esi, edi
  4649                              <1> 	; ecx = color (CL, CX, ECX)
  4650 0000DC80 89C8                <1> 	mov	eax, ecx
  4651 0000DC82 8B0D[469F0100]      <1> 	mov	ecx, [v_siz] ; display page pixel count
  4652                              <1> 
  4653 0000DC88 F605[409F0100]20    <1> 	test	byte [v_ops], 20h ; masked color adding ?
  4654 0000DC8F 7405                <1> 	jz	short pix_op_add_0 ; no
  4655 0000DC91 E9CB100000          <1> 	jmp	m_pix_op_add ; add color except mask color
  4656                              <1> pix_op_add_0:
  4657 0000DC96 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  4658 0000DC9D 7707                <1> 	ja	short pix_op_add_1
  4659                              <1> 
  4660                              <1> 	; 256 colors (8bpp)
  4661 0000DC9F E84C0A0000          <1> 	call	pix_op_add_8
  4662 0000DCA4 EB1E                <1> 	jmp	short pix_op_add_4	
  4663                              <1> 			
  4664                              <1> pix_op_add_1:
  4665 0000DCA6 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  4666 0000DCAD 7710                <1> 	ja	short pix_op_add_3 ; 32bpp	
  4667 0000DCAF 7207                <1> 	jb	short pix_op_add_2 ; 16bpp
  4668                              <1> 	
  4669                              <1> 	; 24 bit true colors
  4670 0000DCB1 E85A0A0000          <1> 	call	pix_op_add_24
  4671 0000DCB6 EB0C                <1> 	jmp	short pix_op_add_4
  4672                              <1> 
  4673                              <1> 	; 65536 colors (16bpp)
  4674                              <1> pix_op_add_2:
  4675 0000DCB8 E8410A0000          <1> 	call	pix_op_add_16
  4676 0000DCBD EB05                <1> 	jmp	short pix_op_add_4
  4677                              <1> 
  4678                              <1> 	; 32 bit true colors
  4679                              <1> pix_op_add_3:
  4680 0000DCBF E86C0A0000          <1> 	call	pix_op_add_32
  4681                              <1> pix_op_add_4:
  4682 0000DCC4 29F7                <1> 	sub	edi, esi
  4683 0000DCC6 893D[20900100]      <1> 	mov	[u.r0], edi	
  4684                              <1> pix_op_add_5:
  4685 0000DCCC C3                  <1> 	retn		
  4686                              <1> 
  4687                              <1> pix_op_add_w:
  4688                              <1> 	; 31/01/2021
  4689 0000DCCD 51                  <1> 	push	ecx ; * ; color
  4690 0000DCCE 89D1                <1> 	mov	ecx, edx ; win start pos
  4691 0000DCD0 89F2                <1> 	mov	edx, esi ; size (rows, cols)
  4692 0000DCD2 E828FEFFFF          <1> 	call	sysvideo_15_12 ; window preparations
  4693 0000DCD7 58                  <1> 	pop	eax ; * ; color
  4694 0000DCD8 72F2                <1> 	jc	short pix_op_add_5
  4695                              <1> 
  4696 0000DCDA F605[409F0100]20    <1> 	test	byte [v_ops], 20h ; masked color adding ?
  4697 0000DCE1 7405                <1> 	jz	short pix_op_add_w_0 ; no
  4698 0000DCE3 E927110000          <1> 	jmp	m_pix_op_add_w 
  4699                              <1> 			; window add color except mask color
  4700                              <1> pix_op_add_w_0:
  4701                              <1> 	; ecx = bytes per row (to be applied)
  4702                              <1> 	; edx = screen width in bytes
  4703                              <1> 	; ebx = row count
  4704                              <1> 	; eax = color
  4705                              <1> 
  4706 0000DCE8 8B3D[4A9F0100]      <1> 	mov	edi, [v_str]
  4707 0000DCEE 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  4708 0000DCF5 7707                <1> 	ja	short pix_op_add_w_1
  4709                              <1> 
  4710                              <1> 	; 256 colors (8bpp)
  4711 0000DCF7 BD[F0E60000]        <1> 	mov	ebp, pix_op_add_8
  4712 0000DCFC EB1E                <1> 	jmp	short pix_op_add_w_4
  4713                              <1> 			
  4714                              <1> pix_op_add_w_1:
  4715 0000DCFE 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  4716 0000DD05 7710                <1> 	ja	short pix_op_add_w_3 ; 32bpp
  4717 0000DD07 7207                <1> 	jb	short pix_op_add_w_2 ; 16bpp
  4718                              <1> 
  4719                              <1> 	; 24 bit true colors
  4720 0000DD09 BD[10E70000]        <1> 	mov	ebp, pix_op_add_24
  4721 0000DD0E EB0C                <1> 	jmp	short pix_op_add_w_4
  4722                              <1> 
  4723                              <1> 	; 65536 colors (16bpp)
  4724                              <1> pix_op_add_w_2:
  4725 0000DD10 BD[FEE60000]        <1> 	mov	ebp, pix_op_add_16
  4726 0000DD15 EB05                <1> 	jmp	short pix_op_add_w_4
  4727                              <1> 
  4728                              <1> 	; 32 bit true colors
  4729                              <1> pix_op_add_w_3:
  4730 0000DD17 BD[30E70000]        <1> 	mov	ebp, pix_op_add_32
  4731                              <1> pix_op_add_w_4:
  4732 0000DD1C E95F010000          <1> 	jmp	pix_op_add_w_x
  4733                              <1> 
  4734                              <1> pix_op_sub:
  4735                              <1> 	; 31/01/2021
  4736                              <1> 	; SUB COLOR
  4737                              <1> 	;
  4738                              <1> 	; INPUT:
  4739                              <1> 	;   CL = color (8 bit, 256 colors)
  4740                              <1> 	;  ECX = color (16 bit and true colors)
  4741                              <1> 	;  EDX = start position (row, column)
  4742                              <1> 	;        (HW = row, DX = column)
  4743                              <1> 	;  ESI = size (rows, colums)
  4744                              <1> 	;        (HW = rows, SI = columns)
  4745                              <1> 	;
  4746                              <1> 	;  [maskcolor] = mask color (to be excluded)
  4747                              <1> 	;
  4748                              <1> 	; OUTPUT:
  4749                              <1> 	; 	[u.r0] will be > 0 if succesful
  4750                              <1> 	
  4751 0000DD21 F605[409F0100]10    <1> 	test	byte [v_ops], 10h ; display page or window ?
  4752 0000DD28 7555                <1> 	jnz	short pix_op_sub_w ; window
  4753                              <1> 	
  4754 0000DD2A 8B3D[429F0100]      <1> 	mov	edi, [v_mem]
  4755 0000DD30 89FE                <1> 	mov	esi, edi
  4756                              <1> 	; ecx = color (CL, CX, ECX)
  4757 0000DD32 89C8                <1> 	mov	eax, ecx
  4758 0000DD34 8B0D[469F0100]      <1> 	mov	ecx, [v_siz] ; display page pixel count
  4759                              <1> 
  4760 0000DD3A F605[409F0100]20    <1> 	test	byte [v_ops], 20h ; masked color subtract ?
  4761 0000DD41 7405                <1> 	jz	short pix_op_sub_0 ; no
  4762 0000DD43 E9FA100000          <1> 	jmp	m_pix_op_sub ; sub color except mask color
  4763                              <1> pix_op_sub_0:
  4764 0000DD48 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  4765 0000DD4F 7707                <1> 	ja	short pix_op_sub_1
  4766                              <1> 
  4767                              <1> 	; 256 colors (8bpp)
  4768 0000DD51 E8E9090000          <1> 	call	pix_op_sub_8
  4769 0000DD56 EB1E                <1> 	jmp	short pix_op_sub_4	
  4770                              <1> 			
  4771                              <1> pix_op_sub_1:
  4772 0000DD58 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  4773 0000DD5F 7710                <1> 	ja	short pix_op_sub_3 ; 32bpp	
  4774 0000DD61 7207                <1> 	jb	short pix_op_sub_2 ; 16bpp
  4775                              <1> 	
  4776                              <1> 	; 24 bit true colors
  4777 0000DD63 E8FA090000          <1> 	call	pix_op_sub_24
  4778 0000DD68 EB0C                <1> 	jmp	short pix_op_sub_4
  4779                              <1> 
  4780                              <1> 	; 65536 colors (16bpp)
  4781                              <1> pix_op_sub_2:
  4782 0000DD6A E8E0090000          <1> 	call	pix_op_sub_16
  4783 0000DD6F EB05                <1> 	jmp	short pix_op_sub_4
  4784                              <1> 
  4785                              <1> 	; 32 bit true colors
  4786                              <1> pix_op_sub_3:
  4787 0000DD71 E8060A0000          <1> 	call	pix_op_sub_32
  4788                              <1> pix_op_sub_4:
  4789 0000DD76 29F7                <1> 	sub	edi, esi
  4790 0000DD78 893D[20900100]      <1> 	mov	[u.r0], edi	
  4791                              <1> pix_op_sub_5:
  4792 0000DD7E C3                  <1> 	retn		
  4793                              <1> 
  4794                              <1> pix_op_sub_w:
  4795                              <1> 	; 31/01/2021
  4796 0000DD7F 51                  <1> 	push	ecx ; * ; color
  4797 0000DD80 89D1                <1> 	mov	ecx, edx ; win start pos
  4798 0000DD82 89F2                <1> 	mov	edx, esi ; size (rows, cols)
  4799 0000DD84 E876FDFFFF          <1> 	call	sysvideo_15_12 ; window preparations
  4800 0000DD89 58                  <1> 	pop	eax ; * ; color
  4801 0000DD8A 72F2                <1> 	jc	short pix_op_sub_5
  4802                              <1> 
  4803 0000DD8C F605[409F0100]20    <1> 	test	byte [v_ops], 20h ; masked color subtract ?
  4804 0000DD93 7405                <1> 	jz	short pix_op_sub_w_0 ; no
  4805 0000DD95 E94B110000          <1> 	jmp	m_pix_op_sub_w 
  4806                              <1> 			; window sub color except mask color
  4807                              <1> pix_op_sub_w_0:
  4808                              <1> 	; ecx = bytes per row (to be applied)
  4809                              <1> 	; edx = screen width in bytes
  4810                              <1> 	; ebx = row count
  4811                              <1> 	; eax = color
  4812                              <1> 
  4813 0000DD9A 8B3D[4A9F0100]      <1> 	mov	edi, [v_str]
  4814 0000DDA0 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  4815 0000DDA7 7707                <1> 	ja	short pix_op_sub_w_1
  4816                              <1> 
  4817                              <1> 	; 256 colors (8bpp)
  4818 0000DDA9 BD[3FE70000]        <1> 	mov	ebp, pix_op_sub_8
  4819 0000DDAE EB1E                <1> 	jmp	short pix_op_sub_w_4
  4820                              <1> 			
  4821                              <1> pix_op_sub_w_1:
  4822 0000DDB0 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  4823 0000DDB7 7710                <1> 	ja	short pix_op_sub_w_3 ; 32bpp
  4824 0000DDB9 7207                <1> 	jb	short pix_op_sub_w_2 ; 16bpp
  4825                              <1> 
  4826                              <1> 	; 24 bit true colors
  4827 0000DDBB BD[62E70000]        <1> 	mov	ebp, pix_op_sub_24
  4828 0000DDC0 EB0C                <1> 	jmp	short pix_op_sub_w_4
  4829                              <1> 
  4830                              <1> 	; 65536 colors (16bpp)
  4831                              <1> pix_op_sub_w_2:
  4832 0000DDC2 BD[4FE70000]        <1> 	mov	ebp, pix_op_sub_16
  4833 0000DDC7 EB05                <1> 	jmp	short pix_op_sub_w_4
  4834                              <1> 
  4835                              <1> 	; 32 bit true colors
  4836                              <1> pix_op_sub_w_3:
  4837 0000DDC9 BD[7CE70000]        <1> 	mov	ebp, pix_op_sub_32
  4838                              <1> pix_op_sub_w_4:
  4839 0000DDCE E9AD000000          <1> 	jmp	pix_op_sub_w_x
  4840                              <1> 
  4841                              <1> pix_op_mix:
  4842                              <1> 	; 31/01/2021
  4843                              <1> 	; MIX COLOR
  4844                              <1> 	;
  4845                              <1> 	; INPUT:
  4846                              <1> 	;   CL = color (8 bit, 256 colors)
  4847                              <1> 	;  ECX = color (16 bit and true colors)
  4848                              <1> 	;  EDX = start position (row, column)
  4849                              <1> 	;        (HW = row, DX = column)
  4850                              <1> 	;  ESI = size (rows, colums)
  4851                              <1> 	;        (HW = rows, SI = columns)
  4852                              <1> 	;
  4853                              <1> 	;  [maskcolor] = mask color (to be excluded)
  4854                              <1> 	;
  4855                              <1> 	; OUTPUT:
  4856                              <1> 	; 	[u.r0] will be > 0 if succesful
  4857                              <1> 	
  4858 0000DDD3 F605[409F0100]10    <1> 	test	byte [v_ops], 10h ; display page or window ?
  4859 0000DDDA 7555                <1> 	jnz	short pix_op_mix_w ; window
  4860                              <1> 	
  4861 0000DDDC 8B3D[429F0100]      <1> 	mov	edi, [v_mem]
  4862 0000DDE2 89FE                <1> 	mov	esi, edi
  4863                              <1> 	; ecx = color (CL, CX, ECX)
  4864 0000DDE4 89C8                <1> 	mov	eax, ecx
  4865 0000DDE6 8B0D[469F0100]      <1> 	mov	ecx, [v_siz] ; display page pixel count
  4866                              <1> 
  4867 0000DDEC F605[409F0100]20    <1> 	test	byte [v_ops], 20h ; masked color mix ?
  4868 0000DDF3 7405                <1> 	jz	short pix_op_mix_0 ; no
  4869 0000DDF5 E91E110000          <1> 	jmp	m_pix_op_mix ; mix colors except mask color
  4870                              <1> pix_op_mix_0:
  4871 0000DDFA 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  4872 0000DE01 7707                <1> 	ja	short pix_op_mix_1
  4873                              <1> 
  4874                              <1> 	; 256 colors (8bpp)
  4875 0000DE03 E8F3090000          <1> 	call	pix_op_mix_8
  4876 0000DE08 EB1E                <1> 	jmp	short pix_op_mix_4	
  4877                              <1> 			
  4878                              <1> pix_op_mix_1:
  4879 0000DE0A 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  4880 0000DE11 7710                <1> 	ja	short pix_op_mix_3 ; 32bpp	
  4881 0000DE13 7207                <1> 	jb	short pix_op_mix_2 ; 16bpp
  4882                              <1> 	
  4883                              <1> 	; 24 bit true colors
  4884 0000DE15 E8FC090000          <1> 	call	pix_op_mix_24
  4885 0000DE1A EB0C                <1> 	jmp	short pix_op_mix_4
  4886                              <1> 
  4887                              <1> 	; 65536 colors (16bpp)
  4888                              <1> pix_op_mix_2:
  4889 0000DE1C E8E6090000          <1> 	call	pix_op_mix_16
  4890 0000DE21 EB05                <1> 	jmp	short pix_op_mix_4
  4891                              <1> 
  4892                              <1> 	; 32 bit true colors
  4893                              <1> pix_op_mix_3:
  4894 0000DE23 E80A0A0000          <1> 	call	pix_op_mix_32
  4895                              <1> pix_op_mix_4:
  4896 0000DE28 29F7                <1> 	sub	edi, esi
  4897 0000DE2A 893D[20900100]      <1> 	mov	[u.r0], edi	
  4898                              <1> pix_op_mix_5:
  4899 0000DE30 C3                  <1> 	retn		
  4900                              <1> 
  4901                              <1> pix_op_mix_w:
  4902                              <1> 	; 31/01/2021
  4903 0000DE31 51                  <1> 	push	ecx ; * ; color
  4904 0000DE32 89D1                <1> 	mov	ecx, edx ; win start pos
  4905 0000DE34 89F2                <1> 	mov	edx, esi ; size (rows, cols)
  4906 0000DE36 E8C4FCFFFF          <1> 	call	sysvideo_15_12 ; window preparations
  4907 0000DE3B 58                  <1> 	pop	eax ; * ; color
  4908 0000DE3C 72F2                <1> 	jc	short pix_op_mix_5
  4909                              <1> 
  4910 0000DE3E F605[409F0100]20    <1> 	test	byte [v_ops], 20h ; masked color mix ?
  4911 0000DE45 7405                <1> 	jz	short pix_op_mix_w_0 ; no
  4912 0000DE47 E969110000          <1> 	jmp	m_pix_op_mix_w 
  4913                              <1> 			; window mix colors except mask color
  4914                              <1> pix_op_mix_w_0:
  4915                              <1> 	; ecx = bytes per row (to be applied)
  4916                              <1> 	; edx = screen width in bytes
  4917                              <1> 	; ebx = row count
  4918                              <1> 	; eax = color
  4919                              <1> 
  4920 0000DE4C 8B3D[4A9F0100]      <1> 	mov	edi, [v_str]
  4921 0000DE52 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  4922 0000DE59 7707                <1> 	ja	short pix_op_mix_w_1
  4923                              <1> 
  4924                              <1> 	; 256 colors (8bpp)
  4925 0000DE5B BD[FBE70000]        <1> 	mov	ebp, pix_op_mix_8
  4926 0000DE60 EB1E                <1> 	jmp	short pix_op_mix_w_x
  4927                              <1> 			
  4928                              <1> pix_op_mix_w_1:
  4929 0000DE62 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  4930 0000DE69 7710                <1> 	ja	short pix_op_mix_w_3 ; 32bpp
  4931 0000DE6B 7207                <1> 	jb	short pix_op_mix_w_2 ; 16bpp
  4932                              <1> 
  4933                              <1> 	; 24 bit true colors
  4934 0000DE6D BD[16E80000]        <1> 	mov	ebp, pix_op_mix_24
  4935 0000DE72 EB0C                <1> 	jmp	short pix_op_mix_w_x
  4936                              <1> 
  4937                              <1> 	; 65536 colors (16bpp)
  4938                              <1> pix_op_mix_w_2:
  4939 0000DE74 BD[07E80000]        <1> 	mov	ebp, pix_op_mix_16
  4940 0000DE79 EB05                <1> 	jmp	short pix_op_mix_w_x
  4941                              <1> 
  4942                              <1> 	; 32 bit true colors
  4943                              <1> pix_op_mix_w_3:
  4944 0000DE7B BD[32E80000]        <1> 	mov	ebp, pix_op_mix_32
  4945                              <1> 	;jmp	short pix_op_mix_w_x
  4946                              <1> 
  4947                              <1> pix_op_mix_w_x:
  4948                              <1> pix_op_add_w_x:
  4949                              <1> pix_op_sub_w_x:
  4950                              <1> pix_op_rpl_w_x:
  4951                              <1> pix_op_orc_w_x:
  4952                              <1> pix_op_and_w_x:
  4953                              <1> pix_op_xor_w_x:
  4954                              <1> 	; 27/02/2021
  4955                              <1> 	; 31/01/2021
  4956                              <1> 	; ecx = bytes per row (to be applied)
  4957                              <1> 	; edx = windows (screen) width in bytes
  4958                              <1> 	; ebx = row count
  4959                              <1> 	; eax = color
  4960                              <1> 	; ebp = pixel operation subroutine address
  4961 0000DE80 52                  <1> 	push	edx
  4962 0000DE81 51                  <1> 	push	ecx
  4963 0000DE82 57                  <1> 	push	edi
  4964 0000DE83 8B0D[569F0100]      <1> 	mov	ecx, [pixcount] ; 27/02/2021
  4965 0000DE89 FFD5                <1> 	call	ebp ; call pixel-row operation
  4966 0000DE8B 5F                  <1> 	pop	edi
  4967 0000DE8C 59                  <1> 	pop	ecx ; bytes per row
  4968 0000DE8D 010D[20900100]      <1> 	add	[u.r0], ecx
  4969 0000DE93 5A                  <1> 	pop	edx
  4970 0000DE94 01D7                <1> 	add	edi, edx ; next row
  4971 0000DE96 4B                  <1> 	dec	ebx
  4972 0000DE97 75E7                <1> 	jnz	short pix_op_mix_w_x
  4973 0000DE99 C3                  <1> 	retn
  4974                              <1> 
  4975                              <1> pix_op_rpl:
  4976                              <1> 	; 01/02/2021
  4977                              <1> 	; REPLACE COLOR
  4978                              <1> 	;
  4979                              <1> 	; INPUT:
  4980                              <1> 	;   CL = old/current color (8 bit, 256 colors)
  4981                              <1> 	;  ECX = old/current color (16 bit and true colors)
  4982                              <1> 	;   DL = new color (8 bit, 256 colors)
  4983                              <1> 	;  EDX = new color (16 bit and true colors)
  4984                              <1> 	;  ESI = start position (row, column)
  4985                              <1> 	;        (HW = row, DX = column)
  4986                              <1> 	;  EDI = size (rows, colums)
  4987                              <1> 	;        (HW = rows, SI = columns)
  4988                              <1> 	; OUTPUT:
  4989                              <1> 	; 	[u.r0] will be > 0 if succesful
  4990                              <1> 	
  4991 0000DE9A F605[409F0100]10    <1> 	test	byte [v_ops], 10h ; display page or window ?
  4992 0000DEA1 754D                <1> 	jnz	short pix_op_rpl_w ; window
  4993                              <1> 	
  4994 0000DEA3 8B3D[429F0100]      <1> 	mov	edi, [v_mem]
  4995 0000DEA9 89FE                <1> 	mov	esi, edi
  4996                              <1> 	; ecx = old color (CL, CX, ECX) -to be replaced with-
  4997                              <1> 	; edx = new color (CL, CX, ECX) -new one-
  4998 0000DEAB 89D0                <1> 	mov	eax, edx ; new color
  4999 0000DEAD 890D[529F0100]      <1> 	mov	[maskcolor], ecx ; old color
  5000 0000DEB3 8B0D[469F0100]      <1> 	mov	ecx, [v_siz] ; display page pixel count
  5001                              <1> pix_op_rpl_0:
  5002 0000DEB9 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5003 0000DEC0 7707                <1> 	ja	short pix_op_rpl_1
  5004                              <1> 
  5005                              <1> 	; 256 colors (8bpp)
  5006 0000DEC2 E82F0A0000          <1> 	call	pix_op_rpl_8
  5007 0000DEC7 EB1E                <1> 	jmp	short pix_op_rpl_4
  5008                              <1> 			
  5009                              <1> pix_op_rpl_1:
  5010 0000DEC9 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5011 0000DED0 7710                <1> 	ja	short pix_op_rpl_3 ; 32bpp	
  5012 0000DED2 7207                <1> 	jb	short pix_op_rpl_2 ; 16bpp
  5013                              <1> 
  5014                              <1> 	; 24 bit true colors
  5015 0000DED4 E8400A0000          <1> 	call	pix_op_rpl_24
  5016 0000DED9 EB0C                <1> 	jmp	short pix_op_rpl_4
  5017                              <1> 
  5018                              <1> 	; 65536 colors (16bpp)
  5019                              <1> pix_op_rpl_2:
  5020 0000DEDB E8260A0000          <1> 	call	pix_op_rpl_16
  5021 0000DEE0 EB05                <1> 	jmp	short pix_op_rpl_4
  5022                              <1> 
  5023                              <1> 	; 32 bit true colors	
  5024                              <1> pix_op_rpl_3:
  5025 0000DEE2 E8540A0000          <1> 	call	pix_op_rpl_32
  5026                              <1> pix_op_rpl_4:
  5027 0000DEE7 29F7                <1> 	sub	edi, esi
  5028 0000DEE9 893D[20900100]      <1> 	mov	[u.r0], edi	
  5029                              <1> pix_op_rpl_5:
  5030 0000DEEF C3                  <1> 	retn
  5031                              <1> 
  5032                              <1> pix_op_rpl_w:
  5033                              <1> 	; 01/02/2021
  5034 0000DEF0 890D[529F0100]      <1> 	mov	[maskcolor], ecx ; old color
  5035 0000DEF6 52                  <1> 	push	edx ; * ; new color
  5036 0000DEF7 89F1                <1> 	mov	ecx, esi ; win start pos
  5037 0000DEF9 89FA                <1> 	mov	edx, edi ; size (rows, cols)
  5038 0000DEFB E8FFFBFFFF          <1> 	call	sysvideo_15_12 ; window preparations
  5039 0000DF00 58                  <1> 	pop	eax ; * ; new color
  5040 0000DF01 72EC                <1> 	jc	short pix_op_rpl_5
  5041                              <1> 
  5042                              <1> 	; replace window color
  5043                              <1> pix_op_rpl_w_0:
  5044                              <1> 	; ecx = bytes per row (to be applied)
  5045                              <1> 	; edx = screen width in bytes
  5046                              <1> 	; ebx = row count
  5047                              <1> 	; eax = new color
  5048                              <1> 	; [maskcolor] = old color
  5049                              <1>  
  5050 0000DF03 8B3D[4A9F0100]      <1> 	mov	edi, [v_str]
  5051                              <1> 
  5052 0000DF09 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5053 0000DF10 7707                <1> 	ja	short pix_op_rpl_w_1
  5054                              <1> 
  5055                              <1> 	; 256 colors (8bpp)
  5056 0000DF12 BD[F6E80000]        <1> 	mov	ebp, pix_op_rpl_8
  5057 0000DF17 EB1E                <1> 	jmp	short pix_op_rpl_w_4
  5058                              <1> 			
  5059                              <1> pix_op_rpl_w_1:
  5060 0000DF19 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5061 0000DF20 7710                <1> 	ja	short pix_op_rpl_w_3 ; 32bpp
  5062 0000DF22 7207                <1> 	jb	short pix_op_rpl_w_2 ; 16bpp
  5063                              <1> 
  5064                              <1> 	; 24 bit true colors
  5065 0000DF24 BD[19E90000]        <1> 	mov	ebp, pix_op_rpl_24
  5066 0000DF29 EB0C                <1> 	jmp	short pix_op_rpl_w_4
  5067                              <1> 
  5068                              <1> 	; 65536 colors (16bpp)
  5069                              <1> pix_op_rpl_w_2:
  5070 0000DF2B BD[06E90000]        <1> 	mov	ebp, pix_op_rpl_16
  5071 0000DF30 EB05                <1> 	jmp	short pix_op_rpl_w_4
  5072                              <1> 
  5073                              <1> 	; 32 bit true colors
  5074                              <1> pix_op_rpl_w_3:
  5075 0000DF32 BD[3BE90000]        <1> 	mov	ebp, pix_op_rpl_32
  5076                              <1> pix_op_rpl_w_4:
  5077 0000DF37 E944FFFFFF          <1> 	jmp	pix_op_rpl_w_x
  5078                              <1> 
  5079                              <1> pix_op_orc:
  5080                              <1> 	; 31/01/2021
  5081                              <1> 	; OR COLOR
  5082                              <1> 	;
  5083                              <1> 	; INPUT:
  5084                              <1> 	;   CL = color (8 bit, 256 colors)
  5085                              <1> 	;  ECX = color (16 bit and true colors)
  5086                              <1> 	;  EDX = start position (row, column)
  5087                              <1> 	;        (HW = row, DX = column)
  5088                              <1> 	;  ESI = size (rows, colums)
  5089                              <1> 	;        (HW = rows, SI = columns)
  5090                              <1> 	;
  5091                              <1> 	;  [maskcolor] = mask color (to be excluded)
  5092                              <1> 	;
  5093                              <1> 	; OUTPUT:
  5094                              <1> 	; 	[u.r0] will be > 0 if succesful
  5095                              <1> 	
  5096 0000DF3C F605[409F0100]10    <1> 	test	byte [v_ops], 10h ; display page or window ?
  5097 0000DF43 7555                <1> 	jnz	short pix_op_or_w ; window
  5098                              <1> 	
  5099 0000DF45 8B3D[429F0100]      <1> 	mov	edi, [v_mem]
  5100 0000DF4B 89FE                <1> 	mov	esi, edi
  5101                              <1> 	; ecx = color (CL, CX, ECX)
  5102 0000DF4D 89C8                <1> 	mov	eax, ecx
  5103 0000DF4F 8B0D[469F0100]      <1> 	mov	ecx, [v_siz] ; display page pixel count
  5104                              <1> 
  5105 0000DF55 F605[409F0100]20    <1> 	test	byte [v_ops], 20h ; masked color 'or' ?
  5106 0000DF5C 7405                <1> 	jz	short pix_op_or_0 ; no
  5107 0000DF5E E945110000          <1> 	jmp	m_pix_op_or ; 'or' color except mask color
  5108                              <1> pix_op_or_0:
  5109 0000DF63 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5110 0000DF6A 7707                <1> 	ja	short pix_op_or_1
  5111                              <1> 
  5112                              <1> 	; 256 colors (8bpp)
  5113 0000DF6C E81B080000          <1> 	call	pix_op_or_8
  5114 0000DF71 EB1E                <1> 	jmp	short pix_op_or_4	
  5115                              <1> 			
  5116                              <1> pix_op_or_1:
  5117 0000DF73 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5118 0000DF7A 7710                <1> 	ja	short pix_op_or_3 ; 32bpp	
  5119 0000DF7C 7207                <1> 	jb	short pix_op_or_2 ; 16bpp
  5120                              <1> 	
  5121                              <1> 	; 24 bit true colors
  5122 0000DF7E E817080000          <1> 	call	pix_op_or_24
  5123 0000DF83 EB0C                <1> 	jmp	short pix_op_or_4
  5124                              <1> 
  5125                              <1> 	; 65536 colors (16bpp)
  5126                              <1> pix_op_or_2:
  5127 0000DF85 E808080000          <1> 	call	pix_op_or_16
  5128 0000DF8A EB05                <1> 	jmp	short pix_op_or_4
  5129                              <1> 
  5130                              <1> 	; 32 bit true colors
  5131                              <1> pix_op_or_3:
  5132 0000DF8C E818080000          <1> 	call	pix_op_or_32
  5133                              <1> pix_op_or_4:
  5134 0000DF91 29F7                <1> 	sub	edi, esi
  5135 0000DF93 893D[20900100]      <1> 	mov	[u.r0], edi	
  5136                              <1> pix_op_or_5:
  5137 0000DF99 C3                  <1> 	retn		
  5138                              <1> 
  5139                              <1> pix_op_or_w:
  5140                              <1> 	; 31/01/2021
  5141 0000DF9A 51                  <1> 	push	ecx ; * ; color
  5142 0000DF9B 89D1                <1> 	mov	ecx, edx ; win start pos
  5143 0000DF9D 89F2                <1> 	mov	edx, esi ; size (rows, cols)
  5144 0000DF9F E85BFBFFFF          <1> 	call	sysvideo_15_12 ; window preparations
  5145 0000DFA4 58                  <1> 	pop	eax ; * ; color
  5146 0000DFA5 72F2                <1> 	jc	short pix_op_or_5
  5147                              <1> 
  5148 0000DFA7 F605[409F0100]20    <1> 	test	byte [v_ops], 20h ; masked color 'or' ?
  5149 0000DFAE 7405                <1> 	jz	short pix_op_or_w_0 ; no
  5150 0000DFB0 E980110000          <1> 	jmp	m_pix_op_or_w 
  5151                              <1> 			; window 'or' color except mask color
  5152                              <1> pix_op_or_w_0:
  5153                              <1> 	; ecx = bytes per row (to be applied)
  5154                              <1> 	; edx = screen width in bytes
  5155                              <1> 	; ebx = row count
  5156                              <1> 	; eax = color
  5157                              <1> 
  5158 0000DFB5 8B3D[4A9F0100]      <1> 	mov	edi, [v_str]
  5159 0000DFBB 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5160 0000DFC2 7707                <1> 	ja	short pix_op_or_w_1
  5161                              <1> 
  5162                              <1> 	; 256 colors (8bpp)
  5163 0000DFC4 BD[8CE70000]        <1> 	mov	ebp, pix_op_or_8
  5164 0000DFC9 EB1E                <1> 	jmp	short pix_op_or_w_4
  5165                              <1> 			
  5166                              <1> pix_op_or_w_1:
  5167 0000DFCB 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5168 0000DFD2 7710                <1> 	ja	short pix_op_or_w_3 ; 32bpp
  5169 0000DFD4 7207                <1> 	jb	short pix_op_or_w_2 ; 16bpp
  5170                              <1> 
  5171                              <1> 	; 24 bit true colors
  5172 0000DFD6 BD[9AE70000]        <1> 	mov	ebp, pix_op_or_24
  5173 0000DFDB EB0C                <1> 	jmp	short pix_op_or_w_4
  5174                              <1> 
  5175                              <1> 	; 65536 colors (16bpp)
  5176                              <1> pix_op_or_w_2:
  5177 0000DFDD BD[92E70000]        <1> 	mov	ebp, pix_op_or_16
  5178 0000DFE2 EB05                <1> 	jmp	short pix_op_or_w_4
  5179                              <1> 
  5180                              <1> 	; 32 bit true colors
  5181                              <1> pix_op_or_w_3:
  5182 0000DFE4 BD[A9E70000]        <1> 	mov	ebp, pix_op_or_32
  5183                              <1> pix_op_or_w_4:
  5184 0000DFE9 E992FEFFFF          <1> 	jmp	pix_op_orc_w_x
  5185                              <1> 
  5186                              <1> pix_op_and:
  5187                              <1> 	; 31/01/2021
  5188                              <1> 	; AND COLOR
  5189                              <1> 	;
  5190                              <1> 	; INPUT:
  5191                              <1> 	;   CL = color (8 bit, 256 colors)
  5192                              <1> 	;  ECX = color (16 bit and true colors)
  5193                              <1> 	;  EDX = start position (row, column)
  5194                              <1> 	;        (HW = row, DX = column)
  5195                              <1> 	;  ESI = size (rows, colums)
  5196                              <1> 	;        (HW = rows, SI = columns)
  5197                              <1> 	;
  5198                              <1> 	;  [maskcolor] = mask color (to be excluded)
  5199                              <1> 	;
  5200                              <1> 	; OUTPUT:
  5201                              <1> 	; 	[u.r0] will be > 0 if succesful
  5202                              <1> 	
  5203 0000DFEE F605[409F0100]10    <1> 	test	byte [v_ops], 10h ; display page or window ?
  5204 0000DFF5 7555                <1> 	jnz	short pix_op_and_w ; window
  5205                              <1> 	
  5206 0000DFF7 8B3D[429F0100]      <1> 	mov	edi, [v_mem]
  5207 0000DFFD 89FE                <1> 	mov	esi, edi
  5208                              <1> 	; ecx = color (CL, CX, ECX)
  5209 0000DFFF 89C8                <1> 	mov	eax, ecx
  5210 0000E001 8B0D[469F0100]      <1> 	mov	ecx, [v_siz] ; display page pixel count
  5211                              <1> 
  5212 0000E007 F605[409F0100]20    <1> 	test	byte [v_ops], 20h ; masked color 'and' ?
  5213 0000E00E 7405                <1> 	jz	short pix_op_and_0 ; no
  5214 0000E010 E9D30F0000          <1> 	jmp	m_pix_op_and ; 'and' color except mask color
  5215                              <1> pix_op_and_0:
  5216 0000E015 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5217 0000E01C 7707                <1> 	ja	short pix_op_and_1
  5218                              <1> 
  5219                              <1> 	; 256 colors (8bpp)
  5220 0000E01E E88E070000          <1> 	call	pix_op_and_8
  5221 0000E023 EB1E                <1> 	jmp	short pix_op_and_4	
  5222                              <1> 			
  5223                              <1> pix_op_and_1:
  5224 0000E025 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5225 0000E02C 7710                <1> 	ja	short pix_op_and_3 ; 32bpp	
  5226 0000E02E 7207                <1> 	jb	short pix_op_and_2 ; 16bpp
  5227                              <1> 	
  5228                              <1> 	; 24 bit true colors
  5229 0000E030 E88A070000          <1> 	call	pix_op_and_24
  5230 0000E035 EB0C                <1> 	jmp	short pix_op_and_4
  5231                              <1> 
  5232                              <1> 	; 65536 colors (16bpp)
  5233                              <1> pix_op_and_2:
  5234 0000E037 E87B070000          <1> 	call	pix_op_and_16
  5235 0000E03C EB05                <1> 	jmp	short pix_op_and_4
  5236                              <1> 
  5237                              <1> 	; 32 bit true colors
  5238                              <1> pix_op_and_3:
  5239 0000E03E E88B070000          <1> 	call	pix_op_and_32
  5240                              <1> pix_op_and_4:
  5241 0000E043 29F7                <1> 	sub	edi, esi
  5242 0000E045 893D[20900100]      <1> 	mov	[u.r0], edi	
  5243                              <1> pix_op_and_5:
  5244 0000E04B C3                  <1> 	retn		
  5245                              <1> 
  5246                              <1> pix_op_and_w:
  5247                              <1> 	; 31/01/2021
  5248 0000E04C 51                  <1> 	push	ecx ; * ; color
  5249 0000E04D 89D1                <1> 	mov	ecx, edx ; win start pos
  5250 0000E04F 89F2                <1> 	mov	edx, esi ; size (rows, cols)
  5251 0000E051 E8A9FAFFFF          <1> 	call	sysvideo_15_12 ; window preparations
  5252 0000E056 58                  <1> 	pop	eax ; * ; color
  5253 0000E057 72F2                <1> 	jc	short pix_op_and_5
  5254                              <1> 
  5255 0000E059 F605[409F0100]20    <1> 	test	byte [v_ops], 20h ; masked color 'and' ?
  5256 0000E060 7405                <1> 	jz	short pix_op_and_w_0 ; no
  5257 0000E062 E90E100000          <1> 	jmp	m_pix_op_and_w 
  5258                              <1> 			; window 'and' color except mask color
  5259                              <1> pix_op_and_w_0:
  5260                              <1> 	; ecx = bytes per row (to be applied)
  5261                              <1> 	; edx = screen width in bytes
  5262                              <1> 	; ebx = row count
  5263                              <1> 	; eax = color
  5264                              <1> 
  5265 0000E067 8B3D[4A9F0100]      <1> 	mov	edi, [v_str]
  5266 0000E06D 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5267 0000E074 7707                <1> 	ja	short pix_op_and_w_1
  5268                              <1> 
  5269                              <1> 	; 256 colors (8bpp)
  5270 0000E076 BD[B1E70000]        <1> 	mov	ebp, pix_op_and_8
  5271 0000E07B EB1E                <1> 	jmp	short pix_op_and_w_4
  5272                              <1> 			
  5273                              <1> pix_op_and_w_1:
  5274 0000E07D 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5275 0000E084 7710                <1> 	ja	short pix_op_and_w_3 ; 32bpp
  5276 0000E086 7207                <1> 	jb	short pix_op_and_w_2 ; 16bpp
  5277                              <1> 
  5278                              <1> 	; 24 bit true colors
  5279 0000E088 BD[BFE70000]        <1> 	mov	ebp, pix_op_and_24
  5280 0000E08D EB0C                <1> 	jmp	short pix_op_and_w_4
  5281                              <1> 
  5282                              <1> 	; 65536 colors (16bpp)
  5283                              <1> pix_op_and_w_2:
  5284 0000E08F BD[B7E70000]        <1> 	mov	ebp, pix_op_and_16
  5285 0000E094 EB05                <1> 	jmp	short pix_op_and_w_4
  5286                              <1> 
  5287                              <1> 	; 32 bit true colors
  5288                              <1> pix_op_and_w_3:
  5289 0000E096 BD[CEE70000]        <1> 	mov	ebp, pix_op_and_32
  5290                              <1> pix_op_and_w_4:
  5291 0000E09B E9E0FDFFFF          <1> 	jmp	pix_op_and_w_x
  5292                              <1> 
  5293                              <1> pix_op_xor:
  5294                              <1> 	; 31/01/2021
  5295                              <1> 	; XOR COLOR
  5296                              <1> 	;
  5297                              <1> 	; INPUT:
  5298                              <1> 	;   CL = color (8 bit, 256 colors)
  5299                              <1> 	;  ECX = color (16 bit and true colors)
  5300                              <1> 	;  EDX = start position (row, column)
  5301                              <1> 	;        (HW = row, DX = column)
  5302                              <1> 	;  ESI = size (rows, colums)
  5303                              <1> 	;        (HW = rows, SI = columns)
  5304                              <1> 	;
  5305                              <1> 	;  [maskcolor] = mask color (to be excluded)
  5306                              <1> 	;
  5307                              <1> 	; OUTPUT:
  5308                              <1> 	; 	[u.r0] will be > 0 if succesful
  5309                              <1> 	
  5310 0000E0A0 F605[409F0100]10    <1> 	test	byte [v_ops], 10h ; display page or window ?
  5311 0000E0A7 7555                <1> 	jnz	short pix_op_xor_w ; window
  5312                              <1> 	
  5313 0000E0A9 8B3D[429F0100]      <1> 	mov	edi, [v_mem]
  5314 0000E0AF 89FE                <1> 	mov	esi, edi
  5315                              <1> 	; ecx = color (CL, CX, ECX)
  5316 0000E0B1 89C8                <1> 	mov	eax, ecx
  5317 0000E0B3 8B0D[469F0100]      <1> 	mov	ecx, [v_siz] ; display page pixel count
  5318                              <1> 
  5319 0000E0B9 F605[409F0100]20    <1> 	test	byte [v_ops], 20h ; masked color 'xor' ?
  5320 0000E0C0 7405                <1> 	jz	short pix_op_xor_0 ; no
  5321 0000E0C2 E9A1100000          <1> 	jmp	m_pix_op_xor ; 'xor' color except mask color
  5322                              <1> pix_op_xor_0:
  5323 0000E0C7 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5324 0000E0CE 7707                <1> 	ja	short pix_op_xor_1
  5325                              <1> 
  5326                              <1> 	; 256 colors (8bpp)
  5327 0000E0D0 E801070000          <1> 	call	pix_op_xor_8
  5328 0000E0D5 EB1E                <1> 	jmp	short pix_op_xor_4	
  5329                              <1> 			
  5330                              <1> pix_op_xor_1:
  5331 0000E0D7 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5332 0000E0DE 7710                <1> 	ja	short pix_op_xor_3 ; 32bpp	
  5333 0000E0E0 7207                <1> 	jb	short pix_op_xor_2 ; 16bpp
  5334                              <1> 	
  5335                              <1> 	; 24 bit true colors
  5336 0000E0E2 E8FD060000          <1> 	call	pix_op_xor_24
  5337 0000E0E7 EB0C                <1> 	jmp	short pix_op_xor_4
  5338                              <1> 
  5339                              <1> 	; 65536 colors (16bpp)
  5340                              <1> pix_op_xor_2:
  5341 0000E0E9 E8EE060000          <1> 	call	pix_op_xor_16
  5342 0000E0EE EB05                <1> 	jmp	short pix_op_xor_4
  5343                              <1> 
  5344                              <1> 	; 32 bit true colors
  5345                              <1> pix_op_xor_3:
  5346 0000E0F0 E8FE060000          <1> 	call	pix_op_xor_32
  5347                              <1> pix_op_xor_4:
  5348 0000E0F5 29F7                <1> 	sub	edi, esi
  5349 0000E0F7 893D[20900100]      <1> 	mov	[u.r0], edi	
  5350                              <1> pix_op_xor_5:
  5351 0000E0FD C3                  <1> 	retn		
  5352                              <1> 
  5353                              <1> pix_op_xor_w:
  5354                              <1> 	; 31/01/2021
  5355 0000E0FE 51                  <1> 	push	ecx ; * ; color
  5356 0000E0FF 89D1                <1> 	mov	ecx, edx ; win start pos
  5357 0000E101 89F2                <1> 	mov	edx, esi ; size (rows, cols)
  5358 0000E103 E8F7F9FFFF          <1> 	call	sysvideo_15_12 ; window preparations
  5359 0000E108 58                  <1> 	pop	eax ; * ; color
  5360 0000E109 72F2                <1> 	jc	short pix_op_xor_5
  5361                              <1> 
  5362 0000E10B F605[409F0100]20    <1> 	test	byte [v_ops], 20h ; masked color 'xor' ?
  5363 0000E112 7405                <1> 	jz	short pix_op_xor_w_0 ; no
  5364 0000E114 E9DC100000          <1> 	jmp	m_pix_op_xor_w 
  5365                              <1> 			; window 'xor' color except mask color
  5366                              <1> pix_op_xor_w_0:
  5367                              <1> 	; ecx = bytes per row (to be applied)
  5368                              <1> 	; edx = screen width in bytes
  5369                              <1> 	; ebx = row count
  5370                              <1> 	; eax = color
  5371                              <1> 
  5372 0000E119 8B3D[4A9F0100]      <1> 	mov	edi, [v_str]
  5373 0000E11F 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5374 0000E126 7707                <1> 	ja	short pix_op_xor_w_1
  5375                              <1> 
  5376                              <1> 	; 256 colors (8bpp)
  5377 0000E128 BD[D6E70000]        <1> 	mov	ebp, pix_op_xor_8
  5378 0000E12D EB1E                <1> 	jmp	short pix_op_xor_w_4
  5379                              <1> 			
  5380                              <1> pix_op_xor_w_1:
  5381 0000E12F 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5382 0000E136 7710                <1> 	ja	short pix_op_xor_w_3 ; 32bpp
  5383 0000E138 7207                <1> 	jb	short pix_op_xor_w_2 ; 16bpp
  5384                              <1> 
  5385                              <1> 	; 24 bit true colors
  5386 0000E13A BD[E4E70000]        <1> 	mov	ebp, pix_op_xor_24
  5387 0000E13F EB0C                <1> 	jmp	short pix_op_xor_w_4
  5388                              <1> 
  5389                              <1> 	; 65536 colors (16bpp)
  5390                              <1> pix_op_xor_w_2:
  5391 0000E141 BD[DCE70000]        <1> 	mov	ebp, pix_op_xor_16
  5392 0000E146 EB05                <1> 	jmp	short pix_op_xor_w_4
  5393                              <1> 
  5394                              <1> 	; 32 bit true colors
  5395                              <1> pix_op_xor_w_3:
  5396 0000E148 BD[F3E70000]        <1> 	mov	ebp, pix_op_xor_32
  5397                              <1> pix_op_xor_w_4:
  5398 0000E14D E92EFDFFFF          <1> 	jmp	pix_op_xor_w_x
  5399                              <1> 
  5400                              <1> pix_op_new:
  5401                              <1> 	; 31/01/2021
  5402                              <1> 	; 30/01/2021
  5403                              <1> 	; CHANGE COLOR
  5404                              <1> 	;
  5405                              <1> 	; INPUT:
  5406                              <1> 	;   CL = color (8 bit, 256 colors)
  5407                              <1> 	;  ECX = color (16 bit and true colors)
  5408                              <1> 	;  EDX = start position (row, column)
  5409                              <1> 	;        (HW = row, DX = column)
  5410                              <1> 	;  ESI = size (rows, colums)
  5411                              <1> 	;        (HW = rows, SI = columns)
  5412                              <1> 	;
  5413                              <1> 	;  [maskcolor] = mask color (to be excluded)
  5414                              <1> 	;
  5415                              <1> 	; OUTPUT:
  5416                              <1> 	; 	[u.r0] will be > 0 if succesful
  5417                              <1> 	
  5418 0000E152 F605[409F0100]10    <1> 	test	byte [v_ops], 10h ; display page or window ?
  5419 0000E159 7554                <1> 	jnz	short pix_op_new_w ; window
  5420                              <1> 	
  5421 0000E15B 8B3D[429F0100]      <1> 	mov	edi, [v_mem]
  5422 0000E161 89FE                <1> 	mov	esi, edi
  5423                              <1> 	; ecx = color (CL, CX, ECX)
  5424 0000E163 89C8                <1> 	mov	eax, ecx
  5425 0000E165 8B0D[469F0100]      <1> 	mov	ecx, [v_siz] ; display page pixel count
  5426                              <1> 
  5427 0000E16B F605[409F0100]20    <1> 	test	byte [v_ops], 20h ; masked color change ?
  5428 0000E172 7405                <1> 	jz	short pix_op_new_0 ; no
  5429 0000E174 E90A0B0000          <1> 	jmp	m_pix_op_new ; change color except mask color
  5430                              <1> pix_op_new_0:
  5431 0000E179 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5432 0000E180 7706                <1> 	ja	short pix_op_new_2
  5433                              <1> 
  5434                              <1> 	; 256 colors (8bpp)
  5435                              <1> pix_op_new_1:
  5436 0000E182 88C4                <1> 	mov	ah, al
  5437 0000E184 D1E9                <1> 	shr	ecx, 1	
  5438 0000E186 EB12                <1> 	jmp	short pix_op_new_3
  5439                              <1> 			
  5440                              <1> pix_op_new_2:
  5441 0000E188 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5442 0000E18F 7713                <1> 	ja	short pix_op_new_4 ; 32bpp	
  5443 0000E191 7207                <1> 	jb	short pix_op_new_3 ; 16bpp
  5444                              <1> 
  5445                              <1> 	; 31/01/2021
  5446                              <1> 	
  5447                              <1> 	; 24 bit true colors
  5448 0000E193 E849050000          <1> 	call	pix_op_new_24
  5449                              <1> 
  5450 0000E198 EB0C                <1> 	jmp	short pix_op_new_5
  5451                              <1> 
  5452                              <1> 	; 65536 colors (16bpp)
  5453                              <1> pix_op_new_3:
  5454 0000E19A 89C2                <1> 	mov	edx, eax
  5455 0000E19C C1E010              <1> 	shl	eax, 16
  5456 0000E19F 6689D0              <1> 	mov	ax, dx
  5457 0000E1A2 D1E9                <1> 	shr	ecx, 1 ; dword counts
  5458                              <1> 	; 32 bit true colors	
  5459                              <1> pix_op_new_4:
  5460 0000E1A4 F3AB                <1> 	rep	stosd
  5461                              <1> pix_op_new_5:
  5462 0000E1A6 29F7                <1> 	sub	edi, esi
  5463 0000E1A8 893D[20900100]      <1> 	mov	[u.r0], edi	
  5464                              <1> pix_op_new_6:
  5465 0000E1AE C3                  <1> 	retn		
  5466                              <1> 
  5467                              <1> pix_op_new_w:
  5468                              <1> 	; 31/01/2021
  5469                              <1> 	; 30/01/2021
  5470 0000E1AF 51                  <1> 	push	ecx ; * ; color
  5471 0000E1B0 89D1                <1> 	mov	ecx, edx ; win start pos
  5472 0000E1B2 89F2                <1> 	mov	edx, esi ; size (rows, cols)
  5473 0000E1B4 E846F9FFFF          <1> 	call	sysvideo_15_12 ; window preparations
  5474 0000E1B9 58                  <1> 	pop	eax ; * ; color
  5475 0000E1BA 72F2                <1> 	jc	short pix_op_new_6
  5476                              <1> 
  5477 0000E1BC F605[409F0100]20    <1> 	test	byte [v_ops], 20h ; masked color change ?
  5478 0000E1C3 7405                <1> 	jz	short pix_op_new_w_0 ; no
  5479 0000E1C5 E9470B0000          <1> 	jmp	m_pix_op_new_w 
  5480                              <1> 			; window chg color except mask color
  5481                              <1> pix_op_new_w_0:
  5482                              <1> 	; ecx = bytes per row (to be applied)
  5483                              <1> 	; edx = screen width in bytes
  5484                              <1> 	; ebx = row count
  5485                              <1> 	; eax = color
  5486                              <1> 
  5487 0000E1CA 8B3D[4A9F0100]      <1> 	mov	edi, [v_str]
  5488                              <1> 
  5489 0000E1D0 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5490 0000E1D7 7707                <1> 	ja	short pix_op_new_w_1
  5491                              <1> 
  5492                              <1> 	; 256 colors (8bpp)
  5493 0000E1D9 BD[DAE60000]        <1> 	mov	ebp, pix_op_new_8
  5494 0000E1DE EB1E                <1> 	jmp	short pix_op_new_w_x
  5495                              <1> 			
  5496                              <1> pix_op_new_w_1:
  5497 0000E1E0 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5498 0000E1E7 7710                <1> 	ja	short pix_op_new_w_3 ; 32bpp
  5499 0000E1E9 7207                <1> 	jb	short pix_op_new_w_2 ; 16bpp
  5500                              <1> 
  5501                              <1> 	; 24 bit true colors
  5502 0000E1EB BD[E1E60000]        <1> 	mov	ebp, pix_op_new_24
  5503 0000E1F0 EB0C                <1> 	jmp	short pix_op_new_w_x
  5504                              <1> 
  5505                              <1> 	; 65536 colors (16bpp)
  5506                              <1> pix_op_new_w_2:
  5507 0000E1F2 BD[DDE60000]        <1> 	mov	ebp, pix_op_new_16
  5508 0000E1F7 EB05                <1> 	jmp	short pix_op_new_w_x
  5509                              <1> 
  5510                              <1> 	; 32 bit true colors
  5511                              <1> pix_op_new_w_3:
  5512 0000E1F9 BD[EDE60000]        <1> 	mov	ebp, pix_op_new_32
  5513                              <1> 	;jmp	short pix_op_new_w_x
  5514                              <1> 
  5515                              <1> pix_op_new_w_x:
  5516                              <1> pix_op_not_w_x:
  5517                              <1> pix_op_neg_w_x:
  5518                              <1> pix_op_inc_w_x:
  5519                              <1> pix_op_dec_w_x:
  5520                              <1> 	; 27/02/2021
  5521                              <1> 	; 01/02/2021
  5522                              <1> 	; 31/01/2021
  5523                              <1> 	; ecx = bytes per row (to be applied)
  5524                              <1> 	; edx = windows (screen) width in bytes
  5525                              <1> 	; ebx = row count
  5526                              <1> 	; eax = color
  5527                              <1> 	; ebp = pixel operation subroutine address
  5528                              <1> 	;push	edx ; 01/02/2021
  5529 0000E1FE 51                  <1> 	push	ecx
  5530 0000E1FF 57                  <1> 	push	edi
  5531 0000E200 8B0D[569F0100]      <1> 	mov	ecx, [pixcount] ; 27/02/2021
  5532 0000E206 FFD5                <1> 	call	ebp ; call pixel-row operation
  5533 0000E208 5F                  <1> 	pop	edi
  5534 0000E209 59                  <1> 	pop	ecx ; bytes per row
  5535 0000E20A 010D[20900100]      <1> 	add	[u.r0], ecx
  5536                              <1> 	;pop	edx ; 01/02/2021
  5537 0000E210 01D7                <1> 	add	edi, edx ; next row
  5538 0000E212 4B                  <1> 	dec	ebx
  5539 0000E213 75E9                <1> 	jnz	short pix_op_new_w_x
  5540 0000E215 C3                  <1> 	retn
  5541                              <1> 
  5542                              <1> pix_op_not:
  5543                              <1> 	; 31/01/2021
  5544                              <1> 	; NOT COLOR
  5545                              <1> 	;
  5546                              <1> 	; INPUT:
  5547                              <1> 	;  ECX = start position (row, column)
  5548                              <1> 	;        (HW = row, CX = column)
  5549                              <1> 	;  EDX = size (rows, colums)
  5550                              <1> 	;        (HW = rows, DX = columns)
  5551                              <1> 	;	 (0 -> invalid 	
  5552                              <1> 	;        (1 -> horizontal or vertical line)
  5553                              <1> 	;  [maskcolor] = mask color (to be excluded)
  5554                              <1> 	;
  5555                              <1> 	; OUTPUT:
  5556                              <1> 	; 	[u.r0] will be > 0 if succesful
  5557                              <1> 	
  5558 0000E216 F605[409F0100]10    <1> 	test	byte [v_ops], 10h ; display page or window ?
  5559 0000E21D 7553                <1> 	jnz	short pix_op_not_w ; window
  5560                              <1> 	
  5561 0000E21F 8B3D[429F0100]      <1> 	mov	edi, [v_mem]
  5562 0000E225 89FE                <1> 	mov	esi, edi
  5563 0000E227 8B0D[469F0100]      <1> 	mov	ecx, [v_siz] ; display page pixel count
  5564                              <1> 
  5565 0000E22D F605[409F0100]20    <1> 	test	byte [v_ops], 20h ; masked color 'not' ?
  5566 0000E234 7405                <1> 	jz	short pix_op_not_0 ; no
  5567 0000E236 E9ED0F0000          <1> 	jmp	m_pix_op_not ; 'not' color except mask color
  5568                              <1> pix_op_not_0:
  5569 0000E23B 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5570 0000E242 7707                <1> 	ja	short pix_op_not_1
  5571                              <1> 
  5572                              <1> 	; 256 colors (8bpp)
  5573 0000E244 E8F5050000          <1> 	call	pix_op_not_8
  5574 0000E249 EB1E                <1> 	jmp	short pix_op_not_4
  5575                              <1> 			
  5576                              <1> pix_op_not_1:
  5577 0000E24B 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5578 0000E252 7710                <1> 	ja	short pix_op_not_3 ; 32bpp	
  5579 0000E254 7207                <1> 	jb	short pix_op_not_2 ; 16bpp
  5580                              <1> 
  5581                              <1> 	; 24 bit true colors
  5582 0000E256 E8F1050000          <1> 	call	pix_op_not_24
  5583 0000E25B EB0C                <1> 	jmp	short pix_op_not_4
  5584                              <1> 
  5585                              <1> 	; 65536 colors (16bpp)
  5586                              <1> pix_op_not_2:
  5587 0000E25D E8E2050000          <1> 	call	pix_op_not_16
  5588 0000E262 EB05                <1> 	jmp	short pix_op_not_4
  5589                              <1> 
  5590                              <1> 	; 32 bit true colors	
  5591                              <1> pix_op_not_3:
  5592 0000E264 E8EE050000          <1> 	call	pix_op_not_32
  5593                              <1> pix_op_not_4:
  5594 0000E269 29F7                <1> 	sub	edi, esi
  5595 0000E26B 893D[20900100]      <1> 	mov	[u.r0], edi	
  5596                              <1> pix_op_not_5:
  5597 0000E271 C3                  <1> 	retn
  5598                              <1> 
  5599                              <1> pix_op_not_w:
  5600                              <1> 	; 31/01/2021
  5601                              <1> 	; ecx = win start pos (row, column)
  5602                              <1> 	; edx = size (rows, columns)
  5603 0000E272 E888F8FFFF          <1> 	call	sysvideo_15_12 ; window preparations
  5604 0000E277 72F8                <1> 	jc	short pix_op_not_5
  5605                              <1> 
  5606 0000E279 F605[409F0100]20    <1> 	test	byte [v_ops], 20h ; masked color 'not' ?
  5607 0000E280 7405                <1> 	jz	short pix_op_not_w_0 ; no
  5608 0000E282 E926100000          <1> 	jmp	m_pix_op_not_w 
  5609                              <1> 			; window 'not' color except mask color
  5610                              <1> pix_op_not_w_0:
  5611                              <1> 	; ecx = bytes per row (to be applied)
  5612                              <1> 	; edx = screen width in bytes
  5613                              <1> 	; ebx = row count
  5614                              <1> 
  5615 0000E287 8B3D[4A9F0100]      <1> 	mov	edi, [v_str]
  5616                              <1> 
  5617 0000E28D 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5618 0000E294 7707                <1> 	ja	short pix_op_not_w_1
  5619                              <1> 
  5620                              <1> 	; 256 colors (8bpp)
  5621 0000E296 BD[3EE80000]        <1> 	mov	ebp, pix_op_not_8
  5622 0000E29B EB1E                <1> 	jmp	short pix_op_not_w_4
  5623                              <1> 			
  5624                              <1> pix_op_not_w_1:
  5625 0000E29D 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5626 0000E2A4 7710                <1> 	ja	short pix_op_not_w_3 ; 32bpp
  5627 0000E2A6 7207                <1> 	jb	short pix_op_not_w_2 ; 16bpp
  5628                              <1> 
  5629                              <1> 	; 24 bit true colors
  5630 0000E2A8 BD[4CE80000]        <1> 	mov	ebp, pix_op_not_24
  5631 0000E2AD EB0C                <1> 	jmp	short pix_op_not_w_4
  5632                              <1> 
  5633                              <1> 	; 65536 colors (16bpp)
  5634                              <1> pix_op_not_w_2:
  5635 0000E2AF BD[44E80000]        <1> 	mov	ebp, pix_op_not_16
  5636 0000E2B4 EB05                <1> 	jmp	short pix_op_not_w_4
  5637                              <1> 
  5638                              <1> 	; 32 bit true colors
  5639                              <1> pix_op_not_w_3:
  5640 0000E2B6 BD[57E80000]        <1> 	mov	ebp, pix_op_not_32
  5641                              <1> pix_op_not_w_4:
  5642 0000E2BB E93EFFFFFF          <1> 	jmp	pix_op_not_w_x
  5643                              <1> 
  5644                              <1> pix_op_neg:
  5645                              <1> 	; 31/01/2021
  5646                              <1> 	; NEGATE COLOR
  5647                              <1> 	;
  5648                              <1> 	; INPUT:
  5649                              <1> 	;  ECX = start position (row, column)
  5650                              <1> 	;        (HW = row, CX = column)
  5651                              <1> 	;  EDX = size (rows, colums)
  5652                              <1> 	;        (HW = rows, DX = columns)
  5653                              <1> 	;	 (0 -> invalid 	
  5654                              <1> 	;        (1 -> horizontal or vertical line)
  5655                              <1> 	;  [maskcolor] = mask color (to be excluded)
  5656                              <1> 	;
  5657                              <1> 	; OUTPUT:
  5658                              <1> 	; 	[u.r0] will be > 0 if succesful
  5659                              <1> 	
  5660 0000E2C0 F605[409F0100]10    <1> 	test	byte [v_ops], 10h ; display page or window ?
  5661 0000E2C7 7553                <1> 	jnz	short pix_op_neg_w ; window
  5662                              <1> 	
  5663 0000E2C9 8B3D[429F0100]      <1> 	mov	edi, [v_mem]
  5664 0000E2CF 89FE                <1> 	mov	esi, edi
  5665 0000E2D1 8B0D[469F0100]      <1> 	mov	ecx, [v_siz] ; display page pixel count
  5666                              <1> 
  5667 0000E2D7 F605[409F0100]20    <1> 	test	byte [v_ops], 20h ; masked negate color ?
  5668 0000E2DE 7405                <1> 	jz	short pix_op_neg_0 ; no
  5669 0000E2E0 E9FB0F0000          <1> 	jmp	m_pix_op_neg ; 'neg' color except mask color
  5670                              <1> pix_op_neg_0:
  5671 0000E2E5 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5672 0000E2EC 7707                <1> 	ja	short pix_op_neg_1
  5673                              <1> 
  5674                              <1> 	; 256 colors (8bpp)
  5675 0000E2EE E86C050000          <1> 	call	pix_op_neg_8
  5676 0000E2F3 EB1E                <1> 	jmp	short pix_op_neg_4
  5677                              <1> 			
  5678                              <1> pix_op_neg_1:
  5679 0000E2F5 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5680 0000E2FC 7710                <1> 	ja	short pix_op_neg_3 ; 32bpp	
  5681 0000E2FE 7207                <1> 	jb	short pix_op_neg_2 ; 16bpp
  5682                              <1> 
  5683                              <1> 	; 24 bit true colors
  5684 0000E300 E868050000          <1> 	call	pix_op_neg_24
  5685 0000E305 EB0C                <1> 	jmp	short pix_op_neg_4
  5686                              <1> 
  5687                              <1> 	; 65536 colors (16bpp)
  5688                              <1> pix_op_neg_2:
  5689 0000E307 E859050000          <1> 	call	pix_op_neg_16
  5690 0000E30C EB05                <1> 	jmp	short pix_op_neg_4
  5691                              <1> 
  5692                              <1> 	; 32 bit true colors	
  5693                              <1> pix_op_neg_3:
  5694 0000E30E E86C050000          <1> 	call	pix_op_neg_32
  5695                              <1> pix_op_neg_4:
  5696 0000E313 29F7                <1> 	sub	edi, esi
  5697 0000E315 893D[20900100]      <1> 	mov	[u.r0], edi	
  5698                              <1> pix_op_neg_5:
  5699 0000E31B C3                  <1> 	retn
  5700                              <1> 
  5701                              <1> pix_op_neg_w:
  5702                              <1> 	; 31/01/2021
  5703                              <1> 	; ecx = win start pos (row, column)
  5704                              <1> 	; edx = size (rows, columns)
  5705 0000E31C E8DEF7FFFF          <1> 	call	sysvideo_15_12 ; window preparations
  5706 0000E321 72F8                <1> 	jc	short pix_op_neg_5
  5707                              <1> 
  5708 0000E323 F605[409F0100]20    <1> 	test	byte [v_ops], 20h ; masked negate color ?
  5709 0000E32A 7405                <1> 	jz	short pix_op_neg_w_0 ; no
  5710 0000E32C E934100000          <1> 	jmp	m_pix_op_neg_w 
  5711                              <1> 			; window 'neg' color except mask color
  5712                              <1> pix_op_neg_w_0:
  5713                              <1> 	; ecx = bytes per row (to be applied)
  5714                              <1> 	; edx = screen width in bytes
  5715                              <1> 	; ebx = row count
  5716                              <1> 
  5717 0000E331 8B3D[4A9F0100]      <1> 	mov	edi, [v_str]
  5718                              <1> 
  5719 0000E337 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5720 0000E33E 7707                <1> 	ja	short pix_op_neg_w_1
  5721                              <1> 
  5722                              <1> 	; 256 colors (8bpp)
  5723 0000E340 BD[5FE80000]        <1> 	mov	ebp, pix_op_neg_8
  5724 0000E345 EB1E                <1> 	jmp	short pix_op_neg_w_4
  5725                              <1> 			
  5726                              <1> pix_op_neg_w_1:
  5727 0000E347 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5728 0000E34E 7710                <1> 	ja	short pix_op_neg_w_3 ; 32bpp
  5729 0000E350 7207                <1> 	jb	short pix_op_neg_w_2 ; 16bpp
  5730                              <1> 
  5731                              <1> 	; 24 bit true colors
  5732 0000E352 BD[6DE80000]        <1> 	mov	ebp, pix_op_neg_24
  5733 0000E357 EB0C                <1> 	jmp	short pix_op_neg_w_4
  5734                              <1> 
  5735                              <1> 	; 65536 colors (16bpp)
  5736                              <1> pix_op_neg_w_2:
  5737 0000E359 BD[65E80000]        <1> 	mov	ebp, pix_op_neg_16
  5738 0000E35E EB05                <1> 	jmp	short pix_op_neg_w_4
  5739                              <1> 
  5740                              <1> 	; 32 bit true colors
  5741                              <1> pix_op_neg_w_3:
  5742 0000E360 BD[7FE80000]        <1> 	mov	ebp, pix_op_neg_32
  5743                              <1> pix_op_neg_w_4:
  5744 0000E365 E994FEFFFF          <1> 	jmp	pix_op_neg_w_x
  5745                              <1> 
  5746                              <1> pix_op_inc:
  5747                              <1> 	; 31/01/2021
  5748                              <1> 	; INCREASE COLOR
  5749                              <1> 	;
  5750                              <1> 	; INPUT:
  5751                              <1> 	;  ECX = start position (row, column)
  5752                              <1> 	;        (HW = row, CX = column)
  5753                              <1> 	;  EDX = size (rows, colums)
  5754                              <1> 	;        (HW = rows, DX = columns)
  5755                              <1> 	;	 (0 -> invalid 	
  5756                              <1> 	;        (1 -> horizontal or vertical line)
  5757                              <1> 	;  [maskcolor] = mask color (to be excluded)
  5758                              <1> 	;
  5759                              <1> 	; OUTPUT:
  5760                              <1> 	; 	[u.r0] will be > 0 if succesful
  5761                              <1> 	
  5762 0000E36A F605[409F0100]10    <1> 	test	byte [v_ops], 10h ; display page or window ?
  5763 0000E371 7553                <1> 	jnz	short pix_op_inc_w ; window
  5764                              <1> 	
  5765 0000E373 8B3D[429F0100]      <1> 	mov	edi, [v_mem]
  5766 0000E379 89FE                <1> 	mov	esi, edi
  5767 0000E37B 8B0D[469F0100]      <1> 	mov	ecx, [v_siz] ; display page pixel count
  5768                              <1> 
  5769 0000E381 F605[409F0100]20    <1> 	test	byte [v_ops], 20h ; masked increase color ?
  5770 0000E388 7405                <1> 	jz	short pix_op_inc_0 ; no
  5771 0000E38A E909100000          <1> 	jmp	m_pix_op_inc ; 'inc' color except mask color
  5772                              <1> pix_op_inc_0:
  5773 0000E38F 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5774 0000E396 7707                <1> 	ja	short pix_op_inc_1
  5775                              <1> 
  5776                              <1> 	; 256 colors (8bpp)
  5777 0000E398 E8EA040000          <1> 	call	pix_op_inc_8
  5778 0000E39D EB1E                <1> 	jmp	short pix_op_inc_4
  5779                              <1> 			
  5780                              <1> pix_op_inc_1:
  5781 0000E39F 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5782 0000E3A6 7710                <1> 	ja	short pix_op_inc_3 ; 32bpp	
  5783 0000E3A8 7207                <1> 	jb	short pix_op_inc_2 ; 16bpp
  5784                              <1> 
  5785                              <1> 	; 24 bit true colors
  5786 0000E3AA E8EF040000          <1> 	call	pix_op_inc_24
  5787 0000E3AF EB0C                <1> 	jmp	short pix_op_inc_4
  5788                              <1> 
  5789                              <1> 	; 65536 colors (16bpp)
  5790                              <1> pix_op_inc_2:
  5791 0000E3B1 E8DB040000          <1> 	call	pix_op_inc_16
  5792 0000E3B6 EB05                <1> 	jmp	short pix_op_inc_4
  5793                              <1> 
  5794                              <1> 	; 32 bit true colors	
  5795                              <1> pix_op_inc_3:
  5796 0000E3B8 E8F5040000          <1> 	call	pix_op_inc_32
  5797                              <1> pix_op_inc_4:
  5798 0000E3BD 29F7                <1> 	sub	edi, esi
  5799 0000E3BF 893D[20900100]      <1> 	mov	[u.r0], edi	
  5800                              <1> pix_op_inc_5:
  5801 0000E3C5 C3                  <1> 	retn			
  5802                              <1> 
  5803                              <1> pix_op_inc_w:
  5804                              <1> 	; 31/01/2021
  5805                              <1> 	; ecx = win start pos (row, column)
  5806                              <1> 	; edx = size (rows, columns)
  5807 0000E3C6 E834F7FFFF          <1> 	call	sysvideo_15_12 ; window preparations
  5808 0000E3CB 72F8                <1> 	jc	short pix_op_inc_5
  5809                              <1> 
  5810 0000E3CD F605[409F0100]20    <1> 	test	byte [v_ops], 20h ; masked increase color ?
  5811 0000E3D4 7405                <1> 	jz	short pix_op_inc_w_0 ; no
  5812 0000E3D6 E956100000          <1> 	jmp	m_pix_op_inc_w 
  5813                              <1> 			; window 'inc' color except mask color
  5814                              <1> pix_op_inc_w_0:
  5815                              <1> 	; ecx = bytes per row (to be applied)
  5816                              <1> 	; edx = screen width in bytes
  5817                              <1> 	; ebx = row count
  5818                              <1> 
  5819 0000E3DB 8B3D[4A9F0100]      <1> 	mov	edi, [v_str]
  5820                              <1> 
  5821 0000E3E1 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5822 0000E3E8 7707                <1> 	ja	short pix_op_inc_w_1
  5823                              <1> 
  5824                              <1> 	; 256 colors (8bpp)
  5825 0000E3EA BD[87E80000]        <1> 	mov	ebp, pix_op_inc_8
  5826 0000E3EF EB1E                <1> 	jmp	short pix_op_inc_w_4
  5827                              <1> 			
  5828                              <1> pix_op_inc_w_1:
  5829 0000E3F1 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5830 0000E3F8 7710                <1> 	ja	short pix_op_inc_w_3 ; 32bpp
  5831 0000E3FA 7207                <1> 	jb	short pix_op_inc_w_2 ; 16bpp
  5832                              <1> 
  5833                              <1> 	; 24 bit true colors
  5834 0000E3FC BD[9EE80000]        <1> 	mov	ebp, pix_op_inc_24
  5835 0000E401 EB0C                <1> 	jmp	short pix_op_inc_w_4
  5836                              <1> 
  5837                              <1> 	; 65536 colors (16bpp)
  5838                              <1> pix_op_inc_w_2:
  5839 0000E403 BD[91E80000]        <1> 	mov	ebp, pix_op_inc_16
  5840 0000E408 EB05                <1> 	jmp	short pix_op_inc_w_4
  5841                              <1> 
  5842                              <1> 	; 32 bit true colors
  5843                              <1> pix_op_inc_w_3:
  5844 0000E40A BD[B2E80000]        <1> 	mov	ebp, pix_op_inc_32
  5845                              <1> pix_op_inc_w_4:
  5846 0000E40F E9EAFDFFFF          <1> 	jmp	pix_op_inc_w_x
  5847                              <1> 
  5848                              <1> pix_op_dec:
  5849                              <1> 	; 31/01/2021
  5850                              <1> 	; DECREASE COLOR
  5851                              <1> 	;
  5852                              <1> 	; INPUT:
  5853                              <1> 	;  ECX = start position (row, column)
  5854                              <1> 	;        (HW = row, CX = column)
  5855                              <1> 	;  EDX = size (rows, colums)
  5856                              <1> 	;        (HW = rows, DX = columns)
  5857                              <1> 	;	 (0 -> invalid 	
  5858                              <1> 	;        (1 -> horizontal or vertical line)
  5859                              <1> 	;  [maskcolor] = mask color (to be excluded)
  5860                              <1> 	;
  5861                              <1> 	; OUTPUT:
  5862                              <1> 	; 	[u.r0] will be > 0 if succesful
  5863                              <1> 	
  5864 0000E414 F605[409F0100]10    <1> 	test	byte [v_ops], 10h ; display page or window ?
  5865 0000E41B 7553                <1> 	jnz	short pix_op_dec_w ; window
  5866                              <1> 	
  5867 0000E41D 8B3D[429F0100]      <1> 	mov	edi, [v_mem]
  5868 0000E423 89FE                <1> 	mov	esi, edi
  5869 0000E425 8B0D[469F0100]      <1> 	mov	ecx, [v_siz] ; display page pixel count
  5870                              <1> 
  5871 0000E42B F605[409F0100]20    <1> 	test	byte [v_ops], 20h ; masked decrease color ?
  5872 0000E432 7405                <1> 	jz	short pix_op_dec_0 ; no
  5873 0000E434 E92B100000          <1> 	jmp	m_pix_op_dec ; 'dec' color except mask color
  5874                              <1> pix_op_dec_0:
  5875 0000E439 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5876 0000E440 7707                <1> 	ja	short pix_op_dec_1
  5877                              <1> 
  5878                              <1> 	; 256 colors (8bpp)
  5879 0000E442 E877040000          <1> 	call	pix_op_dec_8
  5880 0000E447 EB1E                <1> 	jmp	short pix_op_dec_4
  5881                              <1> 			
  5882                              <1> pix_op_dec_1:
  5883 0000E449 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5884 0000E450 7710                <1> 	ja	short pix_op_dec_3 ; 32bpp	
  5885 0000E452 7207                <1> 	jb	short pix_op_dec_2 ; 16bpp
  5886                              <1> 
  5887                              <1> 	; 24 bit true colors
  5888 0000E454 E87C040000          <1> 	call	pix_op_dec_24
  5889 0000E459 EB0C                <1> 	jmp	short pix_op_dec_4
  5890                              <1> 
  5891                              <1> 	; 65536 colors (16bpp)
  5892                              <1> pix_op_dec_2:
  5893 0000E45B E868040000          <1> 	call	pix_op_dec_16
  5894 0000E460 EB05                <1> 	jmp	short pix_op_dec_4
  5895                              <1> 
  5896                              <1> 	; 32 bit true colors	
  5897                              <1> pix_op_dec_3:
  5898 0000E462 E881040000          <1> 	call	pix_op_dec_32
  5899                              <1> pix_op_dec_4:
  5900 0000E467 29F7                <1> 	sub	edi, esi
  5901 0000E469 893D[20900100]      <1> 	mov	[u.r0], edi	
  5902                              <1> pix_op_dec_5:
  5903 0000E46F C3                  <1> 	retn			
  5904                              <1> 
  5905                              <1> pix_op_dec_w:
  5906                              <1> 	; 31/01/2021
  5907                              <1> 	; ecx = win start pos (row, column)
  5908                              <1> 	; edx = size (rows, columns)
  5909 0000E470 E88AF6FFFF          <1> 	call	sysvideo_15_12 ; window preparations
  5910 0000E475 72F8                <1> 	jc	short pix_op_dec_5
  5911                              <1> 
  5912 0000E477 F605[409F0100]20    <1> 	test	byte [v_ops], 20h ; masked decrease color ?
  5913 0000E47E 7405                <1> 	jz	short pix_op_dec_w_0 ; no
  5914 0000E480 E973100000          <1> 	jmp	m_pix_op_dec_w 
  5915                              <1> 			; window 'dec' color except mask color
  5916                              <1> pix_op_dec_w_0:
  5917                              <1> 	; ecx = bytes per row (to be applied)
  5918                              <1> 	; edx = screen width in bytes
  5919                              <1> 	; ebx = row count
  5920                              <1> 
  5921 0000E485 8B3D[4A9F0100]      <1> 	mov	edi, [v_str]
  5922                              <1> 
  5923 0000E48B 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  5924 0000E492 7707                <1> 	ja	short pix_op_dec_w_1
  5925                              <1> 
  5926                              <1> 	; 256 colors (8bpp)
  5927 0000E494 BD[BEE80000]        <1> 	mov	ebp, pix_op_dec_8
  5928 0000E499 EB1E                <1> 	jmp	short pix_op_dec_w_4
  5929                              <1> 			
  5930                              <1> pix_op_dec_w_1:
  5931 0000E49B 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  5932 0000E4A2 7710                <1> 	ja	short pix_op_dec_w_3 ; 32bpp
  5933 0000E4A4 7207                <1> 	jb	short pix_op_dec_w_2 ; 16bpp
  5934                              <1> 
  5935                              <1> 	; 24 bit true colors
  5936 0000E4A6 BD[D5E80000]        <1> 	mov	ebp, pix_op_dec_24
  5937 0000E4AB EB0C                <1> 	jmp	short pix_op_dec_w_4
  5938                              <1> 
  5939                              <1> 	; 65536 colors (16bpp)
  5940                              <1> pix_op_dec_w_2:
  5941 0000E4AD BD[C8E80000]        <1> 	mov	ebp, pix_op_dec_16
  5942 0000E4B2 EB05                <1> 	jmp	short pix_op_dec_w_4
  5943                              <1> 
  5944                              <1> 	; 32 bit true colors
  5945                              <1> pix_op_dec_w_3:
  5946 0000E4B4 BD[E8E80000]        <1> 	mov	ebp, pix_op_dec_32
  5947                              <1> pix_op_dec_w_4:
  5948 0000E4B9 E940FDFFFF          <1> 	jmp	pix_op_dec_w_x
  5949                              <1> 
  5950                              <1> pix_op_blk:
  5951                              <1> 	; 11/08/2022 (TRDOS 386 Kernel v2.0.5)
  5952                              <1> 	; 23/01/2021
  5953                              <1> 	; 22/02/2021
  5954                              <1> 	; 02/02/2021
  5955                              <1> 	; COPY PIXEL BLOCK -system to system-
  5956                              <1> 	; WRITE PIXEL BLOCKS -user to system-
  5957                              <1> 	;
  5958                              <1> 	; INPUT:
  5959                              <1> 	;   -If BL bit 5 is 0-	
  5960                              <1> 	;    ECX = start position (row, column) (*)
  5961                              <1> 	;    (HW = row, CX = column)
  5962                              <1> 	;    EDX = size (rows, colums) (*)
  5963                              <1> 	;    (HW = rows, DX = columns)
  5964                              <1> 	;         (0 -> invalid)
  5965                              <1> 	;         (1 -> horizontal or vertical line)
  5966                              <1> 	;    ESI = destination (row, column) (***)
  5967                              <1> 	;   -If BL bit 5 is 1-	
  5968                              <1> 	;     CL = color (8 bit, 256 colors)
  5969                              <1> 	;    ECX = color (16 bit and true colors)
  5970                              <1> 	;    EDX = count of blocks (not bytes)
  5971                              <1> 	;	 (limit: 2048 blocks/windows)	  	
  5972                              <1> 	;    ESI = user's buffer address 
  5973                              <1> 	;	  contains 64 bit block data
  5974                              <1> 	;	  BLOCK ADDRESS - (row, col), dword
  5975                              <1> 	;	  (first 32 bits)
  5976                              <1> 	;	  BLOCK SIZE - (rows, cols), dword
  5977                              <1> 	;	  (second 32 bits)
  5978                              <1> 	; OUTPUT:
  5979                              <1> 	; 	[u.r0] will be > 0 if succesful
  5980                              <1> 
  5981                              <1> 	; Window option ([v_ops] bit 4) will be ignored  	
  5982                              <1> 	; (Function is used for display page coordinates)
  5983                              <1> 
  5984 0000E4BE F605[409F0100]20    <1> 	test	byte [v_ops], 20h ; masked or direct ?
  5985 0000E4C5 755A                <1> 	jnz	short pix_op_blk_u ; blocks from user's buffer
  5986                              <1> 
  5987 0000E4C7 89F0                <1> 	mov	eax, esi ; destination position (row, col)
  5988 0000E4C9 E8DEF6FFFF          <1> 	call	calc_pixel_offset
  5989 0000E4CE 3B05[469F0100]      <1> 	cmp	eax, [v_siz]
  5990 0000E4D4 734A                <1> 	jnb	short pix_op_blk_retn ; out of display page
  5991 0000E4D6 89C6                <1> 	mov	esi, eax
  5992 0000E4D8 E8ACF6FFFF          <1> 	call	pixels_to_byte_count
  5993 0000E4DD 89C7                <1> 	mov	edi, eax
  5994 0000E4DF 89D0                <1> 	mov	eax, edx  ; size
  5995 0000E4E1 E8C6F6FFFF          <1> 	call	calc_pixel_offset
  5996                              <1> 	; 22/02/2021
  5997 0000E4E6 3B05[469F0100]      <1> 	cmp	eax, [v_siz]
  5998 0000E4EC 7732                <1> 	ja	short pix_op_blk_retn ; out of display page
  5999 0000E4EE 01C6                <1> 	add	esi, eax
  6000 0000E4F0 3B35[469F0100]      <1> 	cmp	esi, [v_siz]
  6001 0000E4F6 7728                <1> 	ja	short pix_op_blk_retn ; out of display page
  6002                              <1> 
  6003 0000E4F8 033D[429F0100]      <1> 	add	edi, [v_mem] ; destination address
  6004                              <1> 	
  6005                              <1> 	; 23/01/2021
  6006                              <1> 	;call	pixels_to_byte_count
  6007                              <1> 	;add	edi, eax
  6008                              <1> 	;jc	short pix_op_blk_retn ; out of display page
  6009                              <1> 	;cmp	edi, [v_end]
  6010                              <1> 	;ja	short pix_op_blk_retn ; out of display page
  6011                              <1> 	;sub	edi, eax
  6012                              <1> 
  6013 0000E4FE E8FCF5FFFF          <1> 	call	sysvideo_15_12 ; window preparations
  6014 0000E503 721B                <1> 	jc	short pix_op_blk_retn ; something wrong !?
  6015                              <1> 	; ecx = bytes per row (to be applied)
  6016                              <1> 	; edx = screen width in bytes
  6017                              <1> 	; ebx = row count
  6018                              <1> 
  6019 0000E505 8B35[4A9F0100]      <1> 	mov	esi, [v_str] ; source address
  6020                              <1> 
  6021                              <1> 	; Note:
  6022                              <1> 	; ecx & edx are already adjusted for pixel sizes
  6023                              <1> 	; so, following code is proper all pixel sizes
  6024                              <1> 
  6025 0000E50B 29CA                <1> 	sub	edx, ecx ; screen width - window width
  6026                              <1> pix_op_blk_0:
  6027 0000E50D 89C8                <1> 	mov	eax, ecx
  6028 0000E50F 0105[20900100]      <1> 	add	[u.r0], eax
  6029 0000E515 F3A4                <1> 	rep	movsb
  6030 0000E517 89C1                <1> 	mov	ecx, eax	
  6031 0000E519 01D6                <1> 	add	esi, edx ; next row
  6032 0000E51B 01D7                <1> 	add	edi, edx ; next row
  6033 0000E51D 4B                  <1> 	dec	ebx
  6034 0000E51E 75ED                <1> 	jnz	short pix_op_blk_0
  6035                              <1> pix_op_blk_retn:
  6036 0000E520 C3                  <1> 	retn
  6037                              <1> 
  6038                              <1> pix_op_blk_u:
  6039                              <1> 	; fill blocks (windows) with desired color
  6040                              <1> 	; according to block definitions in user's buffer
  6041 0000E521 81FA00080000        <1> 	cmp	edx, 2048
  6042 0000E527 7605                <1> 	jna	short pix_op_blk_u_0
  6043                              <1> 	; Maximum 2048 blocks
  6044 0000E529 BA00080000          <1> 	mov	edx, 2048
  6045                              <1> pix_op_blk_u_0:
  6046 0000E52E 8025[409F0100]DF    <1> 	and	byte [v_ops], ~20h ; clear masked bit
  6047 0000E535 890D[529F0100]      <1> 	mov	[maskcolor], ecx ; save pixel color
  6048                              <1> 	; 22/02/2021
  6049                              <1> 	;mov	ebp, edx ; save blocks count
  6050                              <1> 	;push	ebp
  6051                              <1> pix_op_blk_u_next:
  6052 0000E53B 52                  <1> 	push	edx
  6053                              <1> 	;mov	ecx, 8
  6054                              <1> 	; 11/08/2022
  6055 0000E53C 29C9                <1> 	sub	ecx, ecx
  6056 0000E53E B108                <1> 	mov	cl, 8
  6057 0000E540 BF[5A9F0100]        <1> 	mov	edi, buffer8 ; 8 bytes small buffer
  6058                              <1> 	; esi = user's buffer address
  6059 0000E545 E891290000          <1> 	call	transfer_from_user_buffer
  6060 0000E54A 72D4                <1> 	jc	short pix_op_blk_retn
  6061 0000E54C 01CE                <1> 	add	esi, ecx ; 22/02/2021
  6062 0000E54E 56                  <1> 	push	esi
  6063 0000E54F 8B15[5A9F0100]      <1> 	mov	edx, [buffer8] ; block start pos (row,col)
  6064 0000E555 8B35[5E9F0100]      <1> 	mov	esi, [buffer8+4] ; block size (rows,cols)
  6065 0000E55B 8B0D[529F0100]      <1> 	mov	ecx, [maskcolor]
  6066 0000E561 E849FCFFFF          <1> 	call	pix_op_new_w ; new (change) color (window)
  6067 0000E566 5E                  <1> 	pop	esi
  6068                              <1> 	;pop	ebp
  6069                              <1> 	;dec	ebp
  6070 0000E567 5A                  <1> 	pop	edx
  6071 0000E568 4A                  <1> 	dec	edx
  6072 0000E569 75D0                <1> 	jnz	short pix_op_blk_u_next
  6073 0000E56B C3                  <1> 	retn
  6074                              <1> 
  6075                              <1> pix_op_lin:
  6076                              <1> 	; 11/08/2022
  6077                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
  6078                              <1> 	; 12/02/2021
  6079                              <1> 	; 11/02/2021
  6080                              <1> 	; 10/02/2021
  6081                              <1> 	; 05/02/2021
  6082                              <1> 	; 02/02/2021
  6083                              <1> 	; WRITE LINE -direct-
  6084                              <1> 	; WRITE LINE(S) -via user's buffer-
  6085                              <1> 	;
  6086                              <1> 	; INPUT:
  6087                              <1> 	;   -If BL bit 5 is 0-	
  6088                              <1> 	;     CL = color (8 bit, 256 colors)
  6089                              <1> 	;    ECX = color (16 bit and true colors)
  6090                              <1> 	;     DX = low 12 bits - size (length)
  6091                              <1> 	;	   high 4 bits - direction or type
  6092                              <1> 	;	     0 - Horizontal line
  6093                              <1> 	;	     1 - Vertical line
  6094                              <1> 	;	   > 1 - undefined, invalid
  6095                              <1> 	;    ESI = start position (row, column)
  6096                              <1> 	;	  (HW = row, SI = column)
  6097                              <1> 	;   -If BL bit 5 is 1-
  6098                              <1> 	;     CL = color (8 bit, 256 colors)
  6099                              <1> 	;    ECX = color (16 bit and true colors)
  6100                              <1> 	;     DX = number of lines (in user buffer)
  6101                              <1> 	;	   (limit: 2048 lines)	
  6102                              <1> 	;    ESI = user's buffer
  6103                              <1> 	;          contains 64 bit data for lines
  6104                              <1> 	;	   START POINT: 32 bit (row, col)
  6105                              <1> 	;	   LENGTH: 32 bit
  6106                              <1> 	;		   high 16 bits - 0
  6107                              <1> 	;		   bit 0-11 - length
  6108                              <1> 	;	   	   bit 12-15 - type (length)
  6109                              <1> 	; OUTPUT:
  6110                              <1> 	; 	[u.r0] will be > 0 if succesful
  6111                              <1> 
  6112                              <1> 	; Window option ([v_ops] bit 4) will be ignored
  6113                              <1> 	; (Function is used for display page coordinates)
  6114                              <1> 
  6115                              <1> 	; 10/02/2021
  6116 0000E56C F605[409F0100]20    <1> 	test	byte [v_ops], 20h ; masked or direct ?
  6117 0000E573 7444                <1> 	jz	short pix_op_lin_vh ; direct (v/h lines) 
  6118                              <1> 
  6119                              <1> 	; lines from user's buffer
  6120                              <1> pix_op_lin_u:
  6121                              <1> 	; draw lines with desired color
  6122                              <1> 	; according to line definitions in user's buffer
  6123 0000E575 81FA00080000        <1> 	cmp	edx, 2048
  6124 0000E57B 7605                <1> 	jna	short pix_op_lin_u_0
  6125                              <1> 	; Maximum 2048 lines
  6126 0000E57D BA00080000          <1> 	mov	edx, 2048
  6127                              <1> pix_op_lin_u_0:
  6128 0000E582 890D[529F0100]      <1> 	mov	[maskcolor], ecx ; save pixel color
  6129 0000E588 89D5                <1> 	mov	ebp, edx ; save line count
  6130                              <1> pix_op_lin_u_next:
  6131                              <1> 	;mov	ecx, 8
  6132                              <1> 	; 11/08/2022
  6133 0000E58A 29C9                <1> 	sub	ecx, ecx
  6134 0000E58C B108                <1> 	mov	cl, 8
  6135 0000E58E BF[5A9F0100]        <1> 	mov	edi, buffer8 ; 8 bytes small buffer
  6136                              <1> 	; esi = user's buffer address
  6137 0000E593 E843290000          <1> 	call	transfer_from_user_buffer
  6138 0000E598 721E                <1> 	jc	short pix_op_lin_retn
  6139 0000E59A 01CE                <1> 	add	esi, ecx ; 11/02/2021
  6140 0000E59C 56                  <1> 	push	esi
  6141 0000E59D 8B35[5A9F0100]      <1> 	mov	esi, [buffer8] ; line start pos (row,col)
  6142 0000E5A3 8B15[5E9F0100]      <1> 	mov	edx, [buffer8+4] ; line length
  6143 0000E5A9 8B0D[529F0100]      <1> 	mov	ecx, [maskcolor]
  6144 0000E5AF E805000000          <1> 	call	pix_op_lin_vh ; new (change) color (window)
  6145 0000E5B4 5E                  <1> 	pop	esi
  6146 0000E5B5 4D                  <1> 	dec	ebp
  6147 0000E5B6 75D2                <1> 	jnz	short pix_op_lin_u_next
  6148                              <1> pix_op_lin_retn:
  6149 0000E5B8 C3                  <1> 	retn
  6150                              <1> 
  6151                              <1> pix_op_lin_vh:
  6152 0000E5B9 81FA38140000        <1> 	cmp	edx, 1438h ; 1920*1080 (780hx438h) limit
  6153 0000E5BF 7762                <1> 	ja	short pix_op_lin_err1 ; invalid type 
  6154                              <1> 			    	; (for current version)
  6155 0000E5C1 66F7C2FF0F          <1> 	test	dx, 0FFFh
  6156 0000E5C6 745B                <1> 	jz	short pix_op_lin_err1 ; zero length!
  6157                              <1> 
  6158 0000E5C8 89F0                <1> 	mov	eax, esi ; start point (row, col)
  6159 0000E5CA E8DDF5FFFF          <1> 	call	calc_pixel_offset
  6160 0000E5CF 3B05[469F0100]      <1> 	cmp	eax, [v_siz]
  6161 0000E5D5 734C                <1> 	jnb	short pix_op_lin_err1 ; out of display page!
  6162 0000E5D7 E8ADF5FFFF          <1> 	call	pixels_to_byte_count
  6163 0000E5DC 89C7                <1> 	mov	edi, eax ; start point offset
  6164 0000E5DE 033D[429F0100]      <1> 	add	edi, [v_mem] ; LFB start address
  6165 0000E5E4 89C8                <1> 	mov	eax, ecx ; color
  6166                              <1> 
  6167 0000E5E6 F6C610              <1> 	test	dh, 10h
  6168                              <1> 	;jz	pix_op_lin_h ; Horizontal line
  6169                              <1> 	; 23/07/2022
  6170 0000E5E9 7505                <1> 	jnz	short pix_op_lin_v
  6171 0000E5EB E98A000000          <1> 	jmp	pix_op_lin_h
  6172                              <1> 
  6173                              <1> pix_op_lin_v:
  6174                              <1> 	; Vertical line
  6175 0000E5F0 80E60F              <1> 	and 	dh, 0Fh ; low 12 bits
  6176 0000E5F3 51                  <1> 	push	ecx ; color
  6177 0000E5F4 89D1                <1> 	mov	ecx, edx
  6178 0000E5F6 0FB705[3E9F0100]    <1> 	movzx	eax, word [v_width]
  6179 0000E5FD 89C3                <1> 	mov	ebx, eax
  6180                              <1> 	; 12/02/2021
  6181 0000E5FF F7E2                <1> 	mul	edx ; rows * [v_width]
  6182 0000E601 01F8                <1> 	add	eax, edi
  6183 0000E603 3B05[4E9F0100]      <1> 	cmp	eax, [v_end]
  6184 0000E609 58                  <1> 	pop	eax ; color
  6185 0000E60A 7717                <1> 	ja	short pix_op_lin_err1 ; out of display page
  6186                              <1> 	; ecx = rows	
  6187 0000E60C 89CA                <1> 	mov	edx, ecx
  6188                              <1> 
  6189 0000E60E 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  6190 0000E615 770D                <1> 	ja	short pix_op_lin_v_2
  6191                              <1> 	; 256 colors (1 byte per pixel)
  6192 0000E617 010D[20900100]      <1> 	add	[u.r0], ecx ; byte count
  6193                              <1> pix_op_lin_v_1:
  6194 0000E61D 8807                <1> 	mov	[edi], al
  6195 0000E61F 01DF                <1> 	add	edi, ebx  ; next row	
  6196 0000E621 E2FA                <1> 	loop	pix_op_lin_v_1
  6197                              <1> pix_op_lin_err1:
  6198 0000E623 C3                  <1> 	retn
  6199                              <1> 
  6200                              <1> pix_op_lin_v_2:
  6201 0000E624 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  6202 0000E62B 773A                <1> 	ja	short pix_op_lin_v_6 ; 32bpp
  6203 0000E62D 7226                <1> 	jb	short pix_op_lin_v_4 ; 16bpp
  6204                              <1> 	
  6205                              <1> 	; 24 bit true colors
  6206                              <1> 	; * 3
  6207 0000E62F 53                  <1> 	push	ebx ; screen width in pixels
  6208 0000E630 D1E3                <1> 	shl	ebx, 1
  6209 0000E632 011C24              <1> 	add	[esp], ebx
  6210 0000E635 5B                  <1> 	pop	ebx ; screen width in bytes
  6211 0000E636 010D[20900100]      <1> 	add	[u.r0], ecx
  6212 0000E63C D1E2                <1> 	shl	edx, 1
  6213 0000E63E 0115[20900100]      <1> 	add	[u.r0], edx ; byte count
  6214                              <1> pix_op_lin_v_3:
  6215 0000E644 668907              <1> 	mov	[edi], ax
  6216 0000E647 C1C810              <1> 	ror	eax, 16
  6217 0000E64A 884702              <1> 	mov	[edi+2], al	
  6218 0000E64D C1C010              <1> 	rol	eax, 16
  6219 0000E650 01DF                <1> 	add	edi, ebx  ; next row	
  6220 0000E652 E2F0                <1> 	loop	pix_op_lin_v_3
  6221 0000E654 C3                  <1> 	retn
  6222                              <1> 
  6223                              <1> pix_op_lin_v_4:
  6224                              <1> 	; 16 bit (65536) colors
  6225 0000E655 D1E3                <1> 	shl	ebx, 1
  6226 0000E657 D1E2                <1> 	shl	edx, 1
  6227 0000E659 0115[20900100]      <1> 	add	[u.r0], edx
  6228                              <1> pix_op_lin_v_5:
  6229 0000E65F 668907              <1> 	mov	[edi], ax
  6230 0000E662 01DF                <1> 	add	edi, ebx  ; next row	
  6231 0000E664 E2F9                <1> 	loop	pix_op_lin_v_5
  6232 0000E666 C3                  <1> 	retn
  6233                              <1> 
  6234                              <1> pix_op_lin_v_6:
  6235                              <1> 	; 32 bit true colors
  6236 0000E667 C1E302              <1> 	shl	ebx, 2
  6237 0000E66A C1E202              <1> 	shl	edx, 2
  6238 0000E66D 0115[20900100]      <1> 	add	[u.r0], edx ; byte count
  6239                              <1> pix_op_lin_v_7:
  6240 0000E673 8907                <1> 	mov	[edi], eax
  6241 0000E675 01DF                <1> 	add	edi, ebx  ; next row	
  6242 0000E677 E2FA                <1> 	loop	pix_op_lin_v_7
  6243 0000E679 C3                  <1> 	retn		
  6244                              <1> 
  6245                              <1> pix_op_lin_h:
  6246                              <1> 	; Horizontal line
  6247 0000E67A 80E60F              <1> 	and 	dh, 0Fh ; low 12 bits
  6248 0000E67D 89D1                <1>   	mov	ecx, edx
  6249 0000E67F 6601D6              <1> 	add	si, dx ; start column + columns
  6250 0000E682 663B35[3E9F0100]    <1> 	cmp	si, [v_width] ; screen width
  6251 0000E689 7711                <1> 	ja	short pix_op_lin_err2 ; out of columns limit
  6252                              <1> 
  6253 0000E68B 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  6254 0000E692 7709                <1> 	ja	short pix_op_lin_h_1
  6255                              <1> 	; 256 colors (1 byte per pixel)
  6256 0000E694 010D[20900100]      <1> 	add	[u.r0], ecx
  6257 0000E69A F3AA                <1> 	rep	stosb
  6258                              <1> pix_op_lin_err2:
  6259 0000E69C C3                  <1> 	retn
  6260                              <1> 
  6261                              <1> pix_op_lin_h_1:
  6262 0000E69D 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  6263 0000E6A4 7728                <1> 	ja	short pix_op_lin_h_4 ; 32bpp
  6264 0000E6A6 721A                <1> 	jb	short pix_op_lin_h_3 ; 16bpp
  6265                              <1> 	
  6266                              <1> 	; 24 bit true colors
  6267                              <1> 	; * 3
  6268 0000E6A8 0115[20900100]      <1> 	add	[u.r0], edx
  6269 0000E6AE D1E2                <1> 	shl	edx, 1
  6270 0000E6B0 0115[20900100]      <1> 	add	[u.r0], edx
  6271                              <1> pix_op_lin_h_2:
  6272 0000E6B6 66AB                <1> 	stosw
  6273 0000E6B8 C1C810              <1> 	ror	eax, 16
  6274 0000E6BB AA                  <1> 	stosb	
  6275 0000E6BC C1C010              <1> 	rol	eax, 16
  6276 0000E6BF E2F5                <1> 	loop	pix_op_lin_h_2
  6277 0000E6C1 C3                  <1> 	retn
  6278                              <1> 
  6279                              <1> pix_op_lin_h_3:
  6280                              <1> 	; 16 bit (65536) colors
  6281 0000E6C2 D1E2                <1> 	shl	edx, 1
  6282 0000E6C4 0115[20900100]      <1> 	add	[u.r0], edx
  6283 0000E6CA F366AB              <1> 	rep	stosw
  6284 0000E6CD C3                  <1> 	retn
  6285                              <1> 
  6286                              <1> pix_op_lin_h_4:
  6287                              <1> 	; 32 bit true colors
  6288 0000E6CE C1E202              <1> 	shl	edx, 2
  6289 0000E6D1 0115[20900100]      <1> 	add	[u.r0], edx
  6290 0000E6D7 F3AB                <1> 	rep	stosd
  6291 0000E6D9 C3                  <1> 	retn
  6292                              <1> 
  6293                              <1> pix_op_new_8:
  6294                              <1> 	; 8 bit colors (256 colors)
  6295                              <1> 	; CHANGE PIXEL COLOR
  6296                              <1> 	; ecx = pixel count per row
  6297                              <1> 	;  al = color
  6298                              <1> 	; edi = start pixel address 
  6299                              <1> 
  6300 0000E6DA F3AA                <1> 	rep	stosb
  6301 0000E6DC C3                  <1> 	retn
  6302                              <1> 
  6303                              <1> pix_op_new_16:
  6304                              <1> 	; 16 bit colors (65536 colors)
  6305                              <1> 	; CHANGE PIXEL COLOR
  6306                              <1> 	; ecx = pixel count per row
  6307                              <1> 	;  ax = color
  6308                              <1> 	; edi = start pixel address 
  6309                              <1> 
  6310 0000E6DD F366AB              <1> 	rep	stosw
  6311 0000E6E0 C3                  <1> 	retn
  6312                              <1> 
  6313                              <1> pix_op_new_24:
  6314                              <1> 	; 24 bit true colors
  6315                              <1> 	; CHANGE PIXEL COLOR
  6316                              <1> 	; ecx = pixel count per row
  6317                              <1> 	; eax = color
  6318                              <1> 	; edi = start pixel address 
  6319                              <1> 
  6320 0000E6E1 66AB                <1> 	stosw
  6321 0000E6E3 C1C810              <1> 	ror	eax, 16	
  6322 0000E6E6 AA                  <1> 	stosb
  6323 0000E6E7 C1C010              <1> 	rol	eax, 16
  6324 0000E6EA E2F5                <1> 	loop	pix_op_new_24
  6325 0000E6EC C3                  <1> 	retn
  6326                              <1> 
  6327                              <1> pix_op_new_32:
  6328                              <1> 	; 32 bit true colors
  6329                              <1> 	; CHANGE PIXEL COLOR
  6330                              <1> 	; ecx = pixel count per row
  6331                              <1> 	; eax = color
  6332                              <1> 	; edi = start pixel address 
  6333                              <1> 
  6334 0000E6ED F3AB                <1> 	rep	stosd
  6335 0000E6EF C3                  <1> 	retn
  6336                              <1> 
  6337                              <1> pix_op_add_8:
  6338                              <1> 	; 8 bit colors (256 colors)
  6339                              <1> 	; ADD PIXEL COLOR
  6340                              <1> 	; ecx = pixel count per row
  6341                              <1> 	;  al = color
  6342                              <1> 	; edi = start pixel address 
  6343                              <1> 
  6344 0000E6F0 88C4                <1> 	mov	ah, al
  6345                              <1> pix_op_add_8_0:
  6346 0000E6F2 0207                <1> 	add	al, [edi]
  6347 0000E6F4 7302                <1> 	jnc	short pix_op_add_8_1
  6348 0000E6F6 B0FF                <1> 	mov	al, 0FFh ; Max. value	
  6349                              <1> pix_op_add_8_1:
  6350 0000E6F8 AA                  <1> 	stosb
  6351 0000E6F9 88E0                <1> 	mov	al, ah
  6352 0000E6FB E2F5                <1> 	loop	pix_op_add_8_0
  6353 0000E6FD C3                  <1> 	retn
  6354                              <1> 
  6355                              <1> pix_op_add_16:
  6356                              <1> 	; 16 bit colors (65536 colors)
  6357                              <1> 	; ADD PIXEL COLOR
  6358                              <1> 	; ecx = pixel count per row
  6359                              <1> 	;  ax = color
  6360                              <1> 	; edi = start pixel address 
  6361                              <1> 
  6362 0000E6FE 89C2                <1> 	mov	edx, eax
  6363                              <1> pix_op_add_16_0:
  6364 0000E700 660307              <1> 	add	ax, [edi]
  6365 0000E703 7304                <1> 	jnc	short pix_op_add_16_1
  6366 0000E705 66B8FFFF            <1> 	mov	ax, 0FFFFh ; Max. value	
  6367                              <1> pix_op_add_16_1:
  6368 0000E709 66AB                <1> 	stosw
  6369 0000E70B 89D0                <1> 	mov	eax, edx
  6370 0000E70D E2F1                <1> 	loop	pix_op_add_16_0
  6371 0000E70F C3                  <1> 	retn
  6372                              <1> 
  6373                              <1> pix_op_add_24:
  6374                              <1> 	; 24 bit true colors
  6375                              <1> 	; ADD PIXEL COLOR
  6376                              <1> 	; ecx = pixel count per row
  6377                              <1> 	; eax = color
  6378                              <1> 	; edi = start pixel address 
  6379                              <1> 
  6380 0000E710 53                  <1> 	push	ebx
  6381 0000E711 BBFFFFFF00          <1> 	mov	ebx, 0FFFFFFh
  6382                              <1> 	;and	eax, ebx ; 0FFFFFFh
  6383 0000E716 89C2                <1> 	mov	edx, eax
  6384                              <1> pix_op_add_24_0:
  6385 0000E718 8B07                <1> 	mov	eax, [edi]
  6386 0000E71A 21D8                <1> 	and	eax, ebx ; 0FFFFFFh
  6387 0000E71C 01D0                <1> 	add	eax, edx
  6388 0000E71E 39D8                <1> 	cmp	eax, ebx
  6389 0000E720 7602                <1> 	jna	short pix_op_add_24_1
  6390 0000E722 89D8                <1> 	mov	eax, ebx ; 0FFFFFFh  ; Max. value
  6391                              <1> pix_op_add_24_1: 
  6392 0000E724 66AB                <1> 	stosw
  6393 0000E726 C1E810              <1> 	shr	eax, 16
  6394 0000E729 AA                  <1> 	stosb
  6395 0000E72A E2EC                <1> 	loop	pix_op_add_24_0
  6396 0000E72C 89D0                <1> 	mov	eax, edx
  6397 0000E72E 5B                  <1> 	pop	ebx
  6398 0000E72F C3                  <1> 	retn
  6399                              <1> 
  6400                              <1> pix_op_add_32:
  6401                              <1> 	; 32 bit true colors
  6402                              <1> 	; ADD PIXEL COLOR
  6403                              <1> 	; ecx = pixel count per row
  6404                              <1> 	; eax = color
  6405                              <1> 	; edi = start pixel address 
  6406                              <1> 
  6407 0000E730 89C2                <1> 	mov	edx, eax
  6408                              <1> pix_op_add_32_0:
  6409 0000E732 0307                <1> 	add	eax, [edi]
  6410 0000E734 7303                <1> 	jnc	short pix_op_add_32_1
  6411                              <1> 	;mov	eax, 0FFFFFFFFh ; Max. value
  6412 0000E736 29C0                <1> 	sub	eax, eax
  6413 0000E738 48                  <1> 	dec	eax	
  6414                              <1> pix_op_add_32_1:
  6415 0000E739 AB                  <1> 	stosd
  6416 0000E73A 89D0                <1> 	mov	eax, edx
  6417 0000E73C E2F4                <1> 	loop	pix_op_add_32_0
  6418 0000E73E C3                  <1> 	retn
  6419                              <1> 
  6420                              <1> pix_op_sub_8:
  6421                              <1> 	; 8 bit colors (256 colors)
  6422                              <1> 	; SUBTRACT PIXEL COLOR
  6423                              <1> 	; ecx = pixel count per row
  6424                              <1> 	;  al = color
  6425                              <1> 	; edi = start pixel address 
  6426                              <1> 
  6427 0000E73F 88C4                <1> 	mov	ah, al
  6428                              <1> pix_op_sub_8_0:
  6429 0000E741 8A07                <1> 	mov	al, [edi]
  6430 0000E743 28E0                <1> 	sub	al, ah
  6431 0000E745 7302                <1> 	jnb	short pix_op_sub_8_1
  6432 0000E747 30C0                <1> 	xor	al, al ; 0 ; Min. value	
  6433                              <1> pix_op_sub_8_1:
  6434 0000E749 AA                  <1> 	stosb
  6435 0000E74A E2F5                <1> 	loop	pix_op_sub_8_0
  6436 0000E74C 88E0                <1> 	mov	al, ah
  6437 0000E74E C3                  <1> 	retn
  6438                              <1> 
  6439                              <1> pix_op_sub_16:
  6440                              <1> 	; 16 bit colors (65536 colors)
  6441                              <1> 	; SUBTRACT PIXEL COLOR
  6442                              <1> 	; ecx = pixel count per row
  6443                              <1> 	;  ax = color
  6444                              <1> 	; edi = start pixel address 
  6445                              <1> 
  6446 0000E74F 89C2                <1> 	mov	edx, eax
  6447                              <1> pix_op_sub_16_0:
  6448 0000E751 668B07              <1> 	mov	ax, [edi]
  6449 0000E754 6629D0              <1> 	sub	ax, dx
  6450 0000E757 7302                <1> 	jnb	short pix_op_sub_16_1
  6451 0000E759 31C0                <1> 	xor	eax, eax ; 0 ; Min. value	
  6452                              <1> pix_op_sub_16_1:
  6453 0000E75B 66AB                <1> 	stosw
  6454 0000E75D E2F2                <1> 	loop	pix_op_sub_16_0
  6455 0000E75F 89D0                <1> 	mov	eax, edx
  6456 0000E761 C3                  <1> 	retn
  6457                              <1> 
  6458                              <1> pix_op_sub_24:
  6459                              <1> 	; 24 bit true colors
  6460                              <1> 	; SUBTRACT PIXEL COLOR
  6461                              <1> 	; ecx = pixel count per row
  6462                              <1> 	; eax = color
  6463                              <1> 	; edi = start pixel address 
  6464                              <1> 
  6465                              <1> 	;and	eax, 0FFFFFFh
  6466 0000E762 89C2                <1> 	mov	edx, eax
  6467                              <1> pix_op_sub_24_0:
  6468 0000E764 8B07                <1> 	mov	eax, [edi]
  6469                              <1> 	; 27/02/2021
  6470 0000E766 25FFFFFF00          <1> 	and	eax, 0FFFFFFh
  6471 0000E76B 29D0                <1> 	sub	eax, edx
  6472 0000E76D 7302                <1> 	jnb	short pix_op_sub_24_1
  6473 0000E76F 31C0                <1> 	xor	eax, eax ; 0 ; Min. value
  6474                              <1> pix_op_sub_24_1: 
  6475 0000E771 66AB                <1> 	stosw
  6476 0000E773 C1E810              <1> 	shr	eax, 16
  6477 0000E776 AA                  <1> 	stosb
  6478 0000E777 E2EB                <1> 	loop	pix_op_sub_24_0
  6479 0000E779 89D0                <1> 	mov	eax, edx
  6480 0000E77B C3                  <1> 	retn
  6481                              <1> 
  6482                              <1> pix_op_sub_32:
  6483                              <1> 	; 32 bit true colors
  6484                              <1> 	; SUBTRACT PIXEL COLOR
  6485                              <1> 	; ecx = pixel count per row
  6486                              <1> 	; eax = color
  6487                              <1> 	; edi = start pixel address 
  6488                              <1> 
  6489 0000E77C 89C2                <1> 	mov	edx, eax
  6490                              <1> pix_op_sub_32_0:
  6491 0000E77E 8B07                <1> 	mov	eax, [edi]
  6492 0000E780 29D0                <1> 	sub	eax, edx
  6493 0000E782 7302                <1> 	jnb	short pix_op_sub_32_1
  6494 0000E784 31C0                <1> 	xor	eax, eax ; 0 ; Min. value
  6495                              <1> pix_op_sub_32_1:
  6496 0000E786 AB                  <1> 	stosd
  6497 0000E787 E2F5                <1> 	loop	pix_op_sub_32_0
  6498 0000E789 89D0                <1> 	mov	eax, edx
  6499 0000E78B C3                  <1> 	retn
  6500                              <1> 
  6501                              <1> pix_op_or_8:
  6502                              <1> 	; 8 bit colors (256 colors)
  6503                              <1> 	; OR PIXEL COLOR
  6504                              <1> 	; ecx = pixel count per row
  6505                              <1> 	;  al = color
  6506                              <1> 	; edi = start pixel address 
  6507                              <1> 
  6508                              <1> pix_op_or_8_0:
  6509 0000E78C 0807                <1> 	or	[edi], al
  6510 0000E78E 47                  <1> 	inc	edi
  6511 0000E78F E2FB                <1> 	loop	pix_op_or_8_0
  6512 0000E791 C3                  <1> 	retn
  6513                              <1> 
  6514                              <1> pix_op_or_16:
  6515                              <1> 	; 16 bit colors (65536 colors)
  6516                              <1> 	; OR PIXEL COLOR
  6517                              <1> 	; ecx = pixel count per row
  6518                              <1> 	;  ax = color
  6519                              <1> 	; edi = start pixel address 
  6520                              <1> 
  6521                              <1> pix_op_or_16_0:
  6522 0000E792 660907              <1> 	or	[edi], ax
  6523 0000E795 47                  <1> 	inc	edi
  6524 0000E796 47                  <1> 	inc	edi
  6525 0000E797 E2F9                <1> 	loop	pix_op_or_16_0
  6526 0000E799 C3                  <1> 	retn
  6527                              <1> 
  6528                              <1> pix_op_or_24:
  6529                              <1> 	; 24 bit true colors
  6530                              <1> 	; OR PIXEL COLOR
  6531                              <1> 	; ecx = pixel count per row
  6532                              <1> 	; eax = color
  6533                              <1> 	; edi = start pixel address 
  6534                              <1> 
  6535 0000E79A 89C2                <1> 	mov	edx, eax
  6536                              <1> pix_op_or_24_0:
  6537 0000E79C 0B07                <1> 	or	eax, [edi]
  6538 0000E79E 66AB                <1> 	stosw
  6539 0000E7A0 C1E810              <1> 	shr	eax, 16
  6540 0000E7A3 AA                  <1> 	stosb	
  6541 0000E7A4 89D0                <1> 	mov	eax, edx
  6542 0000E7A6 E2F4                <1> 	loop	pix_op_or_24_0
  6543 0000E7A8 C3                  <1> 	retn
  6544                              <1> 
  6545                              <1> pix_op_or_32:
  6546                              <1> 	; 32 bit true colors
  6547                              <1> 	; OR PIXEL COLOR
  6548                              <1> 	; ecx = pixel count per row
  6549                              <1> 	; eax = color
  6550                              <1> 	; edi = start pixel address 
  6551                              <1> 
  6552                              <1> 	;mov	edx, eax
  6553                              <1> pix_op_or_32_0:
  6554                              <1> 	;or	eax, [edi]
  6555                              <1> 	;stosd
  6556                              <1> 	;mov	eax, edx
  6557 0000E7A9 0907                <1> 	or	[edi], eax
  6558 0000E7AB 83C704              <1> 	add	edi, 4
  6559 0000E7AE E2F9                <1> 	loop	pix_op_or_32_0
  6560 0000E7B0 C3                  <1> 	retn
  6561                              <1> 
  6562                              <1> pix_op_and_8:
  6563                              <1> 	; 8 bit colors (256 colors)
  6564                              <1> 	; AND PIXEL COLOR
  6565                              <1> 	; ecx = pixel count per row
  6566                              <1> 	;  al = color
  6567                              <1> 	; edi = start pixel address 
  6568                              <1> 
  6569                              <1> pix_op_and_8_0:
  6570 0000E7B1 2007                <1> 	and	[edi], al
  6571 0000E7B3 47                  <1> 	inc	edi
  6572 0000E7B4 E2FB                <1> 	loop	pix_op_and_8_0
  6573 0000E7B6 C3                  <1> 	retn
  6574                              <1> 
  6575                              <1> pix_op_and_16:
  6576                              <1> 	; 16 bit colors (65536 colors)
  6577                              <1> 	; AND PIXEL COLOR
  6578                              <1> 	; ecx = pixel count per row
  6579                              <1> 	;  ax = color
  6580                              <1> 	; edi = start pixel address 
  6581                              <1> 
  6582                              <1> pix_op_and_16_0:
  6583 0000E7B7 662107              <1> 	and	[edi], ax
  6584 0000E7BA 47                  <1> 	inc	edi
  6585 0000E7BB 47                  <1> 	inc	edi
  6586 0000E7BC E2F9                <1> 	loop	pix_op_and_16_0
  6587 0000E7BE C3                  <1> 	retn
  6588                              <1> 
  6589                              <1> pix_op_and_24:
  6590                              <1> 	; 24 bit true colors
  6591                              <1> 	; AND PIXEL COLOR
  6592                              <1> 	; ecx = pixel count per row
  6593                              <1> 	; eax = color
  6594                              <1> 	; edi = start pixel address 
  6595                              <1> 
  6596 0000E7BF 89C2                <1> 	mov	edx, eax
  6597                              <1> pix_op_and_24_0:
  6598 0000E7C1 2307                <1> 	and	eax, [edi]
  6599 0000E7C3 66AB                <1> 	stosw
  6600 0000E7C5 C1E810              <1> 	shr	eax, 16
  6601 0000E7C8 AA                  <1> 	stosb	
  6602 0000E7C9 89D0                <1> 	mov	eax, edx
  6603 0000E7CB E2F4                <1> 	loop	pix_op_and_24_0
  6604 0000E7CD C3                  <1> 	retn
  6605                              <1> 
  6606                              <1> pix_op_and_32:
  6607                              <1> 	; 32 bit true colors
  6608                              <1> 	; AND PIXEL COLOR
  6609                              <1> 	; ecx = pixel count per row
  6610                              <1> 	; eax = color
  6611                              <1> 	; edi = start pixel address 
  6612                              <1> 
  6613                              <1> 	;mov	edx, eax
  6614                              <1> pix_op_and_32_0:
  6615                              <1> 	;and	eax, [edi]
  6616                              <1> 	;stosd
  6617                              <1> 	;mov	eax, edx
  6618 0000E7CE 2107                <1> 	and	[edi], eax
  6619 0000E7D0 83C704              <1> 	add	edi, 4
  6620 0000E7D3 E2F9                <1> 	loop	pix_op_and_32_0
  6621 0000E7D5 C3                  <1> 	retn
  6622                              <1> 
  6623                              <1> pix_op_xor_8:
  6624                              <1> 	; 8 bit colors (256 colors)
  6625                              <1> 	; XOR PIXEL COLOR
  6626                              <1> 	; ecx = pixel count per row
  6627                              <1> 	;  al = color
  6628                              <1> 	; edi = start pixel address 
  6629                              <1> 
  6630                              <1> pix_op_xor_8_0:
  6631 0000E7D6 3007                <1> 	xor	[edi], al
  6632 0000E7D8 47                  <1> 	inc	edi
  6633 0000E7D9 E2FB                <1> 	loop	pix_op_xor_8_0
  6634 0000E7DB C3                  <1> 	retn
  6635                              <1> 
  6636                              <1> pix_op_xor_16:
  6637                              <1> 	; 16 bit colors (65536 colors)
  6638                              <1> 	; XOR PIXEL COLOR
  6639                              <1> 	; ecx = pixel count per row
  6640                              <1> 	;  ax = color
  6641                              <1> 	; edi = start pixel address 
  6642                              <1> 
  6643                              <1> pix_op_xor_16_0:
  6644 0000E7DC 663107              <1> 	xor	[edi], ax
  6645 0000E7DF 47                  <1> 	inc	edi
  6646 0000E7E0 47                  <1> 	inc	edi
  6647 0000E7E1 E2F9                <1> 	loop	pix_op_xor_16_0
  6648 0000E7E3 C3                  <1> 	retn
  6649                              <1> 
  6650                              <1> pix_op_xor_24:
  6651                              <1> 	; 24 bit true colors
  6652                              <1> 	; XOR PIXEL COLOR
  6653                              <1> 	; ecx = pixel count per row
  6654                              <1> 	; eax = color
  6655                              <1> 	; edi = start pixel address 
  6656                              <1> 
  6657 0000E7E4 89C2                <1> 	mov	edx, eax
  6658                              <1> pix_op_xor_24_0:
  6659 0000E7E6 3307                <1> 	xor	eax, [edi]
  6660 0000E7E8 66AB                <1> 	stosw
  6661 0000E7EA C1E810              <1> 	shr	eax, 16
  6662 0000E7ED AA                  <1> 	stosb	
  6663 0000E7EE 89D0                <1> 	mov	eax, edx
  6664 0000E7F0 E2F4                <1> 	loop	pix_op_xor_24_0
  6665 0000E7F2 C3                  <1> 	retn
  6666                              <1> 
  6667                              <1> pix_op_xor_32:
  6668                              <1> 	; 32 bit true colors
  6669                              <1> 	; XOR PIXEL COLOR
  6670                              <1> 	; ecx = pixel count per row
  6671                              <1> 	; eax = color
  6672                              <1> 	; edi = start pixel address 
  6673                              <1> 
  6674                              <1> 	;mov	edx, eax
  6675                              <1> pix_op_xor_32_0:
  6676                              <1> 	;xor	eax, [edi]
  6677                              <1> 	;stosd
  6678                              <1> 	;mov	eax, edx
  6679 0000E7F3 3107                <1> 	xor	[edi], eax
  6680 0000E7F5 83C704              <1> 	add	edi, 4
  6681 0000E7F8 E2F9                <1> 	loop	pix_op_xor_32_0
  6682 0000E7FA C3                  <1> 	retn
  6683                              <1> 
  6684                              <1> pix_op_mix_8:
  6685                              <1> 	; 8 bit colors (256 colors)
  6686                              <1> 	; MIX (AVERAGE) PIXEL COLORS
  6687                              <1> 	; ecx = pixel count per row
  6688                              <1> 	;  al = color
  6689                              <1> 	; edi = start pixel address 
  6690                              <1> 
  6691 0000E7FB 88C4                <1> 	mov	ah, al
  6692                              <1> pix_op_mix_8_0:
  6693 0000E7FD 0207                <1> 	add	al, [edi]
  6694 0000E7FF D0D8                <1> 	rcr	al, 1
  6695 0000E801 AA                  <1> 	stosb
  6696 0000E802 88E0                <1> 	mov	al, ah
  6697 0000E804 E2F7                <1> 	loop	pix_op_mix_8_0
  6698 0000E806 C3                  <1> 	retn
  6699                              <1> 
  6700                              <1> pix_op_mix_16:
  6701                              <1> 	; 16 bit colors (65536 colors)
  6702                              <1> 	; MIX (AVERAGE) PIXEL COLORS
  6703                              <1> 	; ecx = pixel count per row
  6704                              <1> 	;  ax = color
  6705                              <1> 	; edi = start pixel address 
  6706                              <1> 
  6707 0000E807 89C2                <1> 	mov	edx, eax
  6708                              <1> pix_op_mix_16_0:
  6709 0000E809 660307              <1> 	add	ax, [edi]
  6710 0000E80C 66D1D8              <1> 	rcr	ax, 1
  6711 0000E80F 66AB                <1> 	stosw
  6712 0000E811 89D0                <1> 	mov	eax, edx
  6713 0000E813 E2F4                <1> 	loop	pix_op_mix_16_0
  6714 0000E815 C3                  <1> 	retn
  6715                              <1> 
  6716                              <1> pix_op_mix_24:
  6717                              <1> 	; 24 bit true colors
  6718                              <1> 	; MIX (AVERAGE) PIXEL COLORS
  6719                              <1> 	; ecx = pixel count per row
  6720                              <1> 	; eax = color
  6721                              <1> 	; edi = start pixel address 
  6722                              <1> 
  6723 0000E816 53                  <1> 	push	ebx
  6724 0000E817 BBFFFFFF00          <1> 	mov	ebx, 0FFFFFFh
  6725                              <1> 	;and	eax, ebx ; 0FFFFFFh
  6726 0000E81C 89C2                <1> 	mov	edx, eax
  6727                              <1> pix_op_mix_24_0:
  6728 0000E81E 8B07                <1> 	mov	eax, [edi]
  6729 0000E820 21D8                <1> 	and	eax, ebx ; 0FFFFFFh
  6730 0000E822 01D0                <1> 	add	eax, edx
  6731 0000E824 D1E8                <1> 	shr	eax, 1
  6732                              <1> 	;rcr	eax, 1
  6733 0000E826 66AB                <1> 	stosw
  6734 0000E828 C1E810              <1> 	shr	eax, 16
  6735 0000E82B AA                  <1> 	stosb
  6736 0000E82C E2F0                <1> 	loop	pix_op_mix_24_0
  6737 0000E82E 89D0                <1> 	mov	eax, edx
  6738 0000E830 5B                  <1> 	pop	ebx
  6739 0000E831 C3                  <1> 	retn
  6740                              <1> 
  6741                              <1> pix_op_mix_32:
  6742                              <1> 	; 32 bit true colors
  6743                              <1> 	; MIX (AVERAGE) PIXEL COLORS
  6744                              <1> 	; ecx = pixel count per row
  6745                              <1> 	; eax = color
  6746                              <1> 	; edi = start pixel address 
  6747                              <1> 
  6748 0000E832 89C2                <1> 	mov	edx, eax
  6749                              <1> pix_op_mix_32_0:
  6750 0000E834 0307                <1> 	add	eax, [edi]
  6751 0000E836 D1D8                <1> 	rcr	eax, 1	
  6752 0000E838 AB                  <1> 	stosd
  6753 0000E839 89D0                <1> 	mov	eax, edx
  6754 0000E83B E2F7                <1> 	loop	pix_op_mix_32_0
  6755 0000E83D C3                  <1> 	retn
  6756                              <1> 
  6757                              <1> pix_op_not_8:
  6758                              <1> 	; 8 bit colors (256 colors)
  6759                              <1> 	; NOT PIXEL COLOR
  6760                              <1> 	; ecx = pixel count per row
  6761                              <1> 	; edi = start pixel address 
  6762                              <1> 
  6763                              <1> pix_op_not_8_0:
  6764 0000E83E F617                <1> 	not	byte [edi]
  6765 0000E840 47                  <1> 	inc	edi
  6766 0000E841 E2FB                <1> 	loop	pix_op_not_8_0
  6767 0000E843 C3                  <1> 	retn
  6768                              <1> 
  6769                              <1> pix_op_not_16:
  6770                              <1> 	; 16 bit colors (65536 colors)
  6771                              <1> 	; NOT PIXEL COLOR
  6772                              <1> 	; ecx = pixel count per row
  6773                              <1> 	; edi = start pixel address 
  6774                              <1> 
  6775                              <1> pix_op_not_16_0:
  6776 0000E844 66F717              <1> 	not	word [edi]
  6777 0000E847 47                  <1> 	inc	edi
  6778 0000E848 47                  <1> 	inc	edi
  6779 0000E849 E2F9                <1> 	loop	pix_op_not_16_0
  6780 0000E84B C3                  <1> 	retn
  6781                              <1> 
  6782                              <1> pix_op_not_24:
  6783                              <1> 	; 24 bit true colors
  6784                              <1> 	; NOT PIXEL COLOR
  6785                              <1> 	; ecx = pixel count per row
  6786                              <1> 	; edi = start pixel address 
  6787                              <1> 
  6788                              <1> pix_op_not_24_0:
  6789 0000E84C 66F717              <1> 	not	word [edi]
  6790 0000E84F 47                  <1> 	inc	edi
  6791 0000E850 47                  <1> 	inc	edi
  6792 0000E851 F617                <1> 	not	byte [edi]
  6793 0000E853 47                  <1> 	inc	edi
  6794 0000E854 E2F6                <1> 	loop	pix_op_not_24_0
  6795 0000E856 C3                  <1> 	retn
  6796                              <1> 
  6797                              <1> pix_op_not_32:
  6798                              <1> 	; 32 bit true colors
  6799                              <1> 	; NOT PIXEL COLOR
  6800                              <1> 	; ecx = pixel count per row
  6801                              <1> 	; eax = color
  6802                              <1> 	; edi = start pixel address 
  6803                              <1> pix_op_not_32_0:
  6804 0000E857 F717                <1> 	not	dword [edi]
  6805 0000E859 83C704              <1> 	add	edi, 4
  6806 0000E85C E2F9                <1> 	loop	pix_op_not_32_0
  6807 0000E85E C3                  <1> 	retn
  6808                              <1> 
  6809                              <1> pix_op_neg_8:
  6810                              <1> 	; 8 bit colors (256 colors)
  6811                              <1> 	; NEG PIXEL COLOR
  6812                              <1> 	; ecx = pixel count per row
  6813                              <1> 	; edi = start pixel address 
  6814                              <1> 
  6815                              <1> pix_op_neg_8_0:
  6816 0000E85F F61F                <1> 	neg	byte [edi]
  6817 0000E861 47                  <1> 	inc	edi
  6818 0000E862 E2FB                <1> 	loop	pix_op_neg_8_0
  6819 0000E864 C3                  <1> 	retn
  6820                              <1> 
  6821                              <1> pix_op_neg_16:
  6822                              <1> 	; 16 bit colors (65536 colors)
  6823                              <1> 	; NEG PIXEL COLOR
  6824                              <1> 	; ecx = pixel count per row
  6825                              <1> 	; edi = start pixel address 
  6826                              <1> 
  6827                              <1> pix_op_neg_16_0:
  6828 0000E865 66F71F              <1> 	neg	word [edi]
  6829 0000E868 47                  <1> 	inc	edi
  6830 0000E869 47                  <1> 	inc	edi
  6831 0000E86A E2F9                <1> 	loop	pix_op_neg_16_0
  6832 0000E86C C3                  <1> 	retn
  6833                              <1> 
  6834                              <1> pix_op_neg_24:
  6835                              <1> 	; 24 bit true colors
  6836                              <1> 	; NEG PIXEL COLOR
  6837                              <1> 	; ecx = pixel count per row
  6838                              <1> 	; edi = start pixel address 
  6839                              <1> 
  6840                              <1> pix_op_neg_24_0:
  6841 0000E86D 8B07                <1> 	mov	eax, [edi]
  6842 0000E86F 25FFFFFF00          <1> 	and	eax, 0FFFFFFh
  6843 0000E874 F7D8                <1> 	neg	eax
  6844 0000E876 66AB                <1> 	stosw
  6845 0000E878 C1E810              <1> 	shr	eax, 16
  6846 0000E87B AA                  <1> 	stosb
  6847 0000E87C E2EF                <1> 	loop	pix_op_neg_24_0
  6848 0000E87E C3                  <1> 	retn
  6849                              <1> 
  6850                              <1> pix_op_neg_32:
  6851                              <1> 	; 32 bit true colors
  6852                              <1> 	; NEG PIXEL COLOR
  6853                              <1> 	; ecx = pixel count per row
  6854                              <1> 	; eax = color
  6855                              <1> 	; edi = start pixel address 
  6856                              <1> pix_op_neg_32_0:
  6857 0000E87F F71F                <1> 	neg	dword [edi]
  6858 0000E881 83C704              <1> 	add	edi, 4
  6859 0000E884 E2F9                <1> 	loop	pix_op_neg_32_0
  6860 0000E886 C3                  <1> 	retn
  6861                              <1> 
  6862                              <1> pix_op_inc_8:
  6863                              <1> 	; 8 bit colors (256 colors)
  6864                              <1> 	; INCREASE PIXEL COLOR
  6865                              <1> 	; ecx = pixel count per row
  6866                              <1> 	; edi = start pixel address 
  6867                              <1> 
  6868                              <1> pix_op_inc_8_0:
  6869 0000E887 FE07                <1> 	inc	byte [edi]
  6870 0000E889 7502                <1> 	jnz	short pix_op_inc_8_1
  6871                              <1> 	;mov	[edi], 0FFh ; Max. value	
  6872 0000E88B FE0F                <1> 	dec	byte [edi]
  6873                              <1> pix_op_inc_8_1:
  6874 0000E88D 47                  <1> 	inc	edi
  6875 0000E88E E2F7                <1> 	loop	pix_op_inc_8_0
  6876 0000E890 C3                  <1> 	retn
  6877                              <1> 
  6878                              <1> pix_op_inc_16:
  6879                              <1> 	; 16 bit colors (65536 colors)
  6880                              <1> 	; INCREASE PIXEL COLOR
  6881                              <1> 	; ecx = pixel count per row
  6882                              <1> 	; edi = start pixel address 
  6883                              <1> 
  6884                              <1> pix_op_inc_16_0:
  6885 0000E891 66FF07              <1> 	inc	word [edi]
  6886 0000E894 7503                <1> 	jnz	short pix_op_inc_16_1
  6887                              <1> 	;mov	word [edi], 0FFFFh ; Max. value
  6888 0000E896 66FF0F              <1> 	dec	word [edi]
  6889                              <1> pix_op_inc_16_1:
  6890 0000E899 47                  <1> 	inc	edi
  6891 0000E89A 47                  <1> 	inc	edi
  6892 0000E89B E2F4                <1> 	loop	pix_op_inc_16_0
  6893 0000E89D C3                  <1> 	retn
  6894                              <1> 
  6895                              <1> pix_op_inc_24:
  6896                              <1> 	; 24 bit true colors
  6897                              <1> 	; INCREASE PIXEL COLOR
  6898                              <1> 	; ecx = pixel count per row
  6899                              <1> 	; edi = start pixel address 
  6900                              <1> 
  6901                              <1> pix_op_inc_24_0:
  6902 0000E89E 8B07                <1> 	mov	eax, [edi]
  6903 0000E8A0 40                  <1> 	inc	eax
  6904 0000E8A1 25FFFFFF00          <1> 	and	eax, 0FFFFFFh
  6905 0000E8A6 7501                <1> 	jnz	short pix_op_inc_24_1
  6906                              <1> 	;mov	eax, 0FFFFFFh  ; Max. value
  6907 0000E8A8 48                  <1> 	dec	eax ; 0FFFFFFFFh
  6908                              <1> pix_op_inc_24_1: 
  6909 0000E8A9 66AB                <1> 	stosw
  6910 0000E8AB C1E810              <1> 	shr	eax, 16
  6911 0000E8AE AA                  <1> 	stosb
  6912 0000E8AF E2ED                <1> 	loop	pix_op_inc_24_0
  6913 0000E8B1 C3                  <1> 	retn
  6914                              <1> 
  6915                              <1> pix_op_inc_32:
  6916                              <1> 	; 32 bit true colors
  6917                              <1> 	; INCREASE PIXEL COLOR
  6918                              <1> 	; ecx = pixel count per row
  6919                              <1> 	; edi = start pixel address 
  6920                              <1> 
  6921                              <1> pix_op_inc_32_0:
  6922 0000E8B2 FF07                <1> 	inc	dword [edi]
  6923 0000E8B4 7502                <1> 	jnz	short pix_op_inc_32_1
  6924                              <1> 	;mov	dword [edi], 0FFFFFFFFh ; Max. value
  6925 0000E8B6 FF0F                <1> 	dec	dword [edi]
  6926                              <1> pix_op_inc_32_1:
  6927 0000E8B8 83C704              <1> 	add	edi, 4
  6928 0000E8BB E2F5                <1> 	loop	pix_op_inc_32_0
  6929 0000E8BD C3                  <1> 	retn
  6930                              <1> 
  6931                              <1> pix_op_dec_8:
  6932                              <1> 	; 8 bit colors (256 colors)
  6933                              <1> 	; DECREASE PIXEL COLOR
  6934                              <1> 	; ecx = pixel count per row
  6935                              <1> 	; edi = start pixel address 
  6936                              <1> 
  6937                              <1> pix_op_dec_8_0:
  6938 0000E8BE FE0F                <1> 	dec	byte [edi]
  6939 0000E8C0 7902                <1> 	jns	short pix_op_dec_8_1
  6940 0000E8C2 FE07                <1> 	inc	byte [edi] ; 0 ; Min. value	
  6941                              <1> pix_op_dec_8_1:
  6942 0000E8C4 47                  <1> 	inc	edi
  6943 0000E8C5 E2F7                <1> 	loop	pix_op_dec_8_0
  6944 0000E8C7 C3                  <1> 	retn
  6945                              <1> 
  6946                              <1> pix_op_dec_16:
  6947                              <1> 	; 16 bit colors (65536 colors)
  6948                              <1> 	; DECREASE PIXEL COLOR
  6949                              <1> 	; ecx = pixel count per row
  6950                              <1> 	; edi = start pixel address 
  6951                              <1> 
  6952                              <1> pix_op_dec_16_0:
  6953 0000E8C8 66FF0F              <1> 	dec	word [edi]
  6954 0000E8CB 7903                <1> 	jns	short pix_op_dec_16_1
  6955 0000E8CD 66FF07              <1> 	inc	word [edi] ; 0 ; Min. value	
  6956                              <1> pix_op_dec_16_1:
  6957 0000E8D0 47                  <1> 	inc edi
  6958 0000E8D1 47                  <1> 	inc edi
  6959 0000E8D2 E2F4                <1> 	loop	pix_op_dec_16_0
  6960 0000E8D4 C3                  <1> 	retn
  6961                              <1> 
  6962                              <1> pix_op_dec_24:
  6963                              <1> 	; 24 bit true colors
  6964                              <1> 	; DECREASE PIXEL COLOR
  6965                              <1> 	; ecx = pixel count per row
  6966                              <1> 	; edi = start pixel address 
  6967                              <1> 
  6968                              <1> pix_op_dec_24_0:
  6969 0000E8D5 8B07                <1> 	mov	eax, [edi]
  6970 0000E8D7 25FFFFFF00          <1> 	and	eax, 0FFFFFFh
  6971 0000E8DC 7401                <1> 	jz	short pix_op_dec_24_1
  6972                              <1> 			; 0 ; Min. value
  6973 0000E8DE 48                  <1> 	dec	eax
  6974                              <1> pix_op_dec_24_1:
  6975 0000E8DF 66AB                <1> 	stosw
  6976 0000E8E1 C1E810              <1> 	shr	eax, 16
  6977 0000E8E4 AA                  <1> 	stosb
  6978 0000E8E5 E2B7                <1> 	loop	pix_op_inc_24_0
  6979 0000E8E7 C3                  <1> 	retn
  6980                              <1> 
  6981                              <1> pix_op_dec_32:
  6982                              <1> 	; 32 bit true colors
  6983                              <1> 	; DECREASE PIXEL COLOR
  6984                              <1> 	; ecx = pixel count per row
  6985                              <1> 	; edi = start pixel address 
  6986                              <1> 
  6987                              <1> pix_op_dec_32_0:
  6988 0000E8E8 FF0F                <1> 	dec	dword [edi]
  6989 0000E8EA 7902                <1> 	jns	short pix_op_dec_32_1
  6990 0000E8EC FF07                <1> 	inc	dword [edi] ; 0 ; Min. value
  6991                              <1> pix_op_dec_32_1:
  6992 0000E8EE 83C704              <1> 	add	edi, 4
  6993 0000E8F1 E2F5                <1> 	loop	pix_op_dec_32_0
  6994 0000E8F3 89D0                <1> 	mov	eax, edx
  6995 0000E8F5 C3                  <1> 	retn
  6996                              <1> 
  6997                              <1> pix_op_rpl_8:
  6998                              <1> 	; 8 bit colors (256 colors)
  6999                              <1> 	; REPLACE PIXEL COLORS
  7000                              <1> 	; ecx = pixel count per row
  7001                              <1> 	;  al = new color
  7002                              <1> 	; byte [maskcolor] = old color
  7003                              <1> 	; edi = start pixel address
  7004                              <1> 
  7005 0000E8F6 8A25[529F0100]      <1> 	mov	ah, [maskcolor]
  7006                              <1> pix_op_rpl_8_0:
  7007 0000E8FC 3A27                <1> 	cmp	ah, [edi]
  7008 0000E8FE 7502                <1> 	jne	short pix_op_rpl_8_1
  7009 0000E900 8807                <1> 	mov	[edi], al
  7010                              <1> pix_op_rpl_8_1:
  7011 0000E902 47                  <1> 	inc	edi
  7012 0000E903 E2F7                <1> 	loop	pix_op_rpl_8_0
  7013 0000E905 C3                  <1> 	retn
  7014                              <1> 
  7015                              <1> pix_op_rpl_16:
  7016                              <1> 	; 16 bit colors (65536 colors)
  7017                              <1> 	; REPLACE PIXEL COLORS
  7018                              <1> 	; ecx = pixel count per row
  7019                              <1> 	;  ax = new color
  7020                              <1> 	; word [maskcolor] = old color
  7021                              <1> 	; edi = start pixel address
  7022                              <1> 
  7023 0000E906 8B15[529F0100]      <1> 	mov	edx, [maskcolor]
  7024                              <1> pix_op_rpl_16_0:
  7025 0000E90C 663B17              <1> 	cmp	dx, [edi]
  7026 0000E90F 7503                <1> 	jne	short pix_op_rpl_16_1
  7027 0000E911 668907              <1> 	mov	[edi], ax
  7028                              <1> pix_op_rpl_16_1:
  7029 0000E914 47                  <1> 	inc	edi
  7030 0000E915 47                  <1> 	inc	edi
  7031 0000E916 E2F4                <1> 	loop	pix_op_rpl_16_0
  7032 0000E918 C3                  <1> 	retn
  7033                              <1> 
  7034                              <1> pix_op_rpl_24:
  7035                              <1> 	; 24 bit true colors
  7036                              <1> 	; REPLACE PIXEL COLORS
  7037                              <1> 	; ecx = pixel count per row
  7038                              <1> 	; eax = new color
  7039                              <1> 	; [maskcolor] = old color
  7040                              <1> 	; edi = start pixel address
  7041                              <1> 
  7042                              <1> pix_op_rpl_24_0:
  7043 0000E919 8B17                <1> 	mov	edx, [edi]
  7044 0000E91B 81E2FFFFFF00        <1> 	and	edx, 0FFFFFFh
  7045 0000E921 3B15[529F0100]      <1> 	cmp	edx, [maskcolor]
  7046 0000E927 7406                <1> 	je	short pix_op_rpl_24_1
  7047 0000E929 83C703              <1> 	add	edi, 3
  7048 0000E92C E2EB                <1> 	loop	pix_op_rpl_24_0
  7049 0000E92E C3                  <1> 	retn
  7050                              <1> pix_op_rpl_24_1: 
  7051 0000E92F AA                  <1> 	stosb
  7052 0000E930 C1C808              <1> 	ror	eax, 8
  7053 0000E933 66AB                <1> 	stosw
  7054 0000E935 C1C008              <1> 	rol	eax, 8
  7055 0000E938 E2DF                <1> 	loop	pix_op_rpl_24_0
  7056 0000E93A C3                  <1> 	retn
  7057                              <1> 
  7058                              <1> pix_op_rpl_32:
  7059                              <1> 	; 32 bit true colors
  7060                              <1> 	; REPLACE PIXEL COLORS
  7061                              <1> 	; ecx = pixel count per row
  7062                              <1> 	; eax = new color
  7063                              <1> 	; [maskcolor] = old color
  7064                              <1> 	; edi = start pixel address
  7065                              <1> 
  7066 0000E93B 8B15[529F0100]      <1> 	mov	edx, [maskcolor]
  7067                              <1> pix_op_rpl_32_0:
  7068 0000E941 3B17                <1> 	cmp	edx, [edi]
  7069 0000E943 7504                <1> 	jne	short pix_op_rpl_32_2
  7070 0000E945 AB                  <1> 	stosd
  7071 0000E946 E2F9                <1> 	loop	pix_op_rpl_32_0
  7072 0000E948 C3                  <1> 	retn	
  7073                              <1> pix_op_rpl_32_2:
  7074 0000E949 83C704              <1> 	add	edi, 4
  7075 0000E94C E2F3                <1> 	loop	pix_op_rpl_32_0
  7076 0000E94E C3                  <1> 	retn
  7077                              <1> 
  7078                              <1> pix_op_chr:
  7079                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
  7080                              <1> 	; 15/02/2021
  7081                              <1> 	; 05/02/2021
  7082                              <1> 	; WRITE CHARACTER (FONT)
  7083                              <1> 	; 05/01/2021 ([ufont])
  7084                              <1> 	; 01/01/2021
  7085                              <1> 	;     CL = char's color (8 bit, 256 colors)
  7086                              <1> 	;    ECX = char's color (16 bit and true colors)
  7087                              <1> 	;     DL = Character's ASCII code
  7088                              <1> 	;     DH bit 0 -> font height
  7089                              <1> 	;	  0 -> 8x16 character font
  7090                              <1> 	;	  1 -> 8x8 character font
  7091                              <1> 	;     DH bit 1 & 2 -> scale	
  7092                              <1> 	;	  0 = 1/1 (8 pixels per char row)
  7093                              <1> 	;	  1 = 2/1 (16 pixels per char row)
  7094                              <1> 	;	  2 = 3/1 (24 pixels per char row)
  7095                              <1> 	;	  3 = 4/1 (32 pixels per char row) 
  7096                              <1> 	;     DH bit 6 -> [ufont] option (1 = use [ufont])
  7097                              <1> 	;     If DH bit 7 = 1
  7098                              <1> 	;	 USER FONT (from user buffer)
  7099                              <1> 	;	    DL = 0 -> 8x8 (width: 1 byte per row)
  7100                              <1> 	;	    DL = 1 -> 8x16
  7101                              <1> 	;	    DL = 2 -> 16x16 (width: 2 bytes)
  7102                              <1> 	;	    DL = 3 -> 16x32
  7103                              <1> 	;	    DL = 4 -> 24x24 (width: 3 bytes)
  7104                              <1> 	;	    DL = 5 -> 24x48
  7105                              <1> 	;	    DL = 6 -> 32x32 (width: 4 bytes)
  7106                              <1> 	;	    DL = 7 -> 32x64
  7107                              <1> 	;	    DL > 7 -> invalid (unused)
  7108                              <1> 	;	 EDI = user's font buffer address
  7109                              <1> 	;	    (NOTE: byte order is as row0,row1,row2..)
  7110                              <1> 	;     ESI = start position (row, column) (*)
  7111                              <1> 	;	     (HW = row, SI = column)
  7112                              <1> 
  7113 0000E94F 89F0                <1> 	mov	eax, esi ; start position
  7114 0000E951 E856F2FFFF          <1> 	call	calc_pixel_offset
  7115 0000E956 3B05[469F0100]      <1> 	cmp	eax, [v_siz]
  7116 0000E95C 736D                <1> 	jnb	short pix_op_chr_err ; out of display page!
  7117 0000E95E E826F2FFFF          <1> 	call	pixels_to_byte_count
  7118                              <1> 	; eax = font start offset
  7119 0000E963 0305[429F0100]      <1> 	add	eax, [v_mem] ; LFB start address
  7120 0000E969 A3[4A9F0100]        <1> 	mov	[v_str], eax ; font start address 
  7121                              <1> 
  7122 0000E96E 890D[529F0100]      <1> 	mov	[maskcolor], ecx ; save char's color
  7123                              <1> 
  7124 0000E974 8835[409F0100]      <1> 	mov	[v_ops], dh
  7125                              <1> 
  7126 0000E97A 81E6FFFF0000        <1> 	and	esi, 0FFFFh
  7127 0000E980 8935[5A9F0100]      <1> 	mov	[buffer8], esi ; start column
  7128                              <1> 
  7129 0000E986 31DB                <1> 	xor	ebx, ebx ; 0
  7130 0000E988 31C0                <1> 	xor	eax, eax ; 15/02/2021
  7131                              <1> 
  7132 0000E98A F6C680              <1> 	test	dh, 80h
  7133 0000E98D 7577                <1> 	jnz	short pix_op_chr_u ; user font
  7134                              <1> 
  7135 0000E98F 80E63F              <1> 	and	dh, 3Fh ; clear bit 6, [UFONT] option bit
  7136 0000E992 7409                <1> 	jz	short pix_op_chr_0
  7137                              <1> 
  7138 0000E994 80FE07              <1> 	cmp	dh, 7
  7139 0000E997 7732                <1> 	ja	short pix_op_chr_err
  7140                              <1> 			 ; invalid (undefined) option 
  7141 0000E999 88F4                <1> 	mov	ah, dh
  7142 0000E99B D0EC                <1> 	shr	ah, 1
  7143                              <1> 	; ah = 0 to 3, scale
  7144                              <1> 	;jmp	short pix_op_chr_font_pixels
  7145                              <1> 
  7146                              <1> pix_op_chr_font_pixels:
  7147                              <1> 	; 05/02/2021
  7148                              <1> 	; write scaled font to buffer
  7149                              <1> 
  7150                              <1> 	; DL = ASCII code of character
  7151                              <1> 	; AH = scale
  7152                              <1> 	; EDI = buffer address (kernel)
  7153                              <1> 
  7154                              <1> pix_op_chr_0:
  7155 0000E99D 88D3                <1> 	mov	bl, dl ; 15/02/2021
  7156 0000E99F 31C9                <1> 	xor	ecx, ecx
  7157 0000E9A1 B610                <1> 	mov	dh, 16
  7158 0000E9A3 F605[409F0100]01    <1> 	test	byte [v_ops], 1 ; 8x8 font ?
  7159 0000E9AA 7428                <1> 	jz	short pix_op_chr_2 ; 8x16 font 
  7160 0000E9AC B608                <1> 	mov	dh, 8
  7161 0000E9AE C1E303              <1> 	shl	ebx, 3 ; * 8
  7162 0000E9B1 F605[409F0100]40    <1> 	test	byte [v_ops], 40h ; [ufont] option
  7163 0000E9B8 7412                <1> 	jz	short pix_op_chr_1  ; no
  7164                              <1> 	; test 8x8 user font is ready flag
  7165 0000E9BA F605[369F0100]01    <1> 	test	byte [ufont], 1
  7166 0000E9C1 7409                <1> 	jz	short pix_op_chr_1 ; no
  7167 0000E9C3 81C300500900        <1> 	add	ebx, VGAFONT8USER
  7168 0000E9C9 EB2C                <1> 	jmp	short pix_op_chr_fpos_0
  7169                              <1> pix_op_chr_err:
  7170 0000E9CB C3                  <1> 	retn
  7171                              <1> pix_op_chr_1:
  7172 0000E9CC 81C3[1C4F0100]      <1> 	add	ebx, vgafont8 ; system font (8x8)
  7173 0000E9D2 EB23                <1> 	jmp	short pix_op_chr_fpos_0
  7174                              <1> pix_op_chr_2:
  7175 0000E9D4 C1E304              <1> 	shl	ebx, 4 ; * 16
  7176 0000E9D7 F605[409F0100]40    <1> 	test	byte [v_ops], 40h ; [ufont] option
  7177 0000E9DE 7411                <1> 	jz	short pix_op_chr_3  ; no
  7178                              <1> 	; test 8x16 user font is ready flag
  7179 0000E9E0 F605[369F0100]02    <1> 	test	byte [ufont], 2
  7180 0000E9E7 7408                <1> 	jz	short pix_op_chr_3 ; no
  7181 0000E9E9 81C300400900        <1> 	add	ebx, VGAFONT16USER
  7182 0000E9EF EB06                <1> 	jmp	short pix_op_chr_fpos_0
  7183                              <1> pix_op_chr_3:
  7184 0000E9F1 81C3[1C650100]      <1> 	add	ebx, vgafont16 ; system font (8x16)
  7185                              <1> pix_op_chr_fpos_0:
  7186 0000E9F7 20E4                <1> 	and	ah, ah
  7187 0000E9F9 754A                <1> 	jnz	short pix_op_chr_fpos_1 ; scale > 1 
  7188                              <1> 	; no scale (scale = 1)
  7189 0000E9FB 89DE                <1> 	mov	esi, ebx ; 15/02/2021
  7190 0000E9FD 88F1                <1> 	mov	cl, dh ; rows/height (16 or 8)	
  7191 0000E9FF B608                <1> 	mov	dh, 8  ; columns/width
  7192 0000EA01 E9CB000000          <1> 	jmp	pix_op_chr_f2p
  7193                              <1> pix_op_chr_u:
  7194                              <1> 	; write user defined font 
  7195 0000EA06 80FE80              <1> 	cmp	dh, 80h
  7196 0000EA09 75C0                <1> 	jne	short pix_op_chr_err
  7197 0000EA0B 80FA07              <1> 	cmp	dl, 7
  7198 0000EA0E 77BB                <1> 	ja	short pix_op_chr_err
  7199                              <1> 
  7200                              <1> 	; 16/02/2021
  7201 0000EA10 89FE                <1> 	mov	esi, edi ; user's font buffer
  7202                              <1> 	
  7203                              <1> 	;xor	eax, eax
  7204                              <1> 	; eax = 0 ; 15/02/2021	
  7205 0000EA12 88D4                <1> 	mov	ah, dl
  7206 0000EA14 D0EC                <1> 	shr	ah, 1
  7207 0000EA16 FEC4                <1> 	inc	ah	
  7208                              <1> 	; ah =  1 to 4
  7209 0000EA18 88E0                <1> 	mov	al, ah
  7210 0000EA1A C0E003              <1> 	shl	al, 3 ; * 8
  7211                              <1> 	; al = 8,16,24,32
  7212 0000EA1D 88C3                <1> 	mov	bl, al
  7213 0000EA1F 88C7                <1> 	mov	bh, al
  7214 0000EA21 F6E4                <1> 	mul	ah
  7215                              <1> 	; ax = 8,32,72,128 bytes 
  7216 0000EA23 F6C201              <1> 	test	dl, 1
  7217 0000EA26 7404                <1> 	jz	short pix_op_chr_u_0
  7218                              <1> 	;shl	ax, 1 ; *2
  7219                              <1> 	; 23/07/2022
  7220 0000EA28 D1E0                <1> 	shl	eax, 1
  7221                              <1> 	; ax = 16,32,144,256 bytes
  7222 0000EA2A D0E7                <1> 	shl	bh, 1
  7223                              <1> pix_op_chr_u_0:
  7224                              <1> 	; eax = byte count
  7225 0000EA2C 89C1                <1> 	mov	ecx, eax
  7226 0000EA2E BF00760900          <1> 	mov	edi, VBE3SAVERESTOREBLOCK
  7227                              <1> 	; esi = user buffer
  7228 0000EA33 E8A3240000          <1> 	call	transfer_from_user_buffer
  7229 0000EA38 7291                <1> 	jc	short pix_op_chr_err
  7230                              <1> 
  7231 0000EA3A 88F9                <1> 	mov	cl, bh ; rows/height
  7232 0000EA3C 88DE                <1> 	mov	dh, bl ; columns (width)
  7233 0000EA3E 89FE                <1> 	mov	esi, edi ; VBE3SAVERESTOREBLOCK
  7234 0000EA40 E98C000000          <1> 	jmp	pix_op_chr_f2p
  7235                              <1> 
  7236                              <1> pix_op_chr_fpos_1:
  7237                              <1> 	; 18/02/2021
  7238                              <1> 	; scale > 1
  7239 0000EA45 88F5                <1> 	mov	ch, dh ; 16 or 8
  7240 0000EA47 BF00760900          <1> 	mov	edi, VBE3SAVERESTOREBLOCK
  7241 0000EA4C 89FE                <1> 	mov	esi, edi
  7242 0000EA4E FECC                <1> 	dec	ah
  7243 0000EA50 7522                <1> 	jnz	short pix_op_chr_fpos_5 ; scale > 2
  7244                              <1> 	; scale = 2
  7245                              <1> pix_op_chr_fpos_2:	
  7246 0000EA52 B108                <1> 	mov	cl, 8
  7247 0000EA54 8A13                <1> 	mov	dl, [ebx]
  7248                              <1> pix_op_chr_fpos_3:
  7249                              <1> 	;shl 	ax, 2
  7250                              <1> 	; 23/07/2022
  7251 0000EA56 C1E002              <1> 	shl	eax, 2
  7252 0000EA59 D0E2                <1> 	shl	dl, 1
  7253 0000EA5B 7302                <1> 	jnc	short pix_op_chr_fpos_4
  7254 0000EA5D 0C03                <1> 	or	al, 3
  7255                              <1> pix_op_chr_fpos_4:
  7256 0000EA5F FEC9                <1> 	dec	cl
  7257 0000EA61 75F3                <1> 	jnz	short pix_op_chr_fpos_3
  7258 0000EA63 66AB                <1> 	stosw
  7259                              <1> 	; 18/02/2021
  7260 0000EA65 66AB                <1> 	stosw
  7261 0000EA67 43                  <1> 	inc	ebx
  7262 0000EA68 FECD                <1> 	dec	ch
  7263 0000EA6A 75E6                <1> 	jnz	short pix_op_chr_fpos_2
  7264                              <1> 	; scale = 2
  7265 0000EA6C 88F1                <1> 	mov	cl, dh ; 16 or 8 (height/rows)
  7266 0000EA6E D0E1                <1> 	shl	cl, 1  ; 32 or 16 rows
  7267 0000EA70 B610                <1> 	mov	dh, 16 ; columns (width)
  7268 0000EA72 EB5D                <1> 	jmp	short pix_op_chr_f2p
  7269                              <1> pix_op_chr_fpos_5:
  7270 0000EA74 FECC                <1> 	dec	ah
  7271 0000EA76 7538                <1> 	jnz	short pix_op_chr_fpos_9 ; scale = 4
  7272                              <1> 	; scale = 3
  7273                              <1> pix_op_chr_fpos_6:	
  7274 0000EA78 B108                <1> 	mov	cl, 8
  7275 0000EA7A 8A13                <1> 	mov	dl, [ebx]
  7276                              <1> pix_op_chr_fpos_7:
  7277 0000EA7C C1E003              <1> 	shl 	eax, 3
  7278 0000EA7F D0E2                <1> 	shl	dl, 1 ; 18/02/2021
  7279 0000EA81 7302                <1> 	jnc	short pix_op_chr_fpos_8
  7280 0000EA83 0C07                <1> 	or	al, 7
  7281                              <1> pix_op_chr_fpos_8:
  7282 0000EA85 FEC9                <1> 	dec	cl
  7283 0000EA87 75F3                <1> 	jnz	short pix_op_chr_fpos_7
  7284 0000EA89 66AB                <1> 	stosw
  7285                              <1> 	; 18/02/2021
  7286 0000EA8B C1C810              <1> 	ror	eax, 16
  7287 0000EA8E AA                  <1> 	stosb
  7288 0000EA8F C1C010              <1> 	rol	eax, 16
  7289 0000EA92 66AB                <1> 	stosw
  7290 0000EA94 C1C810              <1> 	ror	eax, 16
  7291 0000EA97 AA                  <1> 	stosb	
  7292 0000EA98 C1C010              <1> 	rol	eax, 16
  7293 0000EA9B 66AB                <1> 	stosw
  7294 0000EA9D C1E810              <1> 	shr	eax, 16 ; 27/02/2021
  7295 0000EAA0 AA                  <1> 	stosb
  7296 0000EAA1 43                  <1> 	inc	ebx
  7297                              <1> 	; 18/02/2021
  7298 0000EAA2 FECD                <1> 	dec	ch
  7299 0000EAA4 75D2                <1> 	jnz	short pix_op_chr_fpos_6
  7300                              <1> 	; scale = 3
  7301 0000EAA6 88F1                <1> 	mov	cl, dh ; 16 or 8 (height/rows)
  7302 0000EAA8 D0E1                <1> 	shl	cl, 1 
  7303 0000EAAA 00F1                <1> 	add	cl, dh ; 48 or 24 rows
  7304 0000EAAC B618                <1> 	mov	dh, 24 ; columns (width)
  7305 0000EAAE EB21                <1> 	jmp	short pix_op_chr_f2p
  7306                              <1> 
  7307                              <1> pix_op_chr_fpos_9:
  7308                              <1> 	; scale = 4
  7309 0000EAB0 B108                <1> 	mov	cl, 8
  7310 0000EAB2 8A13                <1> 	mov	dl, [ebx]
  7311                              <1> pix_op_chr_fpos_10:
  7312                              <1> 	; 18/02/2021
  7313 0000EAB4 C1E004              <1> 	shl 	eax, 4
  7314 0000EAB7 D0E2                <1> 	shl	dl, 1 ; 18/02/2021
  7315 0000EAB9 7302                <1> 	jnc	short pix_op_chr_fpos_11
  7316 0000EABB 0C0F                <1> 	or	al, 0Fh ; or al, 15
  7317                              <1> pix_op_chr_fpos_11:
  7318 0000EABD FEC9                <1> 	dec	cl
  7319 0000EABF 75F3                <1> 	jnz	short pix_op_chr_fpos_10
  7320 0000EAC1 AB                  <1> 	stosd
  7321                              <1> 	; 18/02/2021
  7322 0000EAC2 AB                  <1> 	stosd
  7323 0000EAC3 AB                  <1> 	stosd
  7324 0000EAC4 AB                  <1> 	stosd
  7325 0000EAC5 43                  <1> 	inc	ebx
  7326 0000EAC6 FECD                <1> 	dec	ch
  7327 0000EAC8 75E6                <1> 	jnz	short pix_op_chr_fpos_9
  7328                              <1> 	; scale = 4
  7329 0000EACA 88F1                <1> 	mov	cl, dh ; 16 or 8 (height/rows)
  7330 0000EACC C0E102              <1> 	shl	cl, 2 ; 64 or 32 rows
  7331 0000EACF B620                <1> 	mov	dh, 32 ; columns (width)
  7332                              <1> 	;jmp	short pix_op_chr_f2p
  7333                              <1>  	
  7334                              <1> pix_op_chr_f2p:
  7335                              <1> 	; write font pixels
  7336 0000EAD1 8B3D[4A9F0100]      <1> 	mov	edi, [v_str]
  7337                              <1> 	; 15/02/2021
  7338                              <1> pix_op_chr_f2p_next:
  7339 0000EAD7 80FE08              <1> 	cmp	dh, 8
  7340 0000EADA 7706                <1> 	ja	short pix_op_chr_f2p_24
  7341                              <1> pix_op_chr_f2p_8:
  7342 0000EADC AC                  <1> 	lodsb
  7343 0000EADD C1E018              <1> 	shl	eax, 24 ; 15/02/2021
  7344 0000EAE0 EB16                <1> 	jmp	short pix_op_chr_f2p_0
  7345                              <1> pix_op_chr_f2p_24:
  7346 0000EAE2 80FE18              <1> 	cmp	dh, 24
  7347 0000EAE5 7710                <1> 	ja	short pix_op_chr_f2p_32
  7348 0000EAE7 7207                <1> 	jb	short pix_op_chr_f2p_16	
  7349                              <1> 	; 27/02/2021
  7350                              <1> 	;mov	eax, [esi]
  7351 0000EAE9 AD                  <1> 	lodsd
  7352 0000EAEA C1E008              <1> 	shl	eax, 8
  7353                              <1> 	;add	esi, 3
  7354 0000EAED 4E                  <1> 	dec	esi
  7355 0000EAEE EB08                <1> 	jmp	short pix_op_chr_f2p_0
  7356                              <1> pix_op_chr_f2p_16:
  7357 0000EAF0 66AD                <1> 	lodsw
  7358 0000EAF2 C1E010              <1> 	shl	eax, 16 ; 15/02/2021
  7359 0000EAF5 EB01                <1> 	jmp	short pix_op_chr_f2p_0
  7360                              <1> pix_op_chr_f2p_32:
  7361 0000EAF7 AD                  <1> 	lodsd
  7362                              <1> pix_op_chr_f2p_0:
  7363                              <1> 	; EAX = font row (8,16,24,32 pixels)
  7364                              <1> 	;	(bits are shifted to left)
  7365                              <1> 	; CL = rows
  7366                              <1> 	; DH = bits per row (8,16,24,32)
  7367 0000EAF8 8B1D[5A9F0100]      <1> 	mov	ebx, [buffer8] ; start column
  7368 0000EAFE 57                  <1> 	push	edi ; *
  7369 0000EAFF 52                  <1> 	push	edx ; **
  7370                              <1> pix_op_chr_f2p_1:
  7371 0000EB00 E82E000000          <1> 	call	pix_op_chr_w_pixel
  7372                              <1> pix_op_chr_f2p_2:
  7373 0000EB05 663B1D[3E9F0100]    <1> 	cmp	bx, [v_width] ; current column
  7374 0000EB0C 7304                <1> 	jnb	short pix_op_chr_f2p_3
  7375 0000EB0E FECE                <1> 	dec	dh
  7376 0000EB10 75EE                <1> 	jnz	short pix_op_chr_f2p_1 ; next bit
  7377                              <1> pix_op_chr_f2p_3:
  7378                              <1> 	;mov	ebx, [buffer8]
  7379 0000EB12 5A                  <1> 	pop	edx ; **
  7380 0000EB13 58                  <1> 	pop	eax ; *
  7381 0000EB14 3B3D[4E9F0100]      <1> 	cmp	edi, [v_end]
  7382 0000EB1A 7316                <1> 	jnb	short pix_op_chr_f2p_4
  7383 0000EB1C FEC9                <1> 	dec	cl
  7384 0000EB1E 7412                <1> 	jz	short pix_op_chr_f2p_4
  7385                              <1> 	; 27/02/2021
  7386 0000EB20 89C7                <1> 	mov	edi, eax
  7387 0000EB22 0FB705[3E9F0100]    <1> 	movzx	eax, word [v_width]
  7388 0000EB29 E85BF0FFFF          <1> 	call	pixels_to_byte_count
  7389 0000EB2E 01C7                <1> 	add	edi, eax ; next position
  7390 0000EB30 EBA5                <1> 	jmp	short pix_op_chr_f2p_next
  7391                              <1> pix_op_chr_f2p_4:
  7392 0000EB32 C3                  <1> 	retn
  7393                              <1> 
  7394                              <1> pix_op_chr_w_pixel:
  7395                              <1> 	; 15/02/2021
  7396 0000EB33 89C5                <1> 	mov	ebp, eax
  7397 0000EB35 A1[529F0100]        <1> 	mov	eax, [maskcolor]
  7398 0000EB3A 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  7399 0000EB41 7711                <1> 	ja	short pix_op_chr_wp_2
  7400                              <1> 	; 256 colors (1 byte per pixel)
  7401 0000EB43 D1E5                <1> 	shl	ebp, 1
  7402 0000EB45 7302                <1> 	jnc	short pix_op_chr_wp_0
  7403 0000EB47 8807                <1> 	mov	[edi], al
  7404                              <1> pix_op_chr_wp_0:
  7405 0000EB49 47                  <1> 	inc	edi
  7406 0000EB4A FF05[20900100]      <1> 	inc	dword [u.r0] ; +1
  7407                              <1> pix_op_chr_wp_1:
  7408 0000EB50 43                  <1> 	inc	ebx
  7409 0000EB51 89E8                <1> 	mov	eax, ebp
  7410 0000EB53 C3                  <1> 	retn
  7411                              <1> pix_op_chr_wp_2:
  7412 0000EB54 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  7413 0000EB5B 772E                <1> 	ja	short pix_op_chr_wp_6 ; 32bpp
  7414 0000EB5D 721C                <1> 	jb	short pix_op_chr_wp_4 ; 16bpp
  7415                              <1> 	; 24 bit true colors
  7416                              <1> 	; * 3
  7417 0000EB5F D1E5                <1> 	shl	ebp, 1
  7418 0000EB61 7309                <1> 	jnc	short pix_op_chr_wp_3
  7419 0000EB63 668907              <1> 	mov	[edi], ax
  7420 0000EB66 C1E810              <1> 	shr	eax, 16
  7421 0000EB69 884702              <1> 	mov	[edi+2], al
  7422                              <1> pix_op_chr_wp_3:
  7423 0000EB6C B803000000          <1> 	mov	eax, 3 ; 27/02/2021 
  7424 0000EB71 01C7                <1> 	add	edi, eax  ; add edi, 3
  7425 0000EB73 0105[20900100]      <1> 	add	[u.r0], eax ; +3
  7426                              <1> 	
  7427 0000EB79 EBD5                <1> 	jmp	short pix_op_chr_wp_1
  7428                              <1> 
  7429                              <1> pix_op_chr_wp_4:
  7430                              <1> 	; 16 bit (65536) colors
  7431 0000EB7B D1E5                <1> 	shl	ebp, 1
  7432 0000EB7D 7303                <1> 	jnc	short pix_op_chr_wp_5
  7433 0000EB7F 668907              <1> 	mov	[edi], ax
  7434                              <1> pix_op_chr_wp_5:
  7435 0000EB82 47                  <1> 	inc	edi
  7436 0000EB83 FF05[20900100]      <1> 	inc	dword [u.r0] ; +1 
  7437 0000EB89 EBBE                <1> 	jmp	short pix_op_chr_wp_0
  7438                              <1> 
  7439                              <1> pix_op_chr_wp_6:
  7440                              <1> 	; 32 bit true colors
  7441 0000EB8B D1E5                <1> 	shl	ebp, 1
  7442 0000EB8D 7302                <1> 	jnc	short pix_op_chr_wp_7
  7443 0000EB8F 8907                <1> 	mov	[edi], eax
  7444                              <1> pix_op_chr_wp_7:
  7445 0000EB91 31C0                <1> 	xor	eax, eax
  7446 0000EB93 B004                <1> 	mov	al, 4
  7447 0000EB95 01C7                <1> 	add	edi, eax ; add edi, 4
  7448 0000EB97 0105[20900100]      <1> 	add	[u.r0], eax ; +4
  7449 0000EB9D EBB1                <1> 	jmp	short pix_op_chr_wp_1
  7450                              <1> 
  7451                              <1> m_pix_op_cpy:
  7452                              <1> 	; 26/02/2021
  7453                              <1> 	; 06/02/2021
  7454                              <1> 	; MASKED COPY PIXELS (full screen)
  7455                              <1> 	;
  7456                              <1> 	; jump from pix_op_cpy
  7457                              <1> 	;
  7458                              <1> 	; INPUT:
  7459                              <1> 	;   ecx = transfer count (bytes)
  7460                              <1> 	;   edi = [v_mem] = start address of LFB 
  7461                              <1> 	;   esi = user's buffer address (virtual)
  7462                              <1> 	;
  7463                              <1> 	; OUTPUT:
  7464                              <1> 	;   [u.r0] will be > 0 if succesful
  7465                              <1> 
  7466                              <1> 	; Full screen masked copy
  7467                              <1> 
  7468                              <1> 	; Modified regs: eax, ebx, edx, esi, edi, ecx
  7469                              <1> 
  7470                              <1> m_pix_op_cpy_0:
  7471                              <1> 	;push	ebx ; *** ; 26/02/2021
  7472 0000EB9F 57                  <1> 	push	edi ; **
  7473 0000EBA0 51                  <1> 	push	ecx ; *
  7474 0000EBA1 81F9F8070000        <1> 	cmp	ecx, 2040 ; (3*680) ; 26/02/2021
  7475 0000EBA7 7605                <1> 	jna	short m_pix_op_cpy_1
  7476 0000EBA9 B9F8070000          <1> 	mov	ecx, 2040
  7477                              <1> m_pix_op_cpy_1:
  7478 0000EBAE BF00760900          <1> 	mov	edi, VBE3SAVERESTOREBLOCK ; temporary buff
  7479 0000EBB3 E823230000          <1> 	call	transfer_from_user_buffer
  7480 0000EBB8 726C                <1> 	jc	short m_pix_op_cpy_3
  7481 0000EBBA 01CE                <1> 	add	esi, ecx
  7482 0000EBBC 89F5                <1> 	mov	ebp, esi  ; save user's buffer address
  7483 0000EBBE 89FE                <1> 	mov	esi, edi
  7484 0000EBC0 89CB                <1> 	mov	ebx, ecx
  7485 0000EBC2 59                  <1> 	pop	ecx ; *
  7486 0000EBC3 29D9                <1> 	sub	ecx, ebx
  7487 0000EBC5 5F                  <1> 	pop	edi ; **
  7488 0000EBC6 31D2                <1> 	xor	edx, edx ; 26/02/2021
  7489 0000EBC8 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8
  7490 0000EBCF 7435                <1> 	je	short m_pix_op_cpy_1_8
  7491 0000EBD1 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24
  7492 0000EBD8 776D                <1> 	ja	short m_pix_op_cpy_1_32
  7493 0000EBDA 724D                <1> 	jb	short m_pix_op_cpy_1_16
  7494                              <1> m_pix_op_cpy_1_24:
  7495                              <1> 	; 24 bit masked copy
  7496                              <1> 	;mov	edx, 3
  7497 0000EBDC B203                <1> 	mov	dl, 3 ; 26/02/2021
  7498                              <1> m_pix_op_cpy_1_24_0:
  7499 0000EBDE 66AD                <1> 	lodsw
  7500 0000EBE0 C1E010              <1> 	shl	eax, 16
  7501 0000EBE3 AC                  <1> 	lodsb
  7502 0000EBE4 C1C010              <1> 	rol	eax, 16
  7503 0000EBE7 3B05[529F0100]      <1> 	cmp	eax, [maskcolor]
  7504 0000EBED 740F                <1> 	je	short m_pix_op_cpy_1_24_1 ; exclude
  7505 0000EBEF 668907              <1> 	mov	[edi], ax
  7506 0000EBF2 C1E810              <1> 	shr	eax, 16
  7507 0000EBF5 884702              <1> 	mov	[edi+2], al
  7508 0000EBF8 0115[20900100]      <1> 	add	[u.r0], edx ; +3
  7509                              <1> m_pix_op_cpy_1_24_1:
  7510 0000EBFE 01D7                <1> 	add	edi, edx ; +3
  7511 0000EC00 29D3                <1> 	sub	ebx, edx ; sub ebx, 3
  7512 0000EC02 77DA                <1> 	ja	short m_pix_op_cpy_1_24_0
  7513 0000EC04 EB15                <1>  	jmp	short m_pix_op_cpy_2
  7514                              <1> 
  7515                              <1> m_pix_op_cpy_1_8:
  7516                              <1> 	; 8 bit masked copy
  7517 0000EC06 AC                  <1> 	lodsb
  7518 0000EC07 3A05[529F0100]      <1> 	cmp	al, [maskcolor]
  7519 0000EC0D 7408                <1> 	je	short m_pix_op_cpy_1_8_1 ; exclude
  7520 0000EC0F 8807                <1> 	mov	[edi], al
  7521 0000EC11 FF05[20900100]      <1> 	inc	dword [u.r0] ; +1
  7522                              <1> m_pix_op_cpy_1_8_1:
  7523 0000EC17 47                  <1> 	inc	edi ; +1
  7524 0000EC18 4B                  <1> 	dec	ebx 	
  7525 0000EC19 75EB                <1> 	jnz	short m_pix_op_cpy_1_8
  7526                              <1> m_pix_op_cpy_2:
  7527 0000EC1B 89EE                <1> 	mov	esi, ebp ; restore user's buffer addr
  7528 0000EC1D 09C9                <1> 	or	ecx, ecx
  7529                              <1> 	; 26/02/2021
  7530 0000EC1F 7407                <1> 	jz	short m_pix_of_cpy_4
  7531 0000EC21 E979FFFFFF          <1> 	jmp	m_pix_op_cpy_0
  7532                              <1> m_pix_op_cpy_3:
  7533 0000EC26 59                  <1> 	pop	ecx ; *
  7534 0000EC27 5F                  <1> 	pop	edi ; **
  7535                              <1> m_pix_of_cpy_4:
  7536                              <1> 	;pop	ebx ; *** ; 26/02/2021 
  7537 0000EC28 C3                  <1> 	retn
  7538                              <1> 
  7539                              <1> m_pix_op_cpy_1_16:
  7540                              <1> 	; 16 bit masked copy
  7541                              <1> 	;mov	edx, 2
  7542 0000EC29 B202                <1> 	mov	dl, 2 ; 26/02/2021
  7543                              <1> m_pix_op_cpy_1_16_0:
  7544 0000EC2B 66AD                <1> 	lodsw
  7545 0000EC2D 663B05[529F0100]    <1> 	cmp	ax, [maskcolor]
  7546 0000EC34 7409                <1> 	je	short m_pix_op_cpy_1_16_1 ; exclude
  7547 0000EC36 668907              <1> 	mov	[edi], ax
  7548 0000EC39 0115[20900100]      <1> 	add	[u.r0], edx ; +2
  7549                              <1> m_pix_op_cpy_1_16_1:
  7550 0000EC3F 01D7                <1> 	add	edi, edx ; +2
  7551 0000EC41 29D3                <1> 	sub	ebx, edx ; sub ebx, 2
  7552 0000EC43 77E6                <1> 	ja	short m_pix_op_cpy_1_16_0
  7553 0000EC45 EBD4                <1>  	jmp	short m_pix_op_cpy_2
  7554                              <1> 
  7555                              <1> m_pix_op_cpy_1_32:
  7556                              <1> 	; 32 bit masked copy
  7557                              <1> 	;mov	edx, 4
  7558 0000EC47 B204                <1> 	mov	dl, 4 ; 26/02/2021
  7559                              <1> m_pix_op_cpy_1_32_0:
  7560 0000EC49 AD                  <1> 	lodsd
  7561 0000EC4A 3B05[529F0100]      <1> 	cmp	eax, [maskcolor]
  7562 0000EC50 7408                <1> 	je	short m_pix_op_cpy_1_32_1 ; exclude
  7563 0000EC52 8907                <1> 	mov	[edi], eax
  7564 0000EC54 0115[20900100]      <1> 	add	[u.r0], edx ; +4
  7565                              <1> m_pix_op_cpy_1_32_1:
  7566 0000EC5A 01D7                <1> 	add	edi, edx ; +4
  7567 0000EC5C 29D3                <1> 	sub	ebx, edx ; sub ebx, 4
  7568 0000EC5E 77E9                <1> 	ja	short m_pix_op_cpy_1_32_0
  7569 0000EC60 EBB9                <1>  	jmp	short m_pix_op_cpy_2
  7570                              <1> 	
  7571                              <1> m_pix_op_cpy_w:
  7572                              <1> 	; 26/02/2021
  7573                              <1> 	; 06/02/2021
  7574                              <1> 	; MASKED COPY PIXELS (window)
  7575                              <1> 	;
  7576                              <1> 	; jump from pix_op_cpy_w
  7577                              <1> 	;
  7578                              <1> 	; INPUT:
  7579                              <1> 	;   ecx = bytes per row (to be applied)
  7580                              <1> 	;   edx = screen width in bytes
  7581                              <1> 	;   ebx = row count
  7582                              <1> 	;   esi = user's buffer address
  7583                              <1> 	;   [v_str] = window start address
  7584                              <1> 	;
  7585                              <1> 	; OUTPUT:
  7586                              <1> 	;   [u.r0] will be > 0 if succesful
  7587                              <1> 
  7588                              <1> 	; Window masked copy
  7589                              <1> 
  7590                              <1> m_pix_op_cpy_w_0:
  7591 0000EC62 8B3D[4A9F0100]      <1> 	mov	edi, [v_str]
  7592                              <1> m_pix_op_cpy_w_1:
  7593 0000EC68 57                  <1> 	push	edi
  7594 0000EC69 56                  <1> 	push	esi
  7595 0000EC6A 53                  <1> 	push	ebx
  7596 0000EC6B 52                  <1> 	push	edx
  7597 0000EC6C 51                  <1> 	push	ecx
  7598 0000EC6D E82DFFFFFF          <1> 	call	m_pix_op_cpy ; 26/02/2021
  7599 0000EC72 59                  <1> 	pop	ecx
  7600 0000EC73 5A                  <1> 	pop	edx
  7601 0000EC74 5B                  <1> 	pop	ebx
  7602 0000EC75 5E                  <1> 	pop	esi
  7603 0000EC76 5F                  <1> 	pop	edi
  7604 0000EC77 7209                <1> 	jc	short m_pix_op_cpy_w_2
  7605 0000EC79 4B                  <1> 	dec	ebx
  7606 0000EC7A 7406                <1> 	jz	short m_pix_op_cpy_w_2 ; ok.
  7607                              <1> 	; next row
  7608 0000EC7C 01CE                <1> 	add	esi, ecx ; next row in user's buffer
  7609 0000EC7E 01D7                <1> 	add	edi, edx ; next row of window (system)
  7610 0000EC80 EBE6                <1> 	jmp	short m_pix_op_cpy_w_1
  7611                              <1> m_pix_op_cpy_w_2:
  7612 0000EC82 C3                  <1> 	retn
  7613                              <1> 
  7614                              <1> m_pix_op_new:
  7615                              <1> 	; 06/02/2021
  7616                              <1> 	; CHANGE COLOR (MASKED, full screen)
  7617                              <1> 	;
  7618                              <1> 	; jump from pix_op_new
  7619                              <1> 	;
  7620                              <1> 	; INPUT:
  7621                              <1> 	;   eax = color (AL, AX, EAX)
  7622                              <1> 	;   ecx = [v_siz] ; display page pixel count
  7623                              <1> 	;   esi = edi = [v_mem] ; LFB start address
  7624                              <1> 	;
  7625                              <1> 	;   [maskcolor] = mask color (to be excluded)
  7626                              <1> 	;
  7627                              <1> 	; OUTPUT:
  7628                              <1> 	; 	[u.r0] will be > 0 if succesful
  7629                              <1> 	
  7630                              <1> 	; Full screen
  7631                              <1> m_pix_op_new_0:
  7632 0000EC83 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  7633 0000EC8A 7717                <1> 	ja	short m_pix_op_new_1
  7634                              <1> 	; 256 colors (8bpp)
  7635                              <1> 	;jmp	short m_pix_op_new_8
  7636                              <1> m_pix_op_new_8:
  7637                              <1> 	; 8 bit colors (256 colors)
  7638 0000EC8C 88C2                <1> 	mov	dl, al ; new color
  7639                              <1> m_pix_op_new_8_0:
  7640 0000EC8E AC                  <1> 	lodsb 
  7641 0000EC8F 3A05[529F0100]      <1> 	cmp	al, [maskcolor]
  7642 0000EC95 7408                <1> 	je	short m_pix_op_new_8_1 ; exclude
  7643 0000EC97 8817                <1> 	mov	[edi], dl
  7644 0000EC99 FF05[20900100]      <1> 	inc	dword [u.r0]
  7645                              <1> m_pix_op_new_8_1:
  7646 0000EC9F 47                  <1> 	inc	edi
  7647 0000ECA0 E2EC                <1> 	loop	m_pix_op_new_8_0
  7648 0000ECA2 C3                  <1> 	retn
  7649                              <1> m_pix_op_new_1:
  7650 0000ECA3 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  7651 0000ECAA 774B                <1> 	ja	short m_pix_op_new_3 ; 32bpp	
  7652 0000ECAC 722C                <1> 	jb	short m_pix_op_new_2 ; 16bpp
  7653                              <1> 	; 24 bit true colors
  7654                              <1> 	;jmp	short m_pix_op_new_24
  7655                              <1> m_pix_op_new_24:
  7656                              <1> 	; 24 bit true colors
  7657 0000ECAE 89C2                <1> 	mov	edx, eax ; new color
  7658                              <1> m_pix_op_new_24_0:
  7659 0000ECB0 66AD                <1> 	lodsw
  7660 0000ECB2 C1E010              <1> 	shl	eax, 16
  7661 0000ECB5 AC                  <1> 	lodsb
  7662 0000ECB6 C1C010              <1> 	rol	eax, 16	
  7663 0000ECB9 3B05[529F0100]      <1> 	cmp	eax, [maskcolor]
  7664 0000ECBF 7413                <1> 	je	short m_pix_op_new_24_1 ; exclude
  7665 0000ECC1 668917              <1> 	mov	[edi], dx
  7666 0000ECC4 C1CA10              <1> 	ror	edx, 16
  7667 0000ECC7 885702              <1> 	mov	[edi+2], dl
  7668 0000ECCA C1C210              <1> 	rol	edx, 16
  7669 0000ECCD 8305[20900100]03    <1> 	add	dword [u.r0], 3
  7670                              <1> m_pix_op_new_24_1:
  7671 0000ECD4 83C703              <1> 	add	edi, 3
  7672 0000ECD7 E2D7                <1> 	loop	m_pix_op_new_24_0
  7673 0000ECD9 C3                  <1> 	retn
  7674                              <1> 	; 65536 colors (16bpp)
  7675                              <1> m_pix_op_new_2:
  7676                              <1> 	;jmp	short m_pix_op_new_16
  7677                              <1> m_pix_op_new_16:
  7678                              <1> 	; 16 bit colors (65536 colors)
  7679 0000ECDA 89C2                <1> 	mov	edx, eax ; new color
  7680                              <1> m_pix_op_new_16_0:
  7681 0000ECDC 66AD                <1> 	lodsw
  7682 0000ECDE 663B05[529F0100]    <1> 	cmp	ax, [maskcolor]
  7683 0000ECE5 740A                <1> 	je	short m_pix_op_new_16_1 ; exclude
  7684 0000ECE7 668917              <1> 	mov	[edi], dx
  7685 0000ECEA 8305[20900100]02    <1> 	add	dword [u.r0], 2
  7686                              <1> m_pix_op_new_16_1:
  7687 0000ECF1 83C702              <1> 	add	edi, 2
  7688 0000ECF4 E2E6                <1> 	loop	m_pix_op_new_16_0
  7689 0000ECF6 C3                  <1> 	retn
  7690                              <1> m_pix_op_new_3:
  7691                              <1> 	; 32 bit true colors
  7692                              <1> 	;jmp	short m_pix_op_new_32
  7693                              <1> m_pix_op_new_32:
  7694                              <1> 	; 32 bit true colors
  7695 0000ECF7 89C2                <1> 	mov	edx, eax ; new color
  7696                              <1> m_pix_op_new_32_0:
  7697 0000ECF9 AD                  <1> 	lodsd 
  7698 0000ECFA 3B05[529F0100]      <1> 	cmp	eax, [maskcolor]
  7699 0000ED00 7409                <1> 	je	short m_pix_op_new_32_1 ; exclude
  7700 0000ED02 8917                <1> 	mov	[edi], edx
  7701 0000ED04 8305[20900100]04    <1> 	add	dword [u.r0], 4
  7702                              <1> m_pix_op_new_32_1:
  7703 0000ED0B 83C704              <1> 	add	edi, 4
  7704 0000ED0E E2E9                <1> 	loop	m_pix_op_new_32_0
  7705 0000ED10 C3                  <1> 	retn
  7706                              <1> 
  7707                              <1> m_pix_op_new_w:
  7708                              <1> 	; 06/02/2021
  7709                              <1> 	; CHANGE COLOR (MASKED, window)
  7710                              <1> 	;
  7711                              <1> 	; jump from pix_op_new_w
  7712                              <1> 	;
  7713                              <1> 	; INPUT:
  7714                              <1> 	;   ecx = bytes per row (to be applied)
  7715                              <1> 	;   edx = screen width in bytes
  7716                              <1> 	;   ebx = row count
  7717                              <1> 	;   eax = color
  7718                              <1> 	;
  7719                              <1> 	;   [maskcolor] = mask color (to be excluded)
  7720                              <1> 	;
  7721                              <1> 	; OUTPUT:
  7722                              <1> 	; 	[u.r0] will be > 0 if succesful
  7723                              <1> 
  7724                              <1> 	; Window
  7725                              <1> 	;mov	edi, [v_str] ; LFB start address
  7726                              <1> 	;mov	esi, edi 
  7727                              <1> 
  7728 0000ED11 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  7729 0000ED18 7707                <1> 	ja	short m_pix_op_new_w_1
  7730                              <1> 
  7731                              <1> 	; 256 colors (8bpp)
  7732 0000ED1A BD[8CEC0000]        <1> 	mov	ebp, m_pix_op_new_8
  7733 0000ED1F EB1E                <1> 	jmp	short m_pix_op_new_w_x
  7734                              <1> 			
  7735                              <1> m_pix_op_new_w_1:
  7736 0000ED21 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  7737 0000ED28 7710                <1> 	ja	short m_pix_op_new_w_3 ; 32bpp
  7738 0000ED2A 7207                <1> 	jb	short m_pix_op_new_w_2 ; 16bpp
  7739                              <1> 
  7740                              <1> 	; 24 bit true colors
  7741 0000ED2C BD[AEEC0000]        <1> 	mov	ebp, m_pix_op_new_24
  7742 0000ED31 EB0C                <1> 	jmp	short m_pix_op_new_w_x
  7743                              <1> 
  7744                              <1> 	; 65536 colors (16bpp)
  7745                              <1> m_pix_op_new_w_2:
  7746 0000ED33 BD[DAEC0000]        <1> 	mov	ebp, m_pix_op_new_16
  7747 0000ED38 EB05                <1> 	jmp	short m_pix_op_new_w_x
  7748                              <1> 
  7749                              <1> 	; 32 bit true colors
  7750                              <1> m_pix_op_new_w_3:
  7751 0000ED3A BD[F7EC0000]        <1> 	mov	ebp, m_pix_op_new_32
  7752                              <1> 	;jmp	short m_pix_op_new_w_x
  7753                              <1> 
  7754                              <1> m_pix_op_new_w_x:
  7755                              <1> m_pix_op_add_w_x:
  7756                              <1> m_pix_op_sub_w_x:
  7757                              <1> m_pix_op_mix_w_x:
  7758                              <1> m_pix_op_and_w_x:
  7759                              <1> m_pix_op_orc_w_x:
  7760                              <1> m_pix_op_xor_w_x:
  7761                              <1> m_pix_op_not_w_x:
  7762                              <1> m_pix_op_neg_w_x:
  7763                              <1> m_pix_op_inc_w_x:
  7764                              <1> m_pix_op_dec_w_x:
  7765                              <1> 	; 27/02/2021
  7766                              <1> 	; 26/02/2021
  7767                              <1> 	; 06/02/2021
  7768                              <1> 	; ecx = bytes per row (to be applied)
  7769                              <1> 	; edx = windows (screen) width in bytes
  7770                              <1> 	; ebx = row count
  7771                              <1> 	; eax = color
  7772                              <1> 	; ebp = pixel operation subroutine address
  7773                              <1> 	; edi = esi = window start address
  7774                              <1> 
  7775 0000ED3F 8B3D[4A9F0100]      <1> 	mov	edi, [v_str] ; LFB start address
  7776 0000ED45 89FE                <1> 	mov	esi, edi
  7777                              <1> m_pix_op_w_x_next:
  7778 0000ED47 52                  <1> 	push	edx
  7779 0000ED48 51                  <1> 	push	ecx
  7780 0000ED49 56                  <1> 	push	esi
  7781 0000ED4A 57                  <1> 	push	edi
  7782 0000ED4B 50                  <1> 	push	eax ; 26/02/2021
  7783 0000ED4C 8B0D[569F0100]      <1> 	mov	ecx, [pixcount] ; 27/02/2021  
  7784 0000ED52 FFD5                <1> 	call	ebp ; call masked pixel-row operation
  7785 0000ED54 58                  <1> 	pop	eax ; 26/02/2021
  7786 0000ED55 5F                  <1> 	pop	edi
  7787 0000ED56 5E                  <1> 	pop	esi
  7788 0000ED57 59                  <1> 	pop	ecx
  7789 0000ED58 5A                  <1> 	pop	edx
  7790 0000ED59 01D6                <1> 	add	esi, edx ; next row
  7791 0000ED5B 01D7                <1> 	add	edi, edx ; next row
  7792 0000ED5D 4B                  <1> 	dec	ebx
  7793 0000ED5E 75E7                <1> 	jnz	short m_pix_op_w_x_next
  7794 0000ED60 C3                  <1> 	retn
  7795                              <1> 
  7796                              <1> m_pix_op_add:
  7797                              <1> 	; 06/02/2021
  7798                              <1> 	; ADD COLOR (MASKED, full screen)
  7799                              <1> 	;
  7800                              <1> 	; jump from pix_op_add
  7801                              <1> 	;
  7802                              <1> 	; INPUT:
  7803                              <1> 	;   eax = color (AL, AX, EAX)
  7804                              <1> 	;   ecx = [v_siz] ; display page pixel count
  7805                              <1> 	;   esi = edi = [v_mem] ; LFB start address
  7806                              <1> 	;
  7807                              <1> 	;   [maskcolor] = mask color (to be excluded)
  7808                              <1> 	;
  7809                              <1> 	; OUTPUT:
  7810                              <1> 	; 	[u.r0] will be > 0 if succesful
  7811                              <1> 	
  7812                              <1> 	; Full screen
  7813                              <1> m_pix_op_add_0:
  7814 0000ED61 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  7815 0000ED68 771C                <1> 	ja	short m_pix_op_add_1
  7816                              <1> 	; 256 colors (8bpp)
  7817                              <1> 	;jmp	short m_pix_op_add_8
  7818                              <1> m_pix_op_add_8:
  7819                              <1> 	; 8 bit colors (256 colors)
  7820 0000ED6A 88C2                <1> 	mov	dl, al ; new color
  7821                              <1> m_pix_op_add_8_0:
  7822 0000ED6C AC                  <1> 	lodsb 
  7823 0000ED6D 3A05[529F0100]      <1> 	cmp	al, [maskcolor]
  7824 0000ED73 740D                <1> 	je	short m_pix_op_add_8_1 ; exclude
  7825 0000ED75 FF05[20900100]      <1> 	inc	dword [u.r0] ; +1
  7826 0000ED7B 0017                <1> 	add	[edi], dl
  7827 0000ED7D 7303                <1> 	jnc	short m_pix_op_add_8_1
  7828 0000ED7F C607FF              <1> 	mov	byte [edi], 0FFh 
  7829                              <1> m_pix_op_add_8_1:
  7830 0000ED82 47                  <1> 	inc	edi
  7831 0000ED83 E2E7                <1> 	loop	m_pix_op_add_8_0
  7832 0000ED85 C3                  <1> 	retn
  7833                              <1> m_pix_op_add_1:
  7834 0000ED86 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  7835 0000ED8D 775E                <1> 	ja	short m_pix_op_add_3 ; 32bpp	
  7836 0000ED8F 7238                <1> 	jb	short m_pix_op_add_2 ; 16bpp
  7837                              <1> 	; 24 bit true colors
  7838                              <1> 	;jmp	short m_pix_op_add_24
  7839                              <1> m_pix_op_add_24:
  7840                              <1> 	; 24 bit true colors
  7841 0000ED91 89C2                <1> 	mov	edx, eax ; new color
  7842 0000ED93 81CA000000FF        <1> 	or	edx, 0FF000000h
  7843                              <1> m_pix_op_add_24_0:
  7844 0000ED99 66AD                <1> 	lodsw
  7845 0000ED9B C1E010              <1> 	shl	eax, 16
  7846 0000ED9E AC                  <1> 	lodsb
  7847 0000ED9F C1C010              <1> 	rol	eax, 16	
  7848 0000EDA2 3B05[529F0100]      <1> 	cmp	eax, [maskcolor]
  7849 0000EDA8 7419                <1> 	je	short m_pix_op_add_24_2 ; exclude
  7850 0000EDAA 8305[20900100]03    <1> 	add	dword [u.r0], 3 ; +3
  7851 0000EDB1 01D0                <1> 	add	eax, edx
  7852 0000EDB3 7305                <1> 	jnc	short m_pix_op_add_24_1
  7853 0000EDB5 B8FFFFFF00          <1> 	mov	eax, 0FFFFFFh
  7854                              <1> m_pix_op_add_24_1:	
  7855 0000EDBA 668907              <1> 	mov	[edi], ax
  7856 0000EDBD C1E810              <1> 	shr	eax, 16
  7857 0000EDC0 884702              <1> 	mov	[edi+2], al
  7858                              <1> m_pix_op_add_24_2:
  7859 0000EDC3 83C703              <1> 	add	edi, 3 ; +3
  7860 0000EDC6 E2D1                <1> 	loop	m_pix_op_add_24_0
  7861 0000EDC8 C3                  <1> 	retn
  7862                              <1> 	; 65536 colors (16bpp)
  7863                              <1> m_pix_op_add_2:
  7864                              <1> 	;jmp	short m_pix_op_add_16
  7865                              <1> m_pix_op_add_16:
  7866                              <1> 	; 16 bit colors (65536 colors)
  7867 0000EDC9 89C2                <1> 	mov	edx, eax ; new color
  7868                              <1> m_pix_op_add_16_0:
  7869 0000EDCB 66AD                <1> 	lodsw
  7870 0000EDCD 663B05[529F0100]    <1> 	cmp	ax, [maskcolor]
  7871 0000EDD4 7411                <1> 	je	short m_pix_op_add_16_1 ; exclude
  7872 0000EDD6 8305[20900100]02    <1> 	add	dword [u.r0], 2 ; +2
  7873 0000EDDD 660117              <1> 	add	[edi], dx
  7874 0000EDE0 7305                <1> 	jnc	short m_pix_op_add_16_1
  7875 0000EDE2 66C707FFFF          <1> 	mov	word [edi], 0FFFFh
  7876                              <1> m_pix_op_add_16_1:
  7877 0000EDE7 83C702              <1> 	add	edi, 2 ; +2
  7878 0000EDEA E2DF                <1> 	loop	m_pix_op_add_16_0
  7879 0000EDEC C3                  <1> 	retn
  7880                              <1> m_pix_op_add_3:
  7881                              <1> 	; 32 bit true colors
  7882                              <1> 	;jmp	short m_pix_op_add_32
  7883                              <1> m_pix_op_add_32:
  7884                              <1> 	; 32 bit true colors
  7885 0000EDED 89C2                <1> 	mov	edx, eax ; new color
  7886                              <1> m_pix_op_add_32_0:
  7887 0000EDEF AD                  <1> 	lodsd 
  7888 0000EDF0 3B05[529F0100]      <1> 	cmp	eax, [maskcolor]
  7889 0000EDF6 7411                <1> 	je	short m_pix_op_add_32_1 ; exclude
  7890 0000EDF8 8305[20900100]04    <1> 	add	dword [u.r0], 4 ; +4
  7891 0000EDFF 0117                <1> 	add	[edi], edx
  7892 0000EE01 7306                <1> 	jnc	short m_pix_op_add_32_1
  7893 0000EE03 C707FFFFFFFF        <1> 	mov	dword [edi], 0FFFFFFFFh
  7894                              <1> m_pix_op_add_32_1:
  7895 0000EE09 83C704              <1> 	add	edi, 4 ; +4
  7896 0000EE0C E2E1                <1> 	loop	m_pix_op_add_32_0
  7897 0000EE0E C3                  <1> 	retn
  7898                              <1> 
  7899                              <1> m_pix_op_add_w:
  7900                              <1> 	; 06/02/2021
  7901                              <1> 	; ADD COLOR (MASKED, window)
  7902                              <1> 	;
  7903                              <1> 	; jump from pix_op_add_w
  7904                              <1> 	;
  7905                              <1> 	; INPUT:
  7906                              <1> 	;   ecx = bytes per row (to be applied)
  7907                              <1> 	;   edx = screen width in bytes
  7908                              <1> 	;   ebx = row count
  7909                              <1> 	;   eax = color
  7910                              <1> 	;
  7911                              <1> 	;   [maskcolor] = mask color (to be excluded)
  7912                              <1> 	;
  7913                              <1> 	; OUTPUT:
  7914                              <1> 	; 	[u.r0] will be > 0 if succesful
  7915                              <1> 
  7916                              <1> 	; window
  7917                              <1> 	;mov	edi, [v_str] ; LFB start address
  7918                              <1> 	;mov	esi, edi 
  7919                              <1> 
  7920 0000EE0F 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  7921 0000EE16 7707                <1> 	ja	short m_pix_op_add_w_1
  7922                              <1> 
  7923                              <1> 	; 256 colors (8bpp)
  7924 0000EE18 BD[6AED0000]        <1> 	mov	ebp, m_pix_op_add_8
  7925 0000EE1D EB1E                <1> 	jmp	short m_pix_op_add_w_4
  7926                              <1> 			
  7927                              <1> m_pix_op_add_w_1:
  7928 0000EE1F 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  7929 0000EE26 7710                <1> 	ja	short m_pix_op_add_w_3 ; 32bpp
  7930 0000EE28 7207                <1> 	jb	short m_pix_op_add_w_2 ; 16bpp
  7931                              <1> 
  7932                              <1> 	; 24 bit true colors
  7933 0000EE2A BD[91ED0000]        <1> 	mov	ebp, m_pix_op_add_24
  7934 0000EE2F EB0C                <1> 	jmp	short m_pix_op_add_w_4
  7935                              <1> 
  7936                              <1> 	; 65536 colors (16bpp)
  7937                              <1> m_pix_op_add_w_2:
  7938 0000EE31 BD[C9ED0000]        <1> 	mov	ebp, m_pix_op_add_16
  7939 0000EE36 EB05                <1> 	jmp	short m_pix_op_add_w_4
  7940                              <1> 
  7941                              <1> 	; 32 bit true colors
  7942                              <1> m_pix_op_add_w_3:
  7943 0000EE38 BD[EDED0000]        <1> 	mov	ebp, m_pix_op_add_32
  7944                              <1> m_pix_op_add_w_4:
  7945 0000EE3D E9FDFEFFFF          <1> 	jmp	m_pix_op_add_w_x
  7946                              <1> 
  7947                              <1> m_pix_op_sub:
  7948                              <1> 	; 02/03/2021
  7949                              <1> 	; 06/02/2021
  7950                              <1> 	; SUBTRACT COLOR (MASKED, full screen)
  7951                              <1> 	;
  7952                              <1> 	; jump from pix_op_sub
  7953                              <1> 	;
  7954                              <1> 	; INPUT:
  7955                              <1> 	;   eax = color (AL, AX, EAX)
  7956                              <1> 	;   ecx = [v_siz] ; display page pixel count
  7957                              <1> 	;   esi = edi = [v_mem] ; LFB start address
  7958                              <1> 	;
  7959                              <1> 	;   [maskcolor] = mask color (to be excluded)
  7960                              <1> 	;
  7961                              <1> 	; OUTPUT:
  7962                              <1> 	; 	[u.r0] will be > 0 if succesful
  7963                              <1> 	
  7964                              <1> 	; Full screen
  7965                              <1> m_pix_op_sub_0:
  7966 0000EE42 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  7967 0000EE49 771C                <1> 	ja	short m_pix_op_sub_1
  7968                              <1> 	; 256 colors (8bpp)
  7969                              <1> 	;jmp	short m_pix_op_sub_8
  7970                              <1> m_pix_op_sub_8:
  7971                              <1> 	; 8 bit colors (256 colors)
  7972 0000EE4B 88C2                <1> 	mov	dl, al ; new color
  7973                              <1> m_pix_op_sub_8_0:
  7974 0000EE4D AC                  <1> 	lodsb 
  7975 0000EE4E 3A05[529F0100]      <1> 	cmp	al, [maskcolor]
  7976 0000EE54 740D                <1> 	je	short m_pix_op_sub_8_1 ; exclude
  7977 0000EE56 FF05[20900100]      <1> 	inc	dword [u.r0] ; +1
  7978 0000EE5C 2817                <1> 	sub	[edi], dl
  7979 0000EE5E 7303                <1> 	jnb	short m_pix_op_sub_8_1
  7980 0000EE60 C60700              <1> 	mov	byte [edi], 0 
  7981                              <1> m_pix_op_sub_8_1:
  7982 0000EE63 47                  <1> 	inc	edi
  7983 0000EE64 E2E7                <1> 	loop	m_pix_op_sub_8_0
  7984 0000EE66 C3                  <1> 	retn
  7985                              <1> m_pix_op_sub_1:
  7986 0000EE67 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  7987 0000EE6E 7755                <1> 	ja	short m_pix_op_sub_3 ; 32bpp	
  7988 0000EE70 722F                <1> 	jb	short m_pix_op_sub_2 ; 16bpp
  7989                              <1> 	; 24 bit true colors
  7990                              <1> 	;jmp	short m_pix_op_sub_24
  7991                              <1> m_pix_op_sub_24:
  7992                              <1> 	; 24 bit true colors
  7993 0000EE72 89C2                <1> 	mov	edx, eax ; new color
  7994                              <1> 	; 02/03/2021
  7995                              <1> m_pix_op_sub_24_0:
  7996 0000EE74 66AD                <1> 	lodsw
  7997 0000EE76 C1E010              <1> 	shl	eax, 16
  7998 0000EE79 AC                  <1> 	lodsb
  7999 0000EE7A C1C010              <1> 	rol	eax, 16	
  8000 0000EE7D 3B05[529F0100]      <1> 	cmp	eax, [maskcolor]
  8001 0000EE83 7416                <1> 	je	short m_pix_op_sub_24_2 ; exclude
  8002 0000EE85 8305[20900100]03    <1> 	add	dword [u.r0], 3 ; +3
  8003 0000EE8C 29D0                <1> 	sub	eax, edx
  8004 0000EE8E 7302                <1> 	jnb	short m_pix_op_sub_24_1
  8005 0000EE90 31C0                <1> 	xor	eax, eax ; 0
  8006                              <1> m_pix_op_sub_24_1:	
  8007 0000EE92 668907              <1> 	mov	[edi], ax
  8008 0000EE95 C1E810              <1> 	shr	eax, 16
  8009 0000EE98 884702              <1> 	mov	[edi+2], al
  8010                              <1> m_pix_op_sub_24_2:
  8011 0000EE9B 83C703              <1> 	add	edi, 3 ; +3
  8012 0000EE9E E2D4                <1> 	loop	m_pix_op_sub_24_0
  8013 0000EEA0 C3                  <1> 	retn
  8014                              <1> 	; 65536 colors (16bpp)
  8015                              <1> m_pix_op_sub_2:
  8016                              <1> 	;jmp	short m_pix_op_sub_16
  8017                              <1> m_pix_op_sub_16:
  8018                              <1> 	; 16 bit colors (65536 colors)
  8019 0000EEA1 89C2                <1> 	mov	edx, eax ; new color
  8020                              <1> m_pix_op_sub_16_0:
  8021 0000EEA3 66AD                <1> 	lodsw
  8022 0000EEA5 663B05[529F0100]    <1> 	cmp	ax, [maskcolor]
  8023 0000EEAC 7411                <1> 	je	short m_pix_op_sub_16_1 ; exclude
  8024 0000EEAE 8305[20900100]02    <1> 	add	dword [u.r0], 2 ; +2
  8025 0000EEB5 662917              <1> 	sub	[edi], dx
  8026 0000EEB8 7305                <1> 	jnb	short m_pix_op_sub_16_1
  8027 0000EEBA 31C0                <1> 	xor	eax, eax
  8028 0000EEBC 668907              <1> 	mov	[edi], ax ; 0
  8029                              <1> m_pix_op_sub_16_1:
  8030 0000EEBF 83C702              <1> 	add	edi, 2 ; +2
  8031 0000EEC2 E2DF                <1> 	loop	m_pix_op_sub_16_0
  8032 0000EEC4 C3                  <1> 	retn
  8033                              <1> m_pix_op_sub_3:
  8034                              <1> 	; 32 bit true colors
  8035                              <1> 	;jmp	short m_pix_op_sub_32
  8036                              <1> m_pix_op_sub_32:
  8037                              <1> 	; 32 bit true colors
  8038 0000EEC5 89C2                <1> 	mov	edx, eax ; new color
  8039                              <1> m_pix_op_sub_32_0:
  8040 0000EEC7 AD                  <1> 	lodsd 
  8041 0000EEC8 3B05[529F0100]      <1> 	cmp	eax, [maskcolor]
  8042 0000EECE 740F                <1> 	je	short m_pix_op_sub_32_1 ; exclude
  8043 0000EED0 8305[20900100]04    <1> 	add	dword [u.r0], 4 ; +4
  8044 0000EED7 2917                <1> 	sub	[edi], edx
  8045 0000EED9 7304                <1> 	jnb	short m_pix_op_sub_32_1
  8046 0000EEDB 31C0                <1> 	xor	eax, eax
  8047 0000EEDD 8907                <1> 	mov	[edi], eax ; 0
  8048                              <1> m_pix_op_sub_32_1:
  8049 0000EEDF 83C704              <1> 	add	edi, 4 ; +4
  8050 0000EEE2 E2E3                <1> 	loop	m_pix_op_sub_32_0
  8051 0000EEE4 C3                  <1> 	retn
  8052                              <1> 
  8053                              <1> m_pix_op_sub_w:
  8054                              <1> 	; 06/02/2021
  8055                              <1> 	; SUBTRACT COLOR (MASKED, window)
  8056                              <1> 	;
  8057                              <1> 	; jump from pix_op_sub_w
  8058                              <1> 	;
  8059                              <1> 	; INPUT:
  8060                              <1> 	;   ecx = bytes per row (to be applied)
  8061                              <1> 	;   edx = screen width in bytes
  8062                              <1> 	;   ebx = row count
  8063                              <1> 	;   eax = color
  8064                              <1> 	;
  8065                              <1> 	;   [maskcolor] = mask color (to be excluded)
  8066                              <1> 	;
  8067                              <1> 	; OUTPUT:
  8068                              <1> 	; 	[u.r0] will be > 0 if succesful
  8069                              <1> 
  8070                              <1> 	; window
  8071                              <1> 	;mov	edi, [v_str] ; LFB start address
  8072                              <1> 	;mov	esi, edi 
  8073                              <1> 
  8074 0000EEE5 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  8075 0000EEEC 7707                <1> 	ja	short m_pix_op_sub_w_1
  8076                              <1> 
  8077                              <1> 	; 256 colors (8bpp)
  8078 0000EEEE BD[4BEE0000]        <1> 	mov	ebp, m_pix_op_sub_8
  8079 0000EEF3 EB1E                <1> 	jmp	short m_pix_op_sub_w_4
  8080                              <1> 			
  8081                              <1> m_pix_op_sub_w_1:
  8082 0000EEF5 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  8083 0000EEFC 7710                <1> 	ja	short m_pix_op_sub_w_3 ; 32bpp
  8084 0000EEFE 7207                <1> 	jb	short m_pix_op_sub_w_2 ; 16bpp
  8085                              <1> 
  8086                              <1> 	; 24 bit true colors
  8087 0000EF00 BD[72EE0000]        <1> 	mov	ebp, m_pix_op_sub_24
  8088 0000EF05 EB0C                <1> 	jmp	short m_pix_op_sub_w_4
  8089                              <1> 
  8090                              <1> 	; 65536 colors (16bpp)
  8091                              <1> m_pix_op_sub_w_2:
  8092 0000EF07 BD[A1EE0000]        <1> 	mov	ebp, m_pix_op_sub_16
  8093 0000EF0C EB05                <1> 	jmp	short m_pix_op_sub_w_4
  8094                              <1> 
  8095                              <1> 	; 32 bit true colors
  8096                              <1> m_pix_op_sub_w_3:
  8097 0000EF0E BD[C5EE0000]        <1> 	mov	ebp, m_pix_op_sub_32
  8098                              <1> m_pix_op_sub_w_4:
  8099 0000EF13 E927FEFFFF          <1> 	jmp	m_pix_op_sub_w_x
  8100                              <1> 
  8101                              <1> m_pix_op_mix:
  8102                              <1> 	; 25/02/2021
  8103                              <1> 	; 06/02/2021
  8104                              <1> 	; MIX COLOR (MASKED, full screen)
  8105                              <1> 	;
  8106                              <1> 	; jump from pix_op_mix
  8107                              <1> 	;
  8108                              <1> 	; INPUT:
  8109                              <1> 	;   eax = color (AL, AX, EAX)
  8110                              <1> 	;   ecx = [v_siz] ; display page pixel count
  8111                              <1> 	;   esi = edi = [v_mem] ; LFB start address
  8112                              <1> 	;
  8113                              <1> 	;   [maskcolor] = mask color (to be excluded)
  8114                              <1> 	;
  8115                              <1> 	; OUTPUT:
  8116                              <1> 	; 	[u.r0] will be > 0 if succesful
  8117                              <1> 	
  8118                              <1> 	; Full screen
  8119                              <1> m_pix_op_mix_0:
  8120 0000EF18 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  8121 0000EF1F 771B                <1> 	ja	short m_pix_op_mix_1
  8122                              <1> 	; 256 colors (8bpp)
  8123                              <1> 	;jmp	short m_pix_op_mix_8
  8124                              <1> m_pix_op_mix_8:
  8125                              <1> 	; 8 bit colors (256 colors)
  8126 0000EF21 88C2                <1> 	mov	dl, al ; new (mixing) color
  8127                              <1> m_pix_op_mix_8_0:
  8128 0000EF23 AC                  <1> 	lodsb 
  8129 0000EF24 3A05[529F0100]      <1> 	cmp	al, [maskcolor]
  8130 0000EF2A 740C                <1> 	je	short m_pix_op_mix_8_1 ; exclude
  8131 0000EF2C 00D0                <1> 	add	al, dl ; 25/02/2021
  8132 0000EF2E D0D8                <1> 	rcr	al, 1	
  8133 0000EF30 8807                <1> 	mov	[edi], al
  8134 0000EF32 FF05[20900100]      <1> 	inc	dword [u.r0] ; +1
  8135                              <1> m_pix_op_mix_8_1:
  8136 0000EF38 47                  <1> 	inc	edi
  8137 0000EF39 E2E8                <1> 	loop	m_pix_op_mix_8_0
  8138 0000EF3B C3                  <1> 	retn
  8139                              <1> m_pix_op_mix_1:
  8140 0000EF3C 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  8141 0000EF43 7752                <1> 	ja	short m_pix_op_mix_3 ; 32bpp	
  8142 0000EF45 722D                <1> 	jb	short m_pix_op_mix_2 ; 16bpp
  8143                              <1> 	; 24 bit true colors
  8144                              <1> 	;jmp	short m_pix_op_mix_24
  8145                              <1> m_pix_op_mix_24:
  8146                              <1> 	; 24 bit true colors
  8147 0000EF47 89C2                <1> 	mov	edx, eax ; new color
  8148                              <1> 	;and	edx, 0FFFFFFh
  8149                              <1> m_pix_op_mix_24_0:
  8150 0000EF49 66AD                <1> 	lodsw
  8151 0000EF4B C1E010              <1> 	shl	eax, 16
  8152 0000EF4E AC                  <1> 	lodsb
  8153 0000EF4F C1C010              <1> 	rol	eax, 16	
  8154 0000EF52 3B05[529F0100]      <1> 	cmp	eax, [maskcolor]
  8155 0000EF58 7414                <1> 	je	short m_pix_op_mix_24_1 ; exclude
  8156 0000EF5A 01D0                <1> 	add	eax, edx
  8157 0000EF5C D1E8                <1> 	shr	eax, 1
  8158 0000EF5E 668907              <1> 	mov	[edi], ax
  8159 0000EF61 C1E810              <1> 	shr	eax, 16
  8160 0000EF64 884702              <1> 	mov	[edi+2], al
  8161 0000EF67 8305[20900100]03    <1> 	add	dword [u.r0], 3 ; +3
  8162                              <1> m_pix_op_mix_24_1:
  8163 0000EF6E 83C703              <1> 	add	edi, 3 ; +3
  8164 0000EF71 E2D6                <1> 	loop	m_pix_op_mix_24_0
  8165 0000EF73 C3                  <1> 	retn
  8166                              <1> 	; 65536 colors (16bpp)
  8167                              <1> m_pix_op_mix_2:
  8168                              <1> 	;jmp	short m_pix_op_mix_16
  8169                              <1> m_pix_op_mix_16:
  8170                              <1> 	; 16 bit colors (65536 colors)
  8171 0000EF74 89C2                <1> 	mov	edx, eax ; new color
  8172                              <1> 	;and	edx, 0FFFFh
  8173                              <1> m_pix_op_mix_16_0:
  8174 0000EF76 66AD                <1> 	lodsw
  8175 0000EF78 663B05[529F0100]    <1> 	cmp	ax, [maskcolor]
  8176 0000EF7F 7410                <1> 	je	short m_pix_op_mix_16_1 ; exclude
  8177 0000EF81 6601D0              <1> 	add	ax, dx
  8178 0000EF84 66D1D8              <1> 	rcr	ax, 1
  8179 0000EF87 668907              <1> 	mov	[edi], ax
  8180 0000EF8A 8305[20900100]02    <1> 	add	dword [u.r0], 2 ; +2
  8181                              <1> m_pix_op_mix_16_1:
  8182 0000EF91 83C702              <1> 	add	edi, 2 ; +2
  8183 0000EF94 E2E0                <1> 	loop	m_pix_op_mix_16_0
  8184 0000EF96 C3                  <1> 	retn
  8185                              <1> m_pix_op_mix_3:
  8186                              <1> 	; 32 bit true colors
  8187                              <1> 	;jmp	short m_pix_op_mix_32
  8188                              <1> m_pix_op_mix_32:
  8189                              <1> 	; 32 bit true colors
  8190 0000EF97 89C2                <1> 	mov	edx, eax ; new color
  8191                              <1> m_pix_op_mix_32_0:
  8192 0000EF99 AD                  <1> 	lodsd 
  8193 0000EF9A 3B05[529F0100]      <1> 	cmp	eax, [maskcolor]
  8194 0000EFA0 740D                <1> 	je	short m_pix_op_mix_32_1 ; exclude
  8195 0000EFA2 01D0                <1> 	add	eax, edx
  8196                              <1> 	; 02/03/2021
  8197 0000EFA4 D1D8                <1> 	rcr	eax, 1
  8198 0000EFA6 8907                <1> 	mov	[edi], eax	
  8199 0000EFA8 8305[20900100]04    <1> 	add	dword [u.r0], 4 ; +4
  8200                              <1> m_pix_op_mix_32_1:
  8201 0000EFAF 83C704              <1> 	add	edi, 4 ; +4
  8202 0000EFB2 E2E5                <1> 	loop	m_pix_op_mix_32_0
  8203 0000EFB4 C3                  <1> 	retn
  8204                              <1> 
  8205                              <1> m_pix_op_mix_w:
  8206                              <1> 	; 06/02/2021
  8207                              <1> 	; MIX COLOR (MASKED, window)
  8208                              <1> 	;
  8209                              <1> 	; jump from pix_op_mix_w
  8210                              <1> 	;
  8211                              <1> 	; INPUT:
  8212                              <1> 	;   ecx = bytes per row (to be applied)
  8213                              <1> 	;   edx = screen width in bytes
  8214                              <1> 	;   ebx = row count
  8215                              <1> 	;   eax = color
  8216                              <1> 	;
  8217                              <1> 	;   [maskcolor] = mask color (to be excluded)
  8218                              <1> 	;
  8219                              <1> 	; OUTPUT:
  8220                              <1> 	; 	[u.r0] will be > 0 if succesful
  8221                              <1> 
  8222                              <1> 	; window
  8223                              <1> 	;mov	edi, [v_str] ; LFB start address
  8224                              <1> 	;mov	esi, edi 
  8225                              <1> 
  8226 0000EFB5 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  8227 0000EFBC 7707                <1> 	ja	short m_pix_op_mix_w_1
  8228                              <1> 
  8229                              <1> 	; 256 colors (8bpp)
  8230 0000EFBE BD[21EF0000]        <1> 	mov	ebp, m_pix_op_mix_8
  8231 0000EFC3 EB1E                <1> 	jmp	short m_pix_op_mix_w_4
  8232                              <1> 			
  8233                              <1> m_pix_op_mix_w_1:
  8234 0000EFC5 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  8235 0000EFCC 7710                <1> 	ja	short m_pix_op_mix_w_3 ; 32bpp
  8236 0000EFCE 7207                <1> 	jb	short m_pix_op_mix_w_2 ; 16bpp
  8237                              <1> 
  8238                              <1> 	; 24 bit true colors
  8239 0000EFD0 BD[47EF0000]        <1> 	mov	ebp, m_pix_op_mix_24
  8240 0000EFD5 EB0C                <1> 	jmp	short m_pix_op_mix_w_4
  8241                              <1> 
  8242                              <1> 	; 65536 colors (16bpp)
  8243                              <1> m_pix_op_mix_w_2:
  8244 0000EFD7 BD[74EF0000]        <1> 	mov	ebp, m_pix_op_mix_16
  8245 0000EFDC EB05                <1> 	jmp	short m_pix_op_mix_w_4
  8246                              <1> 
  8247                              <1> 	; 32 bit true colors
  8248                              <1> m_pix_op_mix_w_3:
  8249 0000EFDE BD[97EF0000]        <1> 	mov	ebp, m_pix_op_mix_32
  8250                              <1> m_pix_op_mix_w_4:
  8251 0000EFE3 E957FDFFFF          <1> 	jmp	m_pix_op_mix_w_x
  8252                              <1> 
  8253                              <1> m_pix_op_and:
  8254                              <1> 	; 06/02/2021
  8255                              <1> 	; AND COLOR (MASKED, full screen)
  8256                              <1> 	;
  8257                              <1> 	; jump from pix_op_and
  8258                              <1> 	;
  8259                              <1> 	; INPUT:
  8260                              <1> 	;   eax = color (AL, AX, EAX)
  8261                              <1> 	;   ecx = [v_siz] ; display page pixel count
  8262                              <1> 	;   esi = edi = [v_mem] ; LFB start address
  8263                              <1> 	;
  8264                              <1> 	;   [maskcolor] = mask color (to be excluded)
  8265                              <1> 	;
  8266                              <1> 	; OUTPUT:
  8267                              <1> 	; 	[u.r0] will be > 0 if succesful
  8268                              <1> 	
  8269                              <1> 	; Full screen
  8270                              <1> m_pix_op_and_0:
  8271 0000EFE8 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  8272 0000EFEF 7717                <1> 	ja	short m_pix_op_and_1
  8273                              <1> 	; 256 colors (8bpp)
  8274                              <1> 	;jmp	short m_pix_op_and_8
  8275                              <1> m_pix_op_and_8:
  8276                              <1> 	; 8 bit colors (256 colors)
  8277 0000EFF1 88C2                <1> 	mov	dl, al ; new color
  8278                              <1> m_pix_op_and_8_0:
  8279 0000EFF3 AC                  <1> 	lodsb 
  8280 0000EFF4 3A05[529F0100]      <1> 	cmp	al, [maskcolor]
  8281 0000EFFA 7408                <1> 	je	short m_pix_op_and_8_1 ; exclude
  8282 0000EFFC 2017                <1> 	and	[edi], dl
  8283 0000EFFE FF05[20900100]      <1> 	inc	dword [u.r0] ; +1
  8284                              <1> m_pix_op_and_8_1:
  8285 0000F004 47                  <1> 	inc	edi
  8286 0000F005 E2EC                <1> 	loop	m_pix_op_and_8_0
  8287 0000F007 C3                  <1> 	retn
  8288                              <1> m_pix_op_and_1:
  8289 0000F008 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  8290 0000F00F 774A                <1> 	ja	short m_pix_op_and_3 ; 32bpp	
  8291 0000F011 722B                <1> 	jb	short m_pix_op_and_2 ; 16bpp
  8292                              <1> 	; 24 bit true colors
  8293                              <1> 	;jmp	short m_pix_op_and_24
  8294                              <1> m_pix_op_and_24:
  8295                              <1> 	; 24 bit true colors
  8296 0000F013 89C2                <1> 	mov	edx, eax ; new color
  8297                              <1> 	;and	edx, 0FFFFFFh
  8298                              <1> m_pix_op_and_24_0:
  8299 0000F015 66AD                <1> 	lodsw
  8300 0000F017 C1E010              <1> 	shl	eax, 16
  8301 0000F01A AC                  <1> 	lodsb
  8302 0000F01B C1C010              <1> 	rol	eax, 16	
  8303 0000F01E 3B05[529F0100]      <1> 	cmp	eax, [maskcolor]
  8304 0000F024 7412                <1> 	je	short m_pix_op_and_24_1 ; exclude
  8305 0000F026 21D0                <1> 	and	eax, edx
  8306 0000F028 668907              <1> 	mov	[edi], ax
  8307 0000F02B C1E810              <1> 	shr	eax, 16
  8308 0000F02E 884702              <1> 	mov	[edi+2], al
  8309 0000F031 8305[20900100]03    <1> 	add	dword [u.r0], 3 ; +3
  8310                              <1> m_pix_op_and_24_1:
  8311 0000F038 83C703              <1> 	add	edi, 3 ; +3
  8312 0000F03B E2D8                <1> 	loop	m_pix_op_and_24_0
  8313 0000F03D C3                  <1> 	retn
  8314                              <1> 	; 65536 colors (16bpp)
  8315                              <1> m_pix_op_and_2:
  8316                              <1> 	;jmp	short m_pix_op_and_16
  8317                              <1> m_pix_op_and_16:
  8318                              <1> 	; 16 bit colors (65536 colors)
  8319 0000F03E 89C2                <1> 	mov	edx, eax ; new color
  8320                              <1> 	;and	edx, 0FFFFh
  8321                              <1> m_pix_op_and_16_0:
  8322 0000F040 66AD                <1> 	lodsw
  8323 0000F042 663B05[529F0100]    <1> 	cmp	ax, [maskcolor]
  8324 0000F049 740A                <1> 	je	short m_pix_op_and_16_1 ; exclude
  8325 0000F04B 662117              <1> 	and	[edi], dx
  8326 0000F04E 8305[20900100]02    <1> 	add	dword [u.r0], 2 ; +2
  8327                              <1> m_pix_op_and_16_1:
  8328 0000F055 83C702              <1> 	add	edi, 2 ; +2
  8329 0000F058 E2E6                <1> 	loop	m_pix_op_and_16_0
  8330 0000F05A C3                  <1> 	retn
  8331                              <1> m_pix_op_and_3:
  8332                              <1> 	; 32 bit true colors
  8333                              <1> 	;jmp	short m_pix_op_and_32
  8334                              <1> m_pix_op_and_32:
  8335                              <1> 	; 32 bit true colors
  8336 0000F05B 89C2                <1> 	mov	edx, eax ; new color
  8337                              <1> m_pix_op_and_32_0:
  8338 0000F05D AD                  <1> 	lodsd 
  8339 0000F05E 3B05[529F0100]      <1> 	cmp	eax, [maskcolor]
  8340 0000F064 7409                <1> 	je	short m_pix_op_and_32_1 ; exclude
  8341 0000F066 2117                <1> 	and	[edi], edx ; 25/02/2021	
  8342 0000F068 8305[20900100]04    <1> 	add	dword [u.r0], 4 ; +4
  8343                              <1> m_pix_op_and_32_1:
  8344 0000F06F 83C704              <1> 	add	edi, 4 ; +4
  8345 0000F072 E2E9                <1> 	loop	m_pix_op_and_32_0
  8346 0000F074 C3                  <1> 	retn
  8347                              <1> 
  8348                              <1> m_pix_op_and_w:
  8349                              <1> 	; 06/02/2021
  8350                              <1> 	; AND COLOR (MASKED, window)
  8351                              <1> 	;
  8352                              <1> 	; jump from pix_op_and_w
  8353                              <1> 	;
  8354                              <1> 	; INPUT:
  8355                              <1> 	;   ecx = bytes per row (to be applied)
  8356                              <1> 	;   edx = screen width in bytes
  8357                              <1> 	;   ebx = row count
  8358                              <1> 	;   eax = color
  8359                              <1> 	;
  8360                              <1> 	;   [maskcolor] = mask color (to be excluded)
  8361                              <1> 	;
  8362                              <1> 	; OUTPUT:
  8363                              <1> 	; 	[u.r0] will be > 0 if succesful
  8364                              <1> 
  8365                              <1> 	; window
  8366                              <1> 	;mov	edi, [v_str] ; LFB start address
  8367                              <1> 	;mov	esi, edi 
  8368                              <1> 
  8369 0000F075 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  8370 0000F07C 7707                <1> 	ja	short m_pix_op_and_w_1
  8371                              <1> 
  8372                              <1> 	; 256 colors (8bpp)
  8373 0000F07E BD[F1EF0000]        <1> 	mov	ebp, m_pix_op_and_8
  8374 0000F083 EB1E                <1> 	jmp	short m_pix_op_and_w_4
  8375                              <1> 			
  8376                              <1> m_pix_op_and_w_1:
  8377 0000F085 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  8378 0000F08C 7710                <1> 	ja	short m_pix_op_and_w_3 ; 32bpp
  8379 0000F08E 7207                <1> 	jb	short m_pix_op_and_w_2 ; 16bpp
  8380                              <1> 
  8381                              <1> 	; 24 bit true colors
  8382 0000F090 BD[13F00000]        <1> 	mov	ebp, m_pix_op_and_24
  8383 0000F095 EB0C                <1> 	jmp	short m_pix_op_and_w_4
  8384                              <1> 
  8385                              <1> 	; 65536 colors (16bpp)
  8386                              <1> m_pix_op_and_w_2:
  8387 0000F097 BD[3EF00000]        <1> 	mov	ebp, m_pix_op_and_16
  8388 0000F09C EB05                <1> 	jmp	short m_pix_op_and_w_4
  8389                              <1> 
  8390                              <1> 	; 32 bit true colors
  8391                              <1> m_pix_op_and_w_3:
  8392 0000F09E BD[5BF00000]        <1> 	mov	ebp, m_pix_op_and_32
  8393                              <1> m_pix_op_and_w_4:
  8394 0000F0A3 E997FCFFFF          <1> 	jmp	m_pix_op_and_w_x
  8395                              <1> 
  8396                              <1> m_pix_op_or:
  8397                              <1> 	; 06/02/2021
  8398                              <1> 	; OR COLOR (MASKED, full screen)
  8399                              <1> 	;
  8400                              <1> 	; jump from pix_op_orc
  8401                              <1> 	;
  8402                              <1> 	; INPUT:
  8403                              <1> 	;   eax = color (AL, AX, EAX)
  8404                              <1> 	;   ecx = [v_siz] ; display page pixel count
  8405                              <1> 	;   esi = edi = [v_mem] ; LFB start address
  8406                              <1> 	;
  8407                              <1> 	;   [maskcolor] = mask color (to be excluded)
  8408                              <1> 	;
  8409                              <1> 	; OUTPUT:
  8410                              <1> 	; 	[u.r0] will be > 0 if succesful
  8411                              <1> 	
  8412                              <1> 	; Full screen
  8413                              <1> m_pix_op_or_0:
  8414 0000F0A8 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  8415 0000F0AF 7717                <1> 	ja	short m_pix_op_or_1
  8416                              <1> 	; 256 colors (8bpp)
  8417                              <1> 	;jmp	short m_pix_op_or_8
  8418                              <1> m_pix_op_or_8:
  8419                              <1> 	; 8 bit colors (256 colors)
  8420 0000F0B1 88C2                <1> 	mov	dl, al ; new color
  8421                              <1> m_pix_op_or_8_0:
  8422 0000F0B3 AC                  <1> 	lodsb 
  8423 0000F0B4 3A05[529F0100]      <1> 	cmp	al, [maskcolor]
  8424 0000F0BA 7408                <1> 	je	short m_pix_op_or_8_1 ; exclude
  8425 0000F0BC 0817                <1> 	or	[edi], dl
  8426 0000F0BE FF05[20900100]      <1> 	inc	dword [u.r0] ; +1
  8427                              <1> m_pix_op_or_8_1:
  8428 0000F0C4 47                  <1> 	inc	edi
  8429 0000F0C5 E2EC                <1> 	loop	m_pix_op_or_8_0
  8430 0000F0C7 C3                  <1> 	retn
  8431                              <1> m_pix_op_or_1:
  8432 0000F0C8 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  8433 0000F0CF 774A                <1> 	ja	short m_pix_op_or_3 ; 32bpp	
  8434 0000F0D1 722B                <1> 	jb	short m_pix_op_or_2 ; 16bpp
  8435                              <1> 	; 24 bit true colors
  8436                              <1> 	;jmp	short m_pix_op_or_24
  8437                              <1> m_pix_op_or_24:
  8438                              <1> 	; 24 bit true colors
  8439 0000F0D3 89C2                <1> 	mov	edx, eax ; new color
  8440                              <1> 	;and	edx, 0FFFFFFh
  8441                              <1> m_pix_op_or_24_0:
  8442 0000F0D5 66AD                <1> 	lodsw
  8443 0000F0D7 C1E010              <1> 	shl	eax, 16
  8444 0000F0DA AC                  <1> 	lodsb
  8445 0000F0DB C1C010              <1> 	rol	eax, 16	
  8446 0000F0DE 3B05[529F0100]      <1> 	cmp	eax, [maskcolor]
  8447 0000F0E4 7412                <1> 	je	short m_pix_op_or_24_1 ; exclude
  8448 0000F0E6 09D0                <1> 	or	eax, edx
  8449 0000F0E8 668907              <1> 	mov	[edi], ax
  8450 0000F0EB C1E810              <1> 	shr	eax, 16
  8451 0000F0EE 884702              <1> 	mov	[edi+2], al
  8452 0000F0F1 8305[20900100]03    <1> 	add	dword [u.r0], 3 ; +3
  8453                              <1> m_pix_op_or_24_1:
  8454 0000F0F8 83C703              <1> 	add	edi, 3 ; +3
  8455 0000F0FB E2D8                <1> 	loop	m_pix_op_or_24_0
  8456 0000F0FD C3                  <1> 	retn
  8457                              <1> 	; 65536 colors (16bpp)
  8458                              <1> m_pix_op_or_2:
  8459                              <1> 	;jmp	short m_pix_op_or_16
  8460                              <1> m_pix_op_or_16:
  8461                              <1> 	; 16 bit colors (65536 colors)
  8462 0000F0FE 89C2                <1> 	mov	edx, eax ; new color
  8463                              <1> 	;and	edx, 0FFFFh
  8464                              <1> m_pix_op_or_16_0:
  8465 0000F100 66AD                <1> 	lodsw
  8466 0000F102 663B05[529F0100]    <1> 	cmp	ax, [maskcolor]
  8467 0000F109 740A                <1> 	je	short m_pix_op_or_16_1 ; exclude
  8468 0000F10B 660917              <1> 	or	[edi], dx
  8469 0000F10E 8305[20900100]02    <1> 	add	dword [u.r0], 2 ; +2
  8470                              <1> m_pix_op_or_16_1:
  8471 0000F115 83C702              <1> 	add	edi, 2 ; +2
  8472 0000F118 E2E6                <1> 	loop	m_pix_op_or_16_0
  8473 0000F11A C3                  <1> 	retn
  8474                              <1> m_pix_op_or_3:
  8475                              <1> 	; 32 bit true colors
  8476                              <1> 	;jmp	short m_pix_op_or_32
  8477                              <1> m_pix_op_or_32:
  8478                              <1> 	; 32 bit true colors
  8479 0000F11B 89C2                <1> 	mov	edx, eax ; new color
  8480                              <1> m_pix_op_or_32_0:
  8481 0000F11D AD                  <1> 	lodsd 
  8482 0000F11E 3B05[529F0100]      <1> 	cmp	eax, [maskcolor]
  8483 0000F124 7409                <1> 	je	short m_pix_op_or_32_1 ; exclude
  8484 0000F126 0917                <1> 	or	[edi], edx ; 25/02/2021	
  8485 0000F128 8305[20900100]04    <1> 	add	dword [u.r0], 4 ; +4
  8486                              <1> m_pix_op_or_32_1:
  8487 0000F12F 83C704              <1> 	add	edi, 4 ; +4
  8488 0000F132 E2E9                <1> 	loop	m_pix_op_or_32_0
  8489 0000F134 C3                  <1> 	retn
  8490                              <1> 
  8491                              <1> m_pix_op_or_w:
  8492                              <1> 	; 06/02/2021
  8493                              <1> 	; MIX COLOR (MASKED, window)
  8494                              <1> 	;
  8495                              <1> 	; jump from pix_op_or_w
  8496                              <1> 	;
  8497                              <1> 	; INPUT:
  8498                              <1> 	;   ecx = bytes per row (to be applied)
  8499                              <1> 	;   edx = screen width in bytes
  8500                              <1> 	;   ebx = row count
  8501                              <1> 	;   eax = color
  8502                              <1> 	;
  8503                              <1> 	;   [maskcolor] = mask color (to be excluded)
  8504                              <1> 	;
  8505                              <1> 	; OUTPUT:
  8506                              <1> 	; 	[u.r0] will be > 0 if succesful
  8507                              <1> 
  8508                              <1> 	; window
  8509                              <1> 	;mov	edi, [v_str] ; LFB start address
  8510                              <1> 	;mov	esi, edi 
  8511                              <1> 
  8512 0000F135 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  8513 0000F13C 7707                <1> 	ja	short m_pix_op_or_w_1
  8514                              <1> 
  8515                              <1> 	; 256 colors (8bpp)
  8516 0000F13E BD[B1F00000]        <1> 	mov	ebp, m_pix_op_or_8
  8517 0000F143 EB1E                <1> 	jmp	short m_pix_op_or_w_4
  8518                              <1> 			
  8519                              <1> m_pix_op_or_w_1:
  8520 0000F145 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  8521 0000F14C 7710                <1> 	ja	short m_pix_op_or_w_3 ; 32bpp
  8522 0000F14E 7207                <1> 	jb	short m_pix_op_or_w_2 ; 16bpp
  8523                              <1> 
  8524                              <1> 	; 24 bit true colors
  8525 0000F150 BD[D3F00000]        <1> 	mov	ebp, m_pix_op_or_24
  8526 0000F155 EB0C                <1> 	jmp	short m_pix_op_or_w_4
  8527                              <1> 
  8528                              <1> 	; 65536 colors (16bpp)
  8529                              <1> m_pix_op_or_w_2:
  8530 0000F157 BD[FEF00000]        <1> 	mov	ebp, m_pix_op_or_16
  8531 0000F15C EB05                <1> 	jmp	short m_pix_op_or_w_4
  8532                              <1> 
  8533                              <1> 	; 32 bit true colors
  8534                              <1> m_pix_op_or_w_3:
  8535 0000F15E BD[1BF10000]        <1> 	mov	ebp, m_pix_op_or_32
  8536                              <1> m_pix_op_or_w_4:
  8537 0000F163 E9D7FBFFFF          <1> 	jmp	m_pix_op_orc_w_x
  8538                              <1> 
  8539                              <1> m_pix_op_xor:
  8540                              <1> 	; 06/02/2021
  8541                              <1> 	; XOR COLOR (MASKED, full screen)
  8542                              <1> 	;
  8543                              <1> 	; jump from pix_op_xor
  8544                              <1> 	;
  8545                              <1> 	; INPUT:
  8546                              <1> 	;   eax = color (AL, AX, EAX)
  8547                              <1> 	;   ecx = [v_siz] ; display page pixel count
  8548                              <1> 	;   esi = edi = [v_mem] ; LFB start address
  8549                              <1> 	;
  8550                              <1> 	;   [maskcolor] = mask color (to be excluded)
  8551                              <1> 	;
  8552                              <1> 	; OUTPUT:
  8553                              <1> 	; 	[u.r0] will be > 0 if succesful
  8554                              <1> 	
  8555                              <1> 	; Full screen
  8556                              <1> m_pix_op_xor_0:
  8557 0000F168 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  8558 0000F16F 7717                <1> 	ja	short m_pix_op_xor_1
  8559                              <1> 	; 256 colors (8bpp)
  8560                              <1> 	;jmp	short m_pix_op_xor_8
  8561                              <1> m_pix_op_xor_8:
  8562                              <1> 	; 8 bit colors (256 colors)
  8563 0000F171 88C2                <1> 	mov	dl, al ; new color
  8564                              <1> m_pix_op_xor_8_0:
  8565 0000F173 AC                  <1> 	lodsb 
  8566 0000F174 3A05[529F0100]      <1> 	cmp	al, [maskcolor]
  8567 0000F17A 7408                <1> 	je	short m_pix_op_xor_8_1 ; exclude
  8568 0000F17C 3017                <1> 	xor	[edi], dl
  8569 0000F17E FF05[20900100]      <1> 	inc	dword [u.r0] ; +1
  8570                              <1> m_pix_op_xor_8_1:
  8571 0000F184 47                  <1> 	inc	edi
  8572 0000F185 E2EC                <1> 	loop	m_pix_op_xor_8_0
  8573 0000F187 C3                  <1> 	retn
  8574                              <1> m_pix_op_xor_1:
  8575 0000F188 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  8576 0000F18F 774A                <1> 	ja	short m_pix_op_xor_3 ; 32bpp	
  8577 0000F191 722B                <1> 	jb	short m_pix_op_xor_2 ; 16bpp
  8578                              <1> 	; 24 bit true colors
  8579                              <1> 	;jmp	short m_pix_op_xor_24
  8580                              <1> m_pix_op_xor_24:
  8581                              <1> 	; 24 bit true colors
  8582 0000F193 89C2                <1> 	mov	edx, eax ; new color
  8583                              <1> 	;and	edx, 0FFFFFFh
  8584                              <1> m_pix_op_xor_24_0:
  8585 0000F195 66AD                <1> 	lodsw
  8586 0000F197 C1E010              <1> 	shl	eax, 16
  8587 0000F19A AC                  <1> 	lodsb
  8588 0000F19B C1C010              <1> 	rol	eax, 16	
  8589 0000F19E 3B05[529F0100]      <1> 	cmp	eax, [maskcolor]
  8590 0000F1A4 7412                <1> 	je	short m_pix_op_xor_24_1 ; exclude
  8591 0000F1A6 31D0                <1> 	xor	eax, edx
  8592 0000F1A8 668907              <1> 	mov	[edi], ax
  8593 0000F1AB C1E810              <1> 	shr	eax, 16
  8594 0000F1AE 884702              <1> 	mov	[edi+2], al
  8595 0000F1B1 8305[20900100]03    <1> 	add	dword [u.r0], 3 ; +3
  8596                              <1> m_pix_op_xor_24_1:
  8597 0000F1B8 83C703              <1> 	add	edi, 3 ; +3
  8598 0000F1BB E2D8                <1> 	loop	m_pix_op_xor_24_0
  8599 0000F1BD C3                  <1> 	retn
  8600                              <1> 	; 65536 colors (16bpp)
  8601                              <1> m_pix_op_xor_2:
  8602                              <1> 	;jmp	short m_pix_op_xor_16
  8603                              <1> m_pix_op_xor_16:
  8604                              <1> 	; 16 bit colors (65536 colors)
  8605 0000F1BE 89C2                <1> 	mov	edx, eax ; new color
  8606                              <1> 	;and	edx, 0FFFFh
  8607                              <1> m_pix_op_xor_16_0:
  8608 0000F1C0 66AD                <1> 	lodsw
  8609 0000F1C2 663B05[529F0100]    <1> 	cmp	ax, [maskcolor]
  8610 0000F1C9 740A                <1> 	je	short m_pix_op_xor_16_1 ; exclude
  8611 0000F1CB 663117              <1> 	xor	[edi], dx
  8612 0000F1CE 8305[20900100]02    <1> 	add	dword [u.r0], 2 ; +2
  8613                              <1> m_pix_op_xor_16_1:
  8614 0000F1D5 83C702              <1> 	add	edi, 2 ; +2
  8615 0000F1D8 E2E6                <1> 	loop	m_pix_op_xor_16_0
  8616 0000F1DA C3                  <1> 	retn
  8617                              <1> m_pix_op_xor_3:
  8618                              <1> 	; 32 bit true colors
  8619                              <1> 	;jmp	short m_pix_op_xor_32
  8620                              <1> m_pix_op_xor_32:
  8621                              <1> 	; 32 bit true colors
  8622 0000F1DB 89C2                <1> 	mov	edx, eax ; new color
  8623                              <1> m_pix_op_xor_32_0:
  8624 0000F1DD AD                  <1> 	lodsd 
  8625 0000F1DE 3B05[529F0100]      <1> 	cmp	eax, [maskcolor]
  8626 0000F1E4 7409                <1> 	je	short m_pix_op_xor_32_1 ; exclude
  8627 0000F1E6 3117                <1> 	xor	[edi], edx ; 25/02/2021	
  8628 0000F1E8 8305[20900100]04    <1> 	add	dword [u.r0], 4 ; +4
  8629                              <1> m_pix_op_xor_32_1:
  8630 0000F1EF 83C704              <1> 	add	edi, 4 ; +4
  8631 0000F1F2 E2E9                <1> 	loop	m_pix_op_xor_32_0
  8632 0000F1F4 C3                  <1> 	retn
  8633                              <1> 
  8634                              <1> m_pix_op_xor_w:
  8635                              <1> 	; 06/02/2021
  8636                              <1> 	; XOR COLOR (MASKED, window)
  8637                              <1> 	;
  8638                              <1> 	; jump from pix_op_xor_w
  8639                              <1> 	;
  8640                              <1> 	; INPUT:
  8641                              <1> 	;   ecx = bytes per row (to be applied)
  8642                              <1> 	;   edx = screen width in bytes
  8643                              <1> 	;   ebx = row count
  8644                              <1> 	;   eax = color
  8645                              <1> 	;
  8646                              <1> 	;   [maskcolor] = mask color (to be excluded)
  8647                              <1> 	;
  8648                              <1> 	; OUTPUT:
  8649                              <1> 	; 	[u.r0] will be > 0 if succesful
  8650                              <1> 
  8651                              <1> 	; window
  8652                              <1> 	;mov	edi, [v_str] ; LFB start address
  8653                              <1> 	;mov	esi, edi 
  8654                              <1> 
  8655 0000F1F5 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  8656 0000F1FC 7707                <1> 	ja	short m_pix_op_xor_w_1
  8657                              <1> 
  8658                              <1> 	; 256 colors (8bpp)
  8659 0000F1FE BD[71F10000]        <1> 	mov	ebp, m_pix_op_xor_8
  8660 0000F203 EB1E                <1> 	jmp	short m_pix_op_xor_w_4
  8661                              <1> 			
  8662                              <1> m_pix_op_xor_w_1:
  8663 0000F205 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  8664 0000F20C 7710                <1> 	ja	short m_pix_op_xor_w_3 ; 32bpp
  8665 0000F20E 7207                <1> 	jb	short m_pix_op_xor_w_2 ; 16bpp
  8666                              <1> 
  8667                              <1> 	; 24 bit true colors
  8668 0000F210 BD[93F10000]        <1> 	mov	ebp, m_pix_op_xor_24
  8669 0000F215 EB0C                <1> 	jmp	short m_pix_op_xor_w_4
  8670                              <1> 
  8671                              <1> 	; 65536 colors (16bpp)
  8672                              <1> m_pix_op_xor_w_2:
  8673 0000F217 BD[BEF10000]        <1> 	mov	ebp, m_pix_op_xor_16
  8674 0000F21C EB05                <1> 	jmp	short m_pix_op_xor_w_4
  8675                              <1> 
  8676                              <1> 	; 32 bit true colors
  8677                              <1> m_pix_op_xor_w_3:
  8678 0000F21E BD[DBF10000]        <1> 	mov	ebp, m_pix_op_xor_32
  8679                              <1> m_pix_op_xor_w_4:
  8680 0000F223 E917FBFFFF          <1> 	jmp	m_pix_op_xor_w_x
  8681                              <1> 
  8682                              <1> m_pix_op_not:
  8683                              <1> 	; 06/02/2021
  8684                              <1> 	; NOT COLOR (MASKED, full screen)
  8685                              <1> 	;
  8686                              <1> 	; jump from pix_op_not
  8687                              <1> 	;
  8688                              <1> 	; INPUT:
  8689                              <1> 	;   ecx = [v_siz] ; display page pixel count
  8690                              <1> 	;   esi = edi = [v_mem] ; LFB start address
  8691                              <1> 	;
  8692                              <1> 	;   [maskcolor] = mask color (to be excluded)
  8693                              <1> 	;
  8694                              <1> 	; OUTPUT:
  8695                              <1> 	; 	[u.r0] will be > 0 if succesful
  8696                              <1> 	
  8697                              <1> 	; Full screen
  8698                              <1> m_pix_op_not_0:
  8699 0000F228 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  8700 0000F22F 7715                <1> 	ja	short m_pix_op_not_1
  8701                              <1> 	; 256 colors (8bpp)
  8702                              <1> 	;jmp	short m_pix_op_not_8
  8703                              <1> m_pix_op_not_8:
  8704                              <1> 	; 8 bit colors (256 colors)
  8705 0000F231 AC                  <1> 	lodsb 
  8706 0000F232 3A05[529F0100]      <1> 	cmp	al, [maskcolor]
  8707 0000F238 7408                <1> 	je	short m_pix_op_not_8_1 ; exclude
  8708 0000F23A F617                <1> 	not	byte [edi]
  8709 0000F23C FF05[20900100]      <1> 	inc	dword [u.r0] ; +1
  8710                              <1> m_pix_op_not_8_1:
  8711 0000F242 47                  <1> 	inc	edi
  8712 0000F243 E2EC                <1> 	loop	m_pix_op_not_8
  8713 0000F245 C3                  <1> 	retn
  8714                              <1> m_pix_op_not_1:
  8715 0000F246 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  8716 0000F24D 7746                <1> 	ja	short m_pix_op_not_3 ; 32bpp	
  8717 0000F24F 7229                <1> 	jb	short m_pix_op_not_2 ; 16bpp
  8718                              <1> 	; 24 bit true colors
  8719                              <1> 	;jmp	short m_pix_op_not_24
  8720                              <1> m_pix_op_not_24:
  8721                              <1> 	; 24 bit true colors
  8722 0000F251 66AD                <1> 	lodsw
  8723 0000F253 C1E010              <1> 	shl	eax, 16
  8724 0000F256 AC                  <1> 	lodsb
  8725 0000F257 C1C010              <1> 	rol	eax, 16	
  8726 0000F25A 3B05[529F0100]      <1> 	cmp	eax, [maskcolor]
  8727 0000F260 7412                <1> 	je	short m_pix_op_not_24_1 ; exclude
  8728 0000F262 F7D0                <1> 	not	eax
  8729 0000F264 668907              <1> 	mov	[edi], ax
  8730 0000F267 C1E810              <1> 	shr	eax, 16
  8731 0000F26A 884702              <1> 	mov	[edi+2], al
  8732 0000F26D 8305[20900100]03    <1> 	add	dword [u.r0], 3 ; +3
  8733                              <1> m_pix_op_not_24_1:
  8734 0000F274 83C703              <1> 	add	edi, 3 ; +3
  8735 0000F277 E2D8                <1> 	loop	m_pix_op_not_24
  8736 0000F279 C3                  <1> 	retn
  8737                              <1> 	; 65536 colors (16bpp)
  8738                              <1> m_pix_op_not_2:
  8739                              <1> 	;jmp	short m_pix_op_not_16
  8740                              <1> m_pix_op_not_16:
  8741                              <1> 	; 16 bit colors (65536 colors)
  8742 0000F27A 66AD                <1> 	lodsw
  8743 0000F27C 663B05[529F0100]    <1> 	cmp	ax, [maskcolor]
  8744 0000F283 740A                <1> 	je	short m_pix_op_not_16_1 ; exclude
  8745 0000F285 66F717              <1> 	not	word [edi]
  8746 0000F288 8305[20900100]02    <1> 	add	dword [u.r0], 2 ; +2
  8747                              <1> m_pix_op_not_16_1:
  8748 0000F28F 83C702              <1> 	add	edi, 2 ; +2
  8749 0000F292 E2E6                <1> 	loop	m_pix_op_not_16
  8750 0000F294 C3                  <1> 	retn
  8751                              <1> m_pix_op_not_3:
  8752                              <1> 	; 32 bit true colors
  8753                              <1> 	;jmp	short m_pix_op_not_32
  8754                              <1> m_pix_op_not_32:
  8755                              <1> 	; 32 bit true colors
  8756 0000F295 AD                  <1> 	lodsd 
  8757 0000F296 3B05[529F0100]      <1> 	cmp	eax, [maskcolor]
  8758 0000F29C 7409                <1> 	je	short m_pix_op_not_32_1 ; exclude
  8759 0000F29E F717                <1> 	not	dword [edi]	
  8760 0000F2A0 8305[20900100]04    <1> 	add	dword [u.r0], 4 ; +4
  8761                              <1> m_pix_op_not_32_1:
  8762 0000F2A7 83C704              <1> 	add	edi, 4 ; +4
  8763 0000F2AA E2E9                <1> 	loop	m_pix_op_not_32
  8764 0000F2AC C3                  <1> 	retn
  8765                              <1> 
  8766                              <1> m_pix_op_not_w:
  8767                              <1> 	; 06/02/2021
  8768                              <1> 	; NOT COLOR (MASKED, window)
  8769                              <1> 	;
  8770                              <1> 	; jump from pix_op_not_w
  8771                              <1> 	;
  8772                              <1> 	; INPUT:
  8773                              <1> 	;   ecx = bytes per row (to be applied)
  8774                              <1> 	;   edx = screen width in bytes
  8775                              <1> 	;   ebx = row count
  8776                              <1> 	;
  8777                              <1> 	;   [maskcolor] = mask color (to be excluded)
  8778                              <1> 	;
  8779                              <1> 	; OUTPUT:
  8780                              <1> 	; 	[u.r0] will be > 0 if succesful
  8781                              <1> 
  8782                              <1> 	; window
  8783                              <1> 	;mov	edi, [v_str] ; LFB start address
  8784                              <1> 	;mov	esi, edi 
  8785                              <1> 
  8786 0000F2AD 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  8787 0000F2B4 7707                <1> 	ja	short m_pix_op_not_w_1
  8788                              <1> 
  8789                              <1> 	; 256 colors (8bpp)
  8790 0000F2B6 BD[31F20000]        <1> 	mov	ebp, m_pix_op_not_8
  8791 0000F2BB EB1E                <1> 	jmp	short m_pix_op_not_w_4
  8792                              <1> 			
  8793                              <1> m_pix_op_not_w_1:
  8794 0000F2BD 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  8795 0000F2C4 7710                <1> 	ja	short m_pix_op_not_w_3 ; 32bpp
  8796 0000F2C6 7207                <1> 	jb	short m_pix_op_not_w_2 ; 16bpp
  8797                              <1> 
  8798                              <1> 	; 24 bit true colors
  8799 0000F2C8 BD[51F20000]        <1> 	mov	ebp, m_pix_op_not_24
  8800 0000F2CD EB0C                <1> 	jmp	short m_pix_op_not_w_4
  8801                              <1> 
  8802                              <1> 	; 65536 colors (16bpp)
  8803                              <1> m_pix_op_not_w_2:
  8804 0000F2CF BD[7AF20000]        <1> 	mov	ebp, m_pix_op_not_16
  8805 0000F2D4 EB05                <1> 	jmp	short m_pix_op_not_w_4
  8806                              <1> 
  8807                              <1> 	; 32 bit true colors
  8808                              <1> m_pix_op_not_w_3:
  8809 0000F2D6 BD[95F20000]        <1> 	mov	ebp, m_pix_op_not_32
  8810                              <1> m_pix_op_not_w_4:
  8811 0000F2DB E95FFAFFFF          <1> 	jmp	m_pix_op_not_w_x
  8812                              <1> 
  8813                              <1> m_pix_op_neg:
  8814                              <1> 	; 06/02/2021
  8815                              <1> 	; NEGATIVE COLOR (MASKED, full screen)
  8816                              <1> 	;
  8817                              <1> 	; jump from pix_op_neg
  8818                              <1> 	;
  8819                              <1> 	; INPUT:
  8820                              <1> 	;   ecx = [v_siz] ; display page pixel count
  8821                              <1> 	;   esi = edi = [v_mem] ; LFB start address
  8822                              <1> 	;
  8823                              <1> 	;   [maskcolor] = mask color (to be excluded)
  8824                              <1> 	;
  8825                              <1> 	; OUTPUT:
  8826                              <1> 	; 	[u.r0] will be > 0 if succesful
  8827                              <1> 	
  8828                              <1> 	; Full screen
  8829                              <1> m_pix_op_neg_0:
  8830 0000F2E0 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  8831 0000F2E7 7715                <1> 	ja	short m_pix_op_neg_1
  8832                              <1> 	; 256 colors (8bpp)
  8833                              <1> 	;jmp	short m_pix_op_neg_8
  8834                              <1> m_pix_op_neg_8:
  8835                              <1> 	; 8 bit colors (256 colors)
  8836 0000F2E9 AC                  <1> 	lodsb 
  8837 0000F2EA 3A05[529F0100]      <1> 	cmp	al, [maskcolor]
  8838 0000F2F0 7408                <1> 	je	short m_pix_op_neg_8_1 ; exclude
  8839 0000F2F2 F61F                <1> 	neg	byte [edi]
  8840 0000F2F4 FF05[20900100]      <1> 	inc	dword [u.r0] ; +1
  8841                              <1> m_pix_op_neg_8_1:
  8842 0000F2FA 47                  <1> 	inc	edi
  8843 0000F2FB E2EC                <1> 	loop	m_pix_op_neg_8
  8844 0000F2FD C3                  <1> 	retn
  8845                              <1> m_pix_op_neg_1:
  8846 0000F2FE 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  8847 0000F305 7746                <1> 	ja	short m_pix_op_neg_3 ; 32bpp	
  8848 0000F307 7229                <1> 	jb	short m_pix_op_neg_2 ; 16bpp
  8849                              <1> 	; 24 bit true colors
  8850                              <1> 	;jmp	short m_pix_op_neg_24
  8851                              <1> m_pix_op_neg_24:
  8852                              <1> 	; 24 bit true colors
  8853 0000F309 66AD                <1> 	lodsw
  8854 0000F30B C1E010              <1> 	shl	eax, 16
  8855 0000F30E AC                  <1> 	lodsb
  8856 0000F30F C1C010              <1> 	rol	eax, 16	
  8857 0000F312 3B05[529F0100]      <1> 	cmp	eax, [maskcolor]
  8858 0000F318 7412                <1> 	je	short m_pix_op_neg_24_1 ; exclude
  8859 0000F31A F7D8                <1> 	neg	eax
  8860 0000F31C 668907              <1> 	mov	[edi], ax
  8861 0000F31F C1E810              <1> 	shr	eax, 16
  8862 0000F322 884702              <1> 	mov	[edi+2], al
  8863 0000F325 8305[20900100]03    <1> 	add	dword [u.r0], 3 ; +3
  8864                              <1> m_pix_op_neg_24_1:
  8865 0000F32C 83C703              <1> 	add	edi, 3 ; +3
  8866 0000F32F E2D8                <1> 	loop	m_pix_op_neg_24
  8867 0000F331 C3                  <1> 	retn
  8868                              <1> 	; 65536 colors (16bpp)
  8869                              <1> m_pix_op_neg_2:
  8870                              <1> 	;jmp	short m_pix_op_neg_16
  8871                              <1> m_pix_op_neg_16:
  8872                              <1> 	; 16 bit colors (65536 colors)
  8873 0000F332 66AD                <1> 	lodsw
  8874 0000F334 663B05[529F0100]    <1> 	cmp	ax, [maskcolor]
  8875 0000F33B 740A                <1> 	je	short m_pix_op_neg_16_1 ; exclude
  8876 0000F33D 66F71F              <1> 	neg	word [edi]
  8877 0000F340 8305[20900100]02    <1> 	add	dword [u.r0], 2 ; +2
  8878                              <1> m_pix_op_neg_16_1:
  8879 0000F347 83C702              <1> 	add	edi, 2 ; +2
  8880 0000F34A E2E6                <1> 	loop	m_pix_op_neg_16
  8881 0000F34C C3                  <1> 	retn
  8882                              <1> m_pix_op_neg_3:
  8883                              <1> 	; 32 bit true colors
  8884                              <1> 	;jmp	short m_pix_op_neg_32
  8885                              <1> m_pix_op_neg_32:
  8886                              <1> 	; 32 bit true colors
  8887 0000F34D AD                  <1> 	lodsd 
  8888 0000F34E 3B05[529F0100]      <1> 	cmp	eax, [maskcolor]
  8889 0000F354 7409                <1> 	je	short m_pix_op_neg_32_1 ; exclude
  8890 0000F356 F71F                <1> 	neg	dword [edi]	
  8891 0000F358 8305[20900100]04    <1> 	add	dword [u.r0], 4 ; +4
  8892                              <1> m_pix_op_neg_32_1:
  8893 0000F35F 83C704              <1> 	add	edi, 4 ; +4
  8894 0000F362 E2E9                <1> 	loop	m_pix_op_neg_32
  8895 0000F364 C3                  <1> 	retn
  8896                              <1> 
  8897                              <1> m_pix_op_neg_w:
  8898                              <1> 	; 06/02/2021
  8899                              <1> 	; NEGATIVE COLOR (MASKED, window)
  8900                              <1> 	;
  8901                              <1> 	; jump from pix_op_neg_w
  8902                              <1> 	;
  8903                              <1> 	; INPUT:
  8904                              <1> 	;   ecx = bytes per row (to be applied)
  8905                              <1> 	;   edx = screen width in bytes
  8906                              <1> 	;   ebx = row count
  8907                              <1> 	;
  8908                              <1> 	;   [maskcolor] = mask color (to be excluded)
  8909                              <1> 	;
  8910                              <1> 	; OUTPUT:
  8911                              <1> 	; 	[u.r0] will be > 0 if succesful
  8912                              <1> 
  8913                              <1> 	; window
  8914                              <1> 	;mov	edi, [v_str] ; LFB start address
  8915                              <1> 	;mov	esi, edi 
  8916                              <1> 
  8917 0000F365 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  8918 0000F36C 7707                <1> 	ja	short m_pix_op_neg_w_1
  8919                              <1> 
  8920                              <1> 	; 256 colors (8bpp)
  8921 0000F36E BD[E9F20000]        <1> 	mov	ebp, m_pix_op_neg_8
  8922 0000F373 EB1E                <1> 	jmp	short m_pix_op_neg_w_4
  8923                              <1> 			
  8924                              <1> m_pix_op_neg_w_1:
  8925 0000F375 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  8926 0000F37C 7710                <1> 	ja	short m_pix_op_neg_w_3 ; 32bpp
  8927 0000F37E 7207                <1> 	jb	short m_pix_op_neg_w_2 ; 16bpp
  8928                              <1> 
  8929                              <1> 	; 24 bit true colors
  8930 0000F380 BD[09F30000]        <1> 	mov	ebp, m_pix_op_neg_24
  8931 0000F385 EB0C                <1> 	jmp	short m_pix_op_neg_w_4
  8932                              <1> 
  8933                              <1> 	; 65536 colors (16bpp)
  8934                              <1> m_pix_op_neg_w_2:
  8935 0000F387 BD[32F30000]        <1> 	mov	ebp, m_pix_op_neg_16
  8936 0000F38C EB05                <1> 	jmp	short m_pix_op_neg_w_4
  8937                              <1> 
  8938                              <1> 	; 32 bit true colors
  8939                              <1> m_pix_op_neg_w_3:
  8940 0000F38E BD[4DF30000]        <1> 	mov	ebp, m_pix_op_neg_32
  8941                              <1> m_pix_op_neg_w_4:
  8942 0000F393 E9A7F9FFFF          <1> 	jmp	m_pix_op_neg_w_x
  8943                              <1> 
  8944                              <1> m_pix_op_inc:
  8945                              <1> 	; 06/02/2021
  8946                              <1> 	; INCREASE COLOR (MASKED, full screen)
  8947                              <1> 	;
  8948                              <1> 	; jump from pix_op_inc
  8949                              <1> 	;
  8950                              <1> 	; INPUT:
  8951                              <1> 	;   ecx = [v_siz] ; display page pixel count
  8952                              <1> 	;   esi = edi = [v_mem] ; LFB start address
  8953                              <1> 	;
  8954                              <1> 	;   [maskcolor] = mask color (to be excluded)
  8955                              <1> 	;
  8956                              <1> 	; OUTPUT:
  8957                              <1> 	; 	[u.r0] will be > 0 if succesful
  8958                              <1> 	
  8959                              <1> 	; Full screen
  8960                              <1> m_pix_op_inc_0:
  8961 0000F398 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  8962 0000F39F 7719                <1> 	ja	short m_pix_op_inc_1
  8963                              <1> 	; 256 colors (8bpp)
  8964                              <1> 	;jmp	short m_pix_op_inc_8
  8965                              <1> m_pix_op_inc_8:
  8966                              <1> 	; 8 bit colors (256 colors)
  8967 0000F3A1 AC                  <1> 	lodsb 
  8968 0000F3A2 3A05[529F0100]      <1> 	cmp	al, [maskcolor]
  8969 0000F3A8 740C                <1> 	je	short m_pix_op_inc_8_1 ; exclude
  8970 0000F3AA FE07                <1> 	inc	byte [edi]
  8971 0000F3AC 7502                <1> 	jnz	short m_pix_op_inc_8_0
  8972 0000F3AE FE0F                <1> 	dec	byte [edi]
  8973                              <1> m_pix_op_inc_8_0:
  8974 0000F3B0 FF05[20900100]      <1> 	inc	dword [u.r0] ; +1
  8975                              <1> m_pix_op_inc_8_1:
  8976 0000F3B6 47                  <1> 	inc	edi
  8977 0000F3B7 E2E8                <1> 	loop	m_pix_op_inc_8
  8978 0000F3B9 C3                  <1> 	retn
  8979                              <1> m_pix_op_inc_1:
  8980 0000F3BA 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  8981 0000F3C1 7752                <1> 	ja	short m_pix_op_inc_3 ; 32bpp	
  8982 0000F3C3 7230                <1> 	jb	short m_pix_op_inc_2 ; 16bpp
  8983                              <1> 	; 24 bit true colors
  8984                              <1> 	;jmp	short m_pix_op_inc_24
  8985                              <1> m_pix_op_inc_24:
  8986                              <1> 	; 24 bit true colors
  8987 0000F3C5 66AD                <1> 	lodsw
  8988 0000F3C7 C1E010              <1> 	shl	eax, 16
  8989 0000F3CA AC                  <1> 	lodsb
  8990 0000F3CB C1C010              <1> 	rol	eax, 16	
  8991 0000F3CE 3B05[529F0100]      <1> 	cmp	eax, [maskcolor]
  8992 0000F3D4 7419                <1> 	je	short m_pix_op_inc_24_1 ; exclude
  8993 0000F3D6 40                  <1> 	inc	eax
  8994 0000F3D7 3DFFFFFF00          <1> 	cmp	eax, 0FFFFFFh
  8995 0000F3DC 7601                <1> 	jna	short m_pix_op_inc_24_0
  8996 0000F3DE 48                  <1> 	dec	eax 
  8997                              <1> m_pix_op_inc_24_0:
  8998 0000F3DF 668907              <1> 	mov	[edi], ax
  8999 0000F3E2 C1E810              <1> 	shr	eax, 16
  9000 0000F3E5 884702              <1> 	mov	[edi+2], al
  9001 0000F3E8 8305[20900100]03    <1> 	add	dword [u.r0], 3 ; +3
  9002                              <1> m_pix_op_inc_24_1:
  9003 0000F3EF 83C703              <1> 	add	edi, 3 ; +3
  9004 0000F3F2 E2D1                <1> 	loop	m_pix_op_inc_24
  9005 0000F3F4 C3                  <1> 	retn
  9006                              <1> 	; 65536 colors (16bpp)
  9007                              <1> m_pix_op_inc_2:
  9008                              <1> 	;jmp	short m_pix_op_inc_16
  9009                              <1> m_pix_op_inc_16:
  9010                              <1> 	; 16 bit colors (65536 colors)
  9011 0000F3F5 66AD                <1> 	lodsw
  9012 0000F3F7 663B05[529F0100]    <1> 	cmp	ax, [maskcolor]
  9013 0000F3FE 740F                <1> 	je	short m_pix_op_inc_16_1 ; exclude
  9014 0000F400 66FF07              <1> 	inc	word [edi]
  9015 0000F403 7503                <1> 	jnz	short m_pix_op_inc_16_0
  9016 0000F405 66FF0F              <1> 	dec	word [edi]
  9017                              <1> m_pix_op_inc_16_0:
  9018 0000F408 8305[20900100]02    <1> 	add	dword [u.r0], 2 ; +2
  9019                              <1> m_pix_op_inc_16_1:
  9020 0000F40F 83C702              <1> 	add	edi, 2 ; +2
  9021 0000F412 E2E1                <1> 	loop	m_pix_op_inc_16
  9022 0000F414 C3                  <1> 	retn
  9023                              <1> m_pix_op_inc_3:
  9024                              <1> 	; 32 bit true colors
  9025                              <1> 	;jmp	short m_pix_op_inc_32
  9026                              <1> m_pix_op_inc_32:
  9027                              <1> 	; 32 bit true colors
  9028 0000F415 AD                  <1> 	lodsd 
  9029 0000F416 3B05[529F0100]      <1> 	cmp	eax, [maskcolor]
  9030 0000F41C 740D                <1> 	je	short m_pix_op_inc_32_1 ; exclude
  9031 0000F41E FF07                <1> 	inc	dword [edi]
  9032 0000F420 7502                <1> 	jnz	short m_pix_op_inc_32_0
  9033 0000F422 FF0F                <1> 	dec	dword [edi]
  9034                              <1> m_pix_op_inc_32_0:	
  9035 0000F424 8305[20900100]04    <1> 	add	dword [u.r0], 4 ; +4
  9036                              <1> m_pix_op_inc_32_1:
  9037 0000F42B 83C704              <1> 	add	edi, 4 ; +4
  9038 0000F42E E2E5                <1> 	loop	m_pix_op_inc_32
  9039 0000F430 C3                  <1> 	retn
  9040                              <1> 
  9041                              <1> m_pix_op_inc_w:
  9042                              <1> 	; 06/02/2021
  9043                              <1> 	; INCREASE COLOR (MASKED, window)
  9044                              <1> 	;
  9045                              <1> 	; jump from pix_op_inc_w
  9046                              <1> 	;
  9047                              <1> 	; INPUT:
  9048                              <1> 	;   ecx = bytes per row (to be applied)
  9049                              <1> 	;   edx = screen width in bytes
  9050                              <1> 	;   ebx = row count
  9051                              <1> 	;
  9052                              <1> 	;   [maskcolor] = mask color (to be excluded)
  9053                              <1> 	;
  9054                              <1> 	; OUTPUT:
  9055                              <1> 	; 	[u.r0] will be > 0 if succesful
  9056                              <1> 
  9057                              <1> 	; window
  9058                              <1> 	;mov	edi, [v_str] ; LFB start address
  9059                              <1> 	;mov	esi, edi 
  9060                              <1> 
  9061 0000F431 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  9062 0000F438 7707                <1> 	ja	short m_pix_op_inc_w_1
  9063                              <1> 
  9064                              <1> 	; 256 colors (8bpp)
  9065 0000F43A BD[A1F30000]        <1> 	mov	ebp, m_pix_op_inc_8
  9066 0000F43F EB1E                <1> 	jmp	short m_pix_op_inc_w_4
  9067                              <1> 			
  9068                              <1> m_pix_op_inc_w_1:
  9069 0000F441 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  9070 0000F448 7710                <1> 	ja	short m_pix_op_inc_w_3 ; 32bpp
  9071 0000F44A 7207                <1> 	jb	short m_pix_op_inc_w_2 ; 16bpp
  9072                              <1> 
  9073                              <1> 	; 24 bit true colors
  9074 0000F44C BD[C5F30000]        <1> 	mov	ebp, m_pix_op_inc_24
  9075 0000F451 EB0C                <1> 	jmp	short m_pix_op_inc_w_4
  9076                              <1> 
  9077                              <1> 	; 65536 colors (16bpp)
  9078                              <1> m_pix_op_inc_w_2:
  9079 0000F453 BD[F5F30000]        <1> 	mov	ebp, m_pix_op_inc_16
  9080 0000F458 EB05                <1> 	jmp	short m_pix_op_inc_w_4
  9081                              <1> 
  9082                              <1> 	; 32 bit true colors
  9083                              <1> m_pix_op_inc_w_3:
  9084 0000F45A BD[15F40000]        <1> 	mov	ebp, m_pix_op_inc_32
  9085                              <1> m_pix_op_inc_w_4:
  9086 0000F45F E9DBF8FFFF          <1> 	jmp	m_pix_op_inc_w_x
  9087                              <1> 
  9088                              <1> m_pix_op_dec:
  9089                              <1> 	; 06/02/2021
  9090                              <1> 	; DECREASE COLOR (MASKED, full screen)
  9091                              <1> 	;
  9092                              <1> 	; jump from pix_op_dec
  9093                              <1> 	;
  9094                              <1> 	; INPUT:
  9095                              <1> 	;   ecx = [v_siz] ; display page pixel count
  9096                              <1> 	;   esi = edi = [v_mem] ; LFB start address
  9097                              <1> 	;
  9098                              <1> 	;   [maskcolor] = mask color (to be excluded)
  9099                              <1> 	;
  9100                              <1> 	; OUTPUT:
  9101                              <1> 	; 	[u.r0] will be > 0 if succesful
  9102                              <1> 	
  9103                              <1> 	; Full screen
  9104                              <1> m_pix_op_dec_0:
  9105 0000F464 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  9106 0000F46B 7719                <1> 	ja	short m_pix_op_dec_1
  9107                              <1> 	; 256 colors (8bpp)
  9108                              <1> 	;jmp	short m_pix_op_dec_8
  9109                              <1> m_pix_op_dec_8:
  9110                              <1> 	; 8 bit colors (256 colors)
  9111 0000F46D AC                  <1> 	lodsb 
  9112 0000F46E 3A05[529F0100]      <1> 	cmp	al, [maskcolor]
  9113 0000F474 740C                <1> 	je	short m_pix_op_dec_8_1 ; exclude
  9114 0000F476 FE0F                <1> 	dec	byte [edi]
  9115 0000F478 7902                <1> 	jns	short m_pix_op_dec_8_0
  9116 0000F47A FE07                <1> 	inc	byte [edi]
  9117                              <1> m_pix_op_dec_8_0:
  9118 0000F47C FF05[20900100]      <1> 	inc	dword [u.r0] ; +1
  9119                              <1> m_pix_op_dec_8_1:
  9120 0000F482 47                  <1> 	inc	edi
  9121 0000F483 E2E8                <1> 	loop	m_pix_op_dec_8
  9122 0000F485 C3                  <1> 	retn
  9123                              <1> m_pix_op_dec_1:
  9124 0000F486 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  9125 0000F48D 774D                <1> 	ja	short m_pix_op_dec_3 ; 32bpp	
  9126 0000F48F 722B                <1> 	jb	short m_pix_op_dec_2 ; 16bpp
  9127                              <1> 	; 24 bit true colors
  9128                              <1> 	;jmp	short m_pix_op_dec_24
  9129                              <1> m_pix_op_dec_24:
  9130                              <1> 	; 24 bit true colors
  9131 0000F491 66AD                <1> 	lodsw
  9132 0000F493 C1E010              <1> 	shl	eax, 16
  9133 0000F496 AC                  <1> 	lodsb
  9134 0000F497 C1C010              <1> 	rol	eax, 16	
  9135 0000F49A 3B05[529F0100]      <1> 	cmp	eax, [maskcolor]
  9136 0000F4A0 7414                <1> 	je	short m_pix_op_dec_24_1 ; exclude
  9137 0000F4A2 48                  <1> 	dec	eax
  9138 0000F4A3 7901                <1> 	jns	short m_pix_op_dec_24_0
  9139 0000F4A5 40                  <1> 	inc	eax 
  9140                              <1> m_pix_op_dec_24_0:
  9141 0000F4A6 668907              <1> 	mov	[edi], ax
  9142 0000F4A9 C1E810              <1> 	shr	eax, 16
  9143 0000F4AC 884702              <1> 	mov	[edi+2], al
  9144 0000F4AF 8305[20900100]03    <1> 	add	dword [u.r0], 3 ; +3
  9145                              <1> m_pix_op_dec_24_1:
  9146 0000F4B6 83C703              <1> 	add	edi, 3 ; +3
  9147 0000F4B9 E2D6                <1> 	loop	m_pix_op_dec_24
  9148 0000F4BB C3                  <1> 	retn
  9149                              <1> 	; 65536 colors (16bpp)
  9150                              <1> m_pix_op_dec_2:
  9151                              <1> 	;jmp	short m_pix_op_dec_16
  9152                              <1> m_pix_op_dec_16:
  9153                              <1> 	; 16 bit colors (65536 colors)
  9154 0000F4BC 66AD                <1> 	lodsw
  9155 0000F4BE 663B05[529F0100]    <1> 	cmp	ax, [maskcolor]
  9156 0000F4C5 740F                <1> 	je	short m_pix_op_dec_16_1 ; exclude
  9157 0000F4C7 66FF0F              <1> 	dec	word [edi]
  9158 0000F4CA 7903                <1> 	jns	short m_pix_op_dec_16_0
  9159 0000F4CC 66FF07              <1> 	inc	word [edi]
  9160                              <1> m_pix_op_dec_16_0:
  9161 0000F4CF 8305[20900100]02    <1> 	add	dword [u.r0], 2 ; +2
  9162                              <1> m_pix_op_dec_16_1:
  9163 0000F4D6 83C702              <1> 	add	edi, 2 ; +2
  9164 0000F4D9 E2E1                <1> 	loop	m_pix_op_dec_16
  9165 0000F4DB C3                  <1> 	retn
  9166                              <1> m_pix_op_dec_3:
  9167                              <1> 	; 32 bit true colors
  9168                              <1> 	;jmp	short m_pix_op_dec_32
  9169                              <1> m_pix_op_dec_32:
  9170                              <1> 	; 32 bit true colors
  9171 0000F4DC AD                  <1> 	lodsd 
  9172 0000F4DD 3B05[529F0100]      <1> 	cmp	eax, [maskcolor]
  9173 0000F4E3 740D                <1> 	je	short m_pix_op_dec_32_1 ; exclude
  9174 0000F4E5 FF0F                <1> 	dec	dword [edi]
  9175 0000F4E7 7902                <1> 	jns	short m_pix_op_dec_32_0
  9176 0000F4E9 FF07                <1> 	inc	dword [edi]
  9177                              <1> m_pix_op_dec_32_0:	
  9178 0000F4EB 8305[20900100]04    <1> 	add	dword [u.r0], 4 ; +4
  9179                              <1> m_pix_op_dec_32_1:
  9180 0000F4F2 83C704              <1> 	add	edi, 4 ; +4
  9181 0000F4F5 E2E5                <1> 	loop	m_pix_op_dec_32
  9182 0000F4F7 C3                  <1> 	retn
  9183                              <1> 
  9184                              <1> m_pix_op_dec_w:
  9185                              <1> 	; 06/02/2021
  9186                              <1> 	; DECREASE COLOR (MASKED, window)
  9187                              <1> 	;
  9188                              <1> 	; jump from pix_op_dec_w
  9189                              <1> 	;
  9190                              <1> 	; INPUT:
  9191                              <1> 	;   ecx = bytes per row (to be applied)
  9192                              <1> 	;   edx = screen width in bytes
  9193                              <1> 	;   ebx = row count
  9194                              <1> 	;
  9195                              <1> 	;   [maskcolor] = mask color (to be excluded)
  9196                              <1> 	;
  9197                              <1> 	; OUTPUT:
  9198                              <1> 	; 	[u.r0] will be > 0 if succesful
  9199                              <1> 
  9200                              <1> 	; window
  9201                              <1> 	;mov	edi, [v_str] ; LFB start address
  9202                              <1> 	;mov	esi, edi 
  9203                              <1> 
  9204 0000F4F8 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  9205 0000F4FF 7707                <1> 	ja	short m_pix_op_dec_w_1
  9206                              <1> 
  9207                              <1> 	; 256 colors (8bpp)
  9208 0000F501 BD[6DF40000]        <1> 	mov	ebp, m_pix_op_dec_8
  9209 0000F506 EB1E                <1> 	jmp	short m_pix_op_dec_w_4
  9210                              <1> 			
  9211                              <1> m_pix_op_dec_w_1:
  9212 0000F508 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  9213 0000F50F 7710                <1> 	ja	short m_pix_op_dec_w_3 ; 32bpp
  9214 0000F511 7207                <1> 	jb	short m_pix_op_dec_w_2 ; 16bpp
  9215                              <1> 
  9216                              <1> 	; 24 bit true colors
  9217 0000F513 BD[91F40000]        <1> 	mov	ebp, m_pix_op_dec_24
  9218 0000F518 EB0C                <1> 	jmp	short m_pix_op_dec_w_4
  9219                              <1> 
  9220                              <1> 	; 65536 colors (16bpp)
  9221                              <1> m_pix_op_dec_w_2:
  9222 0000F51A BD[BCF40000]        <1> 	mov	ebp, m_pix_op_dec_16
  9223 0000F51F EB05                <1> 	jmp	short m_pix_op_dec_w_4
  9224                              <1> 
  9225                              <1> 	; 32 bit true colors
  9226                              <1> m_pix_op_dec_w_3:
  9227 0000F521 BD[DCF40000]        <1> 	mov	ebp, m_pix_op_dec_32
  9228                              <1> m_pix_op_dec_w_4:
  9229 0000F526 E914F8FFFF          <1> 	jmp	m_pix_op_dec_w_x
  9230                              <1> 
  9231                              <1> sysvideo_39:
  9232                              <1> 	; 15/02/2021
  9233                              <1> 	; 07/02/2021, 08/02/2021
  9234                              <1> 	; 03/01/2021, 04/01/2021
  9235                              <1> 	; 23/11/2020
  9236                              <1> 	; BH = 3
  9237                              <1> 	; PIXEL READ/WRITE
  9238                              <1> 	
  9239                              <1> 	; 07/02/2021
  9240                              <1> 	; 04/01/2021 (TRDOS 386 v2.0.3)
  9241 0000F52B 80FB03              <1> 	cmp	bl, 3
  9242 0000F52E 761A                <1> 	jna	short sysvideo_39_1
  9243                              <1> 	; 07/02/2021
  9244 0000F530 80FB06              <1> 	cmp	bl, 6
  9245 0000F533 7705                <1> 	ja	short sysvideo_39_0
  9246 0000F535 E91A010000          <1> 	jmp	sysvideo_39_31
  9247                              <1> sysvideo_39_0:
  9248                              <1> 	; error
  9249 0000F53A B3FF                <1> 	mov	bl, 0FFh
  9250 0000F53C 8B2D[1C900100]      <1> 	mov	ebp, [u.usp]  ; ebp points to user's registers
  9251 0000F542 895D10              <1> 	mov	[ebp+16], ebx ; EBX
  9252 0000F545 E90DD9FFFF          <1> 	jmp	sysret
  9253                              <1> sysvideo_39_1:
  9254 0000F54A 803D[BE670000]FF    <1> 	cmp	byte [CRT_MODE], 0FFh
  9255 0000F551 7312                <1> 	jnb	short sysvideo_39_2 ; SVGA (VESA VBE) video mode
  9256                              <1> 
  9257                              <1> 	; Std VGA or CGA mode
  9258 0000F553 81C200000A00        <1> 	add	edx, 0A0000h
  9259 0000F559 72DF                <1> 	jc	short sysvideo_39_0
  9260 0000F55B 81FAFFFF0A00        <1> 	cmp	edx, 0AFFFFh
  9261 0000F561 77D7                <1> 	ja	short sysvideo_39_0
  9262 0000F563 EB1E                <1> 	jmp	short sysvideo_39_3 ; 8bpp
  9263                              <1> 
  9264                              <1> sysvideo_39_2:
  9265                              <1> 	; use current vbe (svga) video mode
  9266                              <1> 
  9267                              <1> 	; get LFB address
  9268 0000F565 A1[E49E0100]        <1> 	mov	eax, [LFB_ADDR] ; [LFB_Info+LFBINFO.LFB_addr]
  9269 0000F56A 09C0                <1> 	or	eax, eax
  9270 0000F56C 74CC                <1> 	jz	short sysvideo_39_0
  9271 0000F56E 3B15[E89E0100]      <1> 	cmp	edx, [LFB_SIZE] 
  9272 0000F574 73C4                <1> 	jnb	short sysvideo_39_0
  9273                              <1> 
  9274 0000F576 01C2                <1> 	add	edx, eax
  9275                              <1> 	;jc	short sysvideo_39_0
  9276                              <1> 
  9277                              <1> 	; Pixel read/write in VESA VBE (2/3) video mode
  9278                              <1> 	; Video memory at Linear Frame Buffer base address
  9279                              <1> 
  9280 0000F578 8A3D[F09E0100]      <1> 	mov	bh, [LFB_Info+LFBINFO.bpp]
  9281                              <1> 
  9282 0000F57E 80FF08              <1> 	cmp	bh, 8 ; 8bpp
  9283 0000F581 775D                <1> 	ja	short sysvideo_39_17
  9284                              <1> 
  9285                              <1> 	; 8 bits per pixel
  9286                              <1> sysvideo_39_3:
  9287 0000F583 80FB01              <1> 	cmp	bl, 1 ; 1 = write pixel
  9288 0000F586 7406                <1> 	je	short sysvideo_39_5
  9289 0000F588 7712                <1> 	ja	short sysvideo_39_8
  9290                              <1> sysvideo_39_4:
  9291                              <1> 	; read pixel (8bpp)
  9292 0000F58A 8A02                <1> 	mov	al, [edx]
  9293                              <1> 	;mov	[u.r0], al
  9294                              <1> 	;jmp	sysret
  9295 0000F58C EB04                <1> 	jmp	short sysvideo_39_7
  9296                              <1> sysvideo_39_5:
  9297                              <1> 	; write pixel (8bpp)
  9298 0000F58E 88C8                <1> 	mov	al, cl
  9299                              <1> sysvideo_39_6:
  9300 0000F590 8802                <1> 	mov	[edx], al
  9301                              <1> sysvideo_39_7:
  9302 0000F592 A2[20900100]        <1> 	mov	[u.r0], al
  9303 0000F597 E9BBD8FFFF          <1> 	jmp	sysret
  9304                              <1> sysvideo_39_8:
  9305 0000F59C 80FB03              <1> 	cmp	bl, 3 ; mix
  9306 0000F59F 7208                <1> 	jb	short sysvideo_39_9
  9307                              <1> 	; mix  pixel colors (8bpp)
  9308 0000F5A1 8A02                <1> 	mov	al, [edx]
  9309 0000F5A3 00C8                <1> 	add	al, cl
  9310 0000F5A5 D0D8                <1> 	rcr	al, 1
  9311 0000F5A7 EBE7                <1> 	jmp	short sysvideo_39_6
  9312                              <1> sysvideo_39_9:
  9313                              <1> 	 ; swap pixel colors (8bpp)
  9314 0000F5A9 88C8                <1> 	mov	al, cl
  9315 0000F5AB 8602                <1> 	xchg	[edx], al
  9316 0000F5AD EBE3                <1> 	jmp	short sysvideo_39_7
  9317                              <1> 
  9318                              <1> 	; 16 bits per pixel
  9319                              <1> sysvideo_39_10:
  9320 0000F5AF 80FB01              <1> 	cmp	bl, 1 ; 1 = write pixel
  9321 0000F5B2 7406                <1> 	je	short sysvideo_39_12
  9322 0000F5B4 7714                <1> 	ja	short sysvideo_39_15
  9323                              <1> sysvideo_39_11:
  9324                              <1> 	; read pixel (16bpp)
  9325 0000F5B6 8B02                <1> 	mov	eax, [edx]
  9326                              <1> 	;mov	[u.r0], ax
  9327                              <1> 	;jmp	sysret
  9328 0000F5B8 EB05                <1> 	jmp	short sysvideo_39_14
  9329                              <1> sysvideo_39_12:
  9330                              <1> 	; write pixel (16bpp)
  9331 0000F5BA 89C8                <1> 	mov	eax, ecx
  9332                              <1> sysvideo_39_13:
  9333 0000F5BC 668902              <1> 	mov	[edx], ax
  9334                              <1> sysvideo_39_14:
  9335 0000F5BF 66A3[20900100]      <1> 	mov	[u.r0], ax
  9336 0000F5C5 E98DD8FFFF          <1> 	jmp	sysret
  9337                              <1> sysvideo_39_15:
  9338 0000F5CA 80FB03              <1> 	cmp	bl, 3 ; mix
  9339 0000F5CD 720A                <1> 	jb	short sysvideo_39_16
  9340                              <1> 	; mix  pixel colors (16bpp)
  9341 0000F5CF 8B02                <1> 	mov	eax, [edx]
  9342 0000F5D1 6601C8              <1> 	add	ax, cx
  9343 0000F5D4 66D1D8              <1> 	rcr	ax, 1
  9344 0000F5D7 EBE3                <1> 	jmp	short sysvideo_39_13
  9345                              <1> sysvideo_39_16:
  9346                              <1> 	 ; swap pixel colors (16bpp)
  9347 0000F5D9 89C8                <1> 	mov	eax, ecx
  9348 0000F5DB 668702              <1> 	xchg	[edx], ax
  9349 0000F5DE EBDF                <1> 	jmp	short sysvideo_39_14
  9350                              <1> sysvideo_39_17:
  9351 0000F5E0 80FF18              <1> 	cmp	bh, 24
  9352 0000F5E3 7743                <1> 	ja	short sysvideo_39_24
  9353 0000F5E5 72C8                <1> 	jb	short sysvideo_39_10  
  9354                              <1> 	
  9355                              <1> 	; 24 bits per pixel
  9356 0000F5E7 81E1FFFFFF00        <1> 	and	ecx, 0FFFFFFh
  9357 0000F5ED 80FB01              <1> 	cmp	bl, 1 ; 1 = write pixel
  9358 0000F5F0 7406                <1> 	je	short sysvideo_39_19
  9359 0000F5F2 7712                <1> 	ja	short sysvideo_39_22
  9360                              <1> sysvideo_39_18:
  9361                              <1> 	; read pixel (24bpp)
  9362 0000F5F4 8B02                <1> 	mov	eax, [edx]
  9363                              <1> 	;and	eax, 0FFFFFFh
  9364                              <1> 	;mov	[u.r0], eax
  9365                              <1> 	;jmp	sysret
  9366 0000F5F6 EB04                <1> 	jmp	short sysvideo_39_21
  9367                              <1> sysvideo_39_19:
  9368                              <1> 	; write pixel (24bpp)
  9369 0000F5F8 89C8                <1> 	mov	eax, ecx
  9370                              <1> sysvideo_39_20:
  9371                              <1> 	;and	eax, 0FFFFFFh
  9372 0000F5FA 8902                <1> 	mov	[edx], eax
  9373                              <1> sysvideo_39_21:
  9374 0000F5FC A3[20900100]        <1> 	mov	[u.r0], eax
  9375 0000F601 E951D8FFFF          <1> 	jmp	sysret
  9376                              <1> sysvideo_39_22:
  9377 0000F606 80FB03              <1> 	cmp	bl, 3 ; mix
  9378 0000F609 720D                <1> 	jb	short sysvideo_39_23
  9379                              <1> 	; mix  pixel colors (24bpp)
  9380 0000F60B 8B02                <1> 	mov	eax, [edx]
  9381 0000F60D 25FFFFFF00          <1> 	and	eax, 0FFFFFFh
  9382                              <1> 	;and	ecx, 0FFFFFFh
  9383 0000F612 01C8                <1> 	add	eax, ecx
  9384 0000F614 D1D8                <1> 	rcr	eax, 1
  9385 0000F616 EBE2                <1> 	jmp	short sysvideo_39_20
  9386                              <1> sysvideo_39_23:
  9387                              <1> 	 ; swap pixel colors (24bpp)
  9388 0000F618 89C8                <1> 	mov	eax, ecx
  9389                              <1> 	;and	eax, 0FFFFFFh
  9390 0000F61A 668702              <1> 	xchg	[edx], ax
  9391 0000F61D C1C810              <1> 	ror	eax, 16
  9392 0000F620 884202              <1> 	mov	[edx+2], al	
  9393 0000F623 C1C010              <1> 	rol	eax, 16
  9394 0000F626 EBD4                <1> 	jmp	short sysvideo_39_21
  9395                              <1> 
  9396                              <1> 	; 32 bits per pixel
  9397                              <1> sysvideo_39_24:
  9398 0000F628 80FB01              <1> 	cmp	bl, 1 ; 1 = write pixel
  9399 0000F62B 7406                <1> 	je	short sysvideo_39_26
  9400 0000F62D 7712                <1> 	ja	short sysvideo_39_29
  9401                              <1> sysvideo_39_25:
  9402                              <1> 	; read pixel (32bpp)
  9403 0000F62F 8B02                <1> 	mov	eax, [edx]
  9404                              <1> 	;mov	[u.r0], eax
  9405                              <1> 	;jmp	sysret
  9406 0000F631 EB04                <1> 	jmp	short sysvideo_39_28
  9407                              <1> sysvideo_39_26:
  9408                              <1> 	; write pixel (32bpp)
  9409 0000F633 89C8                <1> 	mov	eax, ecx
  9410                              <1> sysvideo_39_27:
  9411 0000F635 8902                <1> 	mov	[edx], eax
  9412                              <1> sysvideo_39_28:
  9413 0000F637 A3[20900100]        <1> 	mov	[u.r0], eax
  9414 0000F63C E916D8FFFF          <1> 	jmp	sysret
  9415                              <1> sysvideo_39_29:
  9416 0000F641 80FB03              <1> 	cmp	bl, 3 ; mix
  9417 0000F644 7208                <1> 	jb	short sysvideo_39_30
  9418                              <1> 	; mix  pixel colors (32bpp)
  9419 0000F646 8B02                <1> 	mov	eax, [edx]
  9420 0000F648 01C8                <1> 	add	eax, ecx
  9421 0000F64A D1D8                <1> 	rcr	eax, 1
  9422 0000F64C EBE7                <1> 	jmp	short sysvideo_39_27
  9423                              <1> sysvideo_39_30:
  9424                              <1> 	 ; swap pixel colors (32bpp)
  9425 0000F64E 89C8                <1> 	mov	eax, ecx
  9426 0000F650 8702                <1> 	xchg	[edx], eax
  9427 0000F652 EBE3                <1> 	jmp	short sysvideo_39_28
  9428                              <1> 
  9429                              <1> sysvideo_39_31:
  9430                              <1> 	; 06/03/2021
  9431                              <1> 	; 08/02/2021
  9432                              <1> 	; 07/02/2021
  9433                              <1> 	; BL = 4 -> read pixels from user defined positions
  9434                              <1> 	; BL = 5 -> write single color pixels to user defined pos.
  9435                              <1> 	; BL = 6 -> write multi color pixels to user defined pos.
  9436                              <1> 	; ECX = color (CL, CX, ECX)
  9437                              <1> 	; EDX = number of pixels
  9438                              <1> 	; ESI = user buffer contains dword pixel positions
  9439                              <1> 	;	 (and dword colors for BL input = 6)
  9440                              <1> 	; EDI = user's pixel color buff (destination) for BL = 4
  9441                              <1> 
  9442 0000F654 890D[529F0100]      <1> 	mov	[maskcolor], ecx
  9443 0000F65A 89D5                <1> 	mov	ebp, edx ; number of pixels    
  9444 0000F65C 803D[BE670000]FF    <1> 	cmp	byte [CRT_MODE], 0FFh ; SVGA flag
  9445 0000F663 7317                <1> 	jnb	short sysvideo_39_33 ; SVGA (VESA VBE mode)
  9446                              <1> 	; Standard VGA mode
  9447 0000F665 B900000100          <1> 	mov	ecx, 65536 ; Video page size (maximum)
  9448 0000F66A 39CA                <1> 	cmp	edx, ecx
  9449 0000F66C 7709                <1> 	ja	short sysvideo_39_32 ; abnormal value !
  9450 0000F66E B800000A00          <1> 	mov	eax, 0A0000h ; Video page start address
  9451 0000F673 B708                <1> 	mov	bh, 8  ; 8 bits per pixel (256 colors)
  9452 0000F675 EB35                <1> 	jmp	short sysvideo_39_34
  9453                              <1> sysvideo_39_32:
  9454                              <1> 	; nonsense! (edx has abnormal value)
  9455 0000F677 E9DBD7FFFF          <1> 	jmp	sysret	
  9456                              <1> sysvideo_39_33:
  9457                              <1> 	; 06/03/2021
  9458 0000F67C 8A3D[F09E0100]      <1> 	mov	bh, [LFB_Info+LFBINFO.bpp]
  9459 0000F682 80FF08              <1> 	cmp	bh, 8
  9460 0000F685 7412                <1> 	je	short sysvideo_39_81 ; 8bpp
  9461 0000F687 89D0                <1> 	mov	eax, edx
  9462 0000F689 80FF10              <1> 	cmp	bh, 16
  9463 0000F68C 7409                <1> 	je	short sysvideo_39_80 ; 16bpp
  9464 0000F68E D1E2                <1> 	shl	edx, 1
  9465 0000F690 80FF20              <1> 	cmp	bh, 32
  9466 0000F693 7502                <1> 	jne	short sysvideo_39_80 ; 24bpp
  9467 0000F695 D1E0                <1> 	shl	eax, 1
  9468                              <1> sysvideo_39_80:	
  9469 0000F697 01C2                <1> 	add	edx, eax
  9470                              <1> 	; edx = number of bytes
  9471                              <1> sysvideo_39_81:
  9472                              <1> 	; get LFB address
  9473 0000F699 A1[E49E0100]        <1> 	mov	eax, [LFB_ADDR] ; [LFB_Info+LFBINFO.LFB_addr]
  9474 0000F69E 09C0                <1> 	or	eax, eax
  9475 0000F6A0 74D5                <1> 	jz	short sysvideo_39_32 ; LFB is not ready !
  9476 0000F6A2 8B0D[E89E0100]      <1> 	mov	ecx, [LFB_SIZE]
  9477 0000F6A8 39CA                <1> 	cmp	edx, ecx 
  9478 0000F6AA 77CB                <1> 	ja	short sysvideo_39_32 ; abnormal value !
  9479                              <1> 
  9480                              <1> 	; 02/03/2021
  9481                              <1> 	; 08/02/2021
  9482                              <1> 	;mov	ebp, edx ; pixel count  
  9483                              <1> 	;shl	ebp, 2 ; byte count (pixel pos: 4 bytes)
  9484                              <1> 
  9485                              <1> 	; 06/03/2021
  9486                              <1> 	; bits per pixel (pixel color size)
  9487                              <1> 	;mov	bh, [LFB_Info+LFBINFO.bpp]	
  9488                              <1> sysvideo_39_34:
  9489 0000F6AC C1E502              <1> 	shl	ebp, 2 ; 15/02/2021 (byte count)	
  9490 0000F6AF A3[429F0100]        <1> 	mov	[v_mem], eax ; Save video page start address
  9491 0000F6B4 88DE                <1> 	mov	dh, bl ; sub function
  9492                              <1> 	; 06/03/2021
  9493 0000F6B6 883D[419F0100]      <1> 	mov	[v_bpp], bh ; bits per pixel (color size)
  9494                              <1> 	;mov	ebx, [LFB_SIZE]
  9495 0000F6BC 89CB                <1> 	mov	ebx, ecx ; [LFB_SIZE]
  9496                              <1> 
  9497 0000F6BE B900080000          <1> 	mov	ecx, 2048
  9498 0000F6C3 39CD                <1> 	cmp	ebp, ecx
  9499 0000F6C5 7302                <1> 	jnb	short sysvideo_39_35 	
  9500 0000F6C7 89E9                <1> 	mov	ecx, ebp ; fix to requested byte count	
  9501                              <1> sysvideo_39_35:
  9502 0000F6C9 80FE04              <1> 	cmp	dh, 4 ; 08/02/2021
  9503                              <1> 	;cmp	bl, 4 ; read pixels from user defined positions 
  9504 0000F6CC 7605                <1> 	jna	short sysvideo_39_36
  9505 0000F6CE E9B2000000          <1> 	jmp	sysvideo_39_52
  9506                              <1> 	; 08/02/2021
  9507                              <1> 	;mov	[buffer8], edi  ; user's destination buff addr
  9508                              <1> sysvideo_39_36:
  9509                              <1> 	; 08/02/2021
  9510                              <1> 	; read pixel positions 
  9511                              <1> 	; as defined in user's source buffer 
  9512 0000F6D3 893D[5A9F0100]      <1> 	mov	[buffer8], edi  ; user's destination buff addr
  9513 0000F6D9 BF00760900          <1> 	mov	edi, VBE3SAVERESTOREBLOCK ; kernel buffer for
  9514                              <1> 					  ; 2028 byte data
  9515                              <1> 	; esi = user's source buffer for pixel positions
  9516                              <1> 	; ecx = byte count
  9517 0000F6DE E8F8170000          <1> 	call	transfer_from_user_buffer
  9518 0000F6E3 7292                <1> 	jc	short sysvideo_39_32 ; error
  9519                              <1> 	; ecx  = transfer count (bytes)
  9520                              <1> 
  9521 0000F6E5 57                  <1> 	push	edi ; *
  9522 0000F6E6 56                  <1> 	push	esi ; **
  9523 0000F6E7 51                  <1> 	push	ecx ; ***
  9524                              <1> 
  9525 0000F6E8 89FE                <1> 	mov	esi, edi ; kernel buffer
  9526 0000F6EA 8B15[429F0100]      <1> 	mov	edx, [v_mem] ; video memory
  9527 0000F6F0 C1E902              <1> 	shr	ecx, 2 ; pixel count (within buffer capacity)
  9528                              <1> 
  9529 0000F6F3 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  9530 0000F6FA 7753                <1> 	ja	short sysvideo_39_49
  9531                              <1> sysvideo_39_37:
  9532                              <1> 	; 8bpp
  9533 0000F6FC AD                  <1> 	lodsd
  9534 0000F6FD 39D8                <1> 	cmp	eax, ebx ; < [LFB_SIZE]
  9535 0000F6FF 7309                <1> 	jnb	short sysvideo_39_39
  9536 0000F701 0FB60402            <1> 	movzx	eax, byte [edx+eax]
  9537                              <1> sysvideo_39_38:
  9538 0000F705 AB                  <1> 	stosd
  9539 0000F706 E2F4                <1> 	loop	sysvideo_39_37
  9540 0000F708 EB49                <1> 	jmp	short sysvideo_39_50
  9541                              <1> sysvideo_39_39:
  9542                              <1> 	; write black color for improper positions
  9543 0000F70A 31C0                <1> 	xor	eax, eax
  9544 0000F70C EBF7                <1> 	jmp	short sysvideo_39_38
  9545                              <1> sysvideo_39_40:
  9546 0000F70E 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  9547 0000F715 772A                <1> 	ja	short sysvideo_39_47 ; 32bpp
  9548 0000F717 7216                <1> 	jb	short sysvideo_39_44 ; 16bpp
  9549                              <1> sysvideo_39_41: 
  9550                              <1> 	; 24bpp
  9551 0000F719 AD                  <1> 	lodsd
  9552 0000F71A 39D8                <1> 	cmp	eax, ebx ; < [LFB_SIZE]
  9553 0000F71C 730D                <1> 	jnb	short sysvideo_39_43
  9554 0000F71E 8B0402              <1> 	mov	eax, [edx+eax]
  9555 0000F721 25FFFFFF00          <1> 	and	eax, 0FFFFFFh
  9556                              <1> sysvideo_39_42:
  9557 0000F726 AB                  <1> 	stosd
  9558 0000F727 E2F0                <1> 	loop	sysvideo_39_41
  9559 0000F729 EB28                <1> 	jmp	short sysvideo_39_50
  9560                              <1> sysvideo_39_43:
  9561                              <1> 	; write black color for improper positions
  9562 0000F72B 31C0                <1> 	xor	eax, eax
  9563 0000F72D EBF7                <1> 	jmp	short sysvideo_39_42
  9564                              <1> sysvideo_39_44:
  9565                              <1> 	; 16bpp
  9566 0000F72F AD                  <1> 	lodsd
  9567 0000F730 39D8                <1> 	cmp	eax, ebx ; < [LFB_SIZE]
  9568 0000F732 7309                <1> 	jnb	short sysvideo_39_46
  9569 0000F734 0FB70402            <1> 	movzx	eax, word [edx+eax]
  9570                              <1> sysvideo_39_45:
  9571 0000F738 AB                  <1> 	stosd
  9572 0000F739 E2F4                <1> 	loop	sysvideo_39_44
  9573 0000F73B EB16                <1> 	jmp	short sysvideo_39_50
  9574                              <1> sysvideo_39_46:
  9575                              <1> 	; write black color for improper positions
  9576 0000F73D 31C0                <1> 	xor	eax, eax
  9577 0000F73F EBF7                <1> 	jmp	short sysvideo_39_45
  9578                              <1> sysvideo_39_47:
  9579                              <1> 	; 32bpp
  9580 0000F741 AD                  <1> 	lodsd
  9581 0000F742 39D8                <1> 	cmp	eax, ebx ; < [LFB_SIZE]
  9582 0000F744 7309                <1> 	jnb	short sysvideo_39_49
  9583 0000F746 0FB70402            <1> 	movzx	eax, word [edx+eax]
  9584                              <1> sysvideo_39_48:
  9585 0000F74A AB                  <1> 	stosd
  9586 0000F74B E2F4                <1> 	loop	sysvideo_39_47
  9587 0000F74D EB04                <1> 	jmp	short sysvideo_39_50
  9588                              <1> sysvideo_39_49:
  9589                              <1> 	; write black color for improper positions
  9590 0000F74F 31C0                <1> 	xor	eax, eax
  9591 0000F751 EBF7                <1> 	jmp	short sysvideo_39_48
  9592                              <1> sysvideo_39_50:
  9593 0000F753 59                  <1> 	pop	ecx ; transfer count in bytes
  9594 0000F754 5E                  <1> 	pop	esi ; ** ; kernel buffer
  9595                              <1>  	;mov	esi, VBE3SAVERESTOREBLOCK ; kernel buffer for
  9596                              <1> 					  ; 2048 byte data
  9597 0000F755 8B3D[5A9F0100]      <1> 	mov	edi, [buffer8]
  9598                              <1> 	; edi = user's destination buffer for pixel colors
  9599                              <1> 	; ecx = byte count
  9600 0000F75B E831170000          <1> 	call	transfer_to_user_buffer
  9601 0000F760 5E                  <1> 	pop	esi ; *
  9602 0000F761 7266                <1> 	jc	short sysvideo_39_56 ; error
  9603                              <1> 	; ecx  = transfer count (bytes)
  9604 0000F763 89C8                <1> 	mov	eax, ecx
  9605 0000F765 C1E802              <1> 	shr	eax, 2
  9606 0000F768 0105[20900100]      <1> 	add	[u.r0], eax ; transfer count (in pixels)
  9607                              <1> 		
  9608 0000F76E 29CD                <1> 	sub	ebp, ecx
  9609 0000F770 7657                <1> 	jna	short sysvideo_39_56 ; completed/finished
  9610 0000F772 01CE                <1> 	add	esi, ecx ; next position in source buffer
  9611                              <1> 	;add	[buffer8], ecx ; next pos in destination buff
  9612 0000F774 01CF                <1> 	add	edi, ecx
  9613 0000F776 66B90008            <1> 	mov	cx, 2048 ; new count, limit: kernel buff size
  9614 0000F77A 39CD                <1> 	cmp	ebp, ecx ; remain >= limit ?
  9615 0000F77C 7302                <1> 	jnb	short sysvideo_39_51 ; yes
  9616 0000F77E 89E9                <1> 	mov	ecx, ebp ; fix byte count to remain bytes
  9617                              <1> sysvideo_39_51:
  9618 0000F780 E94EFFFFFF          <1> 	jmp	sysvideo_39_36 
  9619                              <1> 
  9620                              <1> sysvideo_39_52:
  9621 0000F785 80FE05              <1> 	cmp	dh, 5 ; 08/02/2021
  9622                              <1> 	;cmp	bl, 5 ; write pixels to user defined positions 
  9623 0000F788 7605                <1> 	jna	short sysvideo_39_53
  9624 0000F78A E9A1000000          <1> 	jmp	sysvideo_39_66
  9625                              <1> sysvideo_39_53:
  9626                              <1> 	; single color pixel writing
  9627 0000F78F BF00760900          <1> 	mov	edi, VBE3SAVERESTOREBLOCK ; kernel buffer for
  9628                              <1> 					  ; 2028 byte data
  9629                              <1> 	; esi = user's source buffer for pixel positions
  9630                              <1> 	; ecx = byte count
  9631 0000F794 E842170000          <1> 	call	transfer_from_user_buffer
  9632 0000F799 722E                <1> 	jc	short sysvideo_39_56 ; error
  9633                              <1> 	; ecx = transfer count (bytes)
  9634                              <1> 
  9635                              <1> 	; write pixels by using (user) defined positions
  9636                              <1> 	; ecx = byte count (1,2,3,4 times pixel count)	
  9637                              <1> 	; edi = system buffer address
  9638                              <1> 
  9639 0000F79B 56                  <1> 	push	esi ; *
  9640 0000F79C 51                  <1> 	push	ecx ; **
  9641                              <1> 
  9642 0000F79D 89FE                <1> 	mov	esi, edi
  9643 0000F79F 8B3D[429F0100]      <1> 	mov	edi, [v_mem]
  9644                              <1> 
  9645                              <1> 	; 08/02/2021
  9646 0000F7A5 C1E902              <1> 	shr	ecx, 2 ; pixel count
  9647 0000F7A8 8B15[529F0100]      <1> 	mov	edx, [maskcolor]
  9648                              <1> 	;mov	ebx, [v_siz]
  9649                              <1> 
  9650 0000F7AE 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  9651 0000F7B5 7717                <1> 	ja	short sysvideo_39_57
  9652                              <1> sysvideo_39_54:
  9653                              <1> 	; 8bpp
  9654 0000F7B7 AD                  <1> 	lodsd
  9655 0000F7B8 39D8                <1> 	cmp	eax, ebx ; < [v_siz]
  9656 0000F7BA 7309                <1> 	jnb	short sysvideo_39_55
  9657 0000F7BC 881407              <1> 	mov	[edi+eax], dl
  9658                              <1> 	; 06/03/2021
  9659 0000F7BF FF05[20900100]      <1> 	inc	dword [u.r0]
  9660                              <1> sysvideo_39_55:
  9661 0000F7C5 E2F0                <1> 	loop	sysvideo_39_54
  9662 0000F7C7 EB50                <1> 	jmp	short sysvideo_39_64
  9663                              <1> sysvideo_39_56:
  9664 0000F7C9 E989D6FFFF          <1> 	jmp	sysret
  9665                              <1> sysvideo_39_57:
  9666 0000F7CE 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  9667 0000F7D5 7732                <1> 	ja	short sysvideo_39_62 ; 32bpp
  9668 0000F7D7 721D                <1> 	jb	short sysvideo_39_60 ; 16bpp
  9669                              <1> sysvideo_39_58: 
  9670                              <1> 	; 24bpp
  9671 0000F7D9 AD                  <1> 	lodsd
  9672 0000F7DA 39D8                <1> 	cmp	eax, ebx ; < [v_siz]
  9673 0000F7DC 7314                <1> 	jnb	short sysvideo_39_59
  9674 0000F7DE 881407              <1> 	mov	[edi+eax], dl
  9675 0000F7E1 40                  <1> 	inc	eax
  9676 0000F7E2 C1CA08              <1> 	ror	edx, 8
  9677 0000F7E5 66891407            <1> 	mov	[edi+eax], dx
  9678 0000F7E9 C1C208              <1> 	rol	edx, 8
  9679 0000F7EC FF05[20900100]      <1> 	inc	dword [u.r0]
  9680                              <1> sysvideo_39_59:
  9681 0000F7F2 E2E5                <1> 	loop	sysvideo_39_58
  9682 0000F7F4 EB23                <1> 	jmp	short sysvideo_39_64
  9683                              <1> sysvideo_39_60:
  9684                              <1> 	; 16bpp
  9685 0000F7F6 AD                  <1> 	lodsd
  9686 0000F7F7 39D8                <1> 	cmp	eax, ebx ; < [v_siz]
  9687 0000F7F9 730A                <1> 	jnb	short sysvideo_39_61
  9688 0000F7FB 66891407            <1> 	mov	[edi+eax], dx
  9689 0000F7FF FF05[20900100]      <1> 	inc	dword [u.r0]
  9690                              <1> sysvideo_39_61:	
  9691 0000F805 E2EF                <1> 	loop	sysvideo_39_60
  9692 0000F807 EB10                <1> 	jmp	short sysvideo_39_64	
  9693                              <1> sysvideo_39_62:
  9694                              <1> 	; 32bpp
  9695 0000F809 AD                  <1> 	lodsd
  9696 0000F80A 39D8                <1> 	cmp	eax, ebx ; < [v_siz]
  9697 0000F80C 7309                <1> 	jnb	short sysvideo_39_63
  9698 0000F80E 891407              <1> 	mov	[edi+eax], edx
  9699 0000F811 FF05[20900100]      <1> 	inc	dword [u.r0]
  9700                              <1> sysvideo_39_63:	
  9701 0000F817 E2F0                <1> 	loop	sysvideo_39_62
  9702                              <1> sysvideo_39_64:
  9703 0000F819 59                  <1> 	pop	ecx ; **
  9704 0000F81A 5E                  <1> 	pop	esi ; *	
  9705 0000F81B 29CD                <1> 	sub	ebp, ecx
  9706 0000F81D 76AA                <1> 	jna	short sysvideo_39_56
  9707 0000F81F 01CE                <1> 	add	esi, ecx
  9708 0000F821 66B90008            <1> 	mov	cx, 2048
  9709 0000F825 39CD                <1> 	cmp	ebp, ecx
  9710 0000F827 7302                <1> 	jnb	short sysvideo_39_65
  9711 0000F829 89E9                <1> 	mov	ecx, ebp
  9712                              <1> sysvideo_39_65:
  9713 0000F82B E95FFFFFFF          <1> 	jmp	sysvideo_39_53
  9714                              <1> 
  9715                              <1> sysvideo_39_66:
  9716                              <1> 	; 15/02/2021
  9717 0000F830 D1E5                <1> 	shl	ebp, 1 ; 8 bytes per pixel (position&color)
  9718                              <1> sysvideo_39_67: 	
  9719 0000F832 66B90008            <1> 	mov	cx, 2048
  9720 0000F836 39CD                <1> 	cmp	ebp, ecx
  9721 0000F838 7302                <1> 	jnb	short sysvideo_39_68
  9722 0000F83A 89E9                <1> 	mov	ecx, ebp
  9723                              <1> sysvideo_39_68:
  9724                              <1> 	; multi colors pixel writing
  9725 0000F83C BF00760900          <1> 	mov	edi, VBE3SAVERESTOREBLOCK ; kernel buffer for
  9726                              <1> 					  ; 2048 byte data
  9727                              <1> 	; esi = user's source buffer for pixel positions
  9728                              <1> 	; ecx = byte count
  9729 0000F841 E895160000          <1> 	call	transfer_from_user_buffer
  9730 0000F846 7281                <1> 	jc	short sysvideo_39_56 ; error
  9731                              <1> 	; ecx  = transfer count
  9732                              <1> 	
  9733                              <1> 	; write pixels & colors as defined in user buffer 
  9734                              <1> 	; ecx = byte count (2,4,6,8 times pixel count)	
  9735                              <1> 	; edi = system buffer address
  9736                              <1> 
  9737 0000F848 56                  <1> 	push	esi ; **
  9738 0000F849 51                  <1> 	push	ecx ; *
  9739                              <1> 
  9740 0000F84A 89FE                <1> 	mov	esi, edi
  9741 0000F84C 8B3D[429F0100]      <1> 	mov	edi, [v_mem]
  9742                              <1> 
  9743                              <1> 	; 08/02/2021
  9744 0000F852 C1E903              <1> 	shr	ecx, 3 ; pixel count
  9745                              <1> 
  9746                              <1> 	;mov	ebx, [v_siz]
  9747                              <1> 
  9748 0000F855 803D[419F0100]08    <1> 	cmp	byte [v_bpp], 8 ; 8bpp
  9749 0000F85C 7715                <1> 	ja	short sysvideo_39_71
  9750                              <1> sysvideo_39_69:
  9751                              <1> 	; 8bpp
  9752 0000F85E AD                  <1> 	lodsd	; position
  9753 0000F85F 89C2                <1> 	mov	edx, eax
  9754 0000F861 AD                  <1> 	lodsd	; color
  9755 0000F862 39DA                <1> 	cmp	edx, ebx ; < [v_siz]
  9756 0000F864 7309                <1> 	jnb	short sysvideo_39_70
  9757 0000F866 880417              <1> 	mov	[edi+edx], al
  9758                              <1> 	; 06/03/2021
  9759 0000F869 FF05[20900100]      <1> 	inc	dword [u.r0]
  9760                              <1> sysvideo_39_70:
  9761 0000F86F E2ED                <1> 	loop	sysvideo_39_69
  9762 0000F871 EB51                <1> 	jmp	short sysvideo_39_78
  9763                              <1> sysvideo_39_71:
  9764 0000F873 803D[419F0100]18    <1> 	cmp	byte [v_bpp], 24 ; 24bpp
  9765 0000F87A 7735                <1> 	ja	short sysvideo_39_76 ; 32bpp
  9766 0000F87C 721D                <1> 	jb	short sysvideo_39_74 ; 16bpp
  9767                              <1> sysvideo_39_72:
  9768                              <1> 	; 24bpp 
  9769 0000F87E AD                  <1> 	lodsd	; position
  9770 0000F87F 89C2                <1> 	mov	edx, eax
  9771 0000F881 AD                  <1> 	lodsd	; color
  9772 0000F882 39DA                <1> 	cmp	edx, ebx ; < [v_siz]
  9773 0000F884 7311                <1> 	jnb	short sysvideo_39_73
  9774 0000F886 880417              <1> 	mov	[edi+edx], al
  9775 0000F889 42                  <1> 	inc	edx
  9776 0000F88A C1E808              <1> 	shr	eax, 8
  9777 0000F88D 66890417            <1> 	mov	[edi+edx], ax
  9778 0000F891 FF05[20900100]      <1> 	inc	dword [u.r0]
  9779                              <1> sysvideo_39_73:	
  9780 0000F897 E2E5                <1> 	loop	sysvideo_39_72
  9781 0000F899 EB29                <1> 	jmp	short sysvideo_39_78
  9782                              <1> sysvideo_39_74:
  9783                              <1> 	; 16bpp
  9784 0000F89B AD                  <1> 	lodsd	; position
  9785 0000F89C 89C2                <1> 	mov	edx, eax
  9786 0000F89E AD                  <1> 	lodsd	; color
  9787 0000F89F 39DA                <1> 	cmp	edx, ebx ; < [v_siz]
  9788 0000F8A1 730A                <1> 	jnb	short sysvideo_39_75
  9789 0000F8A3 66890417            <1> 	mov	[edi+edx], ax
  9790 0000F8A7 FF05[20900100]      <1> 	inc	dword [u.r0]
  9791                              <1> sysvideo_39_75:	
  9792 0000F8AD E2EC                <1> 	loop	sysvideo_39_74
  9793 0000F8AF EB13                <1> 	jmp	short sysvideo_39_78
  9794                              <1> sysvideo_39_76:
  9795                              <1> 	; 32bpp
  9796 0000F8B1 AD                  <1> 	lodsd	; position
  9797 0000F8B2 89C2                <1> 	mov	edx, eax
  9798 0000F8B4 AD                  <1> 	lodsd	; color
  9799 0000F8B5 39DA                <1> 	cmp	edx, ebx ; < [v_siz]
  9800 0000F8B7 7309                <1> 	jnb	short sysvideo_39_77
  9801 0000F8B9 890417              <1> 	mov	[edi+edx], eax
  9802 0000F8BC FF05[20900100]      <1> 	inc	dword [u.r0]
  9803                              <1> sysvideo_39_77:	
  9804 0000F8C2 E2ED                <1> 	loop	sysvideo_39_76
  9805                              <1> sysvideo_39_78:
  9806 0000F8C4 59                  <1> 	pop	ecx ; *
  9807 0000F8C5 5E                  <1> 	pop	esi ; **	
  9808                              <1> 
  9809 0000F8C6 29CD                <1> 	sub	ebp, ecx
  9810 0000F8C8 762A                <1> 	jna	short sysvideo_39_79
  9811 0000F8CA 01CE                <1> 	add	esi, ecx
  9812 0000F8CC E961FFFFFF          <1> 	jmp	sysvideo_39_67
  9813                              <1> ;sysvideo_39_79:
  9814                              <1> ;	jmp	sysret
  9815                              <1> 		
  9816                              <1> sysvideo_16:
  9817                              <1> 	; 11/08/2022
  9818                              <1> 	; 23/07/2022
  9819                              <1> 	; 06/03/2021
  9820                              <1> 	; 23/11/2020
  9821 0000F8D1 80FF04              <1> 	cmp	bh, 4
  9822                              <1> 	;jb	sysvideo_39 ; bh = 3, pixel r/w
  9823                              <1> 	;ja	short sysvideo_17
  9824                              <1> 	; 23/07/2022
  9825 0000F8D4 7407                <1> 	je	short sysvideo_16_0
  9826 0000F8D6 7721                <1> 	ja	short sysvideo_17
  9827 0000F8D8 E94EFCFFFF          <1> 	jmp	sysvideo_39
  9828                              <1> sysvideo_16_0:	
  9829                              <1> 	; BH = 4
  9830                              <1> 	; Direct User Access for CGA video memory.
  9831                              <1> 	; Setup user's page tables for direct access to 0B8000h.
  9832                              <1> 	;
  9833                              <1> 	; Permission checks are not implemented yet !
  9834                              <1> 	; (11/07/2016)
  9835                              <1> 
  9836 0000F8DD B800800B00          <1> 	mov	eax, 0B8000h
  9837                              <1> 	;mov	ecx, 8 ; 8 pages (8*4K=32K)
  9838                              <1> 	; 11/08/2022
  9839 0000F8E2 31C9                <1> 	xor	ecx, ecx
  9840 0000F8E4 B108                <1> 	mov	cl, 8
  9841 0000F8E6 89C3                <1> 	mov	ebx, eax ; 12/05/2017 ; virtual = physical
  9842 0000F8E8 E86E66FFFF          <1> 	call	direct_memory_access	
  9843                              <1> 	;jc	sysret
  9844 0000F8ED 7205                <1> 	jc	short sysvideo_39_79 ; 06/03/2021
  9845                              <1> 	; eax = 0B8000h if there is not an error
  9846 0000F8EF A3[20900100]        <1> 	mov	[u.r0], eax
  9847                              <1> sysvideo_39_79: ; 08/01/2021
  9848 0000F8F4 E95ED5FFFF          <1> 	jmp	sysret
  9849                              <1> 
  9850                              <1> sysvideo_17:
  9851                              <1> 	; 23/07/2022
  9852                              <1> 	; 23/12/2020
  9853                              <1> 	; 11/12/2020
  9854                              <1> 	; 10/12/2020
  9855                              <1> 	; 23/11/2020
  9856 0000F8F9 80FF06              <1> 	cmp	bh, 6
  9857 0000F8FC 7424                <1> 	je	short sysvideo_17_0 ; 23/07/2022
  9858 0000F8FE 7205                <1> 	jb	short sysvideo_18 ; 23/07/2022
  9859 0000F900 E95E010000          <1> 	jmp	sysvideo_20 ; ja
  9860                              <1> 
  9861                              <1> 	; 23/07/2022
  9862                              <1> sysvideo_18:
  9863                              <1> 	; BH = 5
  9864                              <1> 	; Direct User Access for VGA video memory.
  9865                              <1> 	; Setup user's page tables for direct access to 0A0000h.
  9866                              <1> 	;
  9867                              <1> 	; Permission checks are not implemented yet !
  9868                              <1> 	; (11/07/2016)
  9869                              <1> 
  9870 0000F905 B800000A00          <1> 	mov	eax, 0A0000h
  9871 0000F90A B910000000          <1> 	mov	ecx, 16 ; 16 pages (16*4K=64K)
  9872 0000F90F 89C3                <1> 	mov	ebx, eax ; 12/05/2017 ; virtual = physical
  9873 0000F911 E84566FFFF          <1> 	call	direct_memory_access	
  9874                              <1> 	;jc	sysret
  9875                              <1> 	; 23/07/2022
  9876 0000F916 7205                <1> 	jc	short sysvideo_18_0
  9877                              <1> 	; eax = 0A0000h if there is not an error
  9878 0000F918 A3[20900100]        <1> 	mov	[u.r0], eax
  9879                              <1> sysvideo_18_0:
  9880 0000F91D E935D5FFFF          <1> 	jmp	sysret
  9881                              <1> 
  9882                              <1> sysvideo_17_0:
  9883                              <1> 	; BH = 6
  9884                              <1> 	; Direct User Access to Linear Frame Buffer.
  9885                              <1> 	; Setup user's page tables for direct access to LFB.
  9886                              <1> 	;
  9887                              <1> 	; Permission checks are not implemented yet !
  9888                              <1> 	; (10/12/2020)
  9889                              <1> 
  9890 0000F922 80FBFF              <1> 	cmp	bl, 0FFh ; current video mode
  9891 0000F925 722C                <1> 	jb	short sysvideo_17_2 ; for desired video mode
  9892                              <1> 
  9893 0000F927 381D[BE670000]      <1> 	cmp	[CRT_MODE], bl ; VESA VBE video mode ?
  9894 0000F92D 750E                <1> 	jne	short sysvideo_17_1
  9895 0000F92F 668B0D[D69E0100]    <1> 	mov	cx, [video_mode]
  9896 0000F936 6681E1FF01          <1> 	and	cx, 1FFh
  9897 0000F93B EB29                <1> 	jmp	short sysvideo_17_3
  9898                              <1> sysvideo_17_1:
  9899                              <1> 	; 11/12/2020
  9900 0000F93D 88DF                <1> 	mov	bh, bl ; 0FFh
  9901 0000F93F 8A1D[BE670000]      <1> 	mov	bl, [CRT_MODE] ; VGA/CGA video mode
  9902 0000F945 8B2D[1C900100]      <1> 	mov	ebp, [u.usp]  ; ebp points to user's registers
  9903                              <1> 	; 23/12/2020
  9904 0000F94B 895D10              <1> 	mov	[ebp+16], ebx ; return to user with EBX value 
  9905 0000F94E E904D5FFFF          <1> 	jmp	sysret ; return to user with EAX = 0
  9906                              <1> sysvideo_17_2:
  9907                              <1> 	; bl = VESA video mode - 100h
  9908 0000F953 B701                <1> 	mov	bh, 1 ; bx = 1XXh
  9909 0000F955 53                  <1> 	push	ebx ; requested vesa video mode
  9910 0000F956 E80941FFFF          <1> 	call	vbe_biosfn_return_current_mode
  9911 0000F95B 59                  <1> 	pop	ecx ; requested vesa video mode
  9912 0000F95C 6681E3FF01          <1> 	and	bx, 1FFh
  9913 0000F961 6639D9              <1> 	cmp	cx, bx
  9914 0000F964 7564                <1> 	jne	short sysvideo_17_8
  9915                              <1> sysvideo_17_3:
  9916 0000F966 663B0D[E29E0100]    <1> 	cmp	cx, [LFB_Info+LFBINFO.mode]
  9917 0000F96D 755B                <1> 	jne	short sysvideo_17_8
  9918                              <1> sysvideo_17_4:
  9919                              <1> 	; 11/12/2020
  9920 0000F96F A1[E49E0100]        <1> 	mov	eax, [LFB_Info+LFBINFO.LFB_addr]
  9921                              <1> 	; 21/12/2020
  9922 0000F974 09C0                <1> 	or	eax, eax
  9923 0000F976 744D                <1> 	jz	short sysvideo_17_7
  9924                              <1> 	;
  9925 0000F978 8B0D[E89E0100]      <1> 	mov	ecx, [LFB_Info+LFBINFO.LFB_size] ; buff size
  9926 0000F97E 89C3                <1> 	mov 	ebx, eax ; user's address = physical address
  9927                              <1> 	;push	ebx
  9928 0000F980 51                  <1> 	push	ecx
  9929                              <1> 	; 21/12/2020
  9930 0000F981 81C1FF0F0000        <1> 	add	ecx, 4095  ; PAGESIZE - 1
  9931                              <1> 	; 14/12/2020
  9932 0000F987 C1E90C              <1> 	shr	ecx, 12  ; convert bytes to pages
  9933 0000F98A E8CC65FFFF          <1> 	call	direct_memory_access
  9934 0000F98F 5A                  <1> 	pop	edx  ; linear frame buffer size in bytes
  9935                              <1> 	;pop	eax  ; linear frame buffer address (physical)
  9936 0000F990 7233                <1> 	jc	short sysvideo_17_7 ; [u.r0] = eax = 0
  9937                              <1> sysvideo_17_5:
  9938 0000F992 668B0D[EE9E0100]    <1> 	mov	cx, [LFB_Info+LFBINFO.Y_res] ; screen height
  9939 0000F999 C1E110              <1> 	shl	ecx, 16
  9940 0000F99C 668B0D[EC9E0100]    <1> 	mov	cx,  [LFB_Info+LFBINFO.X_res] ; screen width
  9941 0000F9A3 31DB                <1> 	xor	ebx, ebx
  9942 0000F9A5 8A1D[F09E0100]      <1> 	mov	bl, [LFB_Info+LFBINFO.bpp] ; bits per pixel
  9943 0000F9AB 8A3D[E29E0100]      <1> 	mov	bh, [LFB_Info+LFBINFO.mode] ; XX part of 1XXh
  9944                              <1> sysvideo_26_4: ; 23/12/2020	
  9945 0000F9B1 8B2D[1C900100]      <1> 	mov	ebp, [u.usp]  ; ebp points to user's registers
  9946 0000F9B7 895514              <1> 	mov	[ebp+20], edx ; return to user with EDX value 
  9947 0000F9BA 895D10              <1> 	mov	[ebp+16], ebx ; EBX
  9948 0000F9BD 894D18              <1> 	mov	[ebp+24], ecx ; ECX
  9949                              <1> sysvideo_17_6:
  9950 0000F9C0 A3[20900100]        <1> 	mov	[u.r0], eax ; LFB address
  9951                              <1> sysvideo_17_7:
  9952 0000F9C5 E98DD4FFFF          <1> 	jmp	sysret 
  9953                              <1> sysvideo_17_8:
  9954                              <1> 	; cx = mode
  9955                              <1> 	; 21/12/2020
  9956 0000F9CA 80CD40              <1> 	or	ch, 40h  ; Linear frame buffer flag	
  9957 0000F9CD E8B53EFFFF          <1> 	call	_vbe_biosfn_return_mode_info
  9958 0000F9D2 72F1                <1> 	jc	short sysvideo_17_7
  9959 0000F9D4 EB99                <1> 	jmp	short sysvideo_17_4
  9960                              <1> 	
  9961                              <1> sysvideo_19:	
  9962                              <1> 	; 23/07/2022
  9963                              <1> 	; 22/01/2021
  9964                              <1> 	; 12/12/2020
  9965                              <1> 	; 11/12/2020
  9966                              <1> 	; 23/11/2020
  9967                              <1> 	; BH = 7
  9968                              <1> 	; Get (Super/Extended VGA) mode
  9969                              <1> 	; and Linear Frame Buffer info.
  9970                              <1> 	
  9971                              <1> 	; 22/01/2021
  9972 0000F9D6 B3FF                <1> 	mov	bl, 0FFh
  9973                              <1> 	; 11/12/2020
  9974                              <1> 	;cmp	byte [CRT_MODE], 0FFh ; (extended mode?)
  9975                              <1> 	; 22/01/2021
  9976 0000F9D8 381D[BE670000]      <1> 	cmp	[CRT_MODE], bl  ; 0FFh
  9977                              <1> 	;jb	short sysvideo_17_1 ; not a VESA VBE mode
  9978                              <1> 	; 23/07/2022
  9979                              <1> 	; 12/12/2020
  9980 0000F9DE 7305                <1> 	jnb	short sysvideo_19_0
  9981                              <1> 	; 23/07/2022
  9982 0000F9E0 E958FFFFFF          <1> 	jmp	sysvideo_17_1
  9983                              <1> 
  9984                              <1> sysvideo_19_0:
  9985 0000F9E5 E87A40FFFF          <1> 	call	vbe_biosfn_return_current_mode
  9986 0000F9EA 6681E3FF01          <1> 	and	bx, 1FFh
  9987 0000F9EF 663B1D[E29E0100]    <1> 	cmp	bx, [LFB_Info+LFBINFO.mode]
  9988 0000F9F6 750D                <1> 	jne	short sysvideo_19_2
  9989                              <1> sysvideo_19_1:
  9990 0000F9F8 A1[E49E0100]        <1> 	mov	eax, [LFB_Info+LFBINFO.LFB_addr]
  9991 0000F9FD 8B15[E89E0100]      <1> 	mov	edx, [LFB_Info+LFBINFO.LFB_size]
  9992 0000FA03 EB8D                <1> 	jmp	sysvideo_17_5
  9993                              <1> sysvideo_19_2:
  9994 0000FA05 E87D3EFFFF          <1> 	call	_vbe_biosfn_return_mode_info
  9995 0000FA0A 73EC                <1> 	jnc	short sysvideo_19_1
  9996 0000FA0C E946D4FFFF          <1> 	jmp	sysret
  9997                              <1> 
  9998                              <1> sysvideo_20_1:
  9999                              <1> 	; cx = vesa video mode
 10000 0000FA11 6689C8              <1> 	mov	ax, cx
 10001 0000FA14 663D0001            <1> 	cmp	ax, 100h
 10002 0000FA18 725C                <1> 	jb	short sysvideo_20_0 ; VGA/CGA mode
 10003 0000FA1A 663DFF01            <1> 	cmp	ax, 1FFh
 10004                              <1> 	;ja	short sysvideo_20_4 ; not valid
 10005 0000FA1E 773E                <1> 	ja	short sysvideo_20_3
 10006 0000FA20 50                  <1> 	push	eax
 10007 0000FA21 6689C3              <1> 	mov	bx, ax
 10008 0000FA24 66B8024F            <1> 	mov	ax, 4F02h
 10009                              <1> 
 10010                              <1> 	; simulate _int10h (int 31h) for func 4F02h
 10011                              <1> 	;pushfd
 10012                              <1> 	;push	cs
 10013                              <1> 	;push	sysvideo_20_1_retn 
 10014                              <1> 	;push	es ; *
 10015                              <1> 	;push	ds ; **	; SAVE WORK AND PARAMETER REGISTERS
 10016                              <1> 	;jmp	VBE_func
 10017                              <1> ;sysvideo_20_1_retn:	
 10018                              <1> 	
 10019 0000FA28 E8EE1CFFFF          <1> 	call	_int10h ; simulate int 10h (int 31h)
 10020                              <1> 
 10021 0000FA2D 6683F84F            <1> 	cmp	ax, 004Fh
 10022 0000FA31 58                  <1> 	pop	eax
 10023 0000FA32 752A                <1> 	jne	short sysvideo_20_3 ; error
 10024                              <1> 	;pop	eax
 10025 0000FA34 40                  <1> 	inc	eax
 10026 0000FA35 A3[20900100]        <1> 	mov	[u.r0], eax ; video mode + 1
 10027 0000FA3A 09D2                <1> 	or	edx, edx ; is LFBINFO requested by user ?	
 10028                              <1> 	;jz	short sysvideo_20_4
 10029 0000FA3C 7420                <1> 	jz	short sysvideo_20_3 ; no
 10030                              <1> 
 10031                              <1> 	; 11/12/2020
 10032                              <1> 	; Check LFBINFO table/structure
 10033                              <1> 	; (it is set by vbe2 'vbe_biosfn_set_mode'
 10034                              <1> 	; but if vbe3 vbios pmi is in use,
 10035                              <1> 	; it will not set LFBINFO table)
 10036                              <1> 
 10037 0000FA3E 52                  <1> 	push	edx
 10038 0000FA3F 48                  <1> 	dec	eax  ; video mode
 10039 0000FA40 BE[E29E0100]        <1> 	mov	esi, LFB_Info
 10040 0000FA45 663B06              <1> 	cmp	ax, [esi+LFBINFO.mode]
 10041 0000FA48 7407                <1> 	je	short sysvideo_20_2
 10042                              <1> 
 10043 0000FA4A E8383EFFFF          <1> 	call	_vbe_biosfn_return_mode_info
 10044                              <1> 	;jnc	short sysvideo_20_2
 10045 0000FA4F 723B                <1> 	jc	short sysvideo_20_4 ; edx = 0	
 10046                              <1> 
 10047                              <1> 	;; clear LFBINFO table for invalidating	
 10048                              <1> 	;mov	ecx, LFBINFO.size ; 16
 10049                              <1> 	;mov	edi, esi ; LFB_Info table address
 10050                              <1> 	;xor	eax, eax
 10051                              <1> 	;rep	stosb
 10052                              <1> 
 10053                              <1> sysvideo_20_2:
 10054                              <1> 	;pop	ecx
 10055                              <1> 	;mov	edi, ecx ; user buffer
 10056 0000FA51 5F                  <1> 	pop	edi
 10057 0000FA52 B910000000          <1> 	mov	ecx, LFBINFO.size ; 16
 10058 0000FA57 E835140000          <1> 	call	transfer_to_user_buffer ; fast transfer
 10059 0000FA5C 722F                <1> 	jc	short sysvideo_20_5
 10060                              <1> 	
 10061                              <1> 	;jmp	sysret
 10062                              <1> sysvideo_20_3:	
 10063                              <1> 	;pop	eax ; [u.r0] = 0		
 10064                              <1> ;sysvideo_20_4:
 10065 0000FA5E E9F4D3FFFF          <1> 	jmp	sysret
 10066                              <1> 
 10067                              <1> 	; 23/07/2022
 10068                              <1> sysvideo_20:
 10069                              <1> 	; 11/12/2020
 10070                              <1> 	; 23/11/2020
 10071 0000FA63 80FF08              <1> 	cmp	bh, 8
 10072                              <1> 	; 08/08/2022
 10073                              <1> 	;jb	short sysvideo_19 ; video mode & lfb info
 10074 0000FA66 7407                <1> 	je	short sysvideo_20_6
 10075                              <1> 	; 23/07/2022
 10076 0000FA68 7733                <1> 	ja	short sysvideo_21 ; 12/12/2020
 10077                              <1> 	; 08/08/2022 - jb
 10078 0000FA6A E967FFFFFF          <1> 	jmp	sysvideo_19 
 10079                              <1> sysvideo_20_6:
 10080                              <1> 	; BH = 8
 10081                              <1> 	; Set (Super/Extended VGA) mode & return LFB info
 10082                              <1> 
 10083                              <1> 	; 11/12/2020
 10084 0000FA6F 80FBFF              <1> 	cmp	bl, 0FFh  ; CGA/VGA mode ?
 10085 0000FA72 739D                <1> 	jnb	short sysvideo_20_1
 10086                              <1> 
 10087                              <1> 	;xor	ah, ah
 10088 0000FA74 88D8                <1> 	mov	al, bl
 10089                              <1> sysvideo_20_0:
 10090 0000FA76 E8A01CFFFF          <1> 	call	_int10h  ; uses vbe3 pmi32 option
 10091 0000FA7B 83F8FF              <1> 	cmp	eax, 0FFFFFFFFh ; -1
 10092 0000FA7E 74DE                <1> 	je	short sysvideo_20_3 ; error
 10093                              <1> 	
 10094                              <1> 	; 11/12/2020
 10095                              <1> 	; alternative (it does not use vbe3 pmi32)
 10096                              <1> 	;push	eax
 10097                              <1> 	;call	_set_mode
 10098                              <1> 	;pop	eax
 10099                              <1> 	;jc	short sysvideo_20_3
 10100                              <1> 	
 10101                              <1> 	;inc	eax
 10102 0000FA80 FEC0                <1> 	inc	al
 10103                              <1> 	;mov	[u.r0], ax ; video mode + 1	
 10104 0000FA82 A2[20900100]        <1> 	mov	[u.r0], al
 10105 0000FA87 E9CBD3FFFF          <1> 	jmp	sysret
 10106                              <1> 
 10107                              <1> sysvideo_20_4:
 10108 0000FA8C 5A                  <1> 	pop	edx
 10109                              <1> sysvideo_20_5:
 10110 0000FA8D 31D2                <1> 	xor	edx, edx ; 0
 10111                              <1> 	; edx = 0 -> invalid LFBINFO data
 10112 0000FA8F 8B2D[1C900100]      <1> 	mov	ebp, [u.usp]  ; ebp points to user's registers
 10113 0000FA95 895514              <1> 	mov	[ebp+20], edx ; return to user with EDX value 
 10114 0000FA98 E9BAD3FFFF          <1> 	jmp	sysret
 10115                              <1> 
 10116                              <1> sysvideo_21:
 10117                              <1> 	; 23/07/2022
 10118                              <1> 	; 04/01/2021
 10119                              <1> 	; 03/12/2020
 10120 0000FA9D 80FF0A              <1> 	cmp	bh, 10
 10121                              <1> 	;jb	sysvideo_22 ; VESA VBE3 pmi parms
 10122                              <1> 	; 23/07/2022
 10123 0000FAA0 723F                <1> 	jb	short sysvideo_21_19
 10124                              <1> 	; 23/12/2020
 10125                              <1> 	;je	sysvideo_26 ; Video memory mapping	
 10126                              <1> 	; 23/07/2022
 10127 0000FAA2 7442                <1> 	je	short sysvideo_21_20
 10128                              <1> 	
 10129                              <1> 	; 04/01/2020
 10130 0000FAA4 80FF0B              <1> 	cmp	bh, 11
 10131                              <1> 	;ja	sysvideo_27
 10132                              <1> 	; 23/07/2022
 10133 0000FAA7 7742                <1> 	ja	short sysvideo_21_21
 10134                              <1> 		
 10135                              <1> 	; BH = 11
 10136                              <1> 	; set/read DAC color registers (for 8bpp)
 10137                              <1> 	
 10138 0000FAA9 80FB04              <1> 	cmp	bl, 4
 10139                              <1> 	;jnb	sysvideo_21_7	; BMP file type palette
 10140                              <1> 				; handling
 10141                              <1> 	; 23/07/2022
 10142                              <1> 	;jnb	short sysvideo_21_7
 10143                              <1> 	; 08/08/2022
 10144 0000FAAC 7205                <1> 	jb	short sysvideo_21_18
 10145 0000FAAE E989000000          <1> 	jmp	sysvideo_21_7
 10146                              <1> sysvideo_21_18:	
 10147 0000FAB3 F6C301              <1> 	test	bl, 1
 10148 0000FAB6 7563                <1> 	jnz	short sysvideo_21_4 ; set/write DAC colors
 10149                              <1> 		
 10150                              <1> 	; Read DAC color register or all DAC color registers
 10151 0000FAB8 F6C302              <1> 	test	bl, 2  ; read single DAC color register
 10152 0000FABB 7433                <1> 	jz	short sysvideo_21_2 ; read all DAC color regs	
 10153                              <1> 
 10154                              <1> 	; read single DAC color register
 10155                              <1> 	; CL = DAC color register (index)
 10156                              <1>  	
 10157 0000FABD 66BAC703            <1> 	mov	dx, 3C7h ; VGAREG_DAC_READ_ADDRESS
 10158 0000FAC1 88C8                <1> 	mov	al, cl	; DAC color register
 10159 0000FAC3 31C9                <1> 	xor	ecx, ecx ; (this may not be necessary)
 10160 0000FAC5 EE                  <1> 	out	dx, al
 10161                              <1> 	;mov	dx, 3C9h ; VGAREG_DAC_DATA
 10162 0000FAC6 B2C9                <1> 	mov	dl, 0C9h
 10163 0000FAC8 EC                  <1> 	in	al, dx
 10164 0000FAC9 88C4                <1> 	mov	ah, al	; red
 10165 0000FACB EC                  <1> 	in	al, dx
 10166 0000FACC 88C1                <1> 	mov	cl, al	; green
 10167 0000FACE EC                  <1> 	in	al, dx
 10168 0000FACF 88C5                <1> 	mov	ch, al	; blue
 10169 0000FAD1 C1E108              <1> 	shl	ecx, 8
 10170 0000FAD4 88E1                <1> 	mov	cl, ah	; red	
 10171                              <1> 	; CL = Red, CH = Green, byte 3 = Blue, byte 4 = 0
 10172                              <1> sysvideo_21_0:
 10173 0000FAD6 890D[20900100]      <1> 	mov	[u.r0], ecx
 10174                              <1> sysvideo_21_1:
 10175 0000FADC E976D3FFFF          <1> 	jmp	sysret
 10176                              <1> sysvideo_21_19:
 10177                              <1> 	; 23/07/2022
 10178 0000FAE1 E97A010000          <1> 	jmp	sysvideo_22
 10179                              <1> sysvideo_21_20:
 10180                              <1> 	; 23/07/2022
 10181 0000FAE6 E930020000          <1> 	jmp	sysvideo_26
 10182                              <1> sysvideo_21_21:
 10183                              <1> 	; 23/07/2022
 10184 0000FAEB E9B6020000          <1> 	jmp	sysvideo_27
 10185                              <1> sysvideo_21_2:
 10186                              <1> 	; read all DAC color registers
 10187 0000FAF0 89CB                <1> 	mov	ebx, ecx ; user's buffer address
 10188 0000FAF2 BF00600900          <1> 	mov	edi, VBE3STACKADDR
 10189 0000FAF7 89FE                <1> 	mov	esi, edi
 10190                              <1> 	;mov	ecx, 768 ; 256*3
 10191                              <1> 	; 08/08/2022
 10192 0000FAF9 29C9                <1> 	sub	ecx, ecx
 10193 0000FAFB B503                <1> 	mov	ch, 3
 10194                              <1> 	; ecx = 768 = 300h
 10195                              <1> 	;push	ecx
 10196 0000FAFD 66BAC703            <1> 	mov	dx, 3C7h ; VGAREG_DAC_READ_ADDRESS
 10197 0000FB01 28C0                <1> 	sub	al, al ; 0
 10198 0000FB03 EE                  <1> 	out	dx, al
 10199                              <1> 	;mov	dx, 3C9h ; VGAREG_DAC_DATA
 10200 0000FB04 B2C9                <1> 	mov	dl, 0C9h
 10201                              <1> sysvideo_21_3:
 10202 0000FB06 EC                  <1> 	in	al, dx
 10203 0000FB07 AA                  <1> 	stosb
 10204 0000FB08 EC                  <1> 	in	al, dx
 10205 0000FB09 AA                  <1> 	stosb
 10206 0000FB0A EC                  <1> 	in	al, dx
 10207 0000FB0B AA                  <1> 	stosb
 10208 0000FB0C E2F8                <1> 	loop	sysvideo_21_3
 10209                              <1> 	;pop	ecx
 10210                              <1> 	; 18/08/2022
 10211 0000FB0E B503                <1> 	mov	ch, 3
 10212                              <1> 	; ecx = 768 = 300h
 10213                              <1> 
 10214 0000FB10 89DF                <1> 	mov	edi, ebx ; user's buffer address
 10215                              <1> 	;mov	esi, VBE3STACKADDR
 10216                              <1> 	;mov	ecx, 256*3 = 768
 10217 0000FB12 E87A130000          <1> 	call	transfer_to_user_buffer
 10218 0000FB17 72C3                <1> 	jc	short sysvideo_21_1
 10219                              <1> 	;mov	[u.r0], ecx ; actual transfer count
 10220 0000FB19 EBBB                <1> 	jmp	short sysvideo_21_0
 10221                              <1> 
 10222                              <1> sysvideo_21_4:
 10223                              <1> 	; Set/Write DAC color register or all registers
 10224 0000FB1B F6C302              <1> 	test	bl, 2 ; write/set single DAC color register
 10225 0000FB1E 7456                <1> 	jz	short sysvideo_21_5 ; set all DAC color regs
 10226                              <1> 
 10227                              <1> 	; set single DAC color register
 10228                              <1> 	; CL = DAC color register (index)
 10229                              <1> 	; (byte 1 = Red, byte 2 = Green, byte 3 = Blue) 
 10230                              <1> 
 10231 0000FB20 66BAC803            <1> 	mov	dx, 3C8h ; VGAREG_DAC_WRITE_ADDRESS
 10232 0000FB24 89C8                <1> 	mov	eax, ecx ; DAC color register (index)
 10233 0000FB26 C1E910              <1> 	shr	ecx, 16  ; CL = green, AH = Red
 10234 0000FB29 EE                  <1> 	out	dx, al
 10235                              <1> 	;mov	dx, 3C9h ; VGAREG_DAC_DATA
 10236 0000FB2A FEC2                <1> 	inc	dl
 10237 0000FB2C 88E0                <1> 	mov	al, ah	; Red
 10238 0000FB2E EE                  <1> 	out	dx, al
 10239 0000FB2F 88C8                <1> 	mov	al, cl	; Green
 10240 0000FB31 EE                  <1> 	out	dx, al
 10241 0000FB32 88E8                <1> 	mov	al, ch	; Blue
 10242 0000FB34 EE                  <1> 	out	dx, al	
 10243                              <1> 	;rol	ecx, 8
 10244 0000FB35 C1E108              <1> 	shl	ecx, 8	; 21/02/2021
 10245 0000FB38 88E1                <1> 	mov	cl, ah	; Red
 10246                              <1> 		; ecx = 00BBGGRRh	
 10247 0000FB3A EB9A                <1> 	jmp	short sysvideo_21_0
 10248                              <1> 
 10249                              <1> 	; 23/07/2022
 10250                              <1> sysvideo_21_7:	
 10251                              <1> 	; BMP file type palette handling	
 10252                              <1> 	
 10253 0000FB3C F6C301              <1> 	test	bl, 1
 10254                              <1> 	;jnz	short sysvideo_21_12 ; set/write DAC colors
 10255                              <1> 	; 08/08/2022
 10256 0000FB3F 7405                <1> 	jz	short sysvideo_21_16
 10257 0000FB41 E9A3000000          <1> 	jmp	sysvideo_21_12
 10258                              <1> 
 10259                              <1> sysvideo_21_16:		
 10260                              <1> 	; Read DAC color register or all DAC color registers
 10261 0000FB46 F6C302              <1> 	test	bl, 2  ; read single DAC color register
 10262 0000FB49 7460                <1> 	jz	short sysvideo_21_10 ; read all DAC color regs	
 10263                              <1> 
 10264                              <1> 	; read single DAC color register
 10265                              <1> 	; CL = DAC color register (index)
 10266                              <1>  	
 10267 0000FB4B 66BAC703            <1> 	mov	dx, 3C7h ; VGAREG_DAC_READ_ADDRESS
 10268 0000FB4F 88C8                <1> 	mov	al, cl	; DAC color register
 10269 0000FB51 31C9                <1> 	xor	ecx, ecx
 10270 0000FB53 EE                  <1> 	out	dx, al
 10271                              <1> 	;mov	dx, 3C9h ; VGAREG_DAC_DATA
 10272 0000FB54 B2C9                <1> 	mov	dl, 0C9h
 10273 0000FB56 EC                  <1> 	in	al, dx
 10274 0000FB57 C0E002              <1> 	shl	al, 2
 10275 0000FB5A 88C5                <1> 	mov	ch, al	; red
 10276 0000FB5C EC                  <1> 	in	al, dx
 10277 0000FB5D C0E002              <1> 	shl	al, 2
 10278 0000FB60 88C1                <1> 	mov	cl, al	; green
 10279 0000FB62 EC                  <1> 	in	al, dx
 10280 0000FB63 C0E002              <1> 	shl	al, 2
 10281                              <1> 	; 21/02/2021
 10282 0000FB66 C1E108              <1> 	shl	ecx, 8
 10283 0000FB69 88C1                <1> 	mov	cl, al	; blue
 10284                              <1> 	; CL = Blue, CH = Green, byte 3 = Red, byte 4 = 0
 10285                              <1> sysvideo_21_8:
 10286 0000FB6B 890D[20900100]      <1> 	mov	[u.r0], ecx
 10287                              <1> sysvideo_21_9:
 10288 0000FB71 E9E1D2FFFF          <1> 	jmp	sysret
 10289                              <1> 
 10290                              <1> sysvideo_21_5:
 10291                              <1> 	; write/set all DAC color registers
 10292 0000FB76 89CE                <1> 	mov	esi, ecx ; user's buffer address
 10293 0000FB78 BF00600900          <1> 	mov	edi, VBE3STACKADDR
 10294 0000FB7D 89FB                <1> 	mov	ebx, edi
 10295 0000FB7F B900030000          <1> 	mov	ecx, 768 ; 256*3
 10296 0000FB84 E852130000          <1> 	call	transfer_from_user_buffer
 10297                              <1> 	;jc	short sysvideo_21_1
 10298                              <1> 	; 08/08/2022
 10299 0000FB89 7305                <1> 	jnc	short sysvideo_21_17
 10300 0000FB8B E94CFFFFFF          <1> 	jmp	sysvideo_21_1
 10301                              <1> sysvideo_21_17:
 10302 0000FB90 890D[20900100]      <1> 	mov	[u.r0], ecx ; actual transfer count
 10303                              <1> 
 10304 0000FB96 89DE                <1> 	mov	esi, ebx ; VBE3STACKADDR
 10305 0000FB98 66BAC803            <1> 	mov	dx, 3C8h ; VGAREG_DAC_WRITE_ADDRESS
 10306 0000FB9C 28C0                <1> 	sub	al, al ; 0
 10307 0000FB9E EE                  <1> 	out	dx, al
 10308                              <1> 	;mov	dx, 3C9h ; VGAREG_DAC_DATA
 10309 0000FB9F FEC2                <1> 	inc	dl
 10310                              <1> sysvideo_21_6:
 10311 0000FBA1 AC                  <1> 	lodsb
 10312 0000FBA2 EE                  <1> 	out	dx, al
 10313 0000FBA3 AC                  <1> 	lodsb
 10314 0000FBA4 EE                  <1> 	out	dx, al
 10315 0000FBA5 AC                  <1> 	lodsb
 10316 0000FBA6 EE                  <1> 	out	dx, al
 10317 0000FBA7 E2F8                <1> 	loop	sysvideo_21_6
 10318 0000FBA9 EBC6                <1> 	jmp	short sysvideo_21_9
 10319                              <1> 
 10320                              <1> sysvideo_21_10:
 10321                              <1> 	; read all DAC color registers
 10322 0000FBAB 89CD                <1> 	mov	ebp, ecx ; user's buffer address
 10323 0000FBAD BF00600900          <1> 	mov	edi, VBE3STACKADDR
 10324 0000FBB2 89FE                <1> 	mov	esi, edi
 10325 0000FBB4 B900040000          <1> 	mov	ecx, 1024 ; 256*4
 10326 0000FBB9 51                  <1> 	push	ecx
 10327 0000FBBA 66BAC703            <1> 	mov	dx, 3C7h ; VGAREG_DAC_READ_ADDRESS
 10328 0000FBBE 28C0                <1> 	sub	al, al ; 0
 10329 0000FBC0 EE                  <1> 	out	dx, al
 10330                              <1> 	;mov	dx, 3C9h ; VGAREG_DAC_DATA
 10331 0000FBC1 B2C9                <1> 	mov	dl, 0C9h
 10332                              <1> sysvideo_21_11:
 10333 0000FBC3 31DB                <1> 	xor	ebx, ebx
 10334 0000FBC5 EC                  <1> 	in	al, dx	; Red
 10335 0000FBC6 C0E002              <1> 	shl	al, 2
 10336 0000FBC9 88C7                <1> 	mov	bh, al
 10337 0000FBCB EC                  <1> 	in	al, dx	; Green
 10338 0000FBCC C0E002              <1> 	shl	al, 2
 10339 0000FBCF 88C3                <1> 	mov	bl, al
 10340 0000FBD1 EC                  <1> 	in	al, dx	; Blue
 10341 0000FBD2 C0E002              <1> 	shl	al, 2
 10342 0000FBD5 C1E308              <1> 	shl	ebx, 8
 10343 0000FBD8 89D8                <1> 	mov	eax, ebx ; 00RRGGBBh
 10344 0000FBDA AB                  <1> 	stosd	
 10345 0000FBDB E2E6                <1> 	loop	sysvideo_21_11
 10346 0000FBDD 59                  <1> 	pop	ecx
 10347                              <1> 
 10348 0000FBDE 89EF                <1> 	mov	edi, ebp ; user's buffer address
 10349                              <1> 	;mov	esi, VBE3STACKADDR
 10350                              <1> 	;mov	ecx, 1024 = 4*256
 10351 0000FBE0 E8AC120000          <1> 	call	transfer_to_user_buffer
 10352 0000FBE5 728A                <1> 	jc	short sysvideo_21_9
 10353                              <1> 	;mov	[u.r0], ecx ; actual transfer count
 10354 0000FBE7 EB82                <1> 	jmp	short sysvideo_21_8
 10355                              <1> 
 10356                              <1> sysvideo_21_12:
 10357                              <1> 	; Set/Write DAC color register or all registers
 10358 0000FBE9 F6C302              <1> 	test	bl, 2 ; write/set single DAC color register
 10359 0000FBEC 742A                <1> 	jz	short sysvideo_21_13 ; set all DAC color regs
 10360                              <1> 
 10361                              <1> 	; set single DAC color register
 10362                              <1> 	; CL = DAC color register (index)
 10363                              <1> 	; (byte 1 = Blue, byte 2 = Green, byte 3 = Red) 
 10364                              <1> 
 10365 0000FBEE 66BAC803            <1> 	mov	dx, 3C8h ; VGAREG_DAC_WRITE_ADDRESS
 10366 0000FBF2 88C8                <1> 	mov	al, cl	; DAC color register (index)
 10367 0000FBF4 88EC                <1> 	mov	ah, ch	; Blue 
 10368 0000FBF6 C1E910              <1> 	shr	ecx, 16
 10369 0000FBF9 EE                  <1> 	out	dx, al
 10370                              <1> 	;mov	dx, 3C9h ; VGAREG_DAC_DATA
 10371 0000FBFA FEC2                <1> 	inc	dl
 10372 0000FBFC 88E8                <1> 	mov	al, ch	; Red
 10373 0000FBFE C0E802              <1> 	shr	al, 2
 10374 0000FC01 EE                  <1> 	out	dx, al
 10375 0000FC02 88C8                <1> 	mov	al, cl	; Green
 10376 0000FC04 C0E802              <1> 	shr	al, 2
 10377 0000FC07 EE                  <1> 	out	dx, al
 10378 0000FC08 88E0                <1> 	mov	al, ah	; Blue
 10379 0000FC0A C0E802              <1> 	shr	al, 2
 10380 0000FC0D EE                  <1> 	out	dx, al	
 10381                              <1> 	;rol	ecx, 8
 10382 0000FC0E C1E108              <1> 	shl	ecx, 8 ; 21/02/2021 
 10383 0000FC11 88E1                <1> 	mov	cl, ah
 10384 0000FC13 E953FFFFFF          <1> 	jmp	sysvideo_21_8 ; 08/08/2022
 10385                              <1> 
 10386                              <1> sysvideo_21_13:
 10387                              <1> 	; write/set all DAC color registers
 10388 0000FC18 89CE                <1> 	mov	esi, ecx ; user's buffer address
 10389 0000FC1A BF00600900          <1> 	mov	edi, VBE3STACKADDR
 10390 0000FC1F 89FB                <1> 	mov	ebx, edi
 10391 0000FC21 B900040000          <1> 	mov	ecx, 1024 ; 256*4
 10392 0000FC26 E8B0120000          <1> 	call	transfer_from_user_buffer
 10393 0000FC2B 722E                <1> 	jc	short sysvideo_21_15
 10394 0000FC2D 890D[20900100]      <1> 	mov	[u.r0], ecx ; actual transfer count
 10395                              <1> 
 10396 0000FC33 89DE                <1> 	mov	esi, ebx ; VBE3STACKADDR
 10397 0000FC35 66BAC803            <1> 	mov	dx, 3C8h ; VGAREG_DAC_WRITE_ADDRESS
 10398 0000FC39 28C0                <1> 	sub	al, al ; 0
 10399 0000FC3B EE                  <1> 	out	dx, al
 10400                              <1> 	;mov	dx, 3C9h ; VGAREG_DAC_DATA
 10401 0000FC3C FEC2                <1> 	inc	dl
 10402                              <1> sysvideo_21_14:
 10403 0000FC3E AD                  <1> 	lodsd
 10404                              <1> 	; byte 0 = Blue, byte 1 = Green, byte 2 = Red
 10405                              <1> 	; 21/02/2021
 10406 0000FC3F 89C3                <1> 	mov	ebx, eax ; BL = Blue, BH = Green
 10407 0000FC41 C1CB08              <1> 	ror	ebx, 8 ; BL = Green, BH = Red
 10408 0000FC44 88F8                <1> 	mov	al, bh
 10409 0000FC46 C0E802              <1> 	shr	al, 2
 10410 0000FC49 EE                  <1> 	out	dx, al ; Red
 10411 0000FC4A 88D8                <1> 	mov	al, bl
 10412 0000FC4C C0E802              <1> 	shr	al, 2	
 10413 0000FC4F EE                  <1> 	out	dx, al ; Green
 10414 0000FC50 C1C308              <1> 	rol	ebx, 8 ; BL = Blue
 10415 0000FC53 88D8                <1> 	mov	al, bl
 10416 0000FC55 C0E802              <1> 	shr	al, 2
 10417 0000FC58 EE                  <1> 	out	dx, al ; Blue 
 10418 0000FC59 E2E3                <1> 	loop	sysvideo_21_14
 10419                              <1> sysvideo_21_15:
 10420 0000FC5B E9F7D1FFFF          <1> 	jmp	sysret
 10421                              <1> 
 10422                              <1> sysvideo_22:
 10423                              <1> 	; 28/02/2021
 10424                              <1> 	; 22/01/2021
 10425                              <1> 	; 17/01/2021
 10426                              <1> 	; 04/12/2020
 10427                              <1> 	; 03/12/2020
 10428                              <1> 	; BH = 9
 10429                              <1> 	; Set/Get VESA VBE3 protected mode interface params
 10430                              <1> 
 10431                              <1> 	; 22/01/2021
 10432                              <1> 	;cmp	byte [vbe3], 3
 10433                              <1> 	;jne	short sysvideo_25 ; not applicable if
 10434                              <1> 				; vbe3 compatible video bios
 10435                              <1> 				; is not detected by kernel	
 10436 0000FC60 80FB02              <1> 	cmp	bl, 2
 10437                              <1> 	;ja	short sysvideo_25 ; bl > 2 not implemented
 10438                              <1> 	; 17/01/2021
 10439 0000FC63 7716                <1> 	ja	short sysvideo_22_0 ; srvs flag sub function
 10440                              <1> 	;jb	short sysvideo_23
 10441                              <1> 
 10442                              <1> 	; 21/01/2021
 10443 0000FC65 803D[86090000]03    <1> 	cmp	byte [vbe3], 3
 10444                              <1> 	;jne	short sysvideo_25 ; not applicable if
 10445                              <1> 				; vbe3 compatible video bios
 10446                              <1> 				; is not detected by kernel
 10447 0000FC6C 75ED                <1> 	jne	short sysvideo_21_15 ; 28/02/2021
 10448                              <1> 	
 10449 0000FC6E 80FB01              <1> 	cmp	bl, 1
 10450 0000FC71 7673                <1> 	jna	short sysvideo_23
 10451                              <1> 
 10452 0000FC73 8A1D[D49E0100]      <1> 	mov	bl, [pmi32] ; Video bios 32 bit PMI functions
 10453 0000FC79 EB78                <1> 	jmp	short sysvideo_24
 10454                              <1> 
 10455                              <1> sysvideo_22_0:
 10456                              <1> 	; 17/01/2021
 10457                              <1> 	; save/restore video state user permission
 10458 0000FC7B 80FB05              <1> 	cmp	bl, 5
 10459 0000FC7E 771E                <1> 	ja	short sysvideo_22_2
 10460 0000FC80 7208                <1> 	jb	short sysvideo_22_1
 10461                              <1> 	; get srvs flag value/status
 10462 0000FC82 8A1D[389F0100]      <1> 	mov	bl, [srvsf] ; 0 = disabled, 1 = enabled
 10463 0000FC88 EB2C                <1> 	jmp	short sysvideo_22_3
 10464                              <1> 
 10465                              <1> sysvideo_22_1:
 10466                              <1> 	; permission (root and multi tasking) check
 10467 0000FC8A E836000000          <1> 	call	sysvideo_22_4
 10468 0000FC8F 736A                <1> 	jnc	short sysvideo_25 ; not permitted !
 10469                              <1> 	; cf = 1
 10470 0000FC91 80EB03              <1> 	sub	bl, 3 ; disable = 0, enable = 1
 10471                              <1> 	; 22/01/2021
 10472 0000FC94 881D[389F0100]      <1> 	mov	[srvsf], bl
 10473 0000FC9A FEC3                <1> 	inc	bl ; 1 = disabled, 2 = enabled
 10474 0000FC9C EB18                <1> 	jmp	short sysvideo_22_3
 10475                              <1> 
 10476                              <1> sysvideo_22_2:
 10477 0000FC9E 80FB06              <1> 	cmp	bl, 6
 10478                              <1> 	;ja	short sysvideo_25 ; invalid/unimplemented
 10479                              <1> 	; 28/02/2021
 10480 0000FCA1 7733                <1> 	ja	short sysvideo_22_6
 10481                              <1> 	; get VESA VBE number/status
 10482 0000FCA3 8A25[86090000]      <1> 	mov	ah, [vbe3] ; vbe3 = 3, vbe2 = 2, others = 0
 10483 0000FCA9 A0[87090000]        <1> 	mov	al, [vbe2bios] ; bochs/qemu/vbox emulator status
 10484 0000FCAE 66A3[20900100]      <1> 	mov	[u.r0], ax
 10485 0000FCB4 EB45                <1> 	jmp	short sysvideo_25
 10486                              <1> 
 10487                              <1> sysvideo_22_3:
 10488                              <1> 	; 22/01/2021
 10489 0000FCB6 8A3D[399F0100]      <1> 	mov	bh, [srvso] ; state options (> 80h -> svga)
 10490 0000FCBC 66891D[20900100]    <1> 	mov	[u.r0], bx ; function result is return value 
 10491 0000FCC3 EB36                <1> 	jmp	short sysvideo_25 
 10492                              <1> 
 10493                              <1> sysvideo_22_4:
 10494                              <1> 	; 17/01/2021 - permission will be given by root only
 10495 0000FCC5 803D[16850100]00    <1> 	cmp	byte [multi_tasking], 0 ; in single user mode
 10496 0000FCCC 7707                <1> 	ja	short sysvideo_22_5
 10497                              <1> 	; 19/01/2021
 10498 0000FCCE 803D[72900100]01    <1>  	cmp	byte [u.uid], 1 ; ([u.uid] = 0 -> root)
 10499                              <1> sysvideo_22_5:
 10500                              <1> 	; [multi_tasking] = 0 & [u.uid] = 0 -> CF = 1
 10501                              <1> 	; otherwise -> CF = 0 
 10502 0000FCD5 C3                  <1> 	retn
 10503                              <1> 
 10504                              <1> sysvideo_22_6:
 10505                              <1> 	; 28/02/2021
 10506 0000FCD6 80FB09              <1> 	cmp	bl, 9
 10507 0000FCD9 7720                <1> 	ja	short sysvideo_25 ; invalid/unimplemented
 10508 0000FCDB 7436                <1> 	je	short sysvideo_22_9
 10509 0000FCDD 80FB08              <1> 	cmp	bl, 8
 10510 0000FCE0 721E                <1> 	jb	short sysvideo_22_7
 10511                              <1> 
 10512                              <1> 	; BL = 8
 10513                              <1> 	; Set default true color bpp to 24
 10514                              <1> 
 10515 0000FCE2 B318                <1> 	mov	bl, 24
 10516                              <1> 	;mov	[truecolor], al	; 24bpp (RRGGBBh)
 10517                              <1> 	;mov	[u.r0], al
 10518                              <1> 	;jmp	short sysvideo_25
 10519 0000FCE4 EB25                <1> 	jmp	short sysvideo_22_8
 10520                              <1> 
 10521                              <1> sysvideo_23:
 10522                              <1> 	; 17/01/2021
 10523                              <1> 	; permission (root and multi tasking) check
 10524 0000FCE6 E8DAFFFFFF          <1> 	call	sysvideo_22_4
 10525 0000FCEB 730E                <1> 	jnc	short sysvideo_25 ; not permitted !
 10526                              <1> 
 10527 0000FCED 881D[D49E0100]      <1> 	mov	[pmi32], bl ; 1 = enabled, 0 = disabled 
 10528                              <1> sysvideo_24:
 10529 0000FCF3 FEC3                <1> 	inc	bl
 10530                              <1> sysvideo_22_10:	; 28/02/2021
 10531 0000FCF5 881D[20900100]      <1> 	mov	[u.r0], bl ; function result is return value 
 10532                              <1> sysvideo_25:
 10533 0000FCFB E957D1FFFF          <1> 	jmp	sysret
 10534                              <1> 
 10535                              <1> sysvideo_22_7:
 10536                              <1> 	; BL = 7
 10537                              <1> 	; Set default true color bpp to 32
 10538                              <1> 	; (it will set if [VBE3]=3)
 10539                              <1> 
 10540                              <1> 	; Note: This sub function is used to set 24bpp
 10541                              <1> 	; VESA VBE video modes to 32bpp.. because,
 10542                              <1> 	; old hardware uses 24 bpp but new video hardware
 10543                              <1> 	; uses 32bpp for same VESA VBE truecolor modes.
 10544                              <1> 	; (For example: VBE mode 112h is 640*480, 24bpp but
 10545                              <1> 	; new hardware uses/apply it as 640*480, 32bpp.)  	
 10546                              <1> 	; So, TRDOS 386 v2.0.3 kernel will check [truecolor]
 10547                              <1> 	; status is 32 bpp or not and it will change 24bpp
 10548                              <1> 	; to 32bpp if default [truecolor] value is 32, for
 10549                              <1> 	; same video mode number.
 10550                              <1> 
 10551 0000FD00 803D[86090000]03    <1> 	cmp	byte [vbe3], 3
 10552 0000FD07 75F2                <1> 	jne	short sysvideo_25 ; Only applicable 
 10553                              <1> 				  ; for VBE3 video hardware!
 10554 0000FD09 B320                <1> 	mov	bl, 32
 10555                              <1> sysvideo_22_8:
 10556 0000FD0B 881D[4F750100]      <1> 	mov	[truecolor], bl	; 32bpp (00RRGGBBh)
 10557                              <1> 	;mov	[u.r0], bl
 10558                              <1> 	;jmp	short sysvideo_25
 10559 0000FD11 EBE2                <1> 	jmp	short sysvideo_22_10
 10560                              <1> 
 10561                              <1> sysvideo_22_9:
 10562                              <1> 	; BL = 9
 10563                              <1> 	; Return default true color bpp
 10564 0000FD13 8A1D[4F750100]      <1> 	mov	bl, [truecolor]
 10565 0000FD19 EBDA                <1> 	jmp	short sysvideo_22_10
 10566                              <1> ;sysvideo_22_10:
 10567                              <1> 	;mov	[u.r0], bl
 10568                              <1> 	;jmp	sysret
 10569                              <1> 
 10570                              <1> sysvideo_26:
 10571                              <1> 	; 23/12/2020
 10572                              <1> 	; BH = 10
 10573                              <1> 	; Map video memory to user's buffer
 10574                              <1> 	; (multiuser/owner r/w permisions are ignored
 10575                              <1> 	;  for current TRDOS 386 version !)
 10576                              <1> 
 10577 0000FD1B 6681E100F0          <1> 	and	cx, ~4095  ; clear low 12 bits
 10578 0000FD20 09C9                <1> 	or	ecx, ecx ; start address of user's buffer
 10579 0000FD22 74D7                <1> 	jz	short sysvideo_25 ; error !
 10580                              <1> 	
 10581 0000FD24 80FB01              <1> 	cmp	bl, 1  ; VGA memory mapping ?
 10582 0000FD27 740E                <1> 	je	short sysvideo_26_1
 10583 0000FD29 7718                <1> 	ja	short sysvideo_26_2
 10584                              <1> sysvideo_26_0:
 10585                              <1> 	; BL = 0 : CGA memory (0B8000h) map (32K)
 10586 0000FD2B B800800B00          <1> 	mov	eax, 0B8000h	
 10587 0000FD30 BB00800000          <1> 	mov	ebx, 32768
 10588 0000FD35 EB37                <1> 	jmp	short sysvideo_26_3
 10589                              <1> sysvideo_26_1:
 10590                              <1> 	; BL = 1 : VGA memory (0A0000h) map (64K)
 10591 0000FD37 B800000A00          <1> 	mov	eax, 0A0000h	
 10592 0000FD3C BB00000100          <1> 	mov	ebx, 65536
 10593 0000FD41 EB2B                <1> 	jmp	short sysvideo_26_3
 10594                              <1> sysvideo_26_2:
 10595                              <1> 	; BL = 2 : SVGA memory (LFB) map to user's buffer
 10596 0000FD43 803D[86090000]02    <1> 	cmp	byte [vbe3], 2  ; VESA VBE 2/3 vbios ready ?
 10597 0000FD4A 72AF                <1> 	jb	short sysvideo_25  ; no, error !
 10598 0000FD4C 6681E200F0          <1> 	and	dx, ~4095 ; clear low 12 bits
 10599 0000FD51 09D2                <1> 	or	edx, edx  ; buffer size in bytes	
 10600 0000FD53 74A6                <1> 	jz	short sysvideo_25  ; error
 10601 0000FD55 89D3                <1> 	mov	ebx, edx
 10602 0000FD57 A1[E49E0100]        <1> 	mov	eax, [LFB_ADDR] ; [LFB_Info+LFBINFO.LFB_addr]
 10603 0000FD5C 21C0                <1> 	and	eax, eax
 10604 0000FD5E 7425                <1> 	jz	short sysvideo_26_5
 10605                              <1> 				; (LFB parms are not set yet)
 10606 0000FD60 3B1D[E89E0100]      <1> 	cmp	ebx, [LFB_SIZE] ; [LFB_Info+LFBINFO.LFB_size]
 10607 0000FD66 7606                <1> 	jna	short sysvideo_26_3
 10608 0000FD68 8B1D[E89E0100]      <1> 	mov	ebx, [LFB_SIZE]
 10609                              <1> sysvideo_26_3: 
 10610 0000FD6E 52                  <1> 	push	edx
 10611 0000FD6F 53                  <1> 	push	ebx	; buffer size in bytes
 10612 0000FD70 51                  <1> 	push	ecx	; user's buffer address
 10613 0000FD71 87D9                <1> 	xchg	ebx, ecx
 10614 0000FD73 C1E90C              <1> 	shr	ecx, 12 ; convert buffer size to page count
 10615 0000FD76 E8E061FFFF          <1> 	call	direct_memory_access
 10616 0000FD7B 59                  <1> 	pop	ecx	; user's buffer address
 10617 0000FD7C 5B                  <1> 	pop	ebx	; buffer size
 10618 0000FD7D 5A                  <1> 	pop	edx
 10619                              <1> 	;jc	short sysvideo_25 ; error !
 10620                              <1> 				  ; [u.r0] = 0
 10621                              <1> 	; 28/02/2021
 10622 0000FD7E 7235                <1> 	jc	short sysvideo_27_0 ; error !	
 10623                              <1> 
 10624                              <1> ;sysvideo_26_4:
 10625                              <1> 	;mov	ebp, [u.usp] ; ebp points to user's registers
 10626                              <1> 	;mov	[ebp+20], edx ; return to user with EDX value 
 10627                              <1> 	;mov	[ebp+16], ebx ; EBX
 10628                              <1> 	;mov	[ebp+24], ecx ; ECX
 10629                              <1> 	; eax = physical address of video memory (LFB)
 10630                              <1> 	;mov	[u.r0], eax
 10631                              <1> 	;jmp	sysret
 10632 0000FD80 E92CFCFFFF          <1> 	jmp	sysvideo_26_4
 10633                              <1> 
 10634                              <1> sysvideo_26_5:
 10635 0000FD85 66A1[110F0000]      <1> 	mov	ax, [def_LFB_addr] ; default LFB for mode 118h
 10636                              <1> 	; ah must be 0C0h or 0D0h or E0h
 10637                              <1> 	; others are nonsence !?
 10638 0000FD8B 08E4                <1>  	or	ah, ah
 10639                              <1> 	;jz	short sysvideo_25 ; invalid lfb addr or
 10640                              <1> 			  	; it is not a vbe2 -bochs emu- 
 10641                              <1> 			  	; or vbe3 -real- video bios
 10642                              <1> 	; 28/02/2021
 10643 0000FD8D 7426                <1> 	jz	short sysvideo_27_0 ; invalid LFB address
 10644                              <1>  
 10645 0000FD8F 80FCF0              <1> 	cmp	ah, 0F0h  
 10646                              <1> 	;jnb	short sysvideo_25 ; nonsence !?
 10647                              <1> 	; 28/02/2021
 10648 0000FD92 7321                <1> 	jnb	short sysvideo_27_0 ; nonsence !?
 10649                              <1> 
 10650 0000FD94 C1E010              <1> 	shl	eax, 16
 10651                              <1> 	;jz	short sysvideo_25 ; eax = 0 
 10652                              <1> 
 10653 0000FD97 81FB00907E00        <1> 	cmp	ebx, 1920*1080*4 ; maximum value of possible
 10654                              <1> 				 ; buffer sizes
 10655 0000FD9D 76CF                <1> 	jna	short sysvideo_26_3  ; buffer size is proper
 10656                              <1> 	; resize buffer to fit 4GB limit
 10657 0000FD9F BB00907E00          <1> 	mov	ebx, 1920*1080*4
 10658 0000FDA4 EBC8                <1> 	jmp	short sysvideo_26_3
 10659                              <1> 
 10660                              <1> sysvideo_27:
 10661                              <1> 	; 23/07/2022
 10662                              <1> 	; 16/02/2021
 10663                              <1> 	; 18/01/2021
 10664 0000FDA6 80FF0C              <1> 	cmp	bh, 12
 10665                              <1> 	;ja	sysvideo_28 ; 19/01/2021
 10666                              <1> 	; 23/07/2022
 10667 0000FDA9 7605                <1> 	jna	short sysvideo_27_24
 10668 0000FDAB E970010000          <1> 	jmp	sysvideo_28
 10669                              <1> 
 10670                              <1> sysvideo_27_24:	; 23/07/2022
 10671                              <1> 	; BH = 12
 10672                              <1> 	; Font sub functions.
 10673                              <1> 	; 12/02/2021
 10674                              <1> 	; 11/01/2021
 10675                              <1> 	; 10/01/2021
 10676                              <1> 	;   BL = 0 : Disable system font overwrite
 10677                              <1> 	;   BL = 1 : Enable system font overwrite
 10678                              <1> 	;   BL = 2 : Read system font 8x8
 10679                              <1> 	;   BL = 3 : Read system font 8x14
 10680                              <1> 	;   BL = 4 : Read system font 8x16
 10681                              <1> 	;   BL = 5 : Read user defined font 8x8
 10682                              <1> 	;   BL = 6 : Read user defined font 8x16
 10683                              <1> 	;   BL = 7 : Write system font 8x8
 10684                              <1> 	;   BL = 8 : Write system font 8x14
 10685                              <1> 	;   BL = 9 : Write system font 8x16
 10686                              <1> 	;   BL = 10 : Write user defined font 8x8
 10687                              <1> 	;   BL = 11 : Write user defined font 8x16
 10688                              <1> 	;
 10689                              <1> 	;  BL > 11 : invalid (not implemented)
 10690                              <1> 	;
 10691                              <1> 	; For BL = 1 to 11
 10692                              <1> 	;   ECX = number of characters (<= 256)
 10693                              <1> 	;   EDX = first character (ascii code in DL)
 10694                              <1> 	;   ESI = user's buffer address
 10695                              <1> 	;
 10696                              <1> 	; Return: EAX = character count 
 10697                              <1> 
 10698 0000FDB0 80FB0B              <1> 	cmp	bl, 11
 10699 0000FDB3 7605                <1> 	jna	short sysvideo_27_1
 10700                              <1> sysvideo_27_0:
 10701 0000FDB5 E99DD0FFFF          <1> 	jmp	sysret ; not implemented yet !		
 10702                              <1> sysvideo_27_1:
 10703 0000FDBA 66B80001            <1> 	mov	ax, 256
 10704 0000FDBE 08DB                <1> 	or	bl, bl
 10705 0000FDC0 750E                <1>  	jnz	short sysvideo_27_3
 10706                              <1> 	
 10707                              <1> 	; bl = 0
 10708                              <1> 	; disable system font overwrite 
 10709                              <1> 
 10710 0000FDC2 8025[369F0100]7F    <1> 	and	byte [ufont], 7Fh ; clear bit 7
 10711                              <1> sysvideo_27_2:
 10712                              <1> 	;mov	word [u.r0], 256  ; > 0 -> successful
 10713 0000FDC9 A3[20900100]        <1> 	mov	[u.r0], eax ; 256
 10714 0000FDCE EBE5                <1> 	jmp	short sysvideo_27_0
 10715                              <1> sysvideo_27_3:
 10716 0000FDD0 80FB01              <1> 	cmp	bl, 1
 10717 0000FDD3 7710                <1> 	ja	short sysvideo_27_4
 10718                              <1> 
 10719                              <1> 	; bl = 1
 10720                              <1> 	; enable system font overwrite 
 10721                              <1> 	;	if [multi_tasking]= 0 and [u.uid] = 0
 10722                              <1> 
 10723                              <1> 	;cmp	byte [multi_tasking], 0 
 10724                              <1> 	;			; multi tasking enabled ?
 10725                              <1> 	;ja	short sysvideo_27_0 ; yes
 10726                              <1> 	;; 19/01/2021 
 10727                              <1> 	;; system maintenance or single user mode
 10728                              <1> 	;cmp	byte [u.uid], 0  ; root ?
 10729                              <1> 	;ja	short sysvideo_27_0 ; no
 10730                              <1> 
 10731                              <1> 	; 19/01/2021
 10732                              <1> 	; multi tasking & root check
 10733 0000FDD5 E8EBFEFFFF          <1> 	call	sysvideo_22_4
 10734 0000FDDA 73D9                <1> 	jnc	short sysvideo_27_0 ; not permitted
 10735                              <1> 
 10736                              <1> 	; [multi_tasking]= 0 and [u.uid] = 0
 10737                              <1> 
 10738 0000FDDC 800D[369F0100]80    <1> 	or	byte [ufont], 80h ; set bit 7
 10739                              <1> 		
 10740 0000FDE3 EBE4                <1>  	jmp	short sysvideo_27_2
 10741                              <1> 
 10742                              <1> sysvideo_27_4:
 10743 0000FDE5 09C9                <1> 	or	ecx, ecx
 10744 0000FDE7 74CC                <1> 	jz	short sysvideo_27_0
 10745 0000FDE9 21D2                <1> 	and	edx, edx
 10746 0000FDEB 7410                <1> 	jz	short sysvideo_27_4_0
 10747                              <1> 	;mov	ax, 256
 10748 0000FDED 39C1                <1> 	cmp	ecx, eax ; 256
 10749 0000FDEF 77C4                <1> 	ja	short sysvideo_27_0
 10750 0000FDF1 48                  <1> 	dec	eax
 10751 0000FDF2 39C2                <1> 	cmp	edx, eax ; 255
 10752 0000FDF4 77BF                <1> 	ja	short sysvideo_27_0
 10753 0000FDF6 40                  <1> 	inc	eax
 10754 0000FDF7 29D0                <1> 	sub	eax, edx ; 256 - DX
 10755 0000FDF9 39C8                <1> 	cmp	eax, ecx
 10756 0000FDFB 72B8                <1> 	jb	short sysvideo_27_0
 10757                              <1> 
 10758                              <1> sysvideo_27_4_0:
 10759 0000FDFD 89F5                <1> 	mov	ebp, esi
 10760                              <1> 
 10761 0000FDFF 80FB06              <1> 	cmp	bl, 6
 10762 0000FE02 7768                <1> 	ja	short sysvideo_27_13
 10763 0000FE04 7210                <1> 	jb	short sysvideo_27_5
 10764                              <1> 	; bl = 6
 10765 0000FE06 F605[369F0100]10    <1> 	test	byte [ufont], 16 ; 8x16 user font loaded ?
 10766 0000FE0D 74A6                <1> 	jz	short sysvideo_27_0
 10767                              <1> 	; read 8x16 user defined font
 10768 0000FE0F BE00400900          <1> 	mov	esi, VGAFONT16USER
 10769 0000FE14 EB0C                <1> 	jmp	short sysvideo_27_6
 10770                              <1> sysvideo_27_5:
 10771 0000FE16 80FB04              <1> 	cmp	bl, 4
 10772 0000FE19 7239                <1> 	jb	short sysvideo_27_11
 10773 0000FE1B 7721                <1> 	ja	short sysvideo_27_9
 10774                              <1> 	; bl = 4
 10775                              <1> 	; read 8x16 system font
 10776 0000FE1D BE[1C650100]        <1> 	mov	esi, vgafont16
 10777                              <1> sysvideo_27_6:
 10778                              <1> 	; read 8x16 font
 10779                              <1> 	;shl	dx, 4 ; * 16
 10780                              <1> 	;shl	cx, 4 ; * 16 ; 16 bytes per char
 10781                              <1> 	; 23/07/2022
 10782 0000FE22 C1E204              <1> 	shl	edx, 4 ; * 16
 10783 0000FE25 C1E104              <1> 	shl	ecx, 4 ; * 16
 10784                              <1> sysvideo_27_7:
 10785 0000FE28 89EF                <1> 	mov	edi, ebp
 10786                              <1> 	;add	edi, edx ; 16/02/2021
 10787 0000FE2A 01D6                <1> 	add	esi, edx
 10788                              <1> 	; ecx = byte count
 10789                              <1> 	; esi = source (in system memory)
 10790                              <1> 	; edi = destination (in user memory)
 10791 0000FE2C E860100000          <1> 	call	transfer_to_user_buffer
 10792 0000FE31 7206                <1> 	jc	short sysvideo_27_8
 10793 0000FE33 890D[20900100]      <1> 	mov	[u.r0], ecx	
 10794                              <1> sysvideo_27_8:
 10795 0000FE39 E919D0FFFF          <1> 	jmp	sysret
 10796                              <1> sysvideo_27_9:
 10797                              <1> 	; bl = 5
 10798 0000FE3E F605[369F0100]08    <1> 	test	byte [ufont], 8 ; 8x8 user font loaded ?
 10799 0000FE45 74F2                <1> 	jz	short sysvideo_27_8
 10800                              <1> 	; read 8x8 user defined font
 10801 0000FE47 BE00500900          <1> 	mov	esi, VGAFONT8USER
 10802                              <1> sysvideo_27_10:
 10803                              <1> 	; read 8x8 font
 10804                              <1> 	;shl	dx, 3 ; * 8
 10805                              <1> 	;shl	cx, 3 ; * 8 ; 8 bytes per char
 10806                              <1> 	; 23/07/2022
 10807 0000FE4C C1E203              <1> 	shl	edx, 3 ; * 8
 10808 0000FE4F C1E103              <1> 	shl	ecx, 3 ; * 8
 10809 0000FE52 EBD4                <1> 	jmp	short sysvideo_27_7
 10810                              <1> 
 10811                              <1> sysvideo_27_11:
 10812 0000FE54 80FB03              <1> 	cmp	bl, 3  ; 8x14 system font
 10813 0000FE57 720C                <1> 	jb	short sysvideo_27_12 ; 8x8 system font
 10814                              <1> 	; bl = 3
 10815                              <1> 	; read 8x14 system font 
 10816                              <1> 	;mov	al, 14
 10817                              <1> 	;mul	dl
 10818                              <1> 	;mov	dx, ax
 10819                              <1> 	;push	edx
 10820                              <1> 	;mov	ax, 14
 10821                              <1> 	;mul	cx
 10822                              <1> 	;mov	cx, ax
 10823                              <1> 	;pop	edx
 10824 0000FE59 E8A5000000          <1> 	call	sysvideo_27_14
 10825 0000FE5E BE[1C570100]        <1> 	mov	esi, vgafont14
 10826 0000FE63 EBC3                <1> 	jmp	short sysvideo_27_7	
 10827                              <1> 	
 10828                              <1> sysvideo_27_12:
 10829                              <1> 	; bl = 2
 10830                              <1> 	; read 8x8 system font 
 10831 0000FE65 BE[1C4F0100]        <1> 	mov	esi, vgafont8
 10832 0000FE6A EBE0                <1> 	jmp	short sysvideo_27_10
 10833                              <1> 
 10834                              <1> sysvideo_27_13:
 10835                              <1> 	; overwrite font
 10836 0000FE6C 80FB0A              <1> 	cmp	bl, 10
 10837 0000FE6F 776E                <1> 	ja	short sysvideo_27_22 ; 8x16 user font
 10838 0000FE71 7224                <1> 	jb	short sysvideo_27_15
 10839                              <1> 	; bl = 10
 10840 0000FE73 BF00500900          <1> 	mov	edi, VGAFONT8USER
 10841 0000FE78 F605[369F0100]08    <1> 	test	byte [ufont], 8 ; 8x8 user font loaded ?
 10842 0000FE7F 7556                <1> 	jnz	short sysvideo_27_21 ; yes
 10843 0000FE81 08ED                <1> 	or	ch, ch ; cx = 256
 10844                              <1> 	;jnz	short sysvideo_27_21 ; 256 chars
 10845 0000FE83 7406                <1> 	jz	short sysvideo_27_13_0
 10846 0000FE85 66B90008            <1> 	mov	cx, 8*256
 10847 0000FE89 EB35                <1> 	jmp	short sysvideo_27_18_0
 10848                              <1> sysvideo_27_13_0:
 10849                              <1> 	; copy system font to user font before overwrite
 10850 0000FE8B BE[1C4F0100]        <1> 	mov	esi, vgafont8
 10851                              <1> 	;push	edi
 10852                              <1> 	;push	ecx
 10853                              <1> 	;mov	cl, 64
 10854                              <1> 	;rep	movsd
 10855                              <1> 	;pop	ecx
 10856                              <1> 	;pop	edi
 10857                              <1> 	;mov	esi, ebp ; user's font buffer
 10858 0000FE90 E880000000          <1> 	call	sysvideo_27_23
 10859 0000FE95 EB40                <1> 	jmp	short sysvideo_27_21
 10860                              <1> 
 10861                              <1> sysvideo_27_15:
 10862                              <1> 	; check system font overwrite permission
 10863 0000FE97 F605[369F0100]80    <1> 	test	byte [ufont], 80h
 10864 0000FE9E 7499                <1> 	jz	short sysvideo_27_8
 10865                              <1> 
 10866 0000FEA0 80FB08              <1> 	cmp	bl, 8
 10867 0000FEA3 773A                <1> 	ja	short sysvideo_27_22 ; 8x16 system font
 10868 0000FEA5 722B                <1> 	jb	short sysvideo_27_20 ; 8x8 system font
 10869                              <1> 	; bl = 8
 10870                              <1> 	; overwrite 8x14 system font 
 10871                              <1> 	;mov	al, 14
 10872                              <1> 	;mul	dl
 10873                              <1> 	;mov	dx, ax
 10874                              <1> 	;push	edx
 10875                              <1> 	;mov	ax, 14
 10876                              <1> 	;mul	cx
 10877                              <1> 	;mov	cx, ax
 10878                              <1> 	;pop	edx
 10879 0000FEA7 E857000000          <1> 	call	sysvideo_27_14
 10880 0000FEAC BF[1C570100]        <1> 	mov	edi, vgafont14
 10881 0000FEB1 EB0B                <1> 	jmp	short sysvideo_27_18
 10882                              <1> sysvideo_27_16:
 10883                              <1> 	; bl = 9
 10884                              <1> 	; overwrite 8x16 system font
 10885 0000FEB3 BF[1C650100]        <1> 	mov	edi, vgafont16
 10886                              <1> sysvideo_27_17:
 10887                              <1> 	; overwrite 8x16 font
 10888                              <1> 	;shl	dx, 4 ; * 16
 10889                              <1> 	;shl	cx, 4 ; * 16 ; 16 bytes per char
 10890                              <1> 	; 23/07/2022
 10891 0000FEB8 C1E204              <1> 	shl	edx, 4 ; * 16
 10892 0000FEBB C1E104              <1> 	shl	ecx, 4 ; * 16
 10893                              <1> sysvideo_27_18:
 10894 0000FEBE 01D7                <1> 	add	edi, edx
 10895                              <1> 	;add	esi, edx ; 16/02/2021
 10896                              <1> sysvideo_27_18_0:
 10897                              <1> 	; ecx = byte count
 10898                              <1> 	; esi = source (in user memory)
 10899                              <1> 	; edi = destination (in system memory)
 10900 0000FEC0 E816100000          <1> 	call	transfer_from_user_buffer
 10901 0000FEC5 7206                <1> 	jc	short sysvideo_27_19
 10902 0000FEC7 890D[20900100]      <1> 	mov	[u.r0], ecx	
 10903                              <1> sysvideo_27_19:
 10904 0000FECD E985CFFFFF          <1> 	jmp	sysret
 10905                              <1> sysvideo_27_20:
 10906                              <1> 	; bl = 7
 10907                              <1> 	; overwrite 8x8 system font
 10908 0000FED2 BF[1C4F0100]        <1> 	mov	edi, vgafont8
 10909                              <1> sysvideo_27_21:
 10910                              <1> 	; overwrite 8x8 font
 10911                              <1> 	;shl	dx, 3 ; * 8
 10912                              <1> 	;shl	cx, 3 ; * 8 ; 8 bytes per char
 10913                              <1> 	; 23/07/2022
 10914 0000FED7 C1E203              <1> 	shl	edx, 3 ; * 8
 10915 0000FEDA C1E103              <1> 	shl	ecx, 3 ; * 8
 10916 0000FEDD EBDF                <1> 	jmp	short sysvideo_27_18
 10917                              <1> sysvideo_27_22:
 10918                              <1> 	; bl = 11
 10919                              <1> 	; overwrite 8x16 user defined font
 10920 0000FEDF BF00400900          <1> 	mov	edi, VGAFONT16USER
 10921 0000FEE4 F605[369F0100]10    <1> 	test	byte [ufont], 16 ; 8x16 user font loaded ?
 10922 0000FEEB 75CB                <1> 	jnz	short sysvideo_27_17 ; yes
 10923 0000FEED 08ED                <1> 	or	ch, ch ; cx = 256
 10924                              <1> 	;jnz	short sysvideo_27_17 ; 256 chars
 10925 0000FEEF 7406                <1> 	jz	short sysvideo_27_22_0
 10926 0000FEF1 66B90010            <1> 	mov	cx, 16*256
 10927 0000FEF5 EBC9                <1> 	jmp	short sysvideo_27_18_0
 10928                              <1> sysvideo_27_22_0:
 10929                              <1> 	; copy system font to user font before overwrite
 10930 0000FEF7 BE[1C650100]        <1> 	mov	esi, vgafont16
 10931                              <1> 	;push	edi
 10932                              <1> 	;push	ecx
 10933                              <1> 	;mov	cl, 64
 10934                              <1> 	;rep	movsd
 10935                              <1> 	;pop	ecx
 10936                              <1> 	;pop	edi
 10937                              <1> 	;mov	esi, ebp ; user's font buffer
 10938 0000FEFC E814000000          <1> 	call	sysvideo_27_23
 10939 0000FF01 EBB5                <1> 	jmp	short sysvideo_27_17
 10940                              <1> 
 10941                              <1> sysvideo_27_14:
 10942                              <1> 	; 16/02/2021
 10943 0000FF03 52                  <1> 	push	edx
 10944 0000FF04 66B80E00            <1> 	mov	ax, 14	
 10945 0000FF08 66F7E1              <1> 	mul	cx
 10946 0000FF0B 89C1                <1> 	mov	ecx, eax
 10947 0000FF0D 5A                  <1> 	pop	edx
 10948 0000FF0E B00E                <1> 	mov	al, 14
 10949 0000FF10 F6E2                <1> 	mul	dl
 10950 0000FF12 89C2                <1> 	mov	edx, eax
 10951 0000FF14 C3                  <1> 	retn
 10952                              <1> 
 10953                              <1> 	;mov	al, 14
 10954                              <1> 	;mul	dl
 10955                              <1> 	;mov	dx, ax
 10956                              <1> 	;push	edx
 10957                              <1> 	;; 12/02/2021
 10958                              <1> 	;mov	ax, 14
 10959                              <1> 	;;mov	eax, 14
 10960                              <1> 	;;mul	cx
 10961                              <1> 	;mul	ecx
 10962                              <1> 	;;mov	cx, ax
 10963                              <1> 	;mov	ecx, eax
 10964                              <1> 	;pop	edx
 10965                              <1> 	;retn	
 10966                              <1> 
 10967                              <1> sysvideo_27_23:
 10968 0000FF15 57                  <1> 	push	edi
 10969 0000FF16 51                  <1> 	push	ecx
 10970 0000FF17 B140                <1> 	mov	cl, 64
 10971 0000FF19 F3A5                <1> 	rep	movsd
 10972 0000FF1B 59                  <1> 	pop	ecx
 10973 0000FF1C 5F                  <1> 	pop	edi
 10974 0000FF1D 89EE                <1> 	mov	esi, ebp ; user's font buffer
 10975 0000FF1F C3                  <1> 	retn
 10976                              <1> 
 10977                              <1> sysvideo_28:
 10978                              <1> 	; 23/07/2022
 10979                              <1> 	; 24/01/2021
 10980                              <1> 	; 23/01/2021
 10981                              <1> 	; 18/01/2021
 10982 0000FF20 80FF0E              <1> 	cmp	bh, 14
 10983                              <1> 	;jb	sysvideo_29
 10984                              <1> 	; 23/07/2022
 10985 0000FF23 7222                <1> 	jb	short sysvideo_28_29
 10986                              <1> 	;ja	sysvideo_30
 10987                              <1> 	; 23/07/2022
 10988 0000FF25 7725                <1> 	ja	short sysvideo_28_30
 10989                              <1> 
 10990                              <1> 	; BH = 14
 10991                              <1> 	; Save/Restore Super VGA video state
 10992                              <1> 	
 10993                              <1> 	; BL = options
 10994                              <1> 	;	bit 0 - Save (0) or Restore (1)	
 10995                              <1> 	;	bit 1 - controller hardware state
 10996                              <1> 	;	bit 2 - BIOS data state
 10997                              <1> 	;	bit 3 - DAC state
 10998                              <1> 	;	bit 4 - (extended) Register state
 10999                              <1> 	;	bit 5 - system (0) or user (1) memory
 11000                              <1> 	;	bit 6 - verify without transfer
 11001                              <1> 	;	bit 7 - not used (must be 0)
 11002                              <1> 
 11003                              <1> 	; ECX = Buffer address or VideoStateID
 11004                              <1> 
 11005 0000FF27 803D[86090000]02    <1> 	cmp	byte [vbe3], 2 ;  VESA VBE2 or VBE3 ?
 11006 0000FF2E 7721                <1> 	ja	short sysvideo_28_0 ; yes
 11007 0000FF30 7210                <1> 	jb	short sysvideo_28_16 ; not a SVGA sys !
 11008                              <1> 
 11009                              <1> 	; == VBE2 ==
 11010                              <1> 	; Check Bochs/Qemu/VirtualBox PC emulator
 11011                              <1> 	; (vbe2 is usable only for emulator's vbios)
 11012 0000FF32 8A25[87090000]      <1> 	mov	ah, [vbe2bios]
 11013 0000FF38 80FCC0              <1> 	cmp	ah, 0C0h	
 11014 0000FF3B 7205                <1> 	jb	short sysvideo_28_16 ; unknown vbios !
 11015 0000FF3D 80FCC5              <1> 	cmp	ah, 0C5h
 11016 0000FF40 760F                <1> 	jna	short sysvideo_28_0
 11017                              <1> 		; Use kernel's vbios functions (video.s)
 11018                              <1> sysvideo_28_16:
 11019                              <1> 	; unknown vbios !
 11020 0000FF42 E910CFFFFF          <1> 	jmp	sysret
 11021                              <1> 
 11022                              <1> sysvideo_28_29:
 11023                              <1> 	; 23/07/2022
 11024 0000FF47 E955010000          <1> 	jmp	sysvideo_29
 11025                              <1> sysvideo_28_30:
 11026                              <1> 	; 23/07/2022
 11027 0000FF4C E935020000          <1> 	jmp	sysvideo_30	
 11028                              <1> 
 11029                              <1> sysvideo_28_0:
 11030 0000FF51 80FB7F              <1> 	cmp	bl, 7Fh
 11031 0000FF54 77EC                <1> 	ja	short sysvideo_28_16 ; unknown options
 11032                              <1> 
 11033 0000FF56 88DA                <1> 	mov	dl, bl
 11034 0000FF58 80E21F              <1> 	and	dl, 1Fh 
 11035 0000FF5B D0EA                <1> 	shr	dl, 1
 11036 0000FF5D 74E3                <1> 	jz	short sysvideo_28_16 ; invalid !
 11037                              <1> 	; DL = VBE Function 4F04h Save/Restore options 	
 11038                              <1> 	;  bit 0 : controller hardware state
 11039                              <1> 	;  bit 1 : BIOS data state
 11040                              <1> 	;  bit 2 : DAC state
 11041                              <1> 	;  bit 3 : (extended) Register state
 11042                              <1> 	
 11043 0000FF5F F6C320              <1> 	test	bl, 32 ; bit 5
 11044                              <1> 	;jnz	sysvideo_28_7 ; user buffer
 11045                              <1> 	; 23/07/2022
 11046 0000FF62 7405                <1> 	jz	short sysvideo_28_17
 11047 0000FF64 E9B1000000          <1> 	jmp	sysvideo_28_7
 11048                              <1> 
 11049                              <1> sysvideo_28_17:	 ; 23/07/2022
 11050                              <1> 	; source or destination is kernel/system buffer
 11051                              <1> 
 11052 0000FF69 803D[389F0100]00    <1> 	cmp	byte [srvsf], 0 ; srs permission flag
 11053 0000FF70 76D0                <1> 	jna	short sysvideo_28_16 ; not permitted
 11054                              <1> 
 11055 0000FF72 F6C301              <1> 	test	bl, 1
 11056 0000FF75 743A                <1> 	jz	short sysvideo_28_4 ; Save
 11057                              <1> 
 11058                              <1> 	; Restore
 11059 0000FF77 3B0D[3A9F0100]      <1> 	cmp	ecx, [VideoStateID]
 11060 0000FF7D 75C3                <1> 	jne	short sysvideo_28_16 ; not correct ID !
 11061                              <1> 		
 11062 0000FF7F 0FB6CA              <1> 	movzx	ecx, dl
 11063 0000FF82 80CA80              <1> 	or	dl, 80h
 11064 0000FF85 3A15[399F0100]      <1> 	cmp	dl, [srvso]
 11065 0000FF8B 75B5                <1> 	jne	short sysvideo_28_16 ; not correct !
 11066                              <1> 
 11067 0000FF8D 88DA                <1> 	mov	dl, bl
 11068                              <1> 
 11069                              <1> 	; ecx = cl = options
 11070 0000FF8F E8943BFFFF          <1> 	call	vbe_srs_gbs
 11071                              <1> 	; ebx = state buffer size (data size)
 11072                              <1> 
 11073 0000FF94 891D[20900100]      <1> 	mov	[u.r0], ebx
 11074                              <1> 
 11075 0000FF9A F6C240              <1> 	test	dl, 64 ; verify without transfer
 11076 0000FF9D 75A3                <1> 	jnz	short sysvideo_28_16 ; yes
 11077                              <1> 
 11078 0000FF9F BE00580900          <1> 	mov	esi, VBE3VIDEOSTATE	
 11079 0000FFA4 BF00760900          <1> 	mov	edi, VBE3SAVERESTOREBLOCK
 11080 0000FFA9 87CB                <1> 	xchg	ecx, ebx
 11081 0000FFAB F3A4                <1> 	rep	movsb
 11082                              <1> 	
 11083 0000FFAD 88D9                <1> 	mov	cl, bl
 11084                              <1> 
 11085                              <1> 	; 23/01/2021
 11086 0000FFAF EB44                <1> 	jmp	short sysvideo_28_10
 11087                              <1> 
 11088                              <1> sysvideo_28_4:
 11089 0000FFB1 53                  <1> 	push	ebx	
 11090                              <1> 	; 24/01/2021
 11091 0000FFB2 31DB                <1> 	xor	ebx, ebx ; 0 ; use kernel's buffer
 11092 0000FFB4 881D[399F0100]      <1> 	mov	[srvso], bl ; 0 ; invalidate
 11093 0000FFBA 891D[3A9F0100]      <1> 	mov	[VideoStateID], ebx ; 0 ; invalidate
 11094 0000FFC0 0FB6CA              <1> 	movzx	ecx, dl ; options
 11095 0000FFC3 B201                <1> 	mov	dl, 1 ; save state		
 11096 0000FFC5 E890000000          <1> 	call	sysvideo_28_11 ; 23/01/2021
 11097                              <1> 	; Note: VBE3 BIOS data save option will be
 11098                              <1> 	;	disabled.. ; 24/01/2021
 11099 0000FFCA 89CA                <1> 	mov	edx, ecx ; state (save) options
 11100 0000FFCC 5B                  <1> 	pop	ebx
 11101                              <1> 	
 11102 0000FFCD 6683F84F            <1> 	cmp	ax, 4Fh ; successful ?
 11103 0000FFD1 7536                <1> 	jne	short sysvideo_28_3 ; no !
 11104                              <1> 
 11105 0000FFD3 F6C340              <1> 	test	bl, 64 ; verify without transfer
 11106 0000FFD6 7536                <1> 	jnz	short sysvideo_28_6 ; yes
 11107                              <1> 
 11108                              <1> 	; ecx = cl = options
 11109 0000FFD8 E84B3BFFFF          <1> 	call	vbe_srs_gbs
 11110                              <1> 	; ebx = state buffer size (data size)
 11111                              <1> 
 11112 0000FFDD BE00760900          <1> 	mov	esi, VBE3SAVERESTOREBLOCK
 11113 0000FFE2 BF00580900          <1> 	mov	edi, VBE3VIDEOSTATE	
 11114 0000FFE7 89D9                <1> 	mov	ecx, ebx
 11115 0000FFE9 F3A4                <1> 	rep	movsb
 11116                              <1> 
 11117 0000FFEB 88D1                <1> 	mov	cl, dl
 11118 0000FFED 80C980              <1> 	or	cl, 80h ; SVGA (VESA VBE) flag
 11119                              <1> 	;mov	[srvso], dl
 11120                              <1> 
 11121 0000FFF0 E908010000          <1> 	jmp	sysvideo_28_15
 11122                              <1> 
 11123                              <1> 	; 23/01/2021
 11124                              <1> sysvideo_28_10:
 11125                              <1> 	; CL = VESA VBE3 Save/Restore options
 11126                              <1> 
 11127 0000FFF5 B202                <1> 	mov	dl, 2 ; restore state
 11128                              <1> 
 11129 0000FFF7 E85C000000          <1> 	call	sysvideo_28_1
 11130                              <1> 
 11131 0000FFFC 6683F84F            <1> 	cmp	ax, 4Fh ; successful ?
 11132 00010000 7407                <1> 	je	short sysvideo_28_3
 11133                              <1> 	;jmp	short sysvideo_28_9 
 11134                              <1> 
 11135                              <1> sysvideo_28_9:
 11136                              <1> 	; return zero size (error) to user
 11137 00010002 29C0                <1> 	sub	eax, eax
 11138                              <1> sysvideo_28_5:
 11139 00010004 A3[20900100]        <1> 	mov	[u.r0], eax
 11140                              <1> sysvideo_28_3:
 11141 00010009 E949CEFFFF          <1> 	jmp	sysret
 11142                              <1> 
 11143                              <1> sysvideo_28_6:
 11144                              <1> 	; use timer ticks as VideoStateID
 11145 0001000E A1[08790100]        <1> 	mov	eax, [TIMER_LH]
 11146 00010013 09C0                <1> 	or 	eax, eax
 11147 00010015 75ED                <1> 	jnz	short sysvideo_28_5
 11148 00010017 40                  <1> 	inc	eax
 11149 00010018 EBEA                <1> 	jmp	short sysvideo_28_5
 11150                              <1> 
 11151                              <1> sysvideo_28_7:
 11152                              <1> 	; save/restore to/from user buffer
 11153                              <1> 
 11154                              <1> 	; 23/01/2021
 11155 0001001A 89CE                <1> 	mov	esi, ecx ; user's vstate buffer
 11156 0001001C BF00760900          <1> 	mov	edi, VBE3SAVERESTOREBLOCK
 11157                              <1> 
 11158 00010021 0FB6CA              <1> 	movzx	ecx, dl ; VESA VBE func 4F04h options
 11159                              <1> 
 11160                              <1> 	; source or destination is user buffer
 11161 00010024 F6C301              <1> 	test	bl, 1
 11162 00010027 7444                <1> 	jz	short sysvideo_28_12  ; Save
 11163                              <1> 
 11164                              <1> 	; Restore
 11165 00010029 803D[389F0100]00    <1> 	cmp	byte [srvsf], 0 ; srs permission flag
 11166 00010030 766A                <1> 	jna	short sysvideo_28_14 ; not permitted
 11167                              <1> 
 11168 00010032 88DA                <1> 	mov	dl, bl ; 'sysvideo' options
 11169                              <1> 
 11170                              <1> 	; ecx = cl = options
 11171 00010034 E8EF3AFFFF          <1> 	call	vbe_srs_gbs
 11172                              <1> 	; ebx = state buffer size (data size)
 11173                              <1> 
 11174 00010039 891D[20900100]      <1> 	mov	[u.r0], ebx ; transfer count
 11175                              <1> 
 11176 0001003F F6C240              <1> 	test	dl, 64 ; verify without transfer
 11177 00010042 7558                <1> 	jnz	short sysvideo_28_14 ; yes
 11178                              <1>  
 11179 00010044 6681FB0008          <1> 	cmp	bx, 2048
 11180 00010049 73B7                <1> 	jnb	short sysvideo_28_9 ; invalid
 11181                              <1> 
 11182 0001004B 87CB                <1> 	xchg	ecx, ebx
 11183                              <1> 	; esi = user buffer
 11184                              <1> 	; edi = VBE3SAVERESTOREBLOCK
 11185                              <1> 
 11186 0001004D E8890E0000          <1> 	call	transfer_from_user_buffer
 11187 00010052 72AE                <1> 	jc	short sysvideo_28_9 ; error 
 11188                              <1> 
 11189 00010054 89D9                <1> 	mov	ecx, ebx ; Function 4F04h options
 11190 00010056 EB9D                <1> 	jmp	short sysvideo_28_10 ; 23/01/2021
 11191                              <1> 
 11192                              <1> sysvideo_28_1:
 11193 00010058 31DB                <1> 	xor	ebx, ebx ; 0 ; use kernel's buffer
 11194                              <1> sysvideo_28_11:
 11195                              <1> 	; 24/01/2021
 11196 0001005A 803D[86090000]03    <1> 	cmp	byte [vbe3], 3
 11197 00010061 7405                <1> 	je	short sysvideo_28_2
 11198                              <1> 
 11199                              <1> 	; VESA VBE2 (BOCHS/QEMU/VBOX) video bios
 11200 00010063 E9293AFFFF          <1> 	jmp	_vbe_biosfn_save_restore_state
 11201                              <1> sysvideo_28_2:
 11202                              <1> 	;24/01/2021
 11203                              <1> 	;mov	eax, 4F04h  ; Save/Restore vstate
 11204                              <1> 	; VESA VBE3 video bios
 11205 00010068 E99F19FFFF          <1> 	jmp	_vbe3_pmfn_save_restore_state
 11206                              <1> 	
 11207                              <1> sysvideo_28_12:
 11208                              <1> 	; Save
 11209                              <1> 	;mov	edi, VBE3SAVERESTOREBLOCK
 11210                              <1> 
 11211                              <1> 	;movzx	ecx, dl ; options
 11212 0001006D 56                  <1> 	push	esi
 11213 0001006E 53                  <1> 	push	ebx
 11214                              <1> 	; 23/01/2021
 11215 0001006F B201                <1> 	mov	dl, 1 ; save state
 11216 00010071 E8E2FFFFFF          <1> 	call	sysvideo_28_1
 11217 00010076 5A                  <1> 	pop	edx ; 'sysvideo' options
 11218 00010077 5F                  <1> 	pop	edi ; user's video state buffer
 11219                              <1> 
 11220 00010078 6683F84F            <1> 	cmp	ax, 4Fh ; successful ?
 11221 0001007C 751E                <1> 	jne	short sysvideo_28_14 ; no !
 11222                              <1> 
 11223                              <1> 	; ecx = cl = options
 11224 0001007E E8A53AFFFF          <1> 	call	vbe_srs_gbs
 11225                              <1> 	; ebx = state buffer size (data size)
 11226                              <1> 
 11227 00010083 89D9                <1> 	mov	ecx, ebx ; transfer count
 11228                              <1> 
 11229 00010085 F6C240              <1> 	test	dl, 64 ; verify without transfer
 11230 00010088 750C                <1> 	jnz	short sysvideo_28_13 ; yes
 11231                              <1> 		
 11232                              <1> 	;mov	edi, esi
 11233 0001008A BE00760900          <1> 	mov	esi, VBE3SAVERESTOREBLOCK
 11234 0001008F E8FD0D0000          <1> 	call	transfer_to_user_buffer
 11235 00010094 7206                <1> 	jc	short sysvideo_28_14
 11236                              <1> sysvideo_28_13:
 11237 00010096 890D[20900100]      <1> 	mov	[u.r0], ecx
 11238                              <1> sysvideo_28_14:
 11239 0001009C E9B6CDFFFF          <1> 	jmp	sysret
 11240                              <1> 
 11241                              <1> sysvideo_29:
 11242                              <1> 	; 18/01/2021
 11243                              <1> 	; BH = 13
 11244                              <1> 	; Save/Restore std VGA video state
 11245                              <1> 
 11246                              <1> 	; bl = 0..3
 11247                              <1> 	;	save to or restore from
 11248                              <1> 	;	system buffer, VBE3VIDEOSTATE
 11249                              <1> 	;	ECX = VideoStateID for restoring	
 11250                              <1> 	; bl = 4..7
 11251                              <1> 	;	save to or restore from
 11252                              <1> 	;	user buffer pointed by ECX
 11253                              <1> 		   	
 11254 000100A1 80FB03              <1> 	cmp	bl, 3
 11255 000100A4 7776                <1> 	ja	short sysvideo_29_6
 11256                              <1> 
 11257                              <1> 	; source or destination is kernel/system buffer
 11258                              <1> 
 11259 000100A6 803D[389F0100]00    <1> 	cmp	byte [srvsf], 0 ; srs permission flag
 11260 000100AD 7668                <1> 	jna	short sysvideo_29_5 ; not permitted
 11261                              <1> 
 11262 000100AF F6C301              <1> 	test	bl, 1
 11263 000100B2 7437                <1> 	jz	short sysvideo_29_2  ; Save
 11264                              <1> 
 11265                              <1> 	; Restore
 11266 000100B4 3B0D[3A9F0100]      <1> 	cmp	ecx, [VideoStateID]
 11267 000100BA 755B                <1> 	jne	short sysvideo_29_5 ; not correct ID !
 11268 000100BC 80FB01              <1> 	cmp	bl, 1
 11269 000100BF 7709                <1> 	ja	short sysvideo_29_0
 11270                              <1> 	; bl = 1
 11271 000100C1 BB6E000000          <1> 	mov	ebx, 110 
 11272 000100C6 B103                <1> 	mov	cl, 3 ; ctrl, vbios data
 11273 000100C8 EB07                <1> 	jmp	short sysvideo_29_1
 11274                              <1> sysvideo_29_0:
 11275                              <1>  	; bl  = 3
 11276 000100CA BB72030000          <1> 	mov	ebx, 882 
 11277 000100CF B107                <1> 	mov	cl, 7 ; ctrl, vbios data, dac
 11278                              <1> sysvideo_29_1:
 11279 000100D1 3A0D[399F0100]      <1> 	cmp	cl, [srvso]
 11280 000100D7 753E                <1> 	jne	short sysvideo_29_5 ; not correct !
 11281                              <1> 
 11282 000100D9 BE00580900          <1> 	mov	esi, VBE3VIDEOSTATE ; 22/01/2021
 11283 000100DE E8D93BFFFF          <1> 	call	biosfn_restore_video_state
 11284 000100E3 891D[20900100]      <1> 	mov	[u.r0], ebx ; video state size (bytes)
 11285                              <1> 	;jmp	sysret
 11286 000100E9 EB2C                <1> 	jmp	short sysvideo_29_5	
 11287                              <1> sysvideo_29_2:
 11288                              <1> 	;mov	esi, ecx
 11289 000100EB BF00580900          <1> 	mov	edi, VBE3VIDEOSTATE
 11290                              <1> 	
 11291 000100F0 B107                <1> 	mov	cl, 7 ; ctrl, vbios data, dac
 11292 000100F2 08DB                <1> 	or	bl, bl
 11293 000100F4 7502                <1> 	jnz	short sysvideo_29_3 ; bl = 2
 11294                              <1> 	; bl = 0 
 11295 000100F6 B103                <1> 	mov	cl, 3 ; ctrl, vbios data
 11296                              <1> sysvideo_29_3:
 11297 000100F8 E8573AFFFF          <1> 	call	biosfn_save_video_state
 11298                              <1> sysvideo_28_15:
 11299                              <1> 	; use timer ticks as VideoStateID
 11300 000100FD A1[08790100]        <1> 	mov	eax, [TIMER_LH]
 11301 00010102 21C0                <1> 	and 	eax, eax
 11302 00010104 7501                <1> 	jnz	short sysvideo_29_4
 11303 00010106 40                  <1> 	inc	eax
 11304                              <1> sysvideo_29_4:
 11305 00010107 880D[399F0100]      <1> 	mov	[srvso], cl
 11306 0001010D A3[3A9F0100]        <1> 	mov	[VideoStateID], eax
 11307 00010112 A3[20900100]        <1> 	mov	[u.r0], eax
 11308                              <1> sysvideo_29_5:
 11309 00010117 E93BCDFFFF          <1> 	jmp	sysret
 11310                              <1> 
 11311                              <1> sysvideo_29_6:
 11312 0001011C 80FB07              <1> 	cmp	bl, 7
 11313 0001011F 77F6                <1> 	ja	short sysvideo_29_5 ; invalid sub function 
 11314                              <1> 
 11315 00010121 89CE                <1> 	mov	esi, ecx
 11316 00010123 BF00760900          <1> 	mov	edi, VBE3SAVERESTOREBLOCK
 11317                              <1> 
 11318                              <1> 	; source or destination is user buffer
 11319 00010128 F6C301              <1> 	test	bl, 1
 11320 0001012B 7434                <1> 	jz	short sysvideo_29_9  ; Save
 11321                              <1> 
 11322                              <1> 	; Restore
 11323 0001012D 803D[389F0100]00    <1> 	cmp	byte [srvsf], 0 ; srs permission flag
 11324 00010134 76E1                <1> 	jna	short sysvideo_29_5 ; not permitted
 11325                              <1> 	
 11326                              <1> 	;mov	esi, ecx
 11327                              <1> 	;mov	edi, VBE3SAVERESTOREBLOCK
 11328                              <1> 	
 11329 00010136 80FB07              <1> 	cmp	bl, 7
 11330 00010139 7409                <1> 	je	short sysvideo_29_7
 11331                              <1> 	; bl = 5 
 11332 0001013B B303                <1> 	mov	bl, 3
 11333 0001013D B96E000000          <1> 	mov	ecx, 110
 11334 00010142 EB05                <1> 	jmp	short sysvideo_29_8
 11335                              <1> sysvideo_29_7:
 11336                              <1> 	; bl = 7
 11337 00010144 B972030000          <1> 	mov	ecx, 882
 11338                              <1> sysvideo_29_8:
 11339 00010149 E88D0D0000          <1> 	call	transfer_from_user_buffer
 11340 0001014E 72C7                <1> 	jc	short sysvideo_29_5
 11341 00010150 890D[20900100]      <1> 	mov	[u.r0], ecx
 11342 00010156 88D9                <1> 	mov	cl, bl ; mov cl,7 (mov cl,3)
 11343 00010158 89FE                <1> 	mov	esi, edi ; VBE3SAVERESTOREBLOCK
 11344                              <1> 	; cl = 3 or 7  	
 11345 0001015A E85D3BFFFF          <1> 	call	biosfn_restore_video_state
 11346 0001015F EBB6                <1> 	jmp	sysvideo_29_5
 11347                              <1> 	;jmp	sysret
 11348                              <1> sysvideo_29_9:
 11349                              <1> 	; Save
 11350                              <1> 	;mov	edi, VBE3SAVERESTOREBLOCK
 11351                              <1> 
 11352 00010161 80FB06              <1> 	cmp	bl, 6
 11353 00010164 7409                <1> 	je	short sysvideo_29_10
 11354                              <1> 	; bl = 4
 11355 00010166 BB6E000000          <1> 	mov	ebx, 110
 11356 0001016B B103                <1> 	mov	cl, 3 ; ctrl, vbios data
 11357 0001016D EB07                <1> 	jmp	short sysvideo_29_11
 11358                              <1> sysvideo_29_10:
 11359                              <1> 	; bl = 6
 11360 0001016F BB72030000          <1> 	mov	ebx, 882
 11361 00010174 B107                <1> 	mov	cl, 7 ; ctrl, vbios data, dac
 11362                              <1> sysvideo_29_11:
 11363 00010176 E8D939FFFF          <1> 	call	biosfn_save_video_state
 11364                              <1> 
 11365 0001017B 89D9                <1> 	mov	ecx, ebx ; transfer count
 11366 0001017D 89F7                <1> 	mov	edi, esi
 11367 0001017F BE00760900          <1> 	mov	esi, VBE3SAVERESTOREBLOCK
 11368                              <1> 
 11369                              <1> 	;call	transfer_to_user_buffer
 11370                              <1> 	;jc	short sysvideo_29_5
 11371                              <1> 	;mov	[u.r0], ecx ; transfer count
 11372                              <1> 	;;jmp	sysret
 11373                              <1> 	;jmp	short sysvideo_29_5
 11374                              <1>  
 11375 00010184 EB1A                <1> 	jmp	short sysvideo_29_12
 11376                              <1> 
 11377                              <1> sysvideo_30:	 
 11378 00010186 80FF0F              <1> 	cmp	bh, 15
 11379 00010189 7722                <1> 	ja	short sysvideo_31 ; invalid function
 11380                              <1> 	
 11381                              <1> 	; BH = 15
 11382                              <1> 	; Copy VESA EDID to user's buffer
 11383                              <1> 	
 11384 0001018B 803D[CA410000]4F    <1> 	cmp	byte [edid], 4Fh
 11385 00010192 7519                <1> 	jne	short sysvideo_31 ; not ready ! 
 11386                              <1> 
 11387                              <1> 	;and	ecx, ecx
 11388                              <1> 	;jz	short sysvideo_31
 11389                              <1> 
 11390                              <1> 	; ecx = user's buffer address
 11391 00010194 89CF                <1> 	mov	edi, ecx
 11392 00010196 BE[549E0100]        <1> 	mov	esi, edid_info
 11393 0001019B B980000000          <1> 	mov	ecx, 128 ; 128 bytes
 11394                              <1> sysvideo_29_12:
 11395 000101A0 E8EC0C0000          <1> 	call	transfer_to_user_buffer
 11396 000101A5 7206                <1> 	jc	short sysvideo_31
 11397                              <1> 
 11398 000101A7 890D[20900100]      <1> 	mov	[u.r0], ecx ; EDID size, 128 bytes
 11399                              <1> sysvideo_31:
 11400 000101AD E9A5CCFFFF          <1> 	jmp	sysret
 11401                              <1> 
 11402                              <1> mkdir:
 11403                              <1> 	; 04/12/2015 (14 byte directory names)
 11404                              <1> 	; 12/10/2015
 11405                              <1> 	; 17/06/2015 (Retro UNIX 386 v1 - Beginning)
 11406                              <1> 	; 29/04/2013 - 01/08/2013 (Retro UNIX 8086 v1)
 11407                              <1> 	;
 11408                              <1> 	; 'mkdir' makes a directory entry from the name pointed to
 11409                              <1> 	; by u.namep into the current directory.
 11410                              <1> 	;
 11411                              <1> 	; INPUTS ->
 11412                              <1> 	;    u.namep - points to a file name 
 11413                              <1> 	;	           that is about to be a directory entry.
 11414                              <1> 	;    ii - current directory's i-number.	
 11415                              <1> 	; OUTPUTS ->
 11416                              <1> 	;    u.dirbuf+2 - u.dirbuf+10 - contains file name. 
 11417                              <1> 	;    u.off - points to entry to be filled 
 11418                              <1> 	;	     in the current directory		
 11419                              <1> 	;    u.base - points to start of u.dirbuf.
 11420                              <1> 	;    r1 - contains i-number of current directory 
 11421                              <1> 	;	
 11422                              <1> 	; ((AX = R1)) output
 11423                              <1> 	;
 11424                              <1> 	;    (Retro UNIX Prototype : 11/11/2012, UNIXCOPY.ASM)
 11425                              <1>         ;    ((Modified registers: EAX, EDX, EBX, ECX, ESI, EDI, EBP))  
 11426                              <1> 	;
 11427                              <1> 
 11428                              <1> 	; 17/06/2015 - 32 bit modifications (Retro UNIX 386 v1)
 11429 000101B2 31C0                <1> 	xor 	eax, eax
 11430 000101B4 BF[5A900100]        <1> 	mov     edi, u.dirbuf+2
 11431 000101B9 89FE                <1> 	mov	esi, edi
 11432 000101BB AB                  <1> 	stosd
 11433 000101BC AB                  <1> 	stosd
 11434                              <1> 	; 04/12/2015 (14 byte directory names)
 11435 000101BD AB                  <1> 	stosd
 11436 000101BE 66AB                <1> 	stosw
 11437                              <1> 		; jsr r0,copyz; u.dirbuf+2; u.dirbuf+10. / clear this
 11438 000101C0 89F7                <1> 	mov	edi, esi ; offset to u.dirbuf
 11439                              <1> 	; 12/10/2015 ([u.namep] -> ebp)
 11440                              <1> 	;mov 	ebp, [u.namep]
 11441 000101C2 E8CE040000          <1> 	call	trans_addr_nmbp ; convert virtual address to physical
 11442                              <1> 		; esi = physical address (page start + offset)
 11443                              <1> 		; ecx = byte count in the page (1 - 4096)
 11444                              <1> 	; edi = offset to u.dirbuf (edi is not modified in trans_addr_nm)
 11445                              <1> 		; mov u.namep,r2 / r2 points to name of directory entry
 11446                              <1> 		; mov $u.dirbuf+2,r3 / r3 points to u.dirbuf+2
 11447                              <1> mkdir_1: ; 1: 
 11448 000101C7 45                  <1> 	inc	ebp ; 12/10/2015
 11449                              <1> 	;
 11450                              <1> 	; / put characters in the directory name in u.dirbuf+2 - u.dirbuf+10
 11451                              <1> 	 ; 01/08/2013
 11452 000101C8 AC                  <1> 	lodsb
 11453                              <1> 		; movb (r2)+,r1 / move character in name to r1
 11454 000101C9 20C0                <1> 	and 	al, al
 11455 000101CB 7427                <1> 	jz 	short mkdir_3 	  
 11456                              <1> 		; beq 1f / if null, done
 11457 000101CD 3C2F                <1> 	cmp	al, '/'
 11458                              <1> 		; cmp r1,$'/ / is it a "/"?
 11459 000101CF 7414                <1> 	je	short mkdir_err
 11460                              <1> 	;je	error
 11461                              <1> 		; beq error9 / yes, error
 11462                              <1> 	; 12/10/2015
 11463 000101D1 6649                <1> 	dec	cx
 11464 000101D3 7505                <1> 	jnz	short mkdir_2
 11465                              <1> 	; 12/10/2015 ([u.namep] -> ebp)
 11466 000101D5 E8C1040000          <1> 	call	trans_addr_nm ; convert virtual address to physical
 11467                              <1> 		; esi = physical address (page start + offset)
 11468                              <1> 		; ecx = byte count in the page
 11469                              <1> 	; edi = offset to u.dirbuf (edi is not modified in trans_addr_nm)
 11470                              <1> mkdir_2:
 11471 000101DA 81FF[68900100]      <1> 	cmp     edi, u.dirbuf+16 ; ; 04/12/2015 (10 -> 16) 
 11472                              <1> 		; cmp r3,$u.dirbuf+10. / have we reached the last slot for
 11473                              <1> 				     ; / a char?
 11474 000101E0 74E5                <1> 	je	short mkdir_1
 11475                              <1> 		; beq 1b / yes, go back
 11476 000101E2 AA                  <1> 	stosb
 11477                              <1> 		; movb r1,(r3)+ / no, put the char in the u.dirbuf
 11478 000101E3 EBE2                <1> 	jmp 	short mkdir_1
 11479                              <1> 		; br 1b / get next char
 11480                              <1> mkdir_err:
 11481                              <1> 	; 17/06/2015
 11482 000101E5 C705[88900100]1300- <1> 	mov	dword [u.error], ERR_NOT_DIR ; 'not a valid directory !'
 11482 000101ED 0000                <1>
 11483 000101EF E943CCFFFF          <1> 	jmp	error
 11484                              <1> 
 11485                              <1> mkdir_3: ; 1:
 11486 000101F4 A1[38900100]        <1> 	mov	eax, [u.dirp]
 11487 000101F9 A3[40900100]        <1> 	mov	[u.off], eax
 11488                              <1> 		; mov u.dirp,u.off / pointer to empty current directory
 11489                              <1> 				 ; / slot to u.off
 11490                              <1> wdir: ; 29/04/2013
 11491 000101FE C705[44900100]-     <1>         mov     dword [u.base], u.dirbuf
 11491 00010204 [58900100]          <1>
 11492                              <1> 		; mov $u.dirbuf,u.base / u.base points to created file name
 11493 00010208 C705[48900100]1000- <1>         mov     dword [u.count], 16 ; 04/12/2015 (10 -> 16) 
 11493 00010210 0000                <1>
 11494                              <1> 		; mov $10.,u.count / u.count = 10
 11495 00010212 66A1[24910100]      <1> 	mov	ax, [ii] 
 11496                              <1> 		; mov ii,r1 / r1 has i-number of current directory
 11497 00010218 B201                <1> 	mov	dl, 1 ; owner flag mask ; RETRO UNIX 8086 v1 modification !
 11498 0001021A E85E1C0000          <1> 	call 	access
 11499                              <1> 		; jsr r0,access; 1 / get i-node and set its file up 
 11500                              <1> 				 ; / for writing
 11501                              <1> 	; AX = i-number of current directory
 11502                              <1> 	; 01/08/2013
 11503 0001021F FE05[86900100]      <1> 	inc     byte [u.kcall] ; the caller is 'mkdir' sign	
 11504 00010225 E8C60E0000          <1> 	call	writei
 11505                              <1> 		; jsr r0,writei / write into directory
 11506 0001022A C3                  <1> 	retn	
 11507                              <1> 		; rts r0
 11508                              <1> 
 11509                              <1> sysexec:
 11510                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5
 11511                              <1> 	; 06/02/2022 - Retro UNIX 386 v1.2
 11512                              <1> 	; 18/11/2017
 11513                              <1> 	; 14/11/2017
 11514                              <1> 	; 13/11/2017
 11515                              <1> 	; 24/10/2016 - 04/01/2017
 11516                              <1> 	; 24/04/2016 - TRDOS 386 (TRDOS v2.0)
 11517                              <1> 	; 23/06/2015 - 23/10/2015 (Retro UNIX 386 v1)
 11518                              <1> 	; 03/06/2013 - 06/12/2013 (Retro UNIX 8086 v1)
 11519                              <1> 	;
 11520                              <1> 	; 'sysexec' initiates execution of a file whose path name if
 11521                              <1> 	; pointed to by 'name' in the sysexec call. 
 11522                              <1> 	; 'sysexec' performs the following operations:
 11523                              <1> 	;    1. obtains i-number of file to be executed via 'namei'.
 11524                              <1> 	;    2. obtains i-node of file to be exceuted via 'iget'.
 11525                              <1> 	;    3. sets trap vectors to system routines.
 11526                              <1> 	;    4. loads arguments to be passed to executing file into
 11527                              <1> 	;	highest locations of user's core
 11528                              <1> 	;    5. puts pointers to arguments in locations immediately
 11529                              <1> 	;	following arguments.
 11530                              <1> 	;    6.	saves number of arguments in next location.
 11531                              <1> 	;    7. initializes user's stack area so that all registers
 11532                              <1> 	;	will be zeroed and the PS is cleared and the PC set
 11533                              <1> 	;	to core when 'sysret' restores registers 
 11534                              <1> 	;	and does an rti.
 11535                              <1> 	;    8. initializes u.r0 and u.sp
 11536                              <1> 	;    9. zeros user's core down to u.r0
 11537                              <1> 	;   10.	reads executable file from storage device into core
 11538                              <1> 	;	starting at location 'core'.
 11539                              <1> 	;   11.	sets u.break to point to end of user's code with
 11540                              <1> 	;	data area appended.
 11541                              <1> 	;   12.	calls 'sysret' which returns control at location
 11542                              <1> 	;	'core' via 'rti' instruction.
 11543                              <1> 	;
 11544                              <1> 	; Calling sequence:
 11545                              <1> 	;	sysexec; namep; argp
 11546                              <1> 	; Arguments:
 11547                              <1> 	;	namep - points to pathname of file to be executed
 11548                              <1> 	;	argp  - address of table of argument pointers
 11549                              <1> 	;	argp1... argpn - table of argument pointers
 11550                              <1> 	;	argp1:<...0> ... argpn:<...0> - argument strings
 11551                              <1> 	; Inputs: (arguments)
 11552                              <1> 	; Outputs: -	
 11553                              <1> 	; ...............................................................
 11554                              <1> 	;
 11555                              <1> 	; Retro UNIX 386 v1 modification: 
 11556                              <1> 	;	User application runs in it's own virtual space 
 11557                              <1> 	;	which is izolated from kernel memory (and other
 11558                              <1> 	;	memory pages) via 80386	paging in ring 3 
 11559                              <1> 	;	privilige mode. Virtual start address is always 0.
 11560                              <1> 	;	User's core memory starts at linear address 400000h
 11561                              <1> 	;	(the end of the 1st 4MB).
 11562                              <1> 	;
 11563                              <1> 	; Retro UNIX 8086 v1 modification: 
 11564                              <1> 	;	user/application segment and system/kernel segment
 11565                              <1> 	;	are different and sysenter/sysret/sysrele routines
 11566                              <1> 	;	are different (user's registers are saved to 
 11567                              <1> 	;	and then restored from system's stack.)
 11568                              <1> 	;
 11569                              <1> 	;	NOTE: Retro UNIX 8086 v1 'arg2' routine gets these
 11570                              <1> 	;	      arguments which were in these registers;
 11571                              <1> 	;	      but, it returns by putting the 1st argument
 11572                              <1> 	;	      in 'u.namep' and the 2nd argument
 11573                              <1> 	;	      on top of stack. (1st argument is offset of the
 11574                              <1> 	;	      file/path name in the user's program segment.)
 11575                              <1> 	
 11576                              <1> 	;call	arg2
 11577                              <1> 	; * name - 'u.namep' points to address of file/path name
 11578                              <1> 	;          in the user's program segment ('u.segmnt')
 11579                              <1> 	;          with offset in BX register (as sysopen argument 1).
 11580                              <1> 	; * argp - sysexec argument 2 is in CX register 
 11581                              <1> 	;          which is on top of stack.
 11582                              <1> 	;
 11583                              <1> 		; jsr r0,arg2 / arg0 in u.namep,arg1 on top of stack
 11584                              <1> 
 11585                              <1> 	; 23/06/2015 (32 bit modifications)
 11586                              <1> 
 11587                              <1> 	;; 13/11/2017
 11588                              <1> 	;;mov	[u.namep], ebx ; argument 1
 11589                              <1>         ; 18/10/2015
 11590 0001022B 890D[1C910100]      <1> 	mov     [argv], ecx  ; * ; argument 2
 11591                              <1> 
 11592                              <1> 	; 13/11/2017
 11593 00010231 89DE                <1> 	mov	esi, ebx
 11594 00010233 E81D1F0000          <1> 	call	set_working_path_x
 11595 00010238 7319                <1> 	jnc	short sysexec_0
 11596                              <1> 
 11597                              <1> 	;; 'bad command or file name'
 11598                              <1> 	;mov	eax, ERR_BAD_CMD_ARG ; 01h ; TRDOS 8086
 11599                              <1> 	
 11600                              <1> 	; 'file not found !' error
 11601 0001023A B802000000          <1> 	mov	eax, ERR_NOT_FOUND ; 02h ; TRDOS 8086
 11602                              <1> sysexec_not_found_err:
 11603                              <1> sysexec_access_error:
 11604                              <1> sysexec_ext_error:
 11605 0001023F A3[20900100]        <1> 	mov	[u.r0], eax
 11606 00010244 A3[88900100]        <1> 	mov	[u.error], eax
 11607 00010249 E8DC1F0000          <1> 	call 	reset_working_path
 11608 0001024E E9E4CBFFFF          <1> 	jmp	error
 11609                              <1> 
 11610                              <1> sysexec_0:
 11611                              <1> 	; 13/11/2017
 11612                              <1> 	;mov	esi, FindFile_Name
 11613 00010253 66B80018            <1>         mov	ax, 1800h ; Only files 
 11614 00010257 E81C89FFFF          <1> 	call	find_first_file
 11615 0001025C 72E1                <1> 	jc	short sysexec_not_found_err ; eax = 2
 11616                              <1> 
 11617                              <1> 	; check_ file attributes
 11618                              <1> 	; (attribute bits = 00ADVSHR) ; 18h = Directory+Volume
 11619                              <1> 	; BL = Attributes byte
 11620                              <1> 	
 11621 0001025E F6C306              <1>         test	bl, 6  ; system file or hidden file (S+H) 
 11622                              <1> 	;jz	short sysexec_0ext
 11623 00010261 7417                <1> 	jz	short sysexec_1 ; yes
 11624                              <1> 
 11625                              <1> 	; 13/11/2017 
 11626                              <1> 	; /// TRDOS386 permission check for multiuser mode ///
 11627                              <1> 	; SYSTEM file or HIDDEN file !!
 11628                              <1> 	; (Only super user has permission to run this file.)
 11629                              <1> 	
 11630                              <1> 	; ([u.uid]=0 for super user or root in multiuser mode)
 11631                              <1> 	; ([u.uid]=0 for any users in singleuser mode) 
 11632 00010263 803D[72900100]00    <1> 	cmp 	byte [u.uid], 0 ; Super User ([u.uid]=0) ?
 11633                              <1> 	;jna	short sysexec_0ext
 11634 0001026A 760E                <1> 	jna	short sysexec_1 ; yes 
 11635                              <1> 
 11636                              <1> 	; 'permission denied !' error  
 11637 0001026C B80B000000          <1>         mov	eax, ERR_FILE_ACCESS  ; 11 = ERR_PERM_DENIED
 11638 00010271 EBCC                <1>         jmp	short sysexec_access_error
 11639                              <1> 
 11640                              <1> sysexec_not_exf:
 11641                              <1> 	; 'not executable file !' error
 11642 00010273 B816000000          <1> 	mov	eax, ERR_NOT_EXECUTABLE
 11643 00010278 EBC5                <1> 	jmp	sysexec_ext_error
 11644                              <1> 
 11645                              <1> ;sysexec_0ext:
 11646                              <1> sysexec_1:
 11647                              <1> 	; 18/11/2017
 11648 0001027A BE[2C820100]        <1> 	mov	esi, FindFile_Name
 11649                              <1> 	; 13/11/2017
 11650                              <1> 	; check program file name extension
 11651                              <1> 	; ('.PRG' for current TRDOS version)
 11652 0001027F E8BFA2FFFF          <1> 	call	check_prg_filename_ext
 11653 00010284 72ED                <1> 	jc	short sysexec_not_exf
 11654                              <1> 	
 11655                              <1> 	; 18/11/2017
 11656 00010286 3C50                <1> 	cmp	al, 'P'
 11657 00010288 75E9                <1> 	jne	short sysexec_not_exf	
 11658                              <1> 
 11659                              <1> 	; '.PRG' extension is OK.
 11660                              <1> 	; Only '.PRG' files are valid program files
 11661                              <1> 	; for current TRDOS 386 version.
 11662                              <1> 
 11663 0001028A 8B15[58820100]      <1> 	mov	edx, [FindFile_DirEntry+DirEntry_FileSize]
 11664 00010290 66A1[50820100]      <1> 	mov	ax, [FindFile_DirEntry+DirEntry_FstClusHI]
 11665 00010296 C1E010              <1> 	shl	eax, 16
 11666 00010299 66A1[56820100]      <1> 	mov	ax, [FindFile_DirEntry+DirEntry_FstClusLO]
 11667                              <1> 	; EAX = First Cluster number
 11668                              <1> 	; EDX = File Size
 11669                              <1> 
 11670 0001029F A3[24910100]        <1> 	mov	[ii], eax
 11671 000102A4 8915[28910100]      <1> 	mov	[i.size], edx
 11672                              <1> 
 11673                              <1> ;sysexec_1:
 11674                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5
 11675                              <1> 	; 06/02/2022 - Retro UNIX 386 v1.2
 11676                              <1> 	; 13/11/2017 - TRDOS 386 (TRDOS v2.0)
 11677                              <1> 	; 24/06/2015 - 23/10/2015 (Retro UNIX 386 v1)
 11678                              <1>         ; Moving arguments to the end of [u.upage]
 11679                              <1> 	; (by regarding page borders in user's memory space)
 11680                              <1> 	;
 11681                              <1> 	; 10/10/2015
 11682                              <1> 	; 21/07/2015
 11683                              <1> 	;mov	ebp, esp ; (**)
 11684                              <1> 	; 18/10/2015
 11685                              <1> 	;mov 	edi, ebp
 11686                              <1> 	; 23/07/2022
 11687 000102AA 89E7                <1> 	mov	edi, esp ; (**)
 11688 000102AC B900010000          <1> 	mov 	ecx, MAX_ARG_LEN ; 256
 11689                              <1> 	;sub	edi, MAX_ARG_LEN ; 256
 11690 000102B1 29CF                <1> 	sub	edi, ecx
 11691 000102B3 89FC                <1> 	mov	esp, edi ; *!*
 11692 000102B5 31C0                <1> 	xor	eax, eax
 11693 000102B7 A3[4C900100]        <1> 	mov 	[u.nread], eax ; 0
 11694                              <1> 	; ([argc] must be cleared because previous 'sysexec'
 11695                              <1> 	; may leave it with any value after an error))
 11696                              <1> 	;mov	[argc], ax ; 0 ; 13/11/2017
 11697                              <1> 	; 23/07/2022
 11698 000102BC A3[18910100]        <1> 	mov	[argc], eax ; 0
 11699 000102C1 49                  <1> 	dec	ecx ; 256 - 1
 11700 000102C2 890D[48900100]      <1> 	mov 	[u.count], ecx ; MAX_ARG_LEN - 1 ; 255
 11701                              <1> 	;mov 	dword [u.count], MAX_ARG_LEN - 1 ; 255
 11702                              <1> sysexec_2:
 11703 000102C8 8B35[1C910100]      <1> 	mov	esi, [argv] ; 18/10/2015 
 11704 000102CE E87A020000          <1> 	call	get_argp
 11705                              <1> 	;mov	ecx, 4 
 11706                              <1> 	; 23/07/2022
 11707 000102D3 31C9                <1> 	xor	ecx, ecx
 11708 000102D5 B104                <1> 	mov	cl, 4
 11709                              <1> sysexec_3:
 11710 000102D7 21C0                <1> 	and	eax, eax
 11711 000102D9 7453                <1>         jz	short sysexec_6 ; 23/07/2022
 11712                              <1> 	; 18/10/2015
 11713 000102DB 010D[1C910100]      <1> 	add	[argv], ecx ; 4
 11714                              <1> 	;;inc	word [argc]
 11715                              <1> 	; 23/07/2022
 11716                              <1> 	;inc	dword [argc]
 11717 000102E1 FE05[18910100]      <1> 	inc	byte [argc]
 11718                              <1> 	;
 11719 000102E7 A3[44900100]        <1> 	mov	[u.base], eax
 11720                              <1>  	; 23/10/2015
 11721 000102EC 66C705[84900100]00- <1> 	mov	word [u.pcount], 0
 11721 000102F4 00                  <1>
 11722                              <1> sysexec_4:
 11723 000102F5 E8380B0000          <1> 	call	cpass ; get a character from user's core memory
 11724 000102FA 750B                <1>         jnz	short sysexec_5
 11725                              <1> 		; (max. 255 chars + null)
 11726                              <1> 	; 18/10/2015
 11727 000102FC 28C0                <1> 	sub 	al, al
 11728 000102FE AA                  <1> 	stosb
 11729 000102FF FF05[4C900100]      <1> 	inc	dword [u.nread]
 11730                              <1> 	; 23/07/2022
 11731 00010305 EB27                <1> 	jmp	short sysexec_6 ; 24/04/2016
 11732                              <1> sysexec_5:
 11733 00010307 AA                  <1> 	stosb
 11734 00010308 20C0                <1> 	and 	al, al
 11735 0001030A 75E9                <1> 	jnz	short sysexec_4
 11736                              <1> 	;mov	ecx, 4
 11737                              <1> 	; 23/07/2022
 11738 0001030C 31C9                <1> 	xor	ecx, ecx
 11739 0001030E B104                <1> 	mov	cl, 4
 11740 00010310 390D[14910100]      <1> 	cmp	[ncount], ecx ; 4
 11741 00010316 72B0                <1> 	jb	short sysexec_2
 11742 00010318 8B35[10910100]      <1> 	mov	esi, [nbase]
 11743 0001031E 010D[10910100]      <1> 	add	[nbase], ecx ; 4	
 11744                              <1> 	;sub	[ncount], cx 
 11745                              <1> 	; 23/07/2022
 11746 00010324 290D[14910100]      <1> 	sub	[ncount], ecx
 11747 0001032A 8B06                <1> 	mov	eax, [esi]
 11748 0001032C EBA9                <1> 	jmp	short sysexec_3
 11749                              <1> 
 11750                              <1> sysexec_6:
 11751                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5
 11752                              <1> 	; 19/11/2017
 11753                              <1> 	; 18/11/2017
 11754                              <1> 	; 14/11/2017
 11755                              <1> 	; 13/11/2017
 11756 0001032E 8925[1C910100]      <1> 	mov	[argv], esp ; *!* ; start address of argument list 
 11757                              <1> 
 11758                              <1> 	; 04/01/2017
 11759                              <1> 	; 24/10/2016
 11760                              <1> 	;;02/05/2016
 11761                              <1> 	; 23/04/2016 (TRDOS 386)
 11762                              <1> 	; 18/10/2015 ('sysexec_6')
 11763                              <1> 	; 23/06/2015
 11764 00010334 A1[78900100]        <1> 	mov	eax, [u.pgdir] ; physical address of page directory
 11765                              <1> 	;cmp 	eax, [k_page_dir] ; TRDOS MainProg ? 
 11766                              <1> 	;je	short sysexec_7
 11767                              <1> 	; 19/11/2017
 11768 00010339 8B1D[7C900100]      <1> 	mov	ebx, [u.ppgdir] ; phy addr of the parent's page dir
 11769 0001033F E8A455FFFF          <1> 	call	deallocate_page_dir
 11770                              <1> sysexec_7:
 11771 00010344 E8D454FFFF          <1> 	call	make_page_dir
 11772                              <1> 	;jc	panic  ; allocation error 
 11773                              <1> 	;	       ; after a deallocation would be nonsence !?
 11774                              <1> 	; 23/07/2022
 11775 00010349 7243                <1> 	jc	short sysexec_panic
 11776                              <1> 
 11777                              <1> 	; 24/07/2015
 11778                              <1> 	; map kernel pages (1st 4MB) to PDE 0
 11779                              <1> 	;     of the user's page directory
 11780                              <1> 	;     (It is needed for interrupts!)
 11781                              <1> 	; 18/10/2015
 11782 0001034B 8B15[88780100]      <1> 	mov	edx, [k_page_dir] ; Kernel's page directory
 11783 00010351 8B02                <1> 	mov	eax, [edx] ; physical address of
 11784                              <1> 			   ; kernel's first page table (1st 4 MB)
 11785                              <1> 			   ; (PDE 0 of kernel's page directory)
 11786 00010353 8B15[78900100]      <1> 	mov 	edx, [u.pgdir]
 11787 00010359 8902                <1> 	mov	[edx], eax ; PDE 0 (1st 4MB)
 11788                              <1> 	;
 11789                              <1> 	; 20/07/2015
 11790 0001035B BB00004000          <1> 	mov	ebx, CORE ; start address = 0 (virtual) + CORE
 11791                              <1> 	; 18/10/2015
 11792 00010360 BE[08910100]        <1> 	mov	esi, pcore ; physical start address
 11793                              <1> sysexec_8:	
 11794 00010365 B907000000          <1> 	mov	ecx, PDE_A_USER + PDE_A_WRITE + PDE_A_PRESENT
 11795 0001036A E8CC54FFFF          <1> 	call	make_page_table
 11796                              <1> 	;jc	panic
 11797                              <1> 	; 23/07/2022
 11798 0001036F 721D                <1> 	jc	short sysexec_panic
 11799                              <1> 	;
 11800                              <1> 	;mov	ecx, PTE_A_USER + PTE_A_WRITE + PTE_A_PRESENT
 11801 00010371 E8D354FFFF          <1> 	call	make_page ; make new page, clear and set the pte 
 11802                              <1> 	;jc	panic
 11803                              <1> 	; 23/07/2022
 11804 00010376 7216                <1> 	jc	short sysexec_panic
 11805                              <1> 	;
 11806 00010378 8906                <1> 	mov	[esi], eax ; 24/06/2015
 11807                              <1> 	; ebx = virtual address (24/07/2015)
 11808                              <1> 	; 23/07/2022
 11809                              <1> 	;call 	add_to_swap_queue
 11810                              <1> 	; 18/10/2015
 11811 0001037A 81FE[0C910100]      <1> 	cmp	esi, ecore ; user's stack (last) page ?
 11812 00010380 7411                <1> 	je	short sysexec_9 ; yes
 11813 00010382 BE[0C910100]        <1> 	mov	esi, ecore  ; physical address of the last page 
 11814                              <1> 	; 20/07/2015
 11815 00010387 BB00F0FFFF          <1> 	mov	ebx, (ECORE - PAGE_SIZE) + CORE
 11816                              <1> 	; ebx = virtual end address + segment base address - 4K
 11817 0001038C EBD7                <1>         jmp     short sysexec_8
 11818                              <1> sysexec_panic:
 11819                              <1> 	; 23/07/2022
 11820 0001038E E9166AFFFF          <1> 	jmp	panic
 11821                              <1> 
 11822                              <1> sysexec_9:
 11823                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5
 11824                              <1> 	; 19/11/2017 
 11825                              <1> 	; 24/04/2016 (TRDOS 386 = TRDOS v2.0)
 11826                              <1> 	; 25/06/2015 - 26/08/2015 - 18/10/2015
 11827                              <1> 	; move arguments from kernel stack to [ecore]
 11828                              <1> 	; (argument list/line will be copied from kernel stack
 11829                              <1> 	; frame to the last (stack) page of user's core memory)
 11830                              <1> 	; 18/10/2015
 11831 00010393 8B3D[0C910100]      <1> 	mov	edi, [ecore]
 11832 00010399 81C700100000        <1> 	add	edi, PAGE_SIZE
 11833                              <1> 	; 19/11/2017
 11834                              <1> 	;sub	edi, 4
 11835                              <1> 	;mov	dword [edi], 0 
 11836                              <1> 	;mov	ebx, edi
 11837                              <1> 	;
 11838                              <1> 	;movzx	eax, word [argc]
 11839                              <1> 	;or	eax, eax
 11840                              <1> 	;jz	short sysexec_13 ; 19/11/2017
 11841                              <1> 	;;jnz	short sysexec_10
 11842                              <1> 	;;mov 	ebx, edi
 11843                              <1> 	;;sub	ebx, 4 
 11844                              <1> 	;;mov	[ebx], eax ; 0
 11845                              <1> 	;;jmp 	short sysexec_13
 11846                              <1> 	; 23/07/2022
 11847                              <1> 	; [argc] < 32
 11848 0001039F A1[18910100]        <1> 	mov	eax, [argc]
 11849 000103A4 09C0                <1> 	or	eax, eax
 11850 000103A6 7509                <1> 	jnz	short sysexec_10
 11851 000103A8 89FB                <1> 	mov 	ebx, edi
 11852 000103AA 83EB04              <1> 	sub	ebx, 4 
 11853 000103AD 8903                <1> 	mov	[ebx], eax ; 0
 11854 000103AF EB47                <1> 	jmp 	short sysexec_13
 11855                              <1> 
 11856                              <1> sysexec_10:
 11857 000103B1 8B0D[4C900100]      <1> 	mov	ecx, [u.nread]
 11858                              <1> 	; 13/11/2017
 11859                              <1> 	;;mov	esi, TextBuffer ; 'load_and_execute_file'
 11860                              <1> 	;mov	esi, esp  	; 'sysexec'
 11861 000103B7 8B35[1C910100]      <1> 	mov	esi, [argv] ; 24/04/2016 (TRDOS 386  = TRDOS v2.0)
 11862                              <1> 	; 23/07/2022
 11863 000103BD 29CF                <1> 	sub	edi, ecx ; page end address - argument list length
 11864                              <1> 	;sub	ebx, ecx ; 19/11/2017
 11865                              <1> 
 11866                              <1> 	;;;;
 11867                              <1> 	; 23/07/2022
 11868                              <1> 	; (move edi -backward- to dword boundary)
 11869                              <1> 	; ((this will prevent 'general protection fault' error
 11870                              <1> 	;  as result of a lodsd or dword move instruction
 11871                              <1> 	;  at the end of argument list))
 11872 000103BF 83EF03              <1> 	sub	edi, 3
 11873 000103C2 83E7FC              <1> 	and	edi, ~3 ; (*)
 11874                              <1> 	;;;
 11875                              <1> 
 11876 000103C5 89C2                <1> 	mov	edx, eax
 11877 000103C7 FEC2                <1> 	inc	dl ; argument count + 1 for argc value  
 11878 000103C9 C0E202              <1> 	shl 	dl, 2  ; 4 * (argument count + 1)
 11879                              <1> 	; edx <= 128
 11880 000103CC 89FB                <1> 	mov	ebx, edi
 11881                              <1> 	;mov	edi, ebx ; 19//11/2017
 11882                              <1> 	; 23/07/2022 (*) - edi is already dword aligned -
 11883                              <1> 	;and	bl, 0FCh ; 32 bit (dword) alignment
 11884 000103CE 29D3                <1> 	sub 	ebx, edx
 11885 000103D0 89FA                <1> 	mov	edx, edi
 11886 000103D2 F3A4                <1> 	rep	movsb
 11887 000103D4 89D6                <1> 	mov 	esi, edx
 11888 000103D6 89DF                <1> 	mov 	edi, ebx
 11889 000103D8 BA00F0BFFF          <1> 	mov	edx, ECORE - PAGE_SIZE ; virtual addr. of the last page
 11890 000103DD 2B15[0C910100]      <1> 	sub 	edx, [ecore] ; difference (virtual - physical) 
 11891 000103E3 AB                  <1> 	stosd	; eax = argument count	
 11892                              <1> sysexec_11:
 11893 000103E4 89F0                <1> 	mov	eax, esi
 11894 000103E6 01D0                <1> 	add	eax, edx
 11895 000103E8 AB                  <1> 	stosd  ; eax = virtual address
 11896                              <1> 	; 23/07/2022
 11897 000103E9 FE0D[18910100]      <1> 	dec	byte [argc]
 11898                              <1> 	;dec	dword [argc]
 11899                              <1> 	;;dec	word [argc] ; 14/11/2017
 11900 000103EF 7407                <1> 	jz	short sysexec_13
 11901                              <1> sysexec_12:
 11902 000103F1 AC                  <1> 	lodsb
 11903 000103F2 20C0                <1> 	and	al, al
 11904 000103F4 75FB                <1> 	jnz	short sysexec_12
 11905 000103F6 EBEC                <1> 	jmp	short sysexec_11
 11906                              <1> sysexec_13:
 11907                              <1> 	; 24/10/2016
 11908                              <1> 	; 24/04/2016 - TRDOS 386 (TRDOS v2.0)
 11909                              <1> 	; 23/06/2015 - 19/10/2015 (Retro UNIX 386 v1, 'sysexec_13')
 11910                              <1> 	;
 11911                              <1> 	; moving arguments to [ecore] is OK here..
 11912                              <1> 	;
 11913                              <1> 	; ebx = beginning addres of argument list pointers
 11914                              <1> 		;	in user's stack
 11915 000103F8 2B1D[0C910100]      <1> 	sub 	ebx, [ecore]
 11916 000103FE 81C300F0BFFF        <1> 	add     ebx, (ECORE - PAGE_SIZE)
 11917                              <1> 			; end of core - 4096 (last page)
 11918                              <1> 			; (virtual address)
 11919 00010404 891D[1C910100]      <1> 	mov	[argv], ebx
 11920 0001040A 891D[50900100]      <1> 	mov	[u.break], ebx ; available user memory
 11921                              <1> 	;
 11922 00010410 29C0                <1> 	sub	eax, eax
 11923 00010412 C705[48900100]2000- <1> 	mov	dword [u.count], 32 ; Executable file header size
 11923 0001041A 0000                <1>
 11924 0001041C C705[34900100]-     <1> 	mov	dword [u.fofp], u.off
 11924 00010422 [40900100]          <1>
 11925 00010426 A3[40900100]        <1> 	mov	[u.off], eax ; 0
 11926 0001042B A3[44900100]        <1> 	mov	[u.base], eax ; 0, start of user's core (virtual)
 11927                              <1> 	; 24/10/2016
 11928 00010430 A0[4A790100]        <1> 	mov	al, [Current_Drv]
 11929 00010435 A2[05900100]        <1> 	mov	[cdev], al
 11930                              <1> 	;
 11931 0001043A A1[24910100]        <1> 	mov	eax, [ii] ; Fist Cluster of the Program (PRG) file
 11932                              <1> 	; EAX = First cluster of the executable file
 11933 0001043F E893050000          <1> 	call	readi
 11934                              <1> 
 11935 00010444 8B0D[50900100]      <1> 	mov	ecx, [u.break] ; top of user's stack (physical addr.)
 11936 0001044A 890D[48900100]      <1> 	mov	[u.count], ecx ; save for overrun check
 11937                              <1> 	;
 11938 00010450 8B0D[4C900100]      <1> 	mov	ecx, [u.nread]
 11939 00010456 890D[50900100]      <1> 	mov	[u.break], ecx ; virtual address (offset from start)
 11940 0001045C 80F920              <1> 	cmp	cl, 32
 11941 0001045F 7540                <1>         jne     short sysexec_15
 11942                              <1> 	;:
 11943                              <1> 	; Retro UNIX 386 v1 (32 bit) executable file header format
 11944 00010461 8B35[08910100]      <1> 	mov	esi, [pcore] ; start address of user's core memory 
 11945                              <1> 		             ; (phys. start addr. of the exec. file)
 11946 00010467 AD                  <1> 	lodsd
 11947 00010468 663DEB1E            <1> 	cmp	ax, 1EEBh ; EBH, 1Eh -> jump to +32
 11948 0001046C 7533                <1> 	jne	short sysexec_15
 11949 0001046E AD                  <1> 	lodsd
 11950 0001046F 89C1                <1> 	mov	ecx, eax ; text (code) section size
 11951 00010471 AD                  <1> 	lodsd
 11952 00010472 01C1                <1> 	add	ecx, eax ; + data section size (initialized data)
 11953 00010474 89CB                <1> 	mov	ebx, ecx
 11954 00010476 AD                  <1> 	lodsd	
 11955 00010477 01C3                <1> 	add	ebx, eax ; + bss section size (for overrun checking)
 11956 00010479 3B1D[48900100]      <1> 	cmp	ebx, [u.count]
 11957 0001047F 7711                <1> 	ja	short sysexec_14  ; program overruns stack !
 11958                              <1> 	;
 11959                              <1> 	; add bss section size to [u.break]
 11960 00010481 0105[50900100]      <1> 	add 	[u.break], eax
 11961                              <1> 	;
 11962 00010487 83E920              <1> 	sub	ecx, 32  ; header size (already loaded)
 11963                              <1> 	;cmp	ecx, [u.count]
 11964                              <1> 	;jnb	short sysexec_16
 11965 0001048A 890D[48900100]      <1> 	mov	[u.count], ecx ; required read count
 11966 00010490 EB29                <1> 	jmp	short sysexec_16
 11967                              <1> sysexec_14:
 11968                              <1> 	; insufficient (out of) memory
 11969 00010492 C705[88900100]0400- <1> 	mov	dword [u.error], ERR_MINOR_IM ; 1
 11969 0001049A 0000                <1>
 11970 0001049C E996C9FFFF          <1> 	jmp	error
 11971                              <1> sysexec_15:
 11972 000104A1 8B15[28910100]      <1>         mov	edx, [i.size] ; file size
 11973 000104A7 29CA                <1> 	sub	edx, ecx ; file size - loaded bytes
 11974 000104A9 7626                <1> 	jna	short sysexec_17 ; no need to next read
 11975 000104AB 01D1                <1> 	add	ecx, edx ; [i.size]
 11976 000104AD 3B0D[48900100]      <1> 	cmp	ecx, [u.count] ; overrun check (!)
 11977 000104B3 77DD                <1> 	ja	short sysexec_14
 11978 000104B5 8915[48900100]      <1> 	mov	[u.count], edx
 11979                              <1> sysexec_16:
 11980 000104BB A1[24910100]        <1> 	mov	eax, [ii] ; first cluster
 11981 000104C0 E812050000          <1> 	call	readi
 11982 000104C5 8B0D[4C900100]      <1> 	mov	ecx, [u.nread]
 11983 000104CB 010D[50900100]      <1> 	add	[u.break], ecx
 11984                              <1> sysexec_17:
 11985 000104D1 A1[24910100]        <1> 	mov	eax, [ii] ; first cluster
 11986 000104D6 E8A2190000          <1> 	call	iclose
 11987 000104DB 31C0                <1> 	xor     eax, eax
 11988 000104DD FEC0                <1> 	inc	al
 11989 000104DF 66A3[6C900100]      <1> 	mov	[u.intr], ax ; 1 (interrupt/time-out is enabled)
 11990 000104E5 66A3[6E900100]      <1> 	mov	[u.quit], ax ; 1 ('crtl+brk' signal is enabled) 
 11991                              <1> 	; 23/07/2022
 11992 000104EB FEC8                <1> 	dec	al
 11993                              <1> 	;cmp	dword [u.ppgdir], 0  ; is the caller MainProg (kernel) ?
 11994 000104ED 3905[7C900100]      <1> 	cmp	[u.ppgdir], eax ; 0 ; 23/07/2022
 11995 000104F3 770C                <1> 	ja	short sysexec_18 ; no, the caller is user process
 11996                              <1> 	; If the caller is kernel (MainProg), 'sysexec' will come here
 11997 000104F5 8B15[88780100]      <1> 	mov	edx, [k_page_dir] ; kernel's page directory
 11998 000104FB 8915[7C900100]      <1> 	mov	[u.ppgdir], edx ; next time 'sysexec' must not come here 
 11999                              <1> sysexec_18:
 12000                              <1> 	; 02/05/2016
 12001                              <1> 	; 24/04/2016 (TRDOS 386 = TRDOS v2.0)
 12002                              <1> 	; 18/10/2015 (Retro UNIX 386 v1)
 12003                              <1> 	; 05/08/2015
 12004                              <1> 	; 29/07/2015
 12005                              <1> 
 12006                              <1> ;	; **** arguments list test start - 19/11/2017
 12007                              <1> ;	mov	ebp, [argv]
 12008                              <1> ;	sub	ebp, ECORE - 4096
 12009                              <1> ;	add	ebp, [ecore]
 12010                              <1> ;
 12011                              <1> ;	mov	ebx, [ebp]
 12012                              <1> ;	mov	[argc], bx
 12013                              <1> ;	add	ebp, 4
 12014                              <1> ;	mov	byte [ccolor], 1Fh
 12015                              <1> ;_zx0:
 12016                              <1> ;	cmp	word [argc], 0
 12017                              <1> ;	jna	short _zx2
 12018                              <1> ;_zx1:
 12019                              <1> ;	push	ebp
 12020                              <1> ;	mov	esi, [ebp]
 12021                              <1> ;
 12022                              <1> ;	sub	esi, ECORE - 4096
 12023                              <1> ;	add	esi, [ecore]
 12024                              <1> ;
 12025                              <1> ;	call	print_cmsg
 12026                              <1> ;
 12027                              <1> ;	dec	word [argc]
 12028                              <1> ;	jz	short _zx2
 12029                              <1> ;
 12030                              <1> ;	mov	al, '.'
 12031                              <1> ;	mov	bl, 07h
 12032                              <1> ;	mov	bh, [u.ttyn]
 12033                              <1> ;	call 	_write_tty 
 12034                              <1> ;
 12035                              <1> ;	pop	ebp
 12036                              <1> ;	add	ebp, 4
 12037                              <1> ;	jmp	short _zx1
 12038                              <1> ;_zx2:
 12039                              <1> ;	pop	ebp
 12040                              <1> ;	mov	byte [ccolor], 07h
 12041                              <1> ;	mov	eax, 1
 12042                              <1> ;	; **** arguments list test stop
 12043                              <1> ;	Test result is OK! (there is not a wrong thing) - 19/11/2017
 12044                              <1> 
 12045 00010501 8B2D[1C910100]      <1> 	mov	ebp, [argv] ; user's stack pointer must point to argument
 12046                              <1> 			    ; list pointers (argument count)
 12047 00010507 FA                  <1> 	cli
 12048 00010508 8B25[24780100]      <1>         mov     esp, [tss.esp0] ; ring 0 (kernel) stack pointer
 12049                              <1> 	;mov   	esp, [u.sp] ; Restore Kernel stack
 12050                              <1> 			    ; for this process	 
 12051                              <1> 	;add	esp, 20 ; --> EIP, CS, EFLAGS, ESP, SS
 12052                              <1> 	;;xor	eax, eax ; 0
 12053                              <1> 	; 23/07/2022
 12054                              <1> 	;dec	al ; eax = 0
 12055                              <1> 	; eax = 0
 12056                              <1> 
 12057                              <1> 	;mov	edx, UDATA
 12058                              <1> 	; 18/11/2017
 12059 0001050E 6A23                <1> 	push	UDATA ; user's stack segment
 12060                              <1> 	;push	edx
 12061 00010510 55                  <1> 	push	ebp ; user's stack pointer
 12062                              <1> 		    ; (points to number of arguments)
 12063                              <1> 	
 12064                              <1> 	; 04/01/2017
 12065                              <1> 	; MainProg comes here while [sysflg]= 0FFh
 12066                              <1> 	; (but sysexec comes here while [sysflg]= 0)
 12067 00010511 C605[14900100]00    <1> 	mov	byte [sysflg], 0 ; 04/01/2017
 12068                              <1> 				 ; (timer_int sysflg control)
 12069 00010518 FB                  <1> 	sti
 12070 00010519 9C                  <1> 	pushfd	; EFLAGS
 12071                              <1> 		; Set IF for enabling interrupts in user mode
 12072                              <1> 	;or	dword [esp], 200h 
 12073                              <1> 	;
 12074                              <1> 	;mov	bx, UCODE
 12075                              <1> 	;push	bx ; user's code segment
 12076 0001051A 6A1B                <1> 	push	UCODE
 12077                              <1> 	;push	0
 12078 0001051C 50                  <1> 	push	eax ; EIP (=0) - start address -
 12079 0001051D 8925[18900100]      <1> 	mov	[u.sp], esp ; 29/07/2015
 12080                              <1> 	; 05/08/2015
 12081                              <1> 	; Remedy of a General Protection Fault during 'iretd' is here !
 12082                              <1> 	; ('push dx' would cause to general protection fault, 
 12083                              <1> 	; after 'pop ds' etc.)
 12084                              <1> 	;
 12085                              <1> 	;; push dx ; ds (UDATA)
 12086                              <1> 	;; push dx ; es (UDATA)
 12087                              <1> 	;; push dx ; fs (UDATA)
 12088                              <1> 	;; push dx ; gs (UDATA)
 12089                              <1> 	;
 12090                              <1> 	; This is a trick to prevent general protection fault
 12091                              <1> 	; during 'iretd' intruction at the end of 'sysrele' (in u1.s):
 12092 00010523 66BA2300            <1> 	mov	dx, UDATA ; 19/11/2017
 12093 00010527 8EC2                <1> 	mov 	es, dx ; UDATA
 12094 00010529 06                  <1> 	push 	es ; ds (UDATA)
 12095 0001052A 06                  <1> 	push 	es ; es (UDATA)
 12096 0001052B 06                  <1> 	push 	es ; fs (UDATA)
 12097 0001052C 06                  <1> 	push	es ; gs (UDATA)
 12098 0001052D 66BA1000            <1> 	mov	dx, KDATA
 12099 00010531 8EC2                <1> 	mov	es, dx
 12100                              <1> 	;
 12101                              <1> 	;; pushad simulation
 12102 00010533 89E5                <1> 	mov	ebp, esp ; esp before pushad
 12103 00010535 50                  <1> 	push	eax ; eax (0)
 12104 00010536 50                  <1> 	push	eax ; ecx (0)
 12105 00010537 50                  <1> 	push	eax ; edx (0)
 12106 00010538 50                  <1> 	push	eax ; ebx (0)
 12107 00010539 55                  <1> 	push	ebp ; esp before pushad
 12108 0001053A 50                  <1> 	push	eax ; ebp (0)
 12109 0001053B 50                  <1> 	push	eax ; esi (0)		
 12110 0001053C 50                  <1> 	push	eax ; edi (0)	
 12111                              <1> 	;
 12112 0001053D A3[20900100]        <1> 	mov	[u.r0], eax ; eax = 0
 12113 00010542 8925[1C900100]      <1> 	mov	[u.usp], esp
 12114                              <1> 
 12115                              <1> 	; 14/11/2017
 12116 00010548 E90CC9FFFF          <1> 	jmp	sysret0
 12117                              <1> 
 12118                              <1> get_argp:
 12119                              <1> 	; 08/08/2022
 12120                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5
 12121                              <1> 	; 11/12/2021 - Retro UNIX 386 v1.2 
 12122                              <1> 	; 14/11/2017 - TRDOS 386 (TRDOS v2.0)
 12123                              <1> 	; 18/10/2015 (nbase, ncount)
 12124                              <1> 	; 21/07/2015
 12125                              <1> 	; 24/06/2015 (Retro UNIX 386 v1)
 12126                              <1> 	; Get (virtual) address of argument from user's core memory
 12127                              <1> 	;
 12128                              <1> 	; INPUT:
 12129                              <1> 	;	esi = virtual address of argument pointer
 12130                              <1> 	; OUTPUT:
 12131                              <1> 	;	eax = virtual address of argument
 12132                              <1> 	;
 12133                              <1> 	; Modified registers: EAX, EBX, ECX, EDX, ESI 
 12134                              <1> 	;
 12135 0001054D 833D[7C900100]00    <1>  	cmp     dword [u.ppgdir], 0 ; /etc/init ?
 12136                              <1> 				    ; (the caller is kernel)
 12137                              <1> 	;jna	short get_argpk
 12138                              <1> 	; 08/08/2022
 12139 00010554 7705                <1> 	ja	short get_argp5
 12140 00010556 E985000000          <1> 	jmp	get_argpk
 12141                              <1> get_argp5:
 12142 0001055B 89F3                <1>      	mov	ebx, esi
 12143 0001055D E83456FFFF          <1> 	call	get_physical_addr ; get physical address
 12144 00010562 7253                <1>         jc      short get_argp_err ; 23/07/2022
 12145 00010564 A3[10910100]        <1> 	mov 	[nbase], eax ; physical address	
 12146                              <1> 	;mov	[ncount], cx ; remain byte count in page (1-4096)
 12147                              <1> 	; 23/07/2022
 12148 00010569 890D[14910100]      <1> 	mov	[ncount], ecx
 12149                              <1> 	;mov	eax, 4 ; 21/07/2015
 12150 0001056F 31C0                <1> 	xor	eax, eax
 12151 00010571 B004                <1> 	mov	al, 4
 12152                              <1> 	;cmp	cx, ax ; 4
 12153                              <1> 	; 23/07/2022
 12154 00010573 39C1                <1> 	cmp	ecx, eax ; 4
 12155 00010575 7354                <1> 	jnb	short get_argp2
 12156 00010577 89F3                <1> 	mov	ebx, esi
 12157 00010579 01CB                <1> 	add	ebx, ecx
 12158 0001057B E81656FFFF          <1> 	call	get_physical_addr ; get physical address
 12159 00010580 7235                <1> 	jc	short get_argp_err
 12160                              <1> 	;push	esi
 12161 00010582 89C6                <1> 	mov	esi, eax
 12162                              <1> 	;xchg	cx, [ncount]
 12163                              <1> 	; 23/07/2022
 12164 00010584 870D[14910100]      <1> 	xchg	ecx, [ncount]
 12165 0001058A 8735[10910100]      <1> 	xchg	esi, [nbase]
 12166 00010590 B504                <1> 	mov	ch, 4
 12167 00010592 28CD                <1> 	sub	ch, cl
 12168                              <1> get_argp0:
 12169 00010594 AC                  <1> 	lodsb
 12170                              <1> 	;push	ax
 12171                              <1> 	; 23/07/2022
 12172 00010595 50                  <1> 	push	eax
 12173 00010596 FEC9                <1> 	dec	cl
 12174 00010598 75FA                <1>         jnz     short get_argp0
 12175 0001059A 8B35[10910100]      <1> 	mov	esi, [nbase]
 12176                              <1> 	; 21/07/2015
 12177 000105A0 0FB6C5              <1> 	movzx	eax, ch
 12178 000105A3 0105[10910100]      <1> 	add	[nbase], eax
 12179                              <1> 	;sub	[ncount], ax
 12180                              <1> 	; 23/07/2022
 12181 000105A9 2905[14910100]      <1> 	sub	[ncount], eax
 12182                              <1> get_argp1:
 12183 000105AF AC                  <1> 	lodsb
 12184 000105B0 FECD                <1> 	dec	ch
 12185 000105B2 7445                <1>         jz      short get_argp3
 12186                              <1>         ;push	ax
 12187                              <1> 	; 23/07/2022
 12188 000105B4 50                  <1> 	push	eax
 12189 000105B5 EBF8                <1> 	jmp     short get_argp1
 12190                              <1> get_argp_err:
 12191 000105B7 A3[88900100]        <1> 	mov	[u.error], eax
 12192                              <1> 	; 14/11/2017
 12193 000105BC B801000000          <1> 	mov	eax, ERR_BAD_CMD_ARG ; 01h ; TRDOS 8086
 12194 000105C1 A3[20900100]        <1> 	mov	[u.r0], eax
 12195 000105C6 E96CC8FFFF          <1> 	jmp	error
 12196                              <1> get_argp2:
 12197                              <1> 	; 21/07/2015
 12198                              <1> 	;mov	eax, 4
 12199 000105CB 8B15[10910100]      <1> 	mov 	edx, [nbase] ; 18/10/2015
 12200 000105D1 0105[10910100]      <1> 	add	[nbase], eax
 12201                              <1> 	;sub	[ncount], ax
 12202                              <1> 	; 23/07/2022
 12203 000105D7 2905[14910100]      <1> 	sub	[ncount], eax
 12204                              <1> 	;
 12205 000105DD 8B02                <1> 	mov	eax, [edx]
 12206 000105DF C3                  <1> 	retn
 12207                              <1> get_argpk:
 12208                              <1> 	; Argument is in kernel's memory space
 12209 000105E0 66C705[14910100]00- <1> 	mov	word [ncount], PAGE_SIZE ; 4096
 12209 000105E8 10                  <1>
 12210 000105E9 8935[10910100]      <1> 	mov	[nbase], esi
 12211 000105EF 8305[10910100]04    <1> 	add	dword [nbase], 4
 12212 000105F6 8B06                <1> 	mov	eax, [esi] ; virtual addr. = physical addr.
 12213 000105F8 C3                  <1> 	retn
 12214                              <1> get_argp3:
 12215 000105F9 B103                <1> 	mov	cl, 3
 12216                              <1> get_argp4:
 12217 000105FB C1E008              <1> 	shl	eax, 8
 12218                              <1> 	;pop	dx
 12219                              <1> 	; 23/07/2022
 12220 000105FE 5A                  <1> 	pop	edx
 12221 000105FF 88D0                <1> 	mov 	al, dl
 12222 00010601 E2F8                <1>         loop    get_argp4
 12223                              <1> 	;pop	esi
 12224 00010603 C3                  <1> 	retn
 12225                              <1> 
 12226                              <1> 	; 23/07/2022
 12227                              <1> %if 0	
 12228                              <1> 
 12229                              <1> sysstat: 
 12230                              <1> 	; 13/01/2017 - TRDOS 386 (TRDOS v2.0)
 12231                              <1> 	; temporary !
 12232                              <1> 	mov	eax, ERR_INV_FNUMBER ; 'invalid function number !'
 12233                              <1>         mov     [u.error], eax
 12234                              <1>         mov     [u.r0], eax 
 12235                              <1> 	jmp	error
 12236                              <1> 
 12237                              <1> sysfstat: 
 12238                              <1> 	; 13/01/2017 - TRDOS 386 (TRDOS v2.0)
 12239                              <1> 	; temporary !
 12240                              <1> 	mov	eax, ERR_INV_FNUMBER ; 'invalid function number !'
 12241                              <1>         mov     [u.error], eax
 12242                              <1>         mov     [u.r0], eax 
 12243                              <1> 	jmp	error
 12244                              <1> 
 12245                              <1> %endif
 12246                              <1> 
 12247                              <1> fclose:
 12248                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5
 12249                              <1> 	; 06/10/2016 (TRDOS 386 = TRDOS v2.0)
 12250                              <1> 	;
 12251                              <1> 	; 18/06/2015 (Retro UNIX 386 v1 - Beginning)
 12252                              <1> 	;            (32 bit offset pointer modification)
 12253                              <1> 	; 19/04/2013 - 12/01/2014 (Retro UNIX 8086 v1)
 12254                              <1> 	;
 12255                              <1> 	; Given the file descriptor (index to the u.fp list)
 12256                              <1> 	; 'fclose' first gets the i-number of the file via 'getf'.
 12257                              <1> 	; If i-node is active (i-number > 0) the entry in 
 12258                              <1> 	; u.fp list is cleared. If all the processes that opened
 12259                              <1> 	; that file close it, then fsp etry is freed and the file
 12260                              <1> 	; is closed. If not a return is taken. 
 12261                              <1> 	; If the file has been deleted while open, 'anyi' is called
 12262                              <1> 	; to see anyone else has it open, i.e., see if it is appears
 12263                              <1> 	; in another entry in the fsp table. Upon return from 'anyi'
 12264                              <1> 	; a check is made to see if the file is special.
 12265                              <1> 	;
 12266                              <1> 	; INPUTS ->
 12267                              <1> 	;    r1 - contains the file descriptor (value=0,1,2...)
 12268                              <1> 	;    u.fp - list of entries in the fsp table
 12269                              <1> 	;    fsp - table of entries (4 words/entry) of open files. 
 12270                              <1> 	; OUTPUTS ->
 12271                              <1> 	;    r1 - contains the same file descriptor
 12272                              <1> 	;    r2 - contains i-number
 12273                              <1> 	;
 12274                              <1> 	; ((AX = R1))
 12275                              <1> 	; ((Modified registers: EDX, EBX, ECX, ESI, EDI, EBP))
 12276                              <1> 	;
 12277                              <1> 	; Retro UNIX 8086 v1 modification : CF = 1
 12278                              <1> 	;              if i-number of the file is 0. (error)
 12279                              <1> 	;
 12280                              <1> 	; TRDOS 386 (06/10/2016)
 12281                              <1> 	; 
 12282                              <1> 	; INPUT:
 12283                              <1> 	;	EAX = File Handle (File Descriptor, File Index)
 12284                              <1> 	;
 12285                              <1> 	; OUTPUT:
 12286                              <1> 	;	CF = 1 -> File not open !
 12287                              <1> 	;	CF = 0 -> OK!
 12288                              <1> 	;	     EBX = File Number (System)
 12289                              <1> 	;	     [cdev] = Logical DOS Drive Number
 12290                              <1> 	;	     EAX = File Handle/Number (user)
 12291                              <1> 	;
 12292                              <1> 	; Modified Registers: EBX
 12293                              <1> 
 12294 00010604 50                  <1> 	push	eax ; File handle
 12295                              <1> 	
 12296 00010605 E846000000          <1> 	call	getf
 12297                              <1> 	;jc	device_close ; eax = device number
 12298                              <1> 	; 17/04/2021 (temporary)
 12299 0001060A 7306                <1> 	jnc	short _fclose_0
 12300 0001060C 58                  <1> 	pop	eax
 12301 0001060D E943CFFFFF          <1> 	jmp	rw2 ; file not open !
 12302                              <1> _fclose_0:
 12303 00010612 80BB[E4850100]01    <1> 	cmp	byte [ebx+OF_MODE], 1 ; open mode ; 0 = empty entry
 12304 00010619 722C                <1> 	jb	short fclose_1	      ; 1 = read, 2 = write
 12305                              <1> 	
 12306 0001061B 83F801              <1> 	cmp	eax, 1 ; is the first cluster number > 0
 12307 0001061E 7227                <1> 	jb	short fclose_1 ; no, this is empty entry
 12308                              <1> 
 12309                              <1> fclose_0:
 12310 00010620 FE8B[24860100]      <1> 	dec	byte [ebx+OF_OPENCOUNT] ; decrement the number of processes 
 12311                              <1> 			                ; that have opened the file
 12312 00010626 791F                <1> 	jns	short fclose_1 ; jump if not negative (jump if bit 7 is 0)	 
 12313                              <1> 			; if all processes haven't closed the file, return
 12314                              <1> 	;
 12315                              <1> 	; eax ; First cluster
 12316 00010628 31C0                <1> 	xor	eax, eax ; 0
 12317 0001062A 8883[E4850100]      <1> 	mov	[ebx+OF_MODE], al ; 0 = empty entry
 12318                              <1> 	;mov	[ebx+OF_STATUS], al ; 0 = empty entry
 12319                              <1> 	;shl	bx, 2 
 12320                              <1> 	; 23/07/2022
 12321                              <1> 	;shl	bl, 2
 12322 00010630 C1E302              <1> 	shl	ebx, 2
 12323 00010633 8983[44850100]      <1> 	mov	[ebx+OF_FCLUSTER], eax ; 0
 12324 00010639 8983[C4880100]      <1> 	mov	[ebx+OF_CCLUSTER], eax ; 0
 12325                              <1> 	;mov	[ebx+OF_CCINDEX], eax ; 0
 12326                              <1> 	; 23/07/2022
 12327                              <1> 	;mov	[ebx+OF_OPENCOUNT], al ; 0
 12328 0001063F A3[34900100]        <1> 	mov	[u.fofp], eax ; 0
 12329                              <1> 	;shr	bx, 2
 12330                              <1> 	; 23/07/2022
 12331                              <1> 	;shr	bl, 2
 12332 00010644 C1EB02              <1> 	shr	ebx, 2
 12333                              <1> fclose_1: ; 1:
 12334 00010647 58                  <1> 	pop	eax ; File handle (File Descriptor, File Index)
 12335 00010648 C680[2A900100]00    <1> 	mov	byte [eax+u.fp], 0 ; clear that entry in the u.fp list
 12336 0001064F C3                  <1> 	retn
 12337                              <1> 
 12338                              <1> getf:
 12339                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
 12340                              <1> 	; 17/04/2021 - TRDOS 386 v2.0.4
 12341                              <1> 	;	(temporary modifications)
 12342                              <1> 	; 12/10/2016
 12343                              <1> 	; 11/10/2016
 12344                              <1> 	; 08/10/2016
 12345                              <1> 	; 06/10/2016 (TRDOS 386 = TRDOS v2.0)
 12346                              <1> 	; / get the device number and the i-number of an open file
 12347                              <1> 	; 13/05/2015
 12348                              <1> 	; 11/05/2015 (Retro UNIX 386 v1 - Beginning)
 12349                              <1> 	; 19/04/2013 - 18/11/2013 (Retro UNIX 8086 v1)
 12350                              <1> 	;
 12351 00010650 89C3                <1> 	mov	ebx, eax
 12352                              <1> getf1: 
 12353 00010652 83FB0A              <1> 	cmp	ebx, 10
 12354 00010655 730A                <1>         jnb	short getf2
 12355 00010657 8A9B[2A900100]      <1> 	mov	bl, [ebx+u.fp]
 12356 0001065D 08DB                <1> 	or	bl, bl
 12357 0001065F 7503                <1> 	jnz	short getf3
 12358                              <1> getf2:
 12359                              <1> 	; 'File not open !' error (ax=0)
 12360 00010661 29C0                <1> 	sub	eax, eax
 12361 00010663 C3                  <1> 	retn
 12362                              <1> getf3:	
 12363                              <1> 	; 23/07/2022
 12364                              <1> 	;test	bl, 80h
 12365                              <1> 	;jnz	short getf5 ; device
 12366 00010664 FECB                <1> 	dec	bl ; 0 based
 12367 00010666 8A83[C4850100]      <1> 	mov	al, [ebx+OF_DRIVE]
 12368 0001066C A2[05900100]        <1> 	mov	[cdev], al
 12369 00010671 C0E302              <1> 	shl	bl, 2 ; *4 (dword offset)
 12370                              <1> 	; 23/07/2022
 12371                              <1> 	;shl	ebx, 2
 12372 00010674 8B83[C4860100]      <1> 	mov	eax, [ebx+OF_SIZE]
 12373 0001067A A3[28910100]        <1> 	mov	[i.size], eax ; file size
 12374 0001067F 8D83[44860100]      <1> 	lea	eax, [ebx+OF_POINTER] ; 12/10/2016
 12375 00010685 A3[34900100]        <1> 	mov	[u.fofp], eax
 12376 0001068A 8B83[44850100]      <1> 	mov	eax, [ebx+OF_FCLUSTER]
 12377 00010690 C0EB02              <1> 	shr	bl, 2 ; /4 (byte offset)
 12378                              <1> 	; 23/07/2022
 12379                              <1> 	;shr	ebx, 2
 12380                              <1> 	; 17/04/2021
 12381 00010693 F8                  <1> 	clc 
 12382                              <1> getf4:
 12383 00010694 C3                  <1> 	retn
 12384                              <1> ;getf5: 
 12385                              <1> 	; 17/04/2021
 12386                              <1> 	; (following code is disabled as temporary)
 12387                              <1> 	;
 12388                              <1> 	;; get device number
 12389                              <1> 	;and	bl, 7Fh ; 1 to 7Fh
 12390                              <1> 	;dec	bl ; 0 based (0 to 7Eh)
 12391                              <1> 	;mov	al, [ebx+DEV_DRIVER]
 12392                              <1> 	;mov	ch, [ebx+DEV_ACCESS]
 12393                              <1> 	;mov	cl, [ebx+DEV_OPENMODE]
 12394                              <1> 	;and	ch, 0FEh ; reset bit 0 ; dev_close
 12395                              <1> 	;
 12396                              <1> 	; 23/07/2022
 12397                              <1> 	;stc ; cf = 1 
 12398                              <1> 	;retn
 12399                              <1> 
 12400                              <1> trans_addr_nmbp:
 12401                              <1> 	; 18/10/2015
 12402                              <1> 	; 12/10/2015
 12403 00010695 8B2D[3C900100]      <1> 	mov 	ebp, [u.namep]
 12404                              <1> trans_addr_nm: 
 12405                              <1> 	; Convert virtual (pathname) address to physical address
 12406                              <1> 	; (Retro UNIX 386 v1 feature only !)
 12407                              <1> 	; 18/10/2015
 12408                              <1> 	; 12/10/2015 (u.pnbase & u.pncount has been removed from code)
 12409                              <1> 	; 02/07/2015
 12410                              <1> 	; 17/06/2015
 12411                              <1> 	; 16/06/2015
 12412                              <1> 	;
 12413                              <1> 	; INPUTS: 
 12414                              <1> 	;	ebp = pathname address (virtual) ; [u.namep]
 12415                              <1> 	;	[u.pgdir] = user's page directory
 12416                              <1> 	; OUTPUT:
 12417                              <1> 	;       esi = physical address of the pathname
 12418                              <1> 	;	ecx = remain byte count in the page
 12419                              <1> 	;
 12420                              <1> 	; (Modified registers: EAX, EBX, ECX, EDX, ESI)
 12421                              <1> 	;
 12422 0001069B 833D[7C900100]00    <1>         cmp     dword [u.ppgdir], 0  ; /etc/init ? (sysexec)
 12423 000106A2 7618                <1> 	jna	short trans_addr_nmk ; the caller is os kernel;
 12424                              <1> 				     ; it is already physical address
 12425 000106A4 50                  <1>    	push	eax	
 12426 000106A5 89EB                <1> 	mov	ebx, ebp ; [u.namep] ; pathname address (virtual)
 12427 000106A7 E8EA54FFFF          <1>        	call	get_physical_addr ; get physical address
 12428 000106AC 7204                <1> 	jc	short tr_addr_nm_err
 12429                              <1> 	; 18/10/2015
 12430                              <1> 	; eax = physical address 
 12431                              <1> 	; cx = remain byte count in page (1-4096) 
 12432                              <1> 		; 12/10/2015 (cx = [u.pncount])
 12433 000106AE 89C6                <1> 	mov	esi, eax ; 12/10/2015 (esi=[u.pnbase])
 12434 000106B0 58                  <1> 	pop	eax 
 12435 000106B1 C3                  <1> 	retn
 12436                              <1> 
 12437                              <1> tr_addr_nm_err:
 12438 000106B2 A3[88900100]        <1> 	mov	[u.error], eax
 12439                              <1> 	;pop 	eax
 12440 000106B7 E97BC7FFFF          <1> 	jmp	error
 12441                              <1> 
 12442                              <1> trans_addr_nmk:
 12443                              <1> 	; 12/10/2015
 12444                              <1> 	; 02/07/2015
 12445 000106BC 8B35[3C900100]      <1> 	mov	esi, [u.namep]  ; [u.pnbase]
 12446 000106C2 66B90010            <1> 	mov	cx, PAGE_SIZE ; 4096 ; [u.pncount]
 12447 000106C6 C3                  <1> 	retn
 12448                              <1> 
 12449                              <1> sysbreak:
 12450                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
 12451                              <1> 	; 18/10/2015
 12452                              <1> 	; 07/10/2015
 12453                              <1> 	; 23/06/2015 (Retro UNIX 386 v1 - Beginning)
 12454                              <1> 	; 20/06/2013 - 24/03/2014 (Retro UNIX 8086 v1)
 12455                              <1> 	;
 12456                              <1> 	; 'sysbreak' sets the programs break points. 
 12457                              <1> 	; It checks the current break point (u.break) to see if it is
 12458                              <1> 	; between "core" and the stack (sp). If it is, it is made an
 12459                              <1> 	; even address (if it was odd) and the area between u.break
 12460                              <1> 	; and the stack is cleared. The new breakpoint is then put
 12461                              <1> 	; in u.break and control is passed to 'sysret'.
 12462                              <1> 	;
 12463                              <1> 	; Calling sequence:
 12464                              <1> 	;	sysbreak; addr
 12465                              <1> 	; Arguments: -
 12466                              <1> 	;	
 12467                              <1> 	; Inputs: u.break - current breakpoint
 12468                              <1> 	; Outputs: u.break - new breakpoint 
 12469                              <1> 	;	area between old u.break and the stack (sp) is cleared.
 12470                              <1> 	; ...............................................................
 12471                              <1> 	;	
 12472                              <1> 	; Retro UNIX 8086 v1 modification:
 12473                              <1> 	;	The user/application program puts breakpoint address
 12474                              <1> 	;       in BX register as 'sysbreak' system call argument.
 12475                              <1> 	; 	(argument transfer method 1)
 12476                              <1> 	;
 12477                              <1> 	;  NOTE: Beginning of core is 0 in Retro UNIX 8086 v1 !
 12478                              <1> 	; 	((!'sysbreak' is not needed in Retro UNIX 8086 v1!))
 12479                              <1> 	;  NOTE:
 12480                              <1> 	; 	'sysbreak' clears extended part (beyond of previous
 12481                              <1> 	;	'u.break' address) of user's memory for original unix's
 12482                              <1> 	;	'bss' compatibility with Retro UNIX 8086 v1 (19/11/2013)
 12483                              <1> 
 12484                              <1> 		; mov u.break,r1 / move users break point to r1
 12485                              <1> 		; cmp r1,$core / is it the same or lower than core?
 12486                              <1> 		; blos 1f / yes, 1f
 12487                              <1> 	; 23/06/2015
 12488 000106C7 8B2D[50900100]      <1> 	mov	ebp, [u.break] ; virtual address (offset)
 12489                              <1> 	;and	ebp, ebp
 12490                              <1> 	;jz	short sysbreak_3 
 12491                              <1> 	; Retro UNIX 386 v1 NOTE: u.break points to virtual address !!!
 12492                              <1> 	; (Even break point address is not needed for Retro UNIX 386 v1)
 12493 000106CD 8B15[18900100]      <1> 	mov	edx, [u.sp] ; kernel stack at the beginning of sys call
 12494 000106D3 83C20C              <1> 	add	edx, 12 ; EIP -4-> CS -4-> EFLAGS -4-> ESP (user) 
 12495                              <1> 	; 07/10/2015
 12496 000106D6 891D[50900100]      <1> 	mov	[u.break], ebx ; virtual address !!!
 12497                              <1> 	;
 12498 000106DC 3B1A                <1> 	cmp	ebx, [edx] ; compare new break point with 
 12499                              <1> 			   ; with top of user's stack (virtual!)
 12500 000106DE 7323                <1> 	jnb	short sysbreak_3
 12501                              <1> 		; cmp r1,sp / is it the same or higher 
 12502                              <1> 			  ; / than the stack?
 12503                              <1> 		; bhis 1f / yes, 1f
 12504 000106E0 89DE                <1> 	mov	esi, ebx
 12505 000106E2 29EE                <1> 	sub	esi, ebp ; new break point - old break point
 12506 000106E4 761D                <1> 	jna	short sysbreak_3 
 12507                              <1> 	;push	ebx
 12508                              <1> sysbreak_1:
 12509 000106E6 89EB                <1> 	mov	ebx, ebp  
 12510 000106E8 E8A954FFFF          <1> 	call	get_physical_addr ; get physical address
 12511 000106ED 72C3                <1> 	jc	short tr_addr_nm_err ; 23/07/2022
 12512                              <1> 	; 18/10/2015
 12513 000106EF 89C7                <1> 	mov	edi, eax 
 12514 000106F1 29C0                <1> 	sub	eax, eax ; 0
 12515                              <1> 		 ; ECX = remain byte count in page (1-4096)
 12516 000106F3 39CE                <1> 	cmp	esi, ecx
 12517 000106F5 7302                <1> 	jnb	short sysbreak_2
 12518 000106F7 89F1                <1> 	mov	ecx, esi
 12519                              <1> sysbreak_2:
 12520 000106F9 29CE                <1> 	sub	esi, ecx
 12521 000106FB 01CD                <1> 	add	ebp, ecx
 12522 000106FD F3AA                <1> 	rep 	stosb
 12523 000106FF 09F6                <1> 	or	esi, esi
 12524 00010701 75E3                <1> 	jnz	short sysbreak_1
 12525                              <1> 	;
 12526                              <1> 		; bit $1,r1 / is it an odd address
 12527                              <1> 		; beq 2f / no, its even
 12528                              <1> 		; clrb (r1)+ / yes, make it even
 12529                              <1> 	; 2: / clear area between the break point and the stack
 12530                              <1> 		; cmp r1,sp / is it higher or same than the stack
 12531                              <1> 		; bhis 1f / yes, quit
 12532                              <1> 		; clr (r1)+ / clear word
 12533                              <1> 		; br 2b / go back
 12534                              <1> 	;pop	ebx
 12535                              <1> sysbreak_3: ; 1:
 12536                              <1> 	;mov	[u.break], ebx ; virtual address !!!
 12537                              <1> 		; jsr r0,arg; u.break / put the "address" 
 12538                              <1> 			; / in u.break (set new break point)
 12539                              <1> 		; br sysret4 / br sysret
 12540 00010703 E94FC7FFFF          <1> 	jmp	sysret
 12541                              <1> 
 12542                              <1> sysseek: ; / moves read write pointer in an fsp entry
 12543                              <1> 	; 06/11/2016 - TRDOS 386 (TRDOS v2.0)
 12544                              <1> 	; 22/06/2015 (Retro UNIX 386 v1 - Beginning)
 12545                              <1> 	; 07/07/2013 - 05/08/2013 (Retro UNIX 8086 v1)
 12546                              <1> 	;
 12547                              <1> 	; 'sysseek' changes the r/w pointer of (3rd word of in an
 12548                              <1> 	; fsp entry) of an open file whose file descriptor is in u.r0.
 12549                              <1> 	; The file descriptor refers to a file open for reading or
 12550                              <1> 	; writing. The read (or write) pointer is set as follows:
 12551                              <1> 	;	* if 'ptrname' is 0, the pointer is set to offset.
 12552                              <1> 	;	* if 'ptrname' is 1, the pointer is set to its
 12553                              <1> 	;	  current location plus offset.
 12554                              <1> 	;	* if 'ptrname' is 2, the pointer is set to the
 12555                              <1> 	;	  size of file plus offset.
 12556                              <1> 	; The error bit (e-bit) is set for an undefined descriptor.
 12557                              <1> 	;
 12558                              <1> 	; Calling sequence:
 12559                              <1> 	;	sysseek; offset; ptrname
 12560                              <1> 	; Arguments:
 12561                              <1> 	;	offset - number of bytes desired to move 
 12562                              <1> 	;		 the r/w pointer
 12563                              <1> 	;	ptrname - a switch indicated above
 12564                              <1> 	;
 12565                              <1> 	; Inputs: r0 - file descriptor 
 12566                              <1> 	; Outputs: -
 12567                              <1> 	; ...............................................................
 12568                              <1> 	;	
 12569                              <1> 	; Retro UNIX 8086 v1 modification: 
 12570                              <1> 	;       'sysseek' system call has three arguments; so,
 12571                              <1> 	;	* 1st argument, file descriptor is in BX (BL) register
 12572                              <1> 	;	* 2nd argument, offset is in CX register
 12573                              <1> 	;	* 3rd argument, ptrname/switch is in DX (DL) register
 12574                              <1> 
 12575 00010708 E821000000          <1> 	call	seektell
 12576                              <1> 	; EAX = Current R/W pointer of the file
 12577                              <1> 	; EBX = [u.fofp]
 12578                              <1> 	; [u.base] = offset (ECX input)
 12579                              <1> 
 12580 0001070D 0305[44900100]      <1> 	add	eax, [u.base]
 12581 00010713 8903                <1> 	mov	[ebx], eax
 12582 00010715 E93DC7FFFF          <1> 	jmp	sysret
 12583                              <1> 
 12584                              <1> systell: ; / get the r/w pointer
 12585                              <1> 	; 06/11/2016 - TRDOS 386 (TRDOS v2.0) - temporary !-
 12586                              <1> 	; 22/06/2015 (Retro UNIX 386 v1 - Beginning)
 12587                              <1> 	; 07/07/2013 - 05/08/2013 (Retro UNIX 8086 v1)
 12588                              <1> 	;
 12589                              <1> 	; Retro UNIX 8086 v1 modification:
 12590                              <1> 	; ! 'systell' does not work in original UNIX v1,
 12591                              <1> 	; 	    it returns with error !
 12592                              <1> 	; Inputs: r0 - file descriptor 
 12593                              <1> 	; Outputs: r0 - file r/w pointer
 12594                              <1> 
 12595                              <1> 	;xor	ecx, ecx ; 0
 12596 0001071A BA01000000          <1> 	mov	edx, 1 ; 05/08/2013
 12597                              <1> 	;call 	seektell
 12598 0001071F E810000000          <1> 	call 	seektell0 ; 05/08/2013
 12599                              <1> 	;; 06/11/2016
 12600                              <1> 	;; mov	eax, [ebx]
 12601 00010724 A3[20900100]        <1> 	mov	[u.r0], eax
 12602 00010729 E929C7FFFF          <1> 	jmp	sysret
 12603                              <1> 
 12604                              <1> ; Original unix v1 'systell' system call:
 12605                              <1> 		; jsr r0,seektell
 12606                              <1> 		; br error4
 12607                              <1> 
 12608                              <1> seektell:
 12609                              <1> 	; 06/11/2016 - TRDOS 386 (TRDOS v2.0)
 12610                              <1> 	; 03/01/2016
 12611                              <1> 	; 22/06/2015 (Retro UNIX 386 v1 - Beginning)
 12612                              <1> 	; 07/07/2013 - 05/08/2013 (Retro UNIX 8086 v1)
 12613                              <1> 	;
 12614                              <1> 	; 'seektell' puts the arguments from sysseek and systell
 12615                              <1> 	; call in u.base and u.count. It then gets the i-number of
 12616                              <1> 	; the file from the file descriptor in u.r0 and by calling
 12617                              <1> 	; getf. The i-node is brought into core and then u.count
 12618                              <1> 	; is checked to see it is a 0, 1, or 2.
 12619                              <1> 	; If it is 0 - u.count stays the same
 12620                              <1> 	;          1 - u.count = offset (u.fofp)
 12621                              <1> 	;	   2 - u.count = i.size (size of file)
 12622                              <1> 	; 	 		
 12623                              <1> 	; !! Retro UNIX 8086 v1 modification:
 12624                              <1> 	;	Argument 1, file descriptor is in BX;
 12625                              <1> 	;	Argument 2, offset is in CX;
 12626                              <1> 	;	Argument 3, ptrname/switch is in DX register.	
 12627                              <1> 	;
 12628                              <1> 	; ((Return -> eax = base for offset (position= base+offset))
 12629                              <1> 	;
 12630 0001072E 890D[44900100]      <1> 	mov 	[u.base], ecx ; offset
 12631                              <1> seektell0:
 12632 00010734 8915[48900100]      <1> 	mov 	[u.count], edx
 12633                              <1> 	; EBX = file descriptor (file number)
 12634 0001073A E813FFFFFF          <1> 	call	getf1
 12635                              <1> 	; EAX = First cluster of the file
 12636                              <1> 	; EBX = File number (Open file number)
 12637                              <1> 	; [u.fofp] = Pointer to File pointer
 12638                              <1> 	; [i.size] = File size
 12639                              <1> 
 12640 0001073F 09C0                <1> 	or	eax, eax
 12641 00010741 7514                <1> 	jnz	short seektell1
 12642                              <1> 
 12643 00010743 B80A000000          <1> 	mov	eax, ERR_FILE_NOT_OPEN
 12644 00010748 A3[20900100]        <1> 	mov	[u.r0], eax 
 12645 0001074D A3[88900100]        <1> 	mov	dword [u.error], eax ; 'file not open !'
 12646 00010752 E9E0C6FFFF          <1> 	jmp	error
 12647                              <1> 
 12648                              <1> seektell1:
 12649 00010757 8B1D[34900100]      <1>         mov     ebx, [u.fofp]
 12650 0001075D 803D[48900100]01    <1> 	cmp	byte [u.count], 1
 12651 00010764 7705                <1> 	ja	short seektell2
 12652 00010766 7409                <1> 	je	short seektell3
 12653 00010768 31C0                <1> 	xor	eax, eax
 12654 0001076A C3                  <1> 	retn
 12655                              <1> 
 12656                              <1> seektell2:
 12657 0001076B A1[28910100]        <1>         mov   	eax, [i.size]
 12658 00010770 C3                  <1> 	retn
 12659                              <1> 
 12660                              <1> seektell3:
 12661 00010771 8B03                <1> 	mov	eax, [ebx]
 12662 00010773 C3                  <1> 	retn
 12663                              <1> 
 12664                              <1> sysintr: ; / set interrupt handling
 12665                              <1> 	; 22/06/2015 (Retro UNIX 386 v1 - Beginning)
 12666                              <1> 	; 07/07/2013 (Retro UNIX 8086 v1)
 12667                              <1> 	;
 12668                              <1> 	; 'sysintr' sets the interrupt handling value. It puts
 12669                              <1> 	; argument of its call in u.intr then branches into 'sysquit'
 12670                              <1> 	; routine. u.tty is checked if to see if a control tty exists.
 12671                              <1> 	; If one does the interrupt character in the tty buffer is
 12672                              <1> 	; cleared and 'sysret'is called. If one does not exits
 12673                              <1> 	; 'sysret' is just called.
 12674                              <1> 	;
 12675                              <1> 	; Calling sequence:
 12676                              <1> 	;	sysintr; arg
 12677                              <1> 	; Argument:
 12678                              <1> 	;	arg - if 0, interrupts (ASCII DELETE) are ignored.
 12679                              <1> 	;	    - if 1, intterupts cause their normal result
 12680                              <1> 	;		 i.e force an exit.
 12681                              <1> 	;	    - if arg is a location within the program,
 12682                              <1> 	;		control is passed to that location when
 12683                              <1> 	;		an interrupt occurs.
 12684                              <1> 	; Inputs: -
 12685                              <1> 	; Outputs: -
 12686                              <1> 	; ...............................................................
 12687                              <1> 	;	
 12688                              <1> 	; Retro UNIX 8086 v1 modification: 
 12689                              <1> 	;       'sysintr' system call sets u.intr to value of BX
 12690                              <1> 	;	then branches into sysquit.
 12691                              <1> 	;
 12692 00010774 66891D[6C900100]    <1> 	mov	[u.intr], bx
 12693                              <1> 		; jsr r0,arg; u.intr / put the argument in u.intr
 12694                              <1> 		; br 1f / go into quit routine
 12695 0001077B E9D7C6FFFF          <1> 	jmp	sysret
 12696                              <1> 
 12697                              <1> sysquit:
 12698                              <1> 	; 22/06/2015 (Retro UNIX 386 v1 - Beginning)
 12699                              <1> 	; 07/07/2013 (Retro UNIX 8086 v1)
 12700                              <1> 	;
 12701                              <1> 	; 'sysquit' turns off the quit signal. it puts the argument of
 12702                              <1> 	; the call in u.quit. u.tty is checked if to see if a control 
 12703                              <1> 	; tty exists. If one does the interrupt character in the tty
 12704                              <1> 	; buffer is cleared and 'sysret'is called. If one does not exits
 12705                              <1> 	; 'sysret' is just called.
 12706                              <1> 	;
 12707                              <1> 	; Calling sequence:
 12708                              <1> 	;	sysquit; arg
 12709                              <1> 	; Argument:
 12710                              <1> 	;	arg - if 0, this call diables quit signals from the
 12711                              <1> 	;		typewriter (ASCII FS)
 12712                              <1> 	;	    - if 1, quits are re-enabled and cause execution to
 12713                              <1> 	;		cease and a core image to be produced.
 12714                              <1> 	;		 i.e force an exit.
 12715                              <1> 	;	    - if arg is an addres in the program,
 12716                              <1> 	;		a quit causes control to sent to that
 12717                              <1> 	;		location.
 12718                              <1> 	; Inputs: -
 12719                              <1> 	; Outputs: -
 12720                              <1> 	; ...............................................................
 12721                              <1> 	;	
 12722                              <1> 	; Retro UNIX 8086 v1 modification: 
 12723                              <1> 	;       'sysquit' system call sets u.quit to value of BX
 12724                              <1> 	;	then branches into 'sysret'.
 12725                              <1> 	;
 12726 00010780 66891D[6E900100]    <1> 	mov	[u.quit], bx
 12727 00010787 E9CBC6FFFF          <1> 	jmp	sysret
 12728                              <1> 		; jsr r0,arg; u.quit / put argument in u.quit
 12729                              <1> 	;1:
 12730                              <1> 		; mov u.ttyp,r1 / move pointer to control tty buffer
 12731                              <1> 			      ; / to r1
 12732                              <1> 		; beq sysret4 / return to user
 12733                              <1> 		; clrb 6(r1) / clear the interrupt character 
 12734                              <1> 			   ; / in the tty buffer
 12735                              <1> 		; br sysret4 / return to user
 12736                              <1> 
 12737                              <1> %if 0
 12738                              <1> 
 12739                              <1> anyi: 
 12740                              <1> 	; 23/07/2022
 12741                              <1> 	; 06/10/2016 (TRDOS 386 = TRDOS v2.0)
 12742                              <1> 	; Major Modification!
 12743                              <1> 	; TRDOS 386 does not permit to delete a file while it is open 
 12744                              <1> 	; The role of 'anyi' procedure has beeen changed to ensure that.
 12745                              <1> 	; 	
 12746                              <1> 	; 22/06/2015 (Retro UNIX 386 v1 - Beginning)
 12747                              <1> 	; 25/04/2013 (Retro UNIX 8086 v1)
 12748                              <1> 	;
 12749                              <1> 	; 'anyi' is called if a file deleted while open.
 12750                              <1> 	; "anyi" checks to see if someone else has opened this file.
 12751                              <1> 	;
 12752                              <1> 	; INPUTS ->
 12753                              <1> 	;    r1 - contains an i-number
 12754                              <1> 	;    fsp - start of table containing open files
 12755                              <1> 	;
 12756                              <1> 	; OUTPUTS ->
 12757                              <1> 	;    "deleted" flag set in fsp entry of another occurrence of
 12758                              <1> 	;	   this file and r2 points 1st word of this fsp entry.
 12759                              <1> 	;    if file not found - bit in i-node map is cleared
 12760                              <1> 	;    			 (i-node is freed)
 12761                              <1> 	;               all blocks related to i-node are freed
 12762                              <1> 	;	        all flags in i-node are cleared
 12763                              <1> 	; ((AX = R1)) input
 12764                              <1> 	;
 12765                              <1> 	;    (Retro UNIX Prototype : 02/12/2012, UNIXCOPY.ASM)
 12766                              <1>         ;    ((Modified registers: EDX, ECX, EBX, ESI, EDI, EBP))
 12767                              <1> 	;
 12768                              <1> 	; / r1 contains an i-number
 12769                              <1> 
 12770                              <1> 	; TRDOS 386 (06/10/2016)
 12771                              <1> 	; 
 12772                              <1> 	; INPUT:
 12773                              <1> 	;	EAX = First Cluster
 12774                              <1> 	;	 DL = Logical DOS Drive Number
 12775                              <1> 	;
 12776                              <1> 	; OUTPUT:
 12777                              <1> 	;	CF = 1 -> EBX = File Handle/Number/Index
 12778                              <1> 	;	CF = 0 -> EBX = 0
 12779                              <1> 	;
 12780                              <1> 	; Modified Registers: EBX
 12781                              <1> 
 12782                              <1> 	xor	ebx, ebx
 12783                              <1> anyi_0: 
 12784                              <1> 	cmp	byte [ebx+OF_MODE], 0 ; 0 = empty entry
 12785                              <1> 	ja	short anyi_2 ; 1 (r), 2 (w) or 3 (r&w)
 12786                              <1> anyi_1:
 12787                              <1> 	inc	bl
 12788                              <1> 	cmp	bl, OPENFILES ; max. count of open files
 12789                              <1> 	jb	short anyi_0
 12790                              <1> 	xor	eax, eax
 12791                              <1> 	retn 
 12792                              <1> anyi_2:
 12793                              <1> 	cmp	dl, [ebx+OF_DRIVE]
 12794                              <1> 	jne	short anyi_1
 12795                              <1> 	;shl	bx, 2 ; *4 (dword offset)
 12796                              <1> 	shl	ebx, 2 ; 23/07/2022
 12797                              <1> 	cmp	eax, [ebx+OF_FCLUSTER]
 12798                              <1> 	je	short anyi_3
 12799                              <1> 	;shr	bx, 2 ; /4 (byte offset)
 12800                              <1> 	shr	ebx, 2 ; 23/07/2022
 12801                              <1> 	jmp	short anyi_1 	
 12802                              <1> anyi_3:
 12803                              <1> 	;shr	bx, 2 ; /4 (bytes offset) (index)
 12804                              <1> 	shr	ebx, 2 ; 23/07/2022
 12805                              <1> 	stc
 12806                              <1> 	retn
 12807                              <1> 
 12808                              <1> %endif
 12809                              <1> 
 12810                              <1> ; Retro UNIX 386 v1 Kernel (v0.2) - SYS9.INC
 12811                              <1> ; Last Modification: 09/12/2015
 12812                              <1> 
 12813                              <1> syssleep:
 12814                              <1> 	; 24/07/2022 - TRDOS 386 v2.0.5
 12815                              <1> 	; 29/06/2015 - (Retro UNIX 386 v1)
 12816                              <1> 	; 11/06/2014 - (Retro UNIX 8086 v1)
 12817                              <1> 	;
 12818                              <1> 	; Retro UNIX 8086 v1 feature only
 12819                              <1> 	; (INPUT -> none)
 12820                              <1> 	
 12821                              <1> 	; Temporary - 24/07/2022
 12822 0001078C 891D[20900100]      <1> 	mov	[u.r0], ebx
 12823                              <1> 	;
 12824 00010792 0FB61D[71900100]    <1> 	movzx	ebx, byte [u.uno] ; process number
 12825 00010799 8AA3[438F0100]      <1> 	mov	ah, [ebx+p.ttyc-1] ; current/console tty
 12826 0001079F E8D9160000          <1> 	call	sleep
 12827                              <1> 	; 24/07/2022
 12828 000107A4 FF05[20900100]      <1> 	inc	dword [u.r0] ; Temporary ! 
 12829 000107AA E9A8C6FFFF          <1> 	jmp	sysret
 12830                              <1> 
 12831                              <1> _vp_clr:
 12832                              <1> 	; Reset/Clear Video Page
 12833                              <1> 	;
 12834                              <1> 	; 24/07/2022 - TRDOS 386 v2.0.5
 12835                              <1> 	; 30/06/2015 - (Retro UNIX 386 v1)
 12836                              <1> 	; 21/05/2013 - 30/10/2013(Retro UNIX 8086 v1) (U0.ASM)
 12837                              <1> 	;
 12838                              <1> 	; Retro UNIX 8086 v1 feature only !
 12839                              <1> 	;
 12840                              <1> 	; INPUTS -> 
 12841                              <1> 	;   BH = video page number	 
 12842                              <1> 	;
 12843                              <1> 	; OUTPUT ->
 12844                              <1> 	;   none
 12845                              <1> 	; ((Modified registers: EAX, BH, ECX, EDX, ESI, EDI))
 12846                              <1> 	;
 12847                              <1> 	; 04/12/2013
 12848 000107AF 28C0                <1> 	sub	al, al
 12849                              <1> 	; al = 0 (clear video page)
 12850                              <1> 	; bh = video page ; 13/05/2016
 12851 000107B1 B407                <1> 	mov	ah, 07h
 12852                              <1> 	; ah = 7 (attribute/color)
 12853                              <1> 	;xor 	cx, cx ; 0, left upper column (cl) & row (cl)
 12854                              <1> 	;mov	dx, 184Fh ; right lower column & row (dl=24, dh=79)
 12855                              <1> 	; 24/07/2022
 12856 000107B3 31C9                <1> 	xor	ecx, ecx
 12857 000107B5 BA4F180000          <1> 	mov	edx, 184Fh
 12858 000107BA E81F18FFFF          <1> 	call	_scroll_up
 12859                              <1> 	; bh = video page
 12860                              <1> 	;xor	dx, dx ; 0 (cursor position) 
 12861                              <1> 	; 24/07/2022
 12862 000107BF 31D2                <1> 	xor	edx, edx
 12863 000107C1 E95E1BFFFF          <1> 	jmp 	_set_cpos
 12864                              <1> 
 12865                              <1> sysmsg:
 12866                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
 12867                              <1> 	; 07/12/2020
 12868                              <1> 	; 05/12/2020
 12869                              <1> 	; 13/05/2016
 12870                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
 12871                              <1> 	; 01/07/2015 - 11/11/2015 (Retro UNIX 386 v1)
 12872                              <1> 	; Print user-application message on user's console tty
 12873                              <1> 	;
 12874                              <1> 	; Input -> EBX = Message address
 12875                              <1> 	;	   ECX = Message length (max. 255)
 12876                              <1> 	;	   DL = Color (IBM PC Rombios color attributes)
 12877                              <1> 	;
 12878 000107C6 81F9FF000000        <1> 	cmp	ecx, MAX_MSG_LEN ; 255
 12879                              <1> 	;ja	sysret ; nothing to do with big message size
 12880                              <1> 	; 23/07/2022
 12881 000107CC 7605                <1> 	jna	short sysmsg8
 12882                              <1> sysmsg7:
 12883 000107CE E984C6FFFF          <1> 	jmp	sysret
 12884                              <1> sysmsg8:	; 23/07/2022
 12885 000107D3 08C9                <1> 	or	cl, cl
 12886                              <1> 	;jz	sysret
 12887                              <1> 	; 23/07/2022
 12888 000107D5 74F7                <1> 	jz	short sysmsg7
 12889 000107D7 20D2                <1> 	and	dl, dl
 12890 000107D9 7502                <1> 	jnz	short sysmsg0
 12891 000107DB B207                <1> 	mov	dl, 07h ; default color
 12892                              <1> 		; (black background, light gray character) 
 12893                              <1> sysmsg0:
 12894 000107DD 891D[44900100]      <1> 	mov	[u.base], ebx
 12895 000107E3 8815[B7780100]      <1> 	mov	[ccolor], dl ; color attributes
 12896 000107E9 89E5                <1> 	mov	ebp, esp
 12897 000107EB 31DB                <1> 	xor	ebx, ebx ; 0
 12898 000107ED 891D[4C900100]      <1> 	mov	[u.nread], ebx ; 0
 12899                              <1> 	;
 12900 000107F3 381D[86900100]      <1> 	cmp	[u.kcall], bl ; 0
 12901 000107F9 776F                <1> 	ja	short sysmsgk ; Temporary (01/07/2015)
 12902                              <1> 	;
 12903 000107FB 890D[48900100]      <1> 	mov	[u.count], ecx
 12904                              <1> 	;inc	ecx ; + 00h ; ASCIIZ
 12905                              <1> 	;
 12906                              <1> 	; 07/12/2020
 12907                              <1> 	;add	ecx, 3
 12908 00010801 6683C103            <1> 	add	cx, 3
 12909 00010805 80E1FC              <1> 	and	cl, ~3  ; not 3
 12910                              <1> 	;
 12911 00010808 29CC                <1> 	sub	esp, ecx
 12912 0001080A 89E7                <1> 	mov	edi, esp
 12913 0001080C 89E6                <1> 	mov	esi, esp
 12914 0001080E 66891D[84900100]    <1> 	mov	[u.pcount], bx ; reset page (phy. addr.) counter
 12915                              <1> 	; 11/11/2015
 12916 00010815 8A25[54900100]      <1> 	mov 	ah, [u.ttyp] ; recent open tty
 12917                              <1> 	; 0 = none
 12918 0001081B FECC                <1> 	dec	ah
 12919 0001081D 790C                <1> 	jns	short sysmsg1 
 12920 0001081F 8A1D[71900100]      <1> 	mov	bl, [u.uno] ; process number	
 12921 00010825 8AA3[438F0100]      <1> 	mov	ah, [ebx+p.ttyc-1] ; user's (process's) console tty
 12922                              <1> sysmsg1:
 12923 0001082B 8825[56900100]      <1> 	mov	[u.ttyn], ah
 12924                              <1> sysmsg2:
 12925 00010831 E8FC050000          <1> 	call	cpass
 12926 00010836 7416                <1> 	jz	short sysmsg5
 12927 00010838 AA                  <1> 	stosb
 12928 00010839 20C0                <1> 	and	al, al
 12929 0001083B 75F4                <1> 	jnz	short sysmsg2
 12930                              <1> sysmsg3:
 12931 0001083D 80FC07              <1> 	cmp	ah, 7 ; tty number
 12932 00010840 7711                <1> 	ja	short sysmsg6 ; serial port
 12933 00010842 E83E000000          <1> 	call	print_cmsg ; 05/12/2020
 12934                              <1> sysmsg4:
 12935 00010847 89EC                <1> 	mov	esp, ebp	
 12936 00010849 E909C6FFFF          <1> 	jmp	sysret
 12937                              <1> sysmsg5:
 12938 0001084E C60700              <1> 	mov	byte [edi], 0
 12939 00010851 EBEA                <1> 	jmp	short sysmsg3
 12940                              <1> sysmsg6:
 12941 00010853 8A06                <1> 	mov	al, [esi]
 12942 00010855 E823160000          <1> 	call	sndc
 12943 0001085A 72EB                <1> 	jc	short sysmsg4
 12944 0001085C 803E00              <1> 	cmp	byte [esi], 0  ; 0 is stop character
 12945 0001085F 76E6                <1> 	jna	short sysmsg4
 12946 00010861 46                  <1> 	inc 	esi
 12947 00010862 8A25[56900100]      <1> 	mov	ah, [u.ttyn]
 12948 00010868 EBE9                <1> 	jmp	short sysmsg6
 12949                              <1> 
 12950                              <1> sysmsgk: ; Temporary (01/07/2015)
 12951                              <1> 	; The message has been sent by Kernel (ASCIIZ string)
 12952                              <1> 	; (ECX -character count- will not be considered)
 12953 0001086A 8B35[44900100]      <1> 	mov	esi, [u.base]
 12954 00010870 8A25[B6780100]      <1> 	mov	ah, [ptty] ; present/current screen (video page)
 12955 00010876 8825[56900100]      <1> 	mov	[u.ttyn], ah
 12956 0001087C C605[86900100]00    <1> 	mov	byte [u.kcall], 0
 12957 00010883 EBB8                <1> 	jmp	short sysmsg3
 12958                              <1> 	
 12959                              <1> print_cmsg: 
 12960                              <1> 	; 08/12/2020
 12961                              <1> 	; 07/12/2020
 12962                              <1> 	; 05/12/2020
 12963                              <1> 	; 18/11/2017
 12964                              <1> 	; 13/05/2016 - TRDOS 386 (TRDOS v2.0)
 12965                              <1> 	; 01/07/2015 (Retro UNIX 386 v1)
 12966                              <1> 	;
 12967                              <1> 	; print message (on user's console tty) 
 12968                              <1> 	;	with requested color
 12969                              <1> 	;
 12970                              <1> 	; INPUTS:
 12971                              <1> 	;	esi = message address
 12972                              <1> 	;	[u.ttyn] = tty number (0 to 7)
 12973                              <1> 	;	[ccolor] = color attributes (IBM PC BIOS colors)
 12974                              <1> 	;
 12975                              <1> 	; Modified registers: eax, ebx, ecx, edx, esi, edi
 12976                              <1> 	; (ebp must be preserved)
 12977                              <1> 
 12978                              <1> 	;mov	bh, ah
 12979 00010885 8A3D[56900100]      <1> 	mov	bh, [u.ttyn]
 12980 0001088B 8A1D[B7780100]      <1> 	mov	bl, [ccolor] ; * ; 05/12/2020
 12981                              <1> 
 12982                              <1> 	; 05/12/2020
 12983 00010891 803D[D49E0100]00    <1> 	cmp	byte [pmi32], 0 ; is vbios's 32 bit pmi enabled ?
 12984 00010898 772E                <1> 	ja	short pcmsg5 ; yes
 12985                              <1> pcmsg1:
 12986                              <1> 	; 08/12/2020
 12987 0001089A 8A1D[B7780100]      <1> 	mov	bl, [ccolor] ; * (video.s 'u11'&'beep' change BL)
 12988                              <1> 	
 12989 000108A0 AC                  <1> 	lodsb
 12990 000108A1 20C0                <1> 	and 	al, al  ; 0
 12991 000108A3 743A                <1> 	jz 	short pcmsg2
 12992                              <1> pcmsg7:
 12993 000108A5 56                  <1> 	push 	esi
 12994                              <1> 	;mov	bl, [ccolor] ; * (video.s 'u11'&'beep' change BL)
 12995                              <1> 	; 05/12/2020
 12996                              <1> 	;;mov	bh, [u.ttyn]
 12997                              <1> 	;call 	_write_tty
 12998                              <1> 	;pop	esi
 12999                              <1> 	;jmp	short pcmsg1
 13000                              <1> ;pcmsg2:
 13001                              <1> 	;retn
 13002                              <1> 
 13003                              <1> 	; 07/12/2020
 13004 000108A6 803D[BE670000]03    <1> 	cmp     byte [CRT_MODE], 3
 13005 000108AD 7708                <1> 	ja 	short pcmsg4
 13006                              <1> pcmsg3:
 13007 000108AF E8EB19FFFF          <1> 	call	_write_tty_m3
 13008 000108B4 5E                  <1> 	pop	esi
 13009 000108B5 EBE3                <1> 	jmp	short pcmsg1
 13010                              <1> pcmsg4:
 13011 000108B7 803D[BE670000]07    <1>         cmp     byte [CRT_MODE], 7
 13012 000108BE 76EF                <1> 	jna 	short pcmsg3
 13013 000108C0 E8A326FFFF          <1> 	call	vga_write_teletype
 13014 000108C5 5E                  <1> 	pop	esi
 13015 000108C6 EBD2                <1> 	jmp	short pcmsg1
 13016                              <1> pcmsg5:
 13017                              <1> 	; 07/12/2020
 13018 000108C8 803D[BE670000]07    <1>         cmp     byte [CRT_MODE], 7
 13019 000108CF 76C9                <1> 	jna 	short pcmsg1
 13020                              <1> 
 13021                              <1> 	; 05/12/2020
 13022                              <1> 	; writing message by using
 13023                              <1> 	; VESA VBE3 video bios protected mode interface
 13024                              <1> 	
 13025 000108D1 B40E                <1> 	mov	ah, 0Eh
 13026                              <1> pcmsg6:
 13027 000108D3 AC                  <1> 	lodsb
 13028 000108D4 20C0                <1> 	and 	al, al  ; 0
 13029 000108D6 7407                <1> 	jz 	short pcmsg2
 13030                              <1> 	; bh = video page
 13031                              <1> 	; ah = 0Eh 
 13032                              <1> 	; al = character
 13033                              <1> 	; bl = color
 13034 000108D8 E80311FFFF          <1> 	call	int10h_32bit_pmi
 13035 000108DD EBF4                <1> 	jmp	short pcmsg6
 13036                              <1> pcmsg2:
 13037 000108DF C3                  <1> 	retn
 13038                              <1> 
 13039                              <1> sysgeterr:
 13040                              <1> 	; 09/12/2015
 13041                              <1> 	; 21/09/2015 - (Retro UNIX 386 v1 feature only!)
 13042                              <1> 	; Get last error number or page fault count
 13043                              <1> 	; (for debugging)
 13044                              <1> 	;
 13045                              <1> 	; Input -> EBX = return type
 13046                              <1> 	;	   0 = last error code (which is in 'u.error')	
 13047                              <1> 	;	   FFFFFFFFh = page fault count for running process
 13048                              <1> 	;	   FFFFFFFEh = total page fault count
 13049                              <1> 	;	   1 .. FFFFFFFDh = undefined 
 13050                              <1> 	;
 13051                              <1> 	; Output -> EAX = last error number or page fault count
 13052                              <1> 	;	   (depending on EBX input)
 13053                              <1> 	; 	
 13054 000108E0 21DB                <1> 	and 	ebx, ebx
 13055 000108E2 750B                <1> 	jnz	short glerr_2
 13056                              <1> glerr_0:
 13057 000108E4 A1[88900100]        <1> 	mov	eax, [u.error]
 13058                              <1> glerr_1:
 13059 000108E9 A3[20900100]        <1> 	mov	[u.r0], eax
 13060 000108EE C3                  <1>  	retn
 13061                              <1> glerr_2:
 13062 000108EF 43                  <1> 	inc	ebx ; FFFFFFFFh -> 0, FFFFFFFEh -> FFFFFFFFh
 13063 000108F0 74FD                <1> 	jz	short glerr_2 ; page fault count for process
 13064 000108F2 43                  <1> 	inc	ebx ; FFFFFFFFh -> 0	
 13065 000108F3 75EF                <1> 	jnz	short glerr_0
 13066 000108F5 A1[38920100]        <1> 	mov	eax, [PF_Count] ; total page fault count
 13067 000108FA EBED                <1>         jmp     short glerr_1
 13068                              <1> glerr_3:
 13069 000108FC A1[8C900100]        <1> 	mov 	eax, [u.pfcount]
 13070 00010901 EBE6                <1> 	jmp	short glerr_1
 13071                              <1> 
 13072                              <1> load_and_run_file:
 13073                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5
 13074                              <1> 	; 18/11/2017
 13075                              <1> 	; 22/01/2017
 13076                              <1> 	; 04/01/2017 - 07/01/2017
 13077                              <1> 	; 24/10/2016
 13078                              <1> 	; 24/04/2016 - 02/05/2016 - 03/05/2016 - 06/05/2016
 13079                              <1> 	; 23/04/2016 (TRDOS 386 = TRDOS v2.0)
 13080                              <1> 	; 23/10/2015 (Retro UNIX 386 v1, 'sysexec')
 13081                              <1> 	; 23/06/2015 (Retro UNIX 386 v1 - Beginning)
 13082                              <1> 	; 03/06/2013 - 06/12/2013 (Retro UNIX 8086 v1)
 13083                              <1> 	; EAX = First Cluster number
 13084                              <1> 	; EDX = File Size
 13085                              <1> 	; ESI = Argument list address
 13086                              <1> 	; [argc] = argument count
 13087                              <1> 	; [u.nread] = argument list length
 13088                              <1> 	; [esp] = return address to the caller (*)
 13089                              <1> 	;
 13090 00010903 8935[1C910100]      <1> 	mov	[argv], esi
 13091 00010909 8915[28910100]      <1> 	mov	[i.size], edx
 13092 0001090F A3[24910100]        <1> 	mov	[ii], eax
 13093                              <1> 
 13094                              <1> 	;sti	; 07/01/2017
 13095                              <1> 	;mov	eax, [k_page_dir]
 13096                              <1> 	;mov	[u.pgdir], eax
 13097 00010914 31C0                <1> 	xor 	eax, eax ; clc ; *** ; 04/01/2017
 13098                              <1> 	;mov	[u.r0], eax ; 0 ; 07/01/2017
 13099                              <1> 
 13100                              <1> 	; 06/05/2016
 13101                              <1> 	; Set 'sysexit' return order to MainProg
 13102                              <1> 	;
 13103 00010916 58                  <1> 	pop	eax ; * 'loc_load_and_run_file_8:' address
 13104                              <1> 	;; 22/01/2017
 13105                              <1> 	;;cli ; 07/01/2017
 13106 00010917 8B25[24780100]      <1> 	mov	esp, [tss.esp0]
 13107                              <1> 	;
 13108                              <1> 	; 'loc_load_run_file_8' address has 
 13109                              <1> 	; 'jmp loc_file_rw_restore_retn' instruction
 13110                              <1> 	; 'loc_file_rw_restore_retn:' will return to
 13111                              <1> 	; [mainprog_return_addr] 
 13112                              <1> 	; just after 'call command_interpreter'
 13113                              <1> 	;
 13114 0001091D 68[286D0000]        <1> 	push	_end_of_mainprog ; we must not return to here !
 13115 00010922 FF35[04850100]      <1> 	push	dword [mainprog_return_addr]
 13116 00010928 89E5                <1> 	mov	ebp, esp ; **
 13117                              <1> 	;	
 13118 0001092A 9C                  <1> 	pushfd  ; EFLAGS      ; IRETD ; ***
 13119 0001092B 6A08                <1> 	push	KCODE ; cs    ; IRETD
 13120 0001092D 50                  <1> 	push	eax ; * (eip) ; IRETD
 13121 0001092E 8925[18900100]      <1> 	mov	[u.sp], esp
 13122                              <1> 	;mov	byte [u.quant], time_count
 13123 00010934 1E                  <1> 	push	ds
 13124 00010935 06                  <1> 	push	es
 13125 00010936 0FA0                <1> 	push	fs
 13126 00010938 0FA8                <1> 	push	gs	
 13127                              <1> 	;mov	eax, [u.r0]
 13128 0001093A 29C0                <1> 	sub	eax, eax
 13129 0001093C 60                  <1> 	pushad
 13130 0001093D 68[57CE0000]        <1> 	push	sysret
 13131                              <1> 	;push	sysrel1 ; 07/01/2017
 13132 00010942 8925[1C900100]      <1> 	mov	[u.usp], esp
 13133                              <1> 	;
 13134 00010948 E800040000          <1> 	call	wswap ; Save MainProg (process 1) 'u' structure
 13135                              <1> 		      ; and registers for return (from program)	
 13136 0001094D 89EC                <1> 	mov	esp, ebp ; **
 13137                              <1> 	;;22/01/2017
 13138                              <1> 	;;sti ; 07/01/2017
 13139                              <1> 	; 23/07/2022
 13140                              <1> 	;push	eax  ; * 'loc_load_and_run_file_8:' address
 13141                              <1> 	;
 13142                              <1> 	;;; 02/05/2016
 13143                              <1> 	;;; Create a new process (parent: MainProg)	
 13144 0001094F 31F6                <1> 	xor 	esi, esi
 13145                              <1> cnpm_1: ; search p.stat table for unused process number
 13146 00010951 46                  <1> 	inc	esi
 13147 00010952 80BE[638F0100]00    <1> 	cmp	byte [esi+p.stat-1], 0 ; SFREE
 13148                              <1> 				; is process active, unused, dead
 13149 00010959 760B                <1> 	jna	short cnpm_2	; it's unused so branch
 13150 0001095B 6683FE10            <1> 	cmp	si, nproc 	; all processes checked
 13151 0001095F 72F0                <1> 	jb	short cnpm_1    ; no, branch back
 13152                              <1> cnpm_panic:
 13153 00010961 E94364FFFF          <1> 	jmp	panic 
 13154                              <1> cnpm_2:
 13155 00010966 A1[78900100]        <1> 	mov	eax, [u.pgdir] ; page directory of MainProg
 13156 0001096B A3[7C900100]        <1> 	mov	[u.ppgdir], eax ; parent's page directory
 13157 00010970 E8434EFFFF          <1> 	call	allocate_page
 13158                              <1> 	;jc	panic
 13159                              <1> 	; 23/07/2022
 13160 00010975 72EA                <1> 	jc	short cnpm_panic
 13161                              <1> 	
 13162                              <1> 	; EAX = UPAGE (user structure page) address
 13163 00010977 A3[74900100]        <1> 	mov	[u.upage], eax ; memory page for 'user' struct (child)
 13164 0001097C 89F7                <1> 	mov	edi, esi
 13165                              <1> 	;shl	di, 2
 13166                              <1> 	; 23/07/2022
 13167 0001097E C1E702              <1> 	shl	edi, 2
 13168 00010981 8987[708F0100]      <1> 	mov	[edi+p.upage-4], eax ; memory page for 'user' struct
 13169 00010987 E89D4EFFFF          <1> 	call	clear_page ; 03/05/2016
 13170                              <1> 	;;movzx	eax, byte [p.ttyc] ; console tty (for MainProg)
 13171                              <1> 	;sub	ax, ax ; 0
 13172                              <1> 	; 23/07/2022
 13173 0001098C 29C0                <1> 	sub	eax, eax
 13174 0001098E 668986[438F0100]    <1> 	mov     [esi+p.ttyc-1], ax ; al - set child's console tty
 13175                              <1> 				   ; ah - reset child's wait channel	
 13176 00010995 66A3[54900100]      <1> 	mov 	[u.ttyp], ax ; 0
 13177                              <1> 	
 13178 0001099B 89F2                <1> 	mov	edx, esi
 13179 0001099D 8815[71900100]      <1> 	mov	[u.uno], dl ; child process number
 13180 000109A3 FE86[638F0100]      <1>         inc     byte [esi+p.stat-1] ; 1, SRUN
 13181                              <1> 	;shl	si, 1 ; multiply si by 2 to get index into p.pid table
 13182                              <1> 	; 23/07/2022
 13183 000109A9 D1E6                <1> 	shl	esi, 1
 13184 000109AB 66FF05[08900100]    <1> 	inc	word [mpid] ; increment m.pid; get a new process name
 13185                              <1> 
 13186                              <1> 	; 23/07/2022	
 13187                              <1> 	;mov	ax, [p.pid]  ; get process name of MainProg
 13188                              <1> 	;mov	ax, 1
 13189 000109B2 FEC0                <1> 	inc	al ; eax = 1
 13190 000109B4 668986[228F0100]    <1> 	mov	[esi+p.ppid-2], ax ; put parent process name 
 13191                              <1> 			           ; in parent process slot for child
 13192 000109BB A2[6A900100]        <1> 	mov	[u.pri], al ; 1	; normal priority
 13193                              <1> 	
 13194                              <1> 	;dec	ax ; 0
 13195                              <1> 	;mov 	[u.ttyp], ax ; 0
 13196                              <1> 
 13197 000109C0 66A1[08900100]      <1> 	mov	ax, [mpid]
 13198 000109C6 668986[028F0100]    <1> 	mov	[esi+p.pid-2], ax ; put new process name 
 13199                              <1> 				  ; in child process' name slot
 13200                              <1> 	;;;
 13201 000109CD A1[24910100]        <1> 	mov 	eax, [ii]
 13202                              <1> 	; 23/07/2022
 13203                              <1> 	; Retro UNIX 386 v1, 'sysexec' (u2.s)
 13204                              <1> 	;call	iopen
 13205                              <1> 	; 06/06/2016
 13206                              <1> 	;mov	byte [u.pri], 1 ; normal priority
 13207                              <1> 	;
 13208                              <1> 	;jmp	short sysexec_7 ; 02/05/2016
 13209                              <1> 	; 23/07/2022
 13210 000109D2 E96DF9FFFF          <1> 	jmp	sysexec_7
 13211                              <1> 
 13212                              <1> ;	; 02/05/2016
 13213                              <1> ;	;inc	byte [sysflg] ; 0FFh -> 0
 13214                              <1> ;	;mov	byte [sysflg], 0 ; 04/01/2017
 13215                              <1> ;	movzx	ebx, byte [u.uno]
 13216                              <1> ;	shl	bl, 1 ; 13/11/2017 	
 13217                              <1> ;	cmp	word [ebx+p.ppid-2], 1 ; MainProg
 13218                              <1> ;	ja	sysret0 ; 03/05/2016
 13219                              <1> ;	push	sysret ; * 
 13220                              <1> ;	mov	[u.usp], esp
 13221                              <1> ;	call	wswap ; save child process 'u' structure and
 13222                              <1> ;		      ; registers
 13223                              <1> ;	add	dword [u.usp], 4 ; 03/05/2016 
 13224                              <1> ;sysexec_19: ; 02/05/2016
 13225                              <1> ;	retn ; * 'sysret' ; byte [sysflg] -> 0FFh
 13226                              <1> 
 13227                              <1> readi:
 13228                              <1> 	; 09/08/2022
 13229                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5
 13230                              <1> 	; 01/05/2016
 13231                              <1> 	; 25/04/2016 - TRDOS 386 (TRDOS v2.0)
 13232                              <1> 	; 20/05/2015 - Retro UNIX 386 v1
 13233                              <1> 	; 11/03/2013 - 31/07/2013 (Retro UNIX 8086 v1)
 13234                              <1> 	;
 13235                              <1> 	; Reads from a file whose the first cluster number in EAX
 13236                              <1> 	; 
 13237                              <1> 	; INPUTS ->
 13238                              <1> 	;    EAX - First cluster number of the file
 13239                              <1> 	;    u.count - byte count user desires
 13240                              <1> 	;    u.base - points to user buffer
 13241                              <1> 	;    u.fofp - points to dword with current file offset
 13242                              <1> 	;    i.size - file size
 13243                              <1> 	;    cdev - logical dos drive number of the file
 13244                              <1> 	; OUTPUTS ->
 13245                              <1> 	;    u.count - cleared
 13246                              <1> 	;    u.nread - accumulates total bytes passed back
 13247                              <1> 	;
 13248                              <1> 	; ((EAX)) input/output
 13249                              <1> 	; (Retro UNIX Prototype : 14/12/2012 - 01/03/2013, UNIXCOPY.ASM)
 13250                              <1>         ; ((Modified registers: edx, ebx, ecx, esi, edi))  
 13251                              <1> 
 13252 000109D7 31D2                <1> 	xor	edx, edx ; 0
 13253 000109D9 8915[4C900100]      <1> 	mov 	[u.nread], edx ; 0
 13254 000109DF 668915[84900100]    <1> 	mov	[u.pcount], dx ; 19/05/2015
 13255 000109E6 3915[48900100]      <1> 	cmp 	[u.count], edx ; 0
 13256                              <1> 	;ja 	short readi_1
 13257                              <1> 	;retn
 13258                              <1> 	; 09/08/2022
 13259 000109EC 765E                <1> 	jna	short dskr_5 ; retn
 13260                              <1> ;readi_1:
 13261                              <1> dskr:
 13262                              <1> 	; 01/05/2016
 13263                              <1> 	; 25/04/2016 - TRDOS 386 (TRDOS v2.0)
 13264                              <1> 	; 24/05/2015 - 12/10/2015 (Retro UNIX 386 v1)
 13265                              <1> 	; 26/04/2013 - 03/08/2013 (Retro UNIX 8086 v1)
 13266                              <1> dskr_0:
 13267 000109EE 8B15[28910100]      <1>         mov	edx, [i.size]
 13268 000109F4 8B1D[34900100]      <1> 	mov	ebx, [u.fofp]
 13269 000109FA 2B13                <1> 	sub	edx, [ebx]
 13270 000109FC 7647                <1> 	jna	short dskr_4
 13271                              <1> 	;
 13272 000109FE 50                  <1> 	push	eax ; 01/05/2016
 13273 000109FF 3B15[48900100]      <1> 	cmp     edx, [u.count] 
 13274 00010A05 7306                <1> 	jnb	short dskr_1
 13275 00010A07 8915[48900100]      <1> 	mov	[u.count], edx
 13276                              <1> dskr_1:
 13277                              <1> 	; EAX = First Cluster
 13278                              <1> 	; [Current_Drv] = Physical drive number 
 13279 00010A0D E83B000000          <1> 	call	mget_r
 13280                              <1> 	; NOTE: in 'mget_r', relevant sector will be read in buffer
 13281                              <1> 	; if it is not already in buffer !
 13282 00010A12 BB[44920100]        <1> 	mov	ebx, readi_buffer
 13283 00010A17 803D[86900100]00    <1> 	cmp	byte [u.kcall], 0 ; the caller is 'namei' sign (=1)
 13284 00010A1E 770F                <1> 	ja	short dskr_3	  ; zf=0 -> the caller is 'namei'
 13285 00010A20 66833D[84900100]00  <1> 	cmp	word [u.pcount], 0
 13286 00010A28 7705                <1> 	ja	short dskr_3
 13287                              <1> dskr_2:
 13288                              <1> 	; [u.base] = virtual address to transfer (as destination address)
 13289 00010A2A E88D010000          <1> 	call	trans_addr_w ; translate virtual address to physical (w)
 13290                              <1> dskr_3:
 13291                              <1> 	; EBX (r5) = system (I/O) buffer address -physical-
 13292 00010A2F E8F0010000          <1> 	call	sioreg
 13293 00010A34 87F7                <1> 	xchg	esi, edi
 13294                              <1> 	; EDI = file (user data) offset
 13295                              <1> 	; ESI = sector (I/O) buffer offset
 13296                              <1> 	; ECX = byte count
 13297 00010A36 F3A4                <1> 	rep	movsb
 13298                              <1> 	; eax = remain bytes in buffer
 13299                              <1>         ;       (check if remain bytes in the buffer > [u.pcount])
 13300 00010A38 09C0                <1> 	or	eax, eax
 13301 00010A3A 75EE                <1> 	jnz	short dskr_2 ; (page end before system buffer end!)
 13302 00010A3C 58                  <1> 	pop	eax  ; (first cluster number)
 13303 00010A3D 390D[48900100]      <1> 	cmp	[u.count], ecx ; 0
 13304 00010A43 77A9                <1> 	ja	short dskr_0
 13305                              <1> dskr_4:
 13306 00010A45 C605[86900100]00    <1> 	mov	byte [u.kcall], 0
 13307                              <1> dskr_5:		; 23/07/2022
 13308 00010A4C C3                  <1> 	retn
 13309                              <1> 
 13310                              <1> mget_r:
 13311                              <1> 	; 29/08/2023
 13312                              <1> 	; 30/07/2022
 13313                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5
 13314                              <1> 	; 24/10/2016
 13315                              <1> 	; 22/10/2016
 13316                              <1> 	; 12/10/2016
 13317                              <1> 	; 29/04/2016
 13318                              <1> 	; 25/04/2016 - TRDOS 386 (TRDOS v2.0)
 13319                              <1> 	; 03/06/2015 (Retro UNIX 386 v1, 'mget', u.5s)
 13320                              <1> 	; 22/03/2013 - 31/07/2013 (Retro UNIX 8086 v1)
 13321                              <1> 	;
 13322                              <1> 	; Get existing or (allocate) a new disk block for file
 13323                              <1> 	; 
 13324                              <1> 	; INPUTS ->
 13325                              <1> 	;    [u.fofp] = file offset pointer
 13326                              <1> 	;    EAX = First Cluster
 13327                              <1> 	;    [cdev] = Logical dos drive number 	  
 13328                              <1> 	;    ([u.off] = file offset)
 13329                              <1> 	; OUTPUTS ->
 13330                              <1> 	;    EAX = logical sector number
 13331                              <1> 	;    ESI = Logical Dos Drive Description Table address	
 13332                              <1> 	;
 13333                              <1> 	; Modified registers: EDX, EBX, ECX, ESI, EDI
 13334                              <1> 
 13335 00010A4D 8B35[34900100]      <1> 	mov     esi, [u.fofp]
 13336 00010A53 8B1E                <1> 	mov	ebx, [esi] ; (u.off)
 13337                              <1> 
 13338 00010A55 29C9                <1> 	sub	ecx, ecx
 13339 00010A57 8A2D[05900100]      <1> 	mov	ch, [cdev]
 13340                              <1> 
 13341 00010A5D BE00010900          <1> 	mov	esi, Logical_DOSDisks
 13342 00010A62 01CE                <1> 	add	esi, ecx
 13343                              <1> 
 13344 00010A64 380D[B8840100]      <1> 	cmp	[readi.valid], cl ; 0
 13345 00010A6A 7648                <1> 	jna	short mget_r_0
 13346                              <1> 	
 13347 00010A6C 3A2D[B9840100]      <1> 	cmp	ch, [readi.drv]
 13348 00010A72 7540                <1> 	jne	short mget_r_0
 13349                              <1> 
 13350 00010A74 3B05[CC840100]      <1> 	cmp	eax, [readi.fclust]
 13351 00010A7A 7561                <1> 	jne	short mget_r_3
 13352                              <1> 	
 13353 00010A7C 89D8                <1> 	mov	eax, ebx ; file offset
 13354 00010A7E 668B0D[C0840100]    <1> 	mov	cx, [readi.bpc]
 13355 00010A85 41                  <1> 	inc	ecx ; <= 65536
 13356 00010A86 29D2                <1> 	sub	edx, edx
 13357 00010A88 F7F1                <1> 	div	ecx
 13358                              <1> 
 13359 00010A8A 8B3D[C8840100]      <1> 	mov	edi, [readi.c_index] ; cluster index
 13360                              <1> 
 13361 00010A90 39F8                <1> 	cmp	eax, edi
 13362 00010A92 7576                <1>         jne     short mget_r_4  ; (*)
 13363                              <1> 
 13364                              <1> 	; edx = byte offset in cluster (<= 65535)
 13365 00010A94 668915[C2840100]    <1> 	mov	[readi.offset], dx
 13366                              <1> 	; 23/07/2022
 13367                              <1> 	;shr	dx, 9 ; / 512
 13368 00010A9B C1EA09              <1> 	shr	edx, 9
 13369 00010A9E 8815[BB840100]      <1> 	mov	[readi.s_index], dl ; sector index in cluster (0 to spc -1)
 13370                              <1> 	
 13371 00010AA4 A1[C4840100]        <1> 	mov	eax, [readi.cluster]  ; > 0 if [readi.valid] = 1
 13372 00010AA9 8B15[D0840100]      <1> 	mov	edx, [readi.fs_index]
 13373 00010AAF E996000000          <1>         jmp     mget_r_7
 13374                              <1> 	
 13375                              <1> mget_r_0:
 13376 00010AB4 882D[B9840100]      <1> 	mov	[readi.drv], ch ; physical drive number
 13377 00010ABA 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
 13378 00010ABE 7707                <1> 	ja	short mget_r_1
 13379 00010AC0 8A4E12              <1> 	mov	cl, [esi+LD_FS_BytesPerSec+1]
 13380 00010AC3 D0E9                <1> 	shr	cl, 1 ;  ; 1 for 512 bytes, 4 for 2048 bytes
 13381 00010AC5 EB03                <1> 	jmp	short mget_r_2	
 13382                              <1> mget_r_1:
 13383 00010AC7 8A4E13              <1> 	mov	cl, [esi+LD_BPB+BPB_SecPerClust]
 13384                              <1> mget_r_2:
 13385 00010ACA 880D[BA840100]      <1> 	mov	[readi.spc], cl  ; sectors per cluster
 13386                              <1> 	; NOTE: readi bytes per sector value is always 512 !
 13387                              <1> 	; 23/07/2022
 13388                              <1> 	;xor	ch, ch
 13389                              <1> 	; 29/08/2023
 13390 00010AD0 C1E109              <1> 	shl	ecx, 9 
 13391                              <1> 	;shl	cx, 9 ; * 512
 13392                              <1> 	;dec	cx ; bytes per cluster - 1
 13393                              <1> 	; 23/07/2022
 13394 00010AD3 49                  <1> 	dec	ecx
 13395 00010AD4 66890D[C0840100]    <1> 	mov	[readi.bpc], cx
 13396                              <1> 	;sub	cx, cx
 13397                              <1> 	; 23/07/2022
 13398 00010ADB 29C9                <1> 	sub	ecx, ecx
 13399                              <1> mget_r_3:
 13400 00010ADD A3[CC840100]        <1> 	mov	[readi.fclust], eax ; first cluster (or FDT address)
 13401 00010AE2 880D[B8840100]      <1> 	mov	[readi.valid], cl ; 0 
 13402                              <1> 	;mov	[readi.s_index], cl ; 0
 13403                              <1> 	;mov	[readi.offset], cx ; 0
 13404 00010AE8 890D[C8840100]      <1> 	mov	[readi.c_index], ecx ; 0
 13405 00010AEE 890D[C4840100]      <1> 	mov	[readi.cluster], ecx ; 0
 13406 00010AF4 890D[BC840100]      <1> 	mov	[readi.sector], ecx ; 0
 13407                              <1> 	
 13408 00010AFA 89D8                <1> 	mov	eax, ebx ; file offset
 13409 00010AFC 668B0D[C0840100]    <1> 	mov	cx, [readi.bpc]
 13410 00010B03 41                  <1> 	inc	ecx ; <= 65536
 13411 00010B04 29D2                <1> 	sub	edx, edx
 13412 00010B06 F7F1                <1> 	div	ecx
 13413                              <1> 	;mov	edi, [readi.c_index] ; previous cluster index
 13414 00010B08 29FF                <1> 	sub	edi, edi
 13415                              <1> mget_r_4:
 13416 00010B0A A3[C8840100]        <1> 	mov	[readi.c_index], eax ; cluster index
 13417                              <1> 	; edx = byte offset in cluster (<= 65535)
 13418 00010B0F 668915[C2840100]    <1> 	mov	[readi.offset], dx
 13419                              <1> 	; 23/07/2022
 13420                              <1> 	;shr	dx, 9 ; / 512
 13421 00010B16 C1EA09              <1> 	shr	edx, 9
 13422 00010B19 8815[BB840100]      <1> 	mov	[readi.s_index], dl ; sector index in cluster (0 to spc -1)
 13423                              <1> 
 13424 00010B1F 89C1                <1> 	mov	ecx, eax ; current cluster index
 13425 00010B21 A1[CC840100]        <1> 	mov	eax, [readi.fclust]
 13426 00010B26 09C9                <1> 	or	ecx, ecx ; cluster index
 13427 00010B28 741B                <1> 	jz	short mget_r_6
 13428                              <1> 
 13429 00010B2A 39CF                <1> 	cmp	edi, ecx
 13430 00010B2C 7710                <1> 	ja	short mget_r_5 ; old cluster index is higher
 13431 00010B2E 8B15[C4840100]      <1> 	mov	edx, [readi.cluster]
 13432 00010B34 21D2                <1> 	and	edx, edx
 13433 00010B36 7406                <1> 	jz	short mget_r_5
 13434                              <1> 	; valid 'readi' parameters (*)
 13435 00010B38 89D0                <1> 	mov	eax, edx
 13436 00010B3A 29F9                <1> 	sub	ecx, edi
 13437 00010B3C 740C                <1> 	jz	short mget_r_7
 13438                              <1> mget_r_5:
 13439                              <1> 	; EAX = Beginning cluster
 13440                              <1> 	; EDX = Sector index in disk/file section
 13441                              <1> 	;	(Only for SINGLIX file system!)
 13442                              <1> 	; ECX = Cluster sequence number after the beginning cluster
 13443                              <1> 	; ESI = Logical DOS Drive Description Table address
 13444 00010B3E E82CC1FFFF          <1> 	call	get_cluster_by_index
 13445 00010B43 724C                <1> 	jc	short mget_r_err
 13446                              <1> 	; EAX = Cluster number		
 13447                              <1> mget_r_6:
 13448 00010B45 A3[C4840100]        <1> 	mov	[readi.cluster], eax ; FDT number for Singlix File System
 13449                              <1> mget_r_7:
 13450 00010B4A 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
 13451 00010B4E 765D                <1> 	jna	short mget_r_12
 13452                              <1> 
 13453                              <1> 	;sub	eax, 2
 13454                              <1> 	; 30/07/2022
 13455 00010B50 48                  <1> 	dec	eax
 13456 00010B51 48                  <1> 	dec	eax
 13457 00010B52 0FB615[BA840100]    <1> 	movzx	edx, byte [readi.spc]
 13458 00010B59 F7E2                <1> 	mul	edx
 13459                              <1> 
 13460 00010B5B 034668              <1> 	add	eax, [esi+LD_DATABegin]
 13461 00010B5E 8A15[BB840100]      <1> 	mov	dl, [readi.s_index]
 13462 00010B64 01D0                <1> 	add	eax, edx
 13463                              <1> mget_r_8:
 13464                              <1> 	; eax = logical sector number
 13465 00010B66 803D[B8840100]00    <1> 	cmp	byte [readi.valid], 0
 13466 00010B6D 7608                <1> 	jna	short mget_r_9
 13467 00010B6F 3B05[BC840100]      <1> 	cmp	eax, [readi.sector]
 13468 00010B75 7435                <1> 	je	short mget_r_11 ; sector is already in 'readi' buffer
 13469                              <1> mget_r_9:
 13470 00010B77 A3[BC840100]        <1> 	mov	[readi.sector], eax
 13471 00010B7C BB[44920100]        <1> 	mov	ebx, readi_buffer ; buffer address
 13472                              <1> 	;mov	ecx, 1
 13473                              <1> 	; 30/07/2022
 13474 00010B81 31C9                <1> 	xor	ecx, ecx
 13475 00010B83 FEC1                <1> 	inc	cl
 13476                              <1> 	; ecx = 1	
 13477                              <1> 
 13478                              <1> 	; 29/04/2016
 13479                              <1> 	;xor	dl, dl
 13480                              <1> 
 13481                              <1> 	; EAX = Logical sector number
 13482                              <1> 	; ECX = Sector count
 13483                              <1> 	; EBX = Buffer address
 13484                              <1> 	; (EDX = 0)
 13485                              <1> 	; ESI = Logical DOS drive description table address	
 13486                              <1> 
 13487 00010B85 E803130000          <1> 	call	disk_read
 13488 00010B8A 7314                <1> 	jnc	short mget_r_10
 13489                              <1> 
 13490                              <1> 	; 22/10/2016 (15h -> 17)
 13491 00010B8C B811000000          <1> 	mov	eax, 17 ; Drive not ready or read error !
 13492                              <1> mget_r_err:
 13493 00010B91 A3[88900100]        <1> 	mov	[u.error], eax
 13494                              <1> 	; 12/10/2016
 13495 00010B96 A3[20900100]        <1> 	mov	[u.r0], eax
 13496 00010B9B E997C2FFFF          <1> 	jmp	error
 13497                              <1> mget_r_10:
 13498 00010BA0 C605[B8840100]01    <1> 	mov	byte [readi.valid], 1 ; 24/10/2016
 13499 00010BA7 A1[BC840100]        <1> 	mov	eax, [readi.sector]
 13500                              <1> mget_r_11:
 13501 00010BAC C3                  <1> 	retn
 13502                              <1> mget_r_12:
 13503                              <1> 	; EAX = FDT number
 13504                              <1> 	; EDX = Sector index from FDT sector (0,1,2,3,4...)
 13505 00010BAD 40                  <1> 	inc	eax ; the first data sector in FS disk section	
 13506 00010BAE 8915[D0840100]      <1> 	mov	[readi.fs_index], edx
 13507 00010BB4 01D0                <1> 	add	eax, edx
 13508 00010BB6 EBAE                <1> 	jmp	short mget_r_8
 13509                              <1> 
 13510                              <1> trans_addr_r:
 13511                              <1> 	; 12/10/2016
 13512                              <1> 	; 02/05/2016 - TRDOS 386 (TRDOS v2.0)
 13513                              <1> 	; Translate virtual address to physical address 
 13514                              <1> 	; for reading from user's memory space
 13515                              <1> 	; 04/06/2015 - 18/10/2015 (Retro UNIX 386 v1)
 13516                              <1> 
 13517 00010BB8 31D2                <1> 	xor	edx, edx ; 0 (read access sign)
 13518 00010BBA EB04                <1> 	jmp 	short trans_addr_rw
 13519                              <1> 
 13520                              <1> trans_addr_w:
 13521                              <1> 	; 12/10/2016
 13522                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
 13523                              <1> 	; Translate virtual address to physical address 
 13524                              <1> 	; for writing to user's memory space
 13525                              <1> 	; 04/06/2015 - 18/10/2015 (Retro UNIX 386 v1)
 13526                              <1> 	
 13527 00010BBC 29D2                <1> 	sub	edx, edx
 13528 00010BBE FEC2                <1> 	inc	dl ; 1 (write access sign)
 13529                              <1> trans_addr_rw:
 13530 00010BC0 50                  <1> 	push	eax
 13531 00010BC1 53                  <1> 	push	ebx
 13532 00010BC2 52                  <1> 	push 	edx ; r/w sign (in DL)
 13533                              <1> 	;
 13534 00010BC3 8B1D[44900100]      <1> 	mov	ebx, [u.base]
 13535 00010BC9 E8C84FFFFF          <1> 	call	get_physical_addr ; get physical address
 13536 00010BCE 730F                <1> 	jnc	short passc_0
 13537 00010BD0 A3[88900100]        <1> 	mov	[u.error], eax
 13538 00010BD5 A3[20900100]        <1> 	mov	[u.r0], eax ; 12/10/2016
 13539                              <1> 	;pop	edx
 13540                              <1> 	;pop 	ebx
 13541                              <1> 	;pop	eax
 13542 00010BDA E958C2FFFF          <1> 	jmp	error
 13543                              <1> passc_0:
 13544 00010BDF F6C202              <1> 	test	dl, PTE_A_WRITE ; writable page
 13545 00010BE2 5A                  <1> 	pop	edx
 13546 00010BE3 751C                <1> 	jnz	short passc_1
 13547                              <1> 	
 13548 00010BE5 20D2                <1> 	and 	dl, dl
 13549 00010BE7 7418                <1> 	jz	short passc_1
 13550                              <1> 	; read only (duplicated) page -must be copied to a new page-
 13551                              <1> 	; EBX = linear address
 13552 00010BE9 51                  <1> 	push 	ecx
 13553 00010BEA E8184FFFFF          <1> 	call 	copy_page
 13554 00010BEF 59                  <1> 	pop	ecx
 13555 00010BF0 721E                <1> 	jc	short passc_2
 13556 00010BF2 50                  <1> 	push	eax ; physical address of the new/allocated page
 13557 00010BF3 E89E4FFFFF          <1> 	call	add_to_swap_queue	
 13558 00010BF8 58                  <1> 	pop	eax
 13559 00010BF9 81E3FF0F0000        <1> 	and 	ebx, PAGE_OFF ; 0FFFh
 13560                              <1> 	;mov 	ecx, PAGE_SIZE
 13561                              <1> 	;sub	ecx, ebx 
 13562 00010BFF 01D8                <1> 	add	eax, ebx  
 13563                              <1> passc_1: 
 13564 00010C01 A3[80900100]        <1> 	mov 	[u.pbase], eax ; physical address	
 13565 00010C06 66890D[84900100]    <1> 	mov	[u.pcount], cx ; remain byte count in page (1-4096)
 13566 00010C0D 5B                  <1> 	pop	ebx
 13567 00010C0E 58                  <1> 	pop	eax
 13568 00010C0F C3                  <1> 	retn
 13569                              <1> passc_2:
 13570 00010C10 B804000000          <1> 	mov	eax, ERR_MINOR_IM ; "Insufficient memory !" error
 13571 00010C15 A3[20900100]        <1> 	mov	[u.r0], eax ; 12/10/2016
 13572 00010C1A A3[88900100]        <1> 	mov	[u.error], eax
 13573                              <1> 	;pop 	ebx
 13574                              <1> 	;pop	eax
 13575 00010C1F E913C2FFFF          <1> 	jmp	error
 13576                              <1> 
 13577                              <1> sioreg: 
 13578                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
 13579                              <1> 	; 19/05/2015 - 25/07/2015 (Retro UNIX 386 v1)
 13580                              <1> 	; 12/03/2013 - 22/07/2013 (Retro UNIX 8086 v1)
 13581                              <1> 	; INPUTS -> 
 13582                              <1> 	;     EBX = system buffer (data) address (r5)
 13583                              <1> 	;     [u.fofp] = pointer to file offset pointer
 13584                              <1> 	;     [u.base] = virtual address of the user buffer
 13585                              <1> 	;     [u.pbase] = physical address of the user buffer
 13586                              <1> 	;     [u.count] = byte count
 13587                              <1> 	;     [u.pcount] = byte count within page frame
 13588                              <1> 	; OUTPUTS -> 
 13589                              <1> 	;     ESI = user data offset (r1)
 13590                              <1> 	;     EDI = system (I/O) buffer offset (r2)
 13591                              <1> 	;     ECX = byte count (r3)
 13592                              <1> 	;     EAX = remain bytes after byte count within page frame
 13593                              <1> 	;	(If EAX > 0, transfer will continue from the next page)
 13594                              <1>         ;
 13595                              <1> 	; ((Modified registers:  EDX))
 13596                              <1>  
 13597 00010C24 8B35[34900100]      <1>         mov     esi, [u.fofp]
 13598 00010C2A 8B3E                <1>         mov     edi, [esi]
 13599 00010C2C 89F9                <1> 	mov	ecx, edi
 13600 00010C2E 81C900FEFFFF        <1> 	or	ecx, 0FFFFFE00h
 13601 00010C34 81E7FF010000        <1> 	and	edi, 1FFh
 13602 00010C3A 01DF                <1> 	add	edi, ebx ; EBX = system buffer (data) address
 13603 00010C3C F7D9                <1> 	neg	ecx
 13604 00010C3E 3B0D[48900100]      <1> 	cmp	ecx, [u.count]
 13605 00010C44 7606                <1> 	jna	short sioreg_0
 13606 00010C46 8B0D[48900100]      <1> 	mov	ecx, [u.count]
 13607                              <1> sioreg_0:
 13608 00010C4C 803D[86900100]00    <1> 	cmp	byte [u.kcall], 0 
 13609 00010C53 7613                <1> 	jna	short sioreg_1
 13610                              <1> 	 ; the caller is 'mkdir' or 'namei'
 13611 00010C55 A1[44900100]        <1> 	mov	eax, [u.base]
 13612 00010C5A A3[80900100]        <1> 	mov 	[u.pbase], eax ; physical address = virtual address
 13613 00010C5F 66890D[84900100]    <1> 	mov	word [u.pcount], cx ; remain bytes in buffer (1 sector)
 13614 00010C66 EB0B                <1> 	jmp	short sioreg_2
 13615                              <1> sioreg_1:
 13616 00010C68 0FB715[84900100]    <1> 	movzx	edx, word [u.pcount]
 13617 00010C6F 39D1                <1> 	cmp	ecx, edx	
 13618 00010C71 772A                <1> 	ja	short sioreg_4 ; transfer count > [u.pcount]
 13619                              <1> sioreg_2: ; 2:
 13620 00010C73 31C0                <1> 	xor 	eax, eax
 13621                              <1> sioreg_3:
 13622 00010C75 010D[4C900100]      <1> 	add 	[u.nread], ecx
 13623 00010C7B 290D[48900100]      <1> 	sub 	[u.count], ecx
 13624 00010C81 010D[44900100]      <1> 	add 	[u.base], ecx
 13625 00010C87 010E                <1>         add 	[esi], ecx 
 13626 00010C89 8B35[80900100]      <1> 	mov	esi, [u.pbase]
 13627 00010C8F 66290D[84900100]    <1> 	sub	[u.pcount], cx
 13628 00010C96 010D[80900100]      <1> 	add	[u.pbase], ecx
 13629 00010C9C C3                  <1>         retn
 13630                              <1> sioreg_4:
 13631                              <1> 	; transfer count > [u.pcount] 
 13632                              <1> 	; (ecx > edx)
 13633 00010C9D 89C8                <1> 	mov	eax, ecx
 13634 00010C9F 29D0                <1> 	sub	eax, edx ; remain bytes for 1 sector (block) transfer 
 13635 00010CA1 89D1                <1> 	mov	ecx, edx ; current transfer count = [u.pcount]
 13636 00010CA3 EBD0                <1> 	jmp	short sioreg_3
 13637                              <1> 
 13638                              <1> tswitch: ; Retro UNIX 386 v1
 13639                              <1> tswap:
 13640                              <1> 	; 16/01/2017
 13641                              <1> 	; 21/05/2016 - TRDOS 386 (TRDOS v2.0)
 13642                              <1> 	; 10/05/2015 - 01/09/2015 (Retro UNIX 386 v1)
 13643                              <1> 	; 14/04/2013 - 14/02/2014 (Retro UNIX 8086 v1)
 13644                              <1> 	; time out swap, called when a user times out.
 13645                              <1> 	; the user is put on the low priority queue.
 13646                              <1> 	; This is done by making a link from the last user
 13647                              <1> 	; on the low priority queue to him via a call to 'putlu'.
 13648                              <1> 	; then he is swapped out.
 13649                              <1> 
 13650                              <1> 	; TRDOS 386 (TRDOS v2.0) modification ->  ** 21/05/2016 **
 13651                              <1> 	;     * when a high priority (event) process will be stopped
 13652                              <1> 	;	(swapped out, swithched out/off), 'tswap/tswitch' will
 13653                              <1> 	;	not add it to a run queue. 
 13654                              <1> 	;	/// What for: Process may be already in a run queue, 
 13655                              <1> 	;	it is unspeficied state because process might be started
 13656                              <1> 	;	by a timer event which does not regard previous priority
 13657                              <1> 	;	level and run queue of the process (for fast executing!).
 13658                              <1> 	;	After the 'run for event', process will be sequenced
 13659                              <1> 	;	to run by it's actual run queue. ///
 13660                              <1> 	;
 13661                              <1> 	; Retro UNIX 386 v1 modification ->
 13662                              <1> 	;       swap (software task switch) is performed by changing
 13663                              <1> 	;	user's page directory (u.pgdir) instead of segment change
 13664                              <1> 	;	as in Retro UNIX 8086 v1.
 13665                              <1> 	;
 13666                              <1> 	; RETRO UNIX 8086 v1 modification ->
 13667                              <1> 	;       'swap to disk' is replaced with 'change running segment'
 13668                              <1> 	;	according to 8086 cpu (x86 real mode) architecture.
 13669                              <1> 	;	pdp-11 was using 64KB uniform memory while IBM PC
 13670                              <1> 	;	compatibles was using 1MB segmented memory
 13671                              <1> 	;	in 8086/8088 times.
 13672                              <1> 	;
 13673                              <1> 	; INPUTS ->
 13674                              <1> 	;    u.uno - users process number
 13675                              <1> 	;    runq+4 - lowest priority queue
 13676                              <1> 	; OUTPUTS ->
 13677                              <1> 	;    r0 - users process number
 13678                              <1> 	;    r2 - lowest priority queue address
 13679                              <1> 	;
 13680                              <1> 	; ((AX = R0, BX = R2)) output
 13681                              <1> 	; ((Modified registers: EDX, EBX, ECX, ESI, EDI))
 13682                              <1> 	;
 13683                              <1> 
 13684                              <1> 	NOTE:
 13685                              <1> 	;* [u.pri] priority level is specified by run queue which is process 
 13686                              <1> 	;  comes to run from.
 13687                              <1> 	;* Initial [u.pri] is 1 ('normal/regular') for programs 
 13688                              <1> 	;  (which are launched by MainProg or 'sysexec'), it is changed
 13689                              <1> 	;  to 2 ('high') by timer event, if program uses 'systimer' system call.
 13690                              <1> 	;* Program (Process) also can change it's running priority 
 13691                              <1> 	;  from 1 to 0 or up to 2 by using 'syspri' system call; but,
 13692                              <1> 	;  if program selects priority level 2 (high) for running, next time 
 13693                              <1> 	;  it is reduced to 1 (normal/regular) because 'syspri' adds this
 13694                              <1> 	;  program to 'run for normal' queue while running duration is a bit
 13695                              <1> 	;  protected from swap/switch out immediate, behalf of other high 
 13696                              <1> 	;  priority process in sequence. Program (with high priority) will not 
 13697                              <1> 	;  be swapped/switched out (by timer event) before it's time quantum 
 13698                              <1> 	;  will be elapsed, but, this will be temporary if program is not using 
 13699                              <1> 	;  timer event function.
 13700                              <1> 
 13701                              <1> 	;For example:
 13702                              <1> 	;If a process frequently gets a timer event, it runs at high priority
 13703                              <1> 	;level but when it returns from running it returns to actual run queue,
 13704                              <1> 	;not to 'run for event' queue again.
 13705                              <1> 	;'tswap' will not change the sequence at return/stop(swap out) stage.
 13706                              <1> 	;But if priority level not high (=2, 'run for event'), 'tswap/tswitch'
 13707                              <1> 	;will add the stopping process to relevant run queue according to
 13708                              <1> 	;[u.pri] priority level.
 13709                              <1> 
 13710                              <1> 	; 16/01/2017
 13711 00010CA5 BB[10900100]        <1> 	mov	ebx, runq+2 	; 'runq_normal' ; normal/regular priority
 13712                              <1> 	; 21/05/2016
 13713                              <1> 	;cmp	byte [u.pri], 2	; high priority (run for event) ?
 13714                              <1> 	;jnb	short swap
 13715                              <1> 	; 16/01/2017
 13716                              <1> 	; (Normal and also high/event priority processes will be added to
 13717                              <1> 	; normal priority run queue for ensuring circular running sequence!)
 13718                              <1> 	; (Timer interrupt or 'syspri' system call may change priority and run
 13719                              <1> 	; queue to high/event level.)
 13720 00010CAA 803D[6A900100]00    <1> 	cmp	byte [u.pri], 0
 13721 00010CB1 7702                <1> 	ja	short tswap_1	; normal priority run queue
 13722                              <1> 	;
 13723 00010CB3 43                  <1> 	inc	ebx
 13724 00010CB4 43                  <1> 	inc	ebx		; runq+4, 'runq_background', low priority
 13725                              <1> tswap_1:
 13726 00010CB5 A0[71900100]        <1> 	mov 	al, [u.uno]
 13727                              <1> 	       	; movb u.uno,r1 / move users process number to r1
 13728                              <1> 		; mov  $runq+4,r2 
 13729                              <1> 			; / move lowest priority queue address to r2
 13730                              <1>       	; ebx = run queue
 13731 00010CBA E8FE000000          <1> 	call 	putlu
 13732                              <1> 		; jsr r0,putlu / create link from last user on Q to 
 13733                              <1> 		             ; / u.uno's user
 13734                              <1> 
 13735                              <1> switch: ; Retro UNIX 386 v1
 13736                              <1> swap:
 13737                              <1> 	; 02/01/2017
 13738                              <1> 	; 21/05/2016
 13739                              <1> 	; 20/05/2016
 13740                              <1> 	; 02/05/2016
 13741                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
 13742                              <1> 	; 10/05/2015 - 02/09/2015 (Retro UNIX 386 v1)
 13743                              <1> 	; 14/04/2013 - 08/03/2014 (Retro UNIX 8086 v1)
 13744                              <1> 	;
 13745                              <1> 	; 'swap' is routine that controls the swapping of processes
 13746                              <1> 	; in and out of core.
 13747                              <1> 	;
 13748                              <1> 	; TRDOS 386 (TRDOS v2.0) modification ->  ** 20/05/2016 **
 13749                              <1> 	;     * 3 different priority level is applied 
 13750                              <1> 	;	(just as original unix v1)
 13751                              <1> 	;	1) high priority (event) run queue, 'runq_event'
 13752                              <1> 	;	2) normal priority (regular) run queue, 'runq_normal'
 13753                              <1> 	;	3) low priority (background) run queue, 'runq_backgroud'
 13754                              <1> 	;	'swap' code will run a process which has max. priority
 13755                              <1>         ;       (for earliest event at first)
 13756                              <1> 	;
 13757                              <1> 	; Retro UNIX 386 v1 modification ->
 13758                              <1> 	;       swap (software task switch) is performed by changing
 13759                              <1> 	;	user's page directory (u.pgdir) instead of segment change
 13760                              <1> 	;	as in Retro UNIX 8086 v1.
 13761                              <1> 	;
 13762                              <1> 	; RETRO UNIX 8086 v1 modification ->
 13763                              <1> 	;       'swap to disk' is replaced with 'change running segment'
 13764                              <1> 	;	according to 8086 cpu (x86 real mode) architecture.
 13765                              <1> 	;	pdp-11 was using 64KB uniform memory while IBM PC
 13766                              <1> 	;	compatibles was using 1MB segmented memory
 13767                              <1> 	;	in 8086/8088 times.
 13768                              <1> 	;
 13769                              <1> 	; INPUTS ->
 13770                              <1> 	;    runq table - contains processes to run.
 13771                              <1> 	;    p.link - contains next process in line to be run.
 13772                              <1> 	;    u.uno - process number of process in core	
 13773                              <1> 	;    s.stack - swap stack used as an internal stack for swapping.
 13774                              <1> 	; OUTPUTS ->
 13775                              <1> 	;    (original unix v1 -> present process to its disk block)
 13776                              <1> 	;    (original unix v1 -> new process into core -> 
 13777                              <1> 	;	   Retro Unix 8086 v1 -> segment registers changed 
 13778                              <1> 	;	   for new process)
 13779                              <1> 	;    u.quant = 3 (Time quantum for a process)
 13780                              <1> 	; 	((INT 1Ch count down speed -> 18.2 times per second)
 13781                              <1> 	;    RETRO UNIX 8086 v1 will use INT 1Ch (18.2 times per second)
 13782                              <1> 	;	 for now, it will swap the process if there is not
 13783                              <1> 	;	 a keyboard event (keystroke) (Int 15h, function 4Fh)
 13784                              <1> 	;	 or will count down from 3 to 0 even if there is a
 13785                              <1> 	;        keyboard event locking due to repetitive key strokes.
 13786                              <1> 	;	 u.quant will be reset to 3 for RETRO UNIX 8086 v1.
 13787                              <1> 	;
 13788                              <1> 	; ((Modified registers: EAX, EDX, EBX, ECX, ESI, EDI))
 13789                              <1> 
 13790                              <1> 	;NOTE:
 13791                              <1> 	;High priority queue is the first for selecting a process to run.
 13792                              <1> 	;If there is not a process in high priority level run queue,
 13793                              <1> 	;a process in normal priority run queue will be selected
 13794                              <1> 	;or a proces in low priority run queue will be selected if normal
 13795                              <1> 	;priority level run queue is empty.
 13796                              <1> 	
 13797                              <1> 	; 21/05/2016 -(3 priority levels, 3 run queues)
 13798 00010CBF BE[0E900100]        <1> 	mov	esi, runq ; 'runq_event' ; high priority, 'run for event'
 13799 00010CC4 C605[14850100]03    <1> 	mov	byte [priority], 3 ; high priority + 1
 13800 00010CCB 31DB                <1> 	xor	ebx, ebx ; 02/01/2017
 13801                              <1> swap_0: ; 1: / search runq table for highest priority process
 13802 00010CCD 66AD                <1> 	lodsw  ; mov ax, [esi], add esi+2
 13803                              <1> 	;xor	ebx, ebx ; 02/05/2016
 13804 00010CCF 6621C0              <1> 	and 	ax, ax ; are there any processes to run in this Q entry
 13805 00010CD2 750E                <1> 	jnz	short swap_2 
 13806                              <1> 	; 21/05/2026
 13807                              <1> 	; runq_normal = runq+2, runq_background = runq+4
 13808 00010CD4 FE0D[14850100]      <1> 	dec	byte [priority] ; 3 -> 3, 2 -> 1, 1-> 0
 13809 00010CDA 75F1                <1> 	jnz	short swap_0	
 13810                              <1> 	;cmp	esi, runq+6  ; if zero compare address to end of table
 13811                              <1> 	;jb	short swap_0 ; if not at end, go back
 13812                              <1> swap_1:
 13813                              <1> 	; 02/05/2016
 13814                              <1> 	; 29/04/2016 (TRDOS 386 = TRDOS v2.0)
 13815                              <1> 	; No user process to run...
 13816                              <1> 	; Run the kernel process... MainProg: Internal Command Interpreter
 13817 00010CDC FEC0                <1> 	inc	al ; mov al, 1  ; process number of MainProg
 13818 00010CDE FEC3                <1> 	inc	bl ; mov bl, al ; 1
 13819 00010CE0 EB1E                <1> 	jmp	short swap_4
 13820                              <1> swap_2:
 13821                              <1> 	; 21/05/2016
 13822 00010CE2 FE0D[14850100]      <1> 	dec	byte [priority] ; priority level of present user/process
 13823                              <1> 			        ; 0, 1, 2
 13824 00010CE8 4E                  <1> 	dec	esi
 13825 00010CE9 4E                  <1>         dec     esi
 13826                              <1> 	;
 13827 00010CEA 88C3                <1> 	mov	bl, al
 13828 00010CEC 38E0                <1> 	cmp	al, ah ; is there only 1 process in the queue to be run
 13829 00010CEE 740A                <1> 	je	short swap_3 ; yes
 13830 00010CF0 8AA3[538F0100]      <1> 	mov	ah, [ebx+p.link-1] 
 13831 00010CF6 8826                <1>        	mov	[esi], ah ; move next process in line into run queue
 13832 00010CF8 EB06                <1> 	jmp	short swap_4
 13833                              <1> swap_3: 
 13834 00010CFA 6631D2              <1> 	xor	dx, dx
 13835 00010CFD 668916              <1> 	mov	[esi], dx ; zero the entry; no processes on the Q
 13836                              <1> swap_4: 
 13837 00010D00 8A25[71900100]      <1> 	mov 	ah, [u.uno]
 13838 00010D06 38C4                <1> 	cmp	ah, al ; is this process the same as the process in core?
 13839 00010D08 743B                <1>        	je	short swap_8 ; yes, don't have to swap
 13840 00010D0A 08E4                <1> 	or	ah, ah  ; is the process # = 0
 13841 00010D0C 740D                <1>        	jz	short swap_6 ; 'sysexit'
 13842                              <1> 	;cmp	ah, al ;is this process the same as the process in core?
 13843                              <1>        	;je	short swap_8 ; yes, don't have to swap
 13844 00010D0E 8925[1C900100]      <1> 	mov	[u.usp], esp ; return  address for 'syswait' & 'sleep'
 13845 00010D14 E834000000          <1> 	call	wswap   ; write out core to disk
 13846 00010D19 EB1C                <1> 	jmp 	short swap_7
 13847                              <1> swap_6:
 13848                              <1> 	; Deallocate memory pages belong to the process
 13849                              <1> 	; which is being terminated.
 13850                              <1> 	; (Retro UNIX 386 v1 modification !)
 13851                              <1> 	;
 13852 00010D1B 53                  <1> 	push	ebx
 13853 00010D1C A1[78900100]        <1> 	mov 	eax, [u.pgdir]  ; page directory of the process
 13854 00010D21 8B1D[7C900100]      <1> 	mov	ebx, [u.ppgdir] ; page directory of the parent process
 13855 00010D27 E8BC4BFFFF          <1> 	call	deallocate_page_dir
 13856 00010D2C A1[74900100]        <1> 	mov	eax, [u.upage] ; 'user' structure page of the process
 13857 00010D31 E8414CFFFF          <1> 	call	deallocate_page
 13858 00010D36 5B                  <1> 	pop	ebx
 13859                              <1> swap_7: 
 13860 00010D37 C0E302              <1> 	shl	bl, 2 ; * 4 
 13861 00010D3A 8B83[708F0100]      <1> 	mov	eax, [ebx+p.upage-4] ; the 'u' page of the new process
 13862 00010D40 E840000000          <1> 	call	rswap ; read new process into core
 13863                              <1> swap_8: 
 13864                              <1> 	; Retro UNIX  8086 v1 modification !
 13865 00010D45 C605[68900100]04    <1> 	mov	byte [u.quant], time_count 
 13866 00010D4C C3                  <1> 	retn
 13867                              <1> 
 13868                              <1> wswap:  ; < swap out, swap to disk >
 13869                              <1> 	; 28/02/2017 (fnsave)
 13870                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
 13871                              <1> 	; 09/05/2015 (Retro UNIX 386 v1)
 13872                              <1> 	; 26/05/2013 - 08/03/2014 (Retro UNIX 8086 v1)
 13873                              <1> 	; 'wswap' writes out the process that is in core onto its
 13874                              <1> 	; appropriate disk area.
 13875                              <1> 	;
 13876                              <1> 	; Retro UNIX 386 v1 modification ->
 13877                              <1> 	;       User (u) structure content and the user's register content
 13878                              <1> 	;	will be copied to the process's/user's UPAGE (a page for
 13879                              <1> 	;	saving 'u' structure and user registers for task switching).
 13880                              <1> 	;	u.usp - points to kernel stack address which contains
 13881                              <1> 	;		user's registers while entering system call.
 13882                              <1> 	;	u.sp  - points to kernel stack address 
 13883                              <1> 	;		to return from system call -for IRET-.
 13884                              <1> 	;	[u.usp]+32+16 = [u.sp] 
 13885                              <1> 	;	[u.usp] -> edi, esi, ebp, esp (= [u.usp]+32), ebx, 
 13886                              <1> 	;		edx, ecx, eax, gs, fs, es, ds, -> [u.sp].
 13887                              <1> 	;
 13888                              <1> 	; Retro UNIX 8086 v1 modification ->
 13889                              <1> 	;       'swap to disk' is replaced with 'change running segment'
 13890                              <1> 	;	according to 8086 cpu (x86 real mode) architecture.
 13891                              <1> 	;	pdp-11 was using 64KB uniform memory while IBM PC
 13892                              <1> 	;	compatibles was using 1MB segmented memory 
 13893                              <1> 	;	in 8086/8088 times.
 13894                              <1> 	;
 13895                              <1> 	; INPUTS ->
 13896                              <1> 	;    u.break - points to end of program
 13897                              <1> 	;    u.usp - stack pointer at the moment of swap
 13898                              <1> 	;    core - beginning of process program
 13899                              <1> 	;    ecore - end of core 	
 13900                              <1> 	;    user - start of user parameter area
 13901                              <1> 	;    u.uno - user process number
 13902                              <1> 	;    p.dska - holds block number of process
 13903                              <1> 	; OUTPUTS ->
 13904                              <1> 	;    swp I/O queue
 13905                              <1> 	;    p.break - negative word count of process 
 13906                              <1> 	;    r1 - process disk address	
 13907                              <1> 	;    r2 - negative word count
 13908                              <1> 	;
 13909                              <1> 	; RETRO UNIX 8086 v1 input/output:
 13910                              <1> 	;
 13911                              <1> 	; INPUTS ->
 13912                              <1> 	;    u.uno - process number (to be swapped out)
 13913                              <1> 	; OUTPUTS ->
 13914                              <1> 	;    none
 13915                              <1> 	;
 13916                              <1> 	;   ((Modified registers: ECX, ESI, EDI))  
 13917                              <1> 	;
 13918                              <1> 
 13919                              <1> 	; 28/02/2017
 13920                              <1> 	;cmp	byte [multi_tasking], 0  ; Musti tasking mode ?
 13921                              <1> 	;jna	short wswp
 13922 00010D4D 803D[9B900100]00    <1> 	cmp	byte [u.fpsave], 0 ; 28/02/2017
 13923 00010D54 7606                <1> 	jna	short wswp
 13924 00010D56 DD35[9C900100]      <1> 	fnsave	[u.fpregs] ; save floating point registers (94 bytes)
 13925                              <1> wswp:
 13926 00010D5C 8B3D[74900100]      <1> 	mov	edi, [u.upage] ; process's user (u) structure page addr
 13927 00010D62 B93C000000          <1> 	mov	ecx, (U_SIZE + 3) / 4
 13928 00010D67 BE[18900100]        <1> 	mov	esi, user ; active user (u) structure
 13929 00010D6C F3A5                <1> 	rep	movsd
 13930                              <1> 	;
 13931 00010D6E 8B35[1C900100]      <1> 	mov	esi, [u.usp] ; esp (system stack pointer, 
 13932                              <1> 			     ;      points to user registers)
 13933 00010D74 8B0D[18900100]      <1> 	mov	ecx, [u.sp]  ; return address from the system call
 13934                              <1> 			     ; (for IRET)
 13935                              <1> 			     ; [u.sp] -> EIP (user)
 13936                              <1> 			     ; [u.sp+4]-> CS (user)
 13937                              <1> 			     ; [u.sp+8] -> EFLAGS (user)
 13938                              <1> 			     ; [u.sp+12] -> ESP (user)
 13939                              <1> 			     ; [u.sp+16] -> SS (user)
 13940 00010D7A 29F1                <1> 	sub	ecx, esi     ; required space for user registers
 13941 00010D7C 83C114              <1> 	add	ecx, 20	     ; +5 dwords to return from system call
 13942                              <1> 			     ; (for IRET)
 13943 00010D7F C1E902              <1> 	shr	ecx, 2
 13944 00010D82 F3A5                <1> 	rep	movsd
 13945 00010D84 C3                  <1> 	retn
 13946                              <1> 
 13947                              <1> rswap:  ; < swap in, swap from disk >
 13948                              <1> 	; 28/02/2017 (frstor)
 13949                              <1> 	; 15/01/2017
 13950                              <1> 	; 14/01/2017
 13951                              <1> 	; 21/05/2016
 13952                              <1> 	; 03/05/2016
 13953                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
 13954                              <1> 	; 09/05/2015 - 15/09/2015 (Retro UNIX 386 v1)
 13955                              <1> 	; 26/05/2013 - 08/03/2014 (Retro UNIX 8086 v1)
 13956                              <1> 	; 'rswap' reads a process whose number is in r1,
 13957                              <1> 	; from disk into core.
 13958                              <1> 	;
 13959                              <1> 	; Retro UNIX 386 v1 modification ->
 13960                              <1> 	;       User (u) structure content and the user's register content
 13961                              <1> 	;	will be restored from process's/user's UPAGE (a page for
 13962                              <1> 	;	saving 'u' structure and user registers for task switching).
 13963                              <1> 	;	u.usp - points to kernel stack address which contains
 13964                              <1> 	;		user's registers while entering system call.
 13965                              <1> 	;	u.sp  - points to kernel stack address 
 13966                              <1> 	;		to return from system call -for IRET-.
 13967                              <1> 	;	[u.usp]+32+16 = [u.sp] 
 13968                              <1> 	;	[u.usp] -> edi, esi, ebp, esp (= [u.usp]+32), ebx, 
 13969                              <1> 	;		edx, ecx, eax, gs, fs, es, ds, -> [u.sp].
 13970                              <1> 	;
 13971                              <1> 	; RETRO UNIX 8086 v1 modification ->
 13972                              <1> 	;       'swap to disk' is replaced with 'change running segment'
 13973                              <1> 	;	according to 8086 cpu (x86 real mode) architecture.
 13974                              <1> 	;	pdp-11 was using 64KB uniform memory while IBM PC
 13975                              <1> 	;	compatibles was using 1MB segmented memory 
 13976                              <1> 	;	in 8086/8088 times.
 13977                              <1> 	;
 13978                              <1> 	; INPUTS ->
 13979                              <1> 	;    r1 - process number of process to be read in
 13980                              <1> 	;    p.break - negative of word count of process 
 13981                              <1> 	;    p.dska - disk address of the process
 13982                              <1> 	;    u.emt - determines handling of emt's
 13983                              <1> 	;    u.ilgins - determines handling of illegal instructions
 13984                              <1> 	; OUTPUTS ->
 13985                              <1> 	;    8 = (u.ilgins)
 13986                              <1> 	;    24 = (u.emt)
 13987                              <1> 	;    swp - bit 10 is set to indicate read 
 13988                              <1> 	;		(bit 15=0 when reading is done)	
 13989                              <1> 	;    swp+2 - disk block address
 13990                              <1> 	;    swp+4 - negative word count 	
 13991                              <1> 	;      ((swp+6 - address of user structure)) 
 13992                              <1> 	;
 13993                              <1> 	; RETRO UNIX 8086 v1 input/output:
 13994                              <1> 	;
 13995                              <1> 	; INPUTS ->
 13996                              <1> 	;    AL	- new process number (to be swapped in)	 
 13997                              <1> 	; OUTPUTS ->
 13998                              <1> 	;    none
 13999                              <1> 	;
 14000                              <1> 	;   ((Modified registers: EAX, ECX, ESI, EDI, ESP))
 14001                              <1> 	;
 14002                              <1> 	; Retro UNIX 386 v1 - modification ! 14/05/2015
 14003 00010D85 89C6                <1> 	mov	esi, eax  ; process's user (u) structure page addr
 14004 00010D87 B93C000000          <1> 	mov	ecx, (U_SIZE + 3) / 4
 14005 00010D8C BF[18900100]        <1> 	mov	edi, user ; active user (u) structure	
 14006 00010D91 F3A5                <1> 	rep	movsd
 14007 00010D93 58                  <1> 	pop	eax	; 'rswap' return address
 14008                              <1> 	; 
 14009                              <1> 	;cli
 14010 00010D94 8B3D[1C900100]      <1> 	mov	edi, [u.usp] ; esp (system stack pointer,
 14011                              <1> 			     ;     points to user registers)
 14012 00010D9A 89FC                <1> 	mov	esp, edi     ; 14/01/2017
 14013 00010D9C 8B0D[18900100]      <1> 	mov	ecx, [u.sp]  ; return address from the system call
 14014                              <1> 			     ; (for IRET)
 14015                              <1> 			     ; [u.sp] -> EIP (user)
 14016                              <1> 			     ; [u.sp+4]-> CS (user)
 14017                              <1> 			     ; [u.sp+8] -> EFLAGS (user)
 14018                              <1> 			     ; [u.sp+12] -> ESP (user)
 14019                              <1> 			     ; [u.sp+16] -> SS (user)
 14020 00010DA2 29F9                <1> 	sub	ecx, edi     ; required space for user registers
 14021 00010DA4 83C114              <1> 	add	ecx, 20	     ; +5 dwords to return from system call
 14022                              <1> 			     ; (for IRET)
 14023 00010DA7 C1E902              <1> 	shr	ecx, 2
 14024 00010DAA F3A5                <1> 	rep	movsd
 14025                              <1> 	;mov	esp, [u.usp] ; 15/09/2015
 14026                              <1> 	;sti
 14027                              <1> 	; 28/02/2017
 14028                              <1> 	;cmp	byte [multi_tasking], 0  ; Musti tasking mode ?
 14029                              <1> 	;jna	short rswp_retn
 14030 00010DAC 803D[9B900100]00    <1> 	cmp	byte [u.fpsave], 0
 14031 00010DB3 7606                <1> 	jna	short rswp_retn
 14032 00010DB5 DD25[9C900100]      <1> 	frstor	[u.fpregs] ; restore floating point regs (94 bytes)
 14033                              <1> rswp_retn:
 14034 00010DBB 50                  <1> 	push	eax	; 'rswap' return address
 14035 00010DBC C3                  <1> 	retn
 14036                              <1> 
 14037                              <1> putlu: 
 14038                              <1> 	; 20/05/2016
 14039                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
 14040                              <1> 	; 10/05/2015 - 12/09/2015 (Retro UNIX 386 v1)
 14041                              <1> 	; 15/04/2013 - 23/02/2014 (Retro UNIX 8086 v1)
 14042                              <1> 	; 'putlu' is called with a process number in r1 and a pointer
 14043                              <1> 	; to lowest priority Q (runq+4) in r2. A link is created from
 14044                              <1> 	; the last process on the queue to process in r1 by putting
 14045                              <1> 	; the process number in r1 into the last process's link.
 14046                              <1> 	;
 14047                              <1> 	; INPUTS ->
 14048                              <1> 	;    r1 - user process number
 14049                              <1> 	;    r2 - points to lowest priority queue
 14050                              <1> 	;    p.dska - disk address of the process	
 14051                              <1> 	;    u.emt - determines handling of emt's
 14052                              <1> 	;    u.ilgins - determines handling of illegal instructions
 14053                              <1> 	; OUTPUTS ->
 14054                              <1> 	;    r3 - process number of last process on the queue upon
 14055                              <1> 	;	  entering putlu
 14056                              <1> 	;    p.link-1 + r3 - process number in r1
 14057                              <1> 	;    r2 - points to lowest priority queue
 14058                              <1> 	;
 14059                              <1> 	; ((Modified registers: EDX, EBX)) 
 14060                              <1> 	;
 14061                              <1> 	; / r1 = user process no.; r2 points to lowest priority queue
 14062                              <1> 
 14063                              <1> 	; EBX = r2
 14064                              <1> 	; EAX = r1 (AL=r1b)
 14065                              <1> 
 14066                              <1> 	; 20/05/2016
 14067                              <1> 	; AL = process number (1 to 16) // Retro UNIX 8086, 386 v1 //
 14068                              <1> 	;     (max. 16 processes available for current kernel version)
 14069                              <1> 	; EBX = run queue address ; 20/05/2016 (TRDOS 386)
 14070                              <1> 		; which is one of following addresses:
 14071                              <1> 		;  1) 'runq_event' high priority run queue
 14072                              <1> 		;  2) 'runq_normal' normal/regular priority run queue
 14073                              <1> 		;  3) 'runq_background' low priority run queue
 14074                              <1> 
 14075                              <1> 	;mov	ebx, runq
 14076 00010DBD 0FB613              <1> 	movzx  	edx, byte [ebx]
 14077 00010DC0 43                  <1> 	inc	ebx
 14078 00010DC1 20D2                <1> 	and	dl, dl
 14079                              <1> 		; tstb (r2)+ / is queue empty?
 14080 00010DC3 740A                <1>        	jz	short putlu_1
 14081                              <1> 		; beq 1f / yes, branch
 14082 00010DC5 8A13                <1> 	mov 	dl, [ebx] ; 12/09/2015
 14083                              <1> 		; movb (r2),r3 / no, save the "last user" process number
 14084                              <1> 			     ; / in r3
 14085 00010DC7 8882[538F0100]      <1>        	mov	[edx+p.link-1], al
 14086                              <1> 		; movb r1,p.link-1(r3) / put pointer to user on 
 14087                              <1> 			     ; / "last users" link
 14088 00010DCD EB03                <1> 	jmp	short putlu_2
 14089                              <1> 		; br 2f /
 14090                              <1> putlu_1: ; 1:
 14091 00010DCF 8843FF              <1> 	mov	[ebx-1], al
 14092                              <1>        		; movb r1,-1(r2) / user is only user; 
 14093                              <1> 			    ; / put process no. at beginning and at end
 14094                              <1> putlu_2: ; 2: 
 14095 00010DD2 8803                <1> 	mov	[ebx], al
 14096                              <1>        		; movb r1,(r2) / user process in r1 is now the last entry
 14097                              <1> 			     ; / on the queue
 14098 00010DD4 88C2                <1> 	mov	dl, al
 14099 00010DD6 88B2[538F0100]      <1>         mov     [edx+p.link-1], dh ; 0
 14100                              <1> 		; dec r2 / restore r2
 14101 00010DDC C3                  <1>         retn
 14102                              <1> 		; rts r0
 14103                              <1> 
 14104                              <1> sysver:
 14105                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
 14106 00010DDD C705[20900100]0002- <1> 	mov	dword [u.r0], 200h ; AH = major version, AL = minor version 
 14106 00010DE5 0000                <1>
 14107 00010DE7 E96BC0FFFF          <1> 	jmp	sysret
 14108                              <1> 
 14109                              <1> syspri: ; change running priority (of the process)
 14110                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
 14111                              <1> 	; 21/05/2016
 14112                              <1> 	; 20/05/2026 - TRDOS 386 (TRDOS v2.0)
 14113                              <1> 	; INPUT ->
 14114                              <1> 	;	BL = priority level
 14115                              <1> 	;	   0 = low running priority (running on background)
 14116                              <1> 	;	   1 = normal/regular priority (running as regular)
 14117                              <1> 	;	   2 = high/event priority (running for event)
 14118                              <1> 	;	   >2 = invalid, it will accepted as 2 (event)
 14119                              <1> 	;	   0FFh = get/return current running priority only
 14120                              <1> 	; OUTPUT -> 	
 14121                              <1> 	;	* if current [u.pri] < 2
 14122                              <1> 	;	  if BL input < 0FFh ->
 14123                              <1> 	;	     [u.pri] is updated as in BL input (0,1,2)
 14124                              <1> 	;	  if BL input = 0FFh -> AL = [u.pri] (current)
 14125                              <1> 	;	      
 14126                              <1> 	;	* if current [u.pri] = 2
 14127                              <1> 	;	  if BL input < 0FFh -> cf = 1 & AL = 2
 14128                              <1> 	;	  if BL input = 0FFh -> cf = 0 & AL = 2
 14129                              <1> 	;	
 14130                              <1> 	;	NOTE: 	
 14131                              <1> 	;	If [u.pri] = 2, it can not be changed to 1 or 0;
 14132                              <1> 	;	because, run queue of the running process is unspecified
 14133                              <1> 	;	at this	stage. Process might be started by a timer event
 14134                              <1> 	;	or priority might be changed to high by previous
 14135                              <1> 	;	'syspri' system	call. In both cases, the process is in
 14136                              <1> 	;	'runq_normal' or 'runq_background' queue.
 14137                              <1> 	;	As result of this fact, when the [u.quant] time quantum
 14138                              <1> 	;	of the process is elapsed or 'sysrele' system call is
 14139                              <1> 	;	instructed by the process, 'tswap' ('tswitch') procedure
 14140                              <1> 	;	will be called (to 'swap' or 'switch' out the procedure)
 14141                              <1> 	;	and it will not call 'putlu' to add the (stopping)
 14142                              <1> 	;	process to relevant run queue when [u.pri] = 2.
 14143                              <1> 	;	(Otherwise, it would be possible to add process to
 14144                              <1> 	;	a run queue while it is already in a run queue, wrongly.)
 14145                              <1>   	;
 14146                              <1> 	;	If [u.pri]< 2, 'tswap/tswitch' procedure will call
 14147                              <1> 	;	'putlu' to add process to relevant run queue
 14148                              <1> 	;	according to [u.pri] value. ('runq_normal' for 1,
 14149                              <1> 	;	'runq_background' for 0).
 14150                              <1> 	;
 14151                              <1> 	;	If BL input >= 2 and < 0FFh while [u.pri] < 2,
 14152                              <1> 	;	process will be added to 'runq_normal' queue and
 14153                              <1> 	;	[u.pri] will be set to 2. (in 'syspri' system call)
 14154                              <1> 	;
 14155                              <1> 
 14156 00010DEC 29C0                <1> 	sub	eax, eax ; 0
 14157 00010DEE A3[88900100]        <1> 	mov	[u.error], eax
 14158                              <1> 
 14159 00010DF3 A0[6A900100]        <1> 	mov	al, [u.pri]
 14160 00010DF8 A3[20900100]        <1> 	mov	[u.r0], eax
 14161                              <1> 
 14162 00010DFD FEC3                <1> 	inc	bl
 14163                              <1> 	;jz	sysret ; 0FFh -> 0, get priority level
 14164                              <1> 	; 23/07/2022	
 14165 00010DFF 742C                <1> 	jz	short syspri_2	; jmp sysret
 14166                              <1> 
 14167 00010E01 3C02                <1> 	cmp	al, 2
 14168                              <1> 	;jnb	error ; CF = 1 & AL = 2 (& last error = 0)
 14169                              <1> 	; 23/07/2022
 14170 00010E03 7205                <1> 	jb	short syspri_0
 14171 00010E05 E92DC0FFFF          <1> 	jmp	error
 14172                              <1> syspri_0:
 14173 00010E0A FECB                <1> 	dec	bl
 14174 00010E0C 80FB02              <1> 	cmp	bl, 2
 14175 00010E0F 7602                <1> 	jna	short syspri_1
 14176 00010E11 B302                <1> 	mov	bl, 2
 14177                              <1> syspri_1:
 14178 00010E13 881D[6A900100]      <1> 	mov	[u.pri], bl
 14179 00010E19 80FB02              <1> 	cmp	bl, 2
 14180                              <1> 	;jb	sysret
 14181                              <1> 	; 23/07/2022
 14182 00010E1C 720F                <1> 	jb	short syspri_2	; jmp sysret
 14183                              <1> 
 14184                              <1> 	; here...
 14185                              <1> 	; Priority of current process has been changed to high
 14186                              <1> 	; ('run for event') but current process will be added to
 14187                              <1> 	; 'run as normal' queue. ('run for event' high priority
 14188                              <1> 	; queue is under control of timer -& RTC- interrupt only!) 
 14189                              <1> 	;
 14190                              <1> 	; (Otherwise, process can fall into black hole!
 14191                              <1> 	; e.g. if it is not in waiting list and it has not got 
 14192                              <1> 	; a timer event and it is not in a run queue!
 14193                              <1> 	; Because, when [u.pri] is 2, 'tswap/tswitch' will not 
 14194                              <1> 	; add the stopping process to a run queue.)
 14195                              <1> 
 14196 00010E1E A0[71900100]        <1> 	mov	al, [u.uno]
 14197 00010E23 BB[10900100]        <1> 	mov	ebx, runq_normal ; normal priority !
 14198                              <1> 				 ; [u.pri] is set to high
 14199                              <1> 				 ; but 'runq_event' queue is set
 14200                              <1> 				 ; only by the kernel's timer
 14201                              <1> 				 ; event function (timer interrupt). 
 14202 00010E28 E890FFFFFF          <1> 	call	putlu
 14203                              <1> syspri_2:
 14204 00010E2D E925C0FFFF          <1> 	jmp	sysret
 14205                              <1> 
 14206                              <1> cpass: ; / get next character from user area of core and put it in AL (r1)
 14207                              <1> 	; 30/07/2022 - TRDOS 386 Kernel v2.0.5
 14208                              <1> 	; 02/05/2016 - TRDOS 386 (TRDOS v2.0)
 14209                              <1> 	; 19/05/2015 - 18/10/2015 (Retro UNIX 386 v1)
 14210                              <1> 	; 14/08/2013 - 20/09/2013 (Retro UNIX 8086 v1)
 14211                              <1> 	; INPUTS -> 
 14212                              <1> 	;     [u.base] = virtual address in user area
 14213                              <1> 	;     [u.count] = byte count (max.)
 14214                              <1> 	;     [u.pcount] = byte count in page (0 = reset)
 14215                              <1> 	; OUTPUTS -> 
 14216                              <1> 	;     AL = the character which is pointed by [u.base]
 14217                              <1> 	;     zf = 1 -> transfer count has been completed
 14218                              <1>         ;
 14219                              <1> 	; ((Modified registers: EAX, EDX, ECX))
 14220                              <1> 	
 14221                              <1> 	; 30/07/2022
 14222 00010E32 29C0                <1> 	sub	eax, eax
 14223                              <1> 	
 14224 00010E34 3905[48900100]      <1> 	cmp	[u.count], eax ; 0
 14225                              <1> 	;cmp 	dword [u.count], 0  ; have all the characters been transferred
 14226                              <1> 			    	    ; i.e., u.count, # of chars. left
 14227 00010E3A 763D                <1> 	jna	short cpass_3	    ; to be transferred = 0?) yes, branch
 14228 00010E3C FF0D[48900100]      <1> 	dec	dword [u.count]	    ; no, decrement u.count
 14229                              <1>         ; 19/05/2015 
 14230                              <1> 	;(Retro UNIX 386 v1 - translation from user's virtual address
 14231                              <1> 	;		      to physical address
 14232                              <1> 	; 30/07/2022
 14233 00010E42 663905[84900100]    <1> 	cmp	[u.pcount], ax ; 0
 14234                              <1> 	;cmp	word [u.pcount], 0 ; byte count in page = 0 (initial value)
 14235                              <1> 			     ; 1-4095 --> use previous physical base address
 14236                              <1> 			     ; in [u.pbase]
 14237 00010E49 770D                <1> 	ja	short cpass_1
 14238                              <1> 	; 30/07/2022
 14239 00010E4B 3905[7C900100]      <1> 	cmp	[u.ppgdir], eax ; 0
 14240                              <1> 	;cmp	dword [u.ppgdir], 0 ; is the caller os kernel
 14241 00010E51 7427                <1>         je      short cpass_k       ; (sysexec, '/etc/init') ?  (MainProg)
 14242 00010E53 E860FDFFFF          <1> 	call	trans_addr_r
 14243                              <1> cpass_1:
 14244 00010E58 66FF0D[84900100]    <1> 	dec	word [u.pcount]
 14245                              <1> cpass_2: 
 14246 00010E5F 8B15[80900100]      <1> 	mov	edx, [u.pbase]
 14247 00010E65 8A02                <1> 	mov	al, [edx]	; take the character pointed to 
 14248                              <1> 				; by u.base and put it in r1
 14249 00010E67 FF05[4C900100]      <1> 	inc	dword [u.nread] ; increment no. of bytes transferred
 14250 00010E6D FF05[44900100]      <1> 	inc	dword [u.base]  ; increment the buffer address to point to the
 14251                              <1> 			        ; next byte
 14252 00010E73 FF05[80900100]      <1> 	inc	dword [u.pbase]
 14253                              <1> cpass_3:
 14254 00010E79 C3                  <1> 	retn
 14255                              <1> cpass_k:
 14256                              <1> 	; 02/07/2015
 14257                              <1> 	; The caller is os kernel 
 14258                              <1> 	; (get sysexec arguments from kernel's memory space)
 14259 00010E7A 8B1D[44900100]      <1> 	mov	ebx, [u.base]
 14260 00010E80 66C705[84900100]00- <1>         mov     word [u.pcount], PAGE_SIZE ; 4096
 14260 00010E88 10                  <1>
 14261 00010E89 891D[80900100]      <1> 	mov	[u.pbase], ebx
 14262 00010E8F EBCE                <1> 	jmp	short cpass_2
 14263                              <1> 
 14264                              <1> transfer_to_user_buffer: ; fast transfer
 14265                              <1> 	; 27/05/2016
 14266                              <1> 	; 16/05/2016 - TRDOS 386 (TRDOS v2.0)
 14267                              <1> 	;
 14268                              <1> 	; INPUT ->
 14269                              <1> 	;	ESI = source address in system space
 14270                              <1> 	;	EDI = user's buffer address
 14271                              <1> 	;	ECX = transfer (byte) count
 14272                              <1> 	;	[u.pgdir] = user's page directory
 14273                              <1> 	; OUTPUT ->
 14274                              <1> 	;	ECX = actual transfer count
 14275                              <1> 	;	cf = 1 -> error
 14276                              <1> 	;	[u.count] = remain byte count
 14277                              <1> 	;
 14278                              <1> 	; Modified registers: eax, ecx
 14279                              <1> 	;
 14280                              <1> 
 14281 00010E91 21C9                <1> 	and	ecx, ecx
 14282 00010E93 743B                <1> 	jz	short ttub_4
 14283                              <1> 
 14284 00010E95 890D[48900100]      <1> 	mov	[u.count], ecx
 14285                              <1> 	
 14286 00010E9B 57                  <1> 	push	edi
 14287 00010E9C 56                  <1> 	push	esi
 14288 00010E9D 53                  <1> 	push	ebx
 14289 00010E9E 52                  <1> 	push	edx
 14290 00010E9F 51                  <1> 	push	ecx
 14291                              <1> 
 14292 00010EA0 89FB                <1> 	mov	ebx, edi
 14293 00010EA2 81C300004000        <1> 	add	ebx, CORE ; 27/05/2016
 14294                              <1> ttub_1:
 14295                              <1> 	; ebx = virtual (linear) address
 14296                              <1> 	; [u.pgdir] = user's page directory
 14297 00010EA8 E8EF4CFFFF          <1>        	call	get_physical_addr_x ; get physical address
 14298 00010EAD 7222                <1> 	jc	short ttub_5
 14299                              <1> 	; eax = physical address 
 14300                              <1> 	; ecx = remain byte count in page (1-4096)
 14301 00010EAF 89C7                <1> 	mov	edi, eax
 14302 00010EB1 A1[48900100]        <1> 	mov	eax, [u.count]
 14303 00010EB6 39C1                <1> 	cmp	ecx, eax
 14304 00010EB8 7602                <1> 	jna	short ttub_2
 14305 00010EBA 89C1                <1> 	mov	ecx, eax
 14306                              <1> ttub_2:	
 14307 00010EBC 29C8                <1> 	sub	eax, ecx
 14308 00010EBE 01CB                <1> 	add	ebx, ecx
 14309 00010EC0 F3A4                <1> 	rep	movsb
 14310 00010EC2 A3[48900100]        <1> 	mov	[u.count], eax
 14311 00010EC7 09C0                <1> 	or	eax, eax
 14312 00010EC9 75DD                <1> 	jnz	short ttub_1
 14313                              <1> ttub_retn:
 14314                              <1> tfub_retn:
 14315 00010ECB 59                  <1> 	pop	ecx ; transfer count = actual transfer count
 14316                              <1> ttub_3:
 14317 00010ECC 5A                  <1> 	pop	edx
 14318 00010ECD 5B                  <1> 	pop	ebx
 14319 00010ECE 5E                  <1> 	pop	esi
 14320 00010ECF 5F                  <1> 	pop	edi
 14321                              <1> ttub_4:
 14322 00010ED0 C3                  <1> 	retn
 14323                              <1> ttub_5:
 14324 00010ED1 59                  <1> 	pop	ecx
 14325 00010ED2 2B0D[48900100]      <1> 	sub	ecx, [u.count] ; actual transfer count
 14326 00010ED8 F9                  <1> 	stc
 14327 00010ED9 EBF1                <1> 	jmp	short ttub_3
 14328                              <1> 
 14329                              <1> transfer_from_user_buffer: ; fast transfer
 14330                              <1> 	; 27/05/2016
 14331                              <1> 	; 16/05/2016 - TRDOS 386 (TRDOS v2.0)
 14332                              <1> 	;
 14333                              <1> 	; INPUT ->
 14334                              <1> 	;	ESI = user's buffer address
 14335                              <1> 	;	EDI = destination address in system space
 14336                              <1> 	;	ECX = transfer (byte) count
 14337                              <1> 	;	[u.pgdir] = user's page directory
 14338                              <1> 	; OUTPUT ->
 14339                              <1> 	;	ecx = actual transfer count
 14340                              <1> 	;	cf = 1 -> error
 14341                              <1> 	;	[u.count] = remain byte count
 14342                              <1> 	;
 14343                              <1> 	; Modified registers: eax, ecx
 14344                              <1> 	;
 14345                              <1> 
 14346 00010EDB 21C9                <1> 	and	ecx, ecx
 14347                              <1> 	;jz	short tfub_4
 14348 00010EDD 74F1                <1> 	jz	short ttub_4
 14349                              <1> 
 14350 00010EDF 890D[48900100]      <1> 	mov	[u.count], ecx
 14351                              <1> 	
 14352 00010EE5 57                  <1> 	push	edi
 14353 00010EE6 56                  <1> 	push	esi
 14354 00010EE7 53                  <1> 	push	ebx
 14355 00010EE8 52                  <1> 	push	edx
 14356 00010EE9 51                  <1> 	push	ecx
 14357                              <1> 
 14358 00010EEA 89F3                <1> 	mov	ebx, esi
 14359 00010EEC 81C300004000        <1> 	add	ebx, CORE ; 27/05/2016
 14360                              <1> tfub_1:
 14361                              <1> 	; ebx = virtual (linear) address
 14362                              <1> 	; [u.pgdir] = user's page directory
 14363 00010EF2 E8A54CFFFF          <1>        	call	get_physical_addr_x ; get physical address
 14364                              <1> 	;jc	short tfub_5
 14365 00010EF7 72D8                <1> 	jc	short ttub_5
 14366                              <1> 	; eax = physical address 
 14367                              <1> 	; ecx = remain byte count in page (1-4096)
 14368 00010EF9 89C6                <1> 	mov	esi, eax
 14369 00010EFB A1[48900100]        <1> 	mov	eax, [u.count]
 14370 00010F00 39C1                <1> 	cmp	ecx, eax
 14371 00010F02 7602                <1> 	jna	short tfub_2
 14372 00010F04 89C1                <1> 	mov	ecx, eax
 14373                              <1> tfub_2:	
 14374 00010F06 29C8                <1> 	sub	eax, ecx
 14375 00010F08 01CB                <1> 	add	ebx, ecx
 14376 00010F0A F3A4                <1> 	rep	movsb
 14377 00010F0C A3[48900100]        <1> 	mov	[u.count], eax
 14378 00010F11 09C0                <1> 	or	eax, eax
 14379 00010F13 75DD                <1> 	jnz	short tfub_1
 14380                              <1> 
 14381 00010F15 EBB4                <1> 	jmp	short tfub_retn
 14382                              <1> 
 14383                              <1> ;tfub_retn:
 14384                              <1> ;	pop	ecx ; transfer count = actual transfer count
 14385                              <1> ;tfub_3:
 14386                              <1> ;	pop	edx
 14387                              <1> ;	pop	ebx
 14388                              <1> ;	pop	esi
 14389                              <1> ;	pop	edi
 14390                              <1> ;tfub_4:
 14391                              <1> ;	retn
 14392                              <1> ;tfub_5:
 14393                              <1> ;	pop	ecx
 14394                              <1> ;	sub	ecx, [u.count] ; actual transfer count
 14395                              <1> ;	stc
 14396                              <1> ;	jmp	short tfub_3
 14397                              <1> 
 14398                              <1> sysfff: ; <Find First File>
 14399                              <1> 	; 08/08/2022
 14400                              <1> 	; 30/07/2022 (TRDOS 386 Kernel v2.0.5)
 14401                              <1> 	; 17/10/2016
 14402                              <1> 	; 16/10/2016
 14403                              <1> 	; 15/10/2016 TRDOS 386 (TRDOS v2.0) feature only !
 14404                              <1> 	;           -derived from TRDOS v1.0, INT_21H.ASM-
 14405                              <1> 	;            ("loc_INT21h_find_first_file")
 14406                              <1> 	; TRDOS 8086 (v1.0)
 14407                              <1>         ; 	07/08/2011 
 14408                              <1>         ;	Find First File
 14409                              <1> 	;	INPUT:
 14410                              <1>         ;	    CX= Attributes
 14411                              <1>         ;	    DS:DX= Pointer to filename
 14412                              <1> 	;	MSDOS OUTPUT:
 14413                              <1> 	;	    DTA: (Default address: PSP offset 80h)
 14414                              <1> 	;	    Offset  Descrription
 14415                              <1> 	;	    0	    Reserved for use find next file
 14416                              <1> 	;	    21	    Attribute of file found
 14417                              <1> 	;	    22	    Time stamp of file
 14418                              <1> 	;	    24	    Date stamp of file
 14419                              <1> 	;	    26	    File size in bytes
 14420                              <1> 	;	    30	    Filename and extension (zero terminated)
 14421                              <1> 	;	If cf = 1:
 14422                              <1> 	;	    Error Codes: (in AX)
 14423                              <1> 	;	    	2 - File not found
 14424                              <1> 	;	       18 - No more files
 14425                              <1>         ;
 14426                              <1> 	; TRDOS 386 (v2.0) 
 14427                              <1> 	; 15/10/2016
 14428                              <1> 	;	
 14429                              <1>         ; INPUT ->
 14430                              <1>         ;	   CL = File attributes
 14431                              <1> 	;     	      bit 0 (1) - Read only file (R)
 14432                              <1> 	;             bit 1 (1) - Hidden file (H)
 14433                              <1>         ;             bit 2 (1) - System file (R)
 14434                              <1> 	;             bit 3 (1) - Volume label/name (V)
 14435                              <1>         ;             bit 4 (1) - Subdirectory (D)
 14436                              <1> 	;	      bit 5 (1) - File has been archived (A)
 14437                              <1> 	;	   CH = 0 -> Return basic parameters (24 bytes)
 14438                              <1> 	;	   CH > 0 -> Return FindFile structure/table (128 bytes)
 14439                              <1>         ;          EBX = Pointer to filename (ASCIIZ) -path-
 14440                              <1> 	;	   EDX = File parameters buffer address
 14441                              <1> 	;		(buffer size = 24 bytes if CH input = 0)
 14442                              <1> 	;		(buffer size = 128 bytes if CH input > 0)
 14443                              <1> 	;		 
 14444                              <1> 	; OUTPUT ->
 14445                              <1> 	;	   EAX = 0 if CH input > 0
 14446                              <1> 	;	   EAX = First cluster number of file if CH input = 0
 14447                              <1> 	;	   EDX = File parameters table/structure address
 14448                              <1> 	;	   Basic Parameters:
 14449                              <1> 	;		Offset  Description
 14450                              <1> 	;		------	---------------
 14451                              <1> 	;		0	File Attributes
 14452                              <1> 	;		1	Ambiguous filename chars are used sign
 14453                              <1> 	;			(0 = filename fits exactly with request)
 14454                              <1> 	;			(>0 = ambiguous filename chars are used)
 14455                              <1> 	;	      	2	Time stamp of file
 14456                              <1> 	;		4	Date stamp of file
 14457                              <1> 	;		6	File size in bytes
 14458                              <1> 	;		10	Short Filename (ASCIIZ, max. 13 bytes)
 14459                              <1> 	;		23	Longname Length (1-255) if existing 
 14460                              <1> 	;  
 14461                              <1> 	;          cf = 1 -> Error code in AL
 14462                              <1> 	;
 14463                              <1> 	; Modified Registers: EAX (at the return of system call)
 14464                              <1> 	;  
 14465                              <1> 	; TR-DOS FindFile (FFF) Structure (128 bytes):
 14466                              <1> 	; 09/10/2011 (DIR.ASM) - 10/02/2016 (trdoskx.s)
 14467                              <1> 	;	
 14468                              <1> 	; Offset	Parameter		Size
 14469                              <1> 	; ------	------------------	-------- 
 14470                              <1> 	; 0		FindFile_Drv		1 byte
 14471                              <1> 	; 1		FindFile_Directory	65 bytes
 14472                              <1> 	; 66		FindFile_Name		13 bytes
 14473                              <1> 	; 79		FindFile_LongNameEntryLength 1 byte
 14474                              <1> 	;Above 80 bytes form
 14475                              <1> 	;TR-DOS Source/Destination File FullName Format/Structure
 14476                              <1> 	; 80		FindFile_AttributesMask 1 word
 14477                              <1> 	; 82		FindFile_DirEntry	32 bytes (*)
 14478                              <1> 	; 114		FindFile_DirFirstCluster 1 double word
 14479                              <1> 	; 118		FindFile_DirCluster	1 double word
 14480                              <1> 	; 122		FindFile_DirEntryNumber 1 word
 14481                              <1> 	; 124		FindFile_MatchCounter	1 word
 14482                              <1> 	; 126		FindFile_Reserved	1 word
 14483                              <1>    	; (*) MS-DOS, FAT 12-16-32 classic directory entry (32 bytes)
 14484                              <1> 
 14485                              <1> 	;mov	[u.namep], ebx
 14486                              <1> 	; 16/10/2016
 14487 00010F17 8915[34850100]      <1> 	mov	[FFF_UBuffer], edx
 14488 00010F1D 66890D[39850100]    <1> 	mov	[FFF_Attrib], cx ; [FFF_RType] = ch
 14489                              <1> 		    ; Attributes in CL, return data type in CH
 14490 00010F24 89DE                <1> 	mov	esi, ebx
 14491                              <1> 	; file name is forced, change directory as temporary
 14492                              <1> 	;mov	ax, 1
 14493                              <1> 	;mov	[FFF_Valid], ah ; 0 ; reset ; 17/10/2016
 14494                              <1> 	;call	set_working_path 
 14495 00010F26 E82A120000          <1> 	call	set_working_path_x ; 17/10/2016	
 14496 00010F2B 731D                <1> 	jnc	short sysfff_0
 14497                              <1>  
 14498 00010F2D 21C0                <1> 	and	eax, eax  ; 0 -> Bad Path!  
 14499 00010F2F 7505                <1> 	jnz	short sysfff_err
 14500                              <1> 
 14501                              <1> 	; eax = 0
 14502 00010F31 B80C000000          <1> 	mov	eax, ERR_DIR_NOT_FOUND ; Directory not found !
 14503                              <1> sysfff_err:
 14504 00010F36 A3[20900100]        <1> 	mov	[u.r0], eax
 14505 00010F3B A3[88900100]        <1> 	mov	[u.error], eax
 14506 00010F40 E8E5120000          <1>         call 	reset_working_path
 14507 00010F45 E9EDBEFFFF          <1> 	jmp	error
 14508                              <1> 
 14509                              <1> sysfff_0:
 14510                              <1> 	;sub	ah, ah ; ah = 0
 14511 00010F4A 8A0424              <1> 	mov	al, [esp]
 14512 00010F4D 08C0                <1> 	or	al, al
 14513 00010F4F 7412                <1> 	jz	short sysfff_2
 14514 00010F51 B410                <1> 	mov	ah, 10h
 14515 00010F53 A808                <1> 	test	al, 08h
 14516 00010F55 7503                <1> 	jnz	short sysfff_1
 14517 00010F57 80CC08              <1> 	or	ah, 08h
 14518                              <1> sysfff_1:
 14519 00010F5A 2410                <1> 	and	al, 10h ; Directory
 14520 00010F5C 7405                <1> 	jz	short sysfff_2
 14521 00010F5E 80E408              <1> 	and	ah, 08h
 14522 00010F61 30C0                <1> 	xor	al, al ; When a directory is searched,
 14523                              <1> 		       ; filename will be returned even if
 14524                              <1> 		       ; it is not a directory!
 14525                              <1> 		       ; Because: (in order to prevent
 14526                              <1> 		       ; creating a dir with existing file name)
 14527                              <1> 		       ; Dir and file names must not be same!
 14528                              <1> 		       ; (return attribute must be checked)	
 14529                              <1> sysfff_2:
 14530                              <1> 	; AX = Attributes mask 
 14531                              <1> 		; AL = AND mask (result must be equal to AL)
 14532                              <1> 		; AH = Negative AND mask (result must be ZERO)
 14533                              <1>  	; ESI = FindFile_Name address
 14534                              <1> 
 14535 00010F63 E8107CFFFF          <1> 	call	find_first_file
 14536 00010F68 72CC                <1> 	jc	short sysfff_err ; eax = 2 (File not found !)
 14537                              <1> 
 14538                              <1> 	; ESI = Directory Entry (FindFile_DirEntry) Location
 14539                              <1> 	; EDI = Directory Buffer Directory Entry Location
 14540                              <1> 	; EAX = File Size
 14541                              <1> 	;  BL = Attributes of The File/Directory
 14542                              <1> 	;  BH = Long Name Yes/No Status (>0 is YES)
 14543                              <1> 	;  DX > 0 : Ambiguous filename chars are used
 14544                              <1> 
 14545                              <1> sysfff_3:
 14546                              <1> 	; 16/10/2016
 14547 00010F6A 668B0D[39850100]    <1> 	mov	cx, [FFF_Attrib]
 14548                              <1> 	; Attribs in CL, return data type in CH
 14549                              <1> 
 14550                              <1> 	;or	cl, cl
 14551                              <1> 	;jz	short sysfff_4 ; 0 = No filter
 14552 00010F71 80F1FF              <1> 	xor	cl, 0FFh
 14553 00010F74 20D9                <1> 	and	cl, bl
 14554 00010F76 7409                <1> 	jz	short sysfff_4
 14555                              <1> 
 14556                              <1> 	;mov	eax, 2 ; 'file not found !' error
 14557                              <1> 	;jmp	short sysfff_err_1
 14558                              <1> 
 14559                              <1> 	; 16/10/2016
 14560 00010F78 E8A87CFFFF          <1> 	call	find_next_file
 14561 00010F7D 72B7                <1> 	jc	short sysfff_err ; eax = 12 (no more files !)
 14562 00010F7F EBE9                <1> 	jmp	short sysfff_3
 14563                              <1> 
 14564                              <1> sysfff_4:
 14565 00010F81 20ED                <1> 	and	ch, ch ; [FFF_RType]
 14566 00010F83 740C                <1> 	jz	short sysfff_5
 14567                              <1> 	;mov	ecx, 128 ; ; transfer length
 14568                              <1> 	; 30/07/2022
 14569 00010F85 29C9                <1> 	sub	ecx, ecx
 14570 00010F87 B180                <1> 	mov	cl, 128
 14571 00010F89 880D[38850100]      <1> 	mov	[FFF_Valid], cl
 14572                              <1> sysfnf_11:
 14573                              <1> 	; ecx = 128
 14574                              <1> 	; 08/08/2022
 14575                              <1> 	;mov	esi, FindFile_Drv
 14576 00010F8F EB3F                <1> 	jmp	short sysfff_6	
 14577                              <1> sysfff_5:
 14578                              <1> 	;;mov	esi, FindFile_DirEntry
 14579                              <1> 	;mov	ecx, 24  ; transfer length
 14580                              <1> 	; 30/07/2022
 14581                              <1> 	;sub	ecx, ecx
 14582                              <1> 	;mov	cl, 24
 14583                              <1> 	;mov	[FFF_Valid], cl
 14584 00010F91 C605[38850100]18    <1> 	mov	byte [FFF_Valid], 24
 14585                              <1> sysfnf_12:
 14586 00010F98 BF[048A0100]        <1> 	mov	edi, DTA ; FFF data transfer address
 14587                              <1> 	;mov	al, [esi+DirEntry_Attr] ; 11
 14588 00010F9D 88D8                <1> 	mov	al, bl ; File/Dir Attributes
 14589 00010F9F 887F17              <1> 	mov	[edi+23], bh ; Longname length (0= none)
 14590 00010FA2 AA                  <1> 	stosb
 14591 00010FA3 88D0                <1> 	mov	al, dl ; DL is for '?'
 14592 00010FA5 00F0                <1> 	add	al, dh ; DH is for '*'
 14593                              <1> 	; AL > 0 if ambiguous file name wildcards are used
 14594 00010FA7 AA                  <1> 	stosb
 14595 00010FA8 8B4616              <1> 	mov	eax, [esi+DirEntry_WrtTime] ; 22
 14596 00010FAB AB                  <1>         stosd	; DirEntry_WrtTime & DirEntry_WrtDate
 14597 00010FAC 8B461C              <1>         mov	eax, [esi+DirEntry_FileSize] ; 28
 14598 00010FAF AB                  <1>         stosd
 14599 00010FB0 668B4614            <1> 	mov	ax, [esi+DirEntry_FstClusHI] ; 20
 14600                              <1> 	;shl	ax, 16
 14601                              <1> 	; 23/07/2022 (BugFix)
 14602 00010FB4 C1E010              <1> 	shl	eax, 16 
 14603 00010FB7 668B461A            <1> 	mov	ax, [esi+DirEntry_FstClusLO] ; 26 
 14604 00010FBB A3[20900100]        <1> 	mov	[u.r0], eax ; First Cluster
 14605                              <1> 
 14606                              <1>         ;mov	esi, FindFile_DirEntry
 14607 00010FC0 E8A2120000          <1> 	call	get_file_name
 14608                              <1> 
 14609 00010FC5 8A0D[38850100]      <1> 	mov	cl, [FFF_Valid]
 14610 00010FCB BE[048A0100]        <1>        	mov	esi, DTA ; FFF data transfer address
 14611                              <1> sysfff_6:
 14612 00010FD0 8B3D[34850100]      <1> 	mov	edi, [FFF_UBuffer] ; user's buffer address (edx)
 14613 00010FD6 E8B6FEFFFF          <1> 	call	transfer_to_user_buffer
 14614                              <1> 
 14615 00010FDB 890D[20900100]      <1> 	mov	[u.r0], ecx ; actual transfer count
 14616 00010FE1 E844120000          <1>         call 	reset_working_path
 14617 00010FE6 E96CBEFFFF          <1> 	jmp	sysret
 14618                              <1> 
 14619                              <1> sysfnf: ; <Find Next File>
 14620                              <1> 	; 29/08/2023 (TRDOS 386 Kernel v2.0.6)
 14621                              <1> 	; 08/08/2022
 14622                              <1> 	; 30/07/2022 (TRDOS 386 Kernel v2.0.5)
 14623                              <1> 	; 16/10/2016 TRDOS 386 (TRDOS v2.0) feature only !
 14624                              <1> 	;           -derived from TRDOS v1.0, INT_21H.ASM-
 14625                              <1> 	;            ("loc_INT21h_find_next_file")
 14626                              <1> 	; TRDOS 8086 (v1.0)
 14627                              <1>         ; 	07/08/2011 
 14628                              <1>         ;	Find First File
 14629                              <1> 	;	INPUT:
 14630                              <1>         ;	    none
 14631                              <1> 	;	MSDOS OUTPUT:
 14632                              <1> 	;	    DTA: (Default address: PSP offset 80h)
 14633                              <1> 	;	    Offset  Descrription
 14634                              <1> 	;	    0	    Reserved for use find next file
 14635                              <1> 	;	    21	    Attribute of file found
 14636                              <1> 	;	    22	    Time stamp of file
 14637                              <1> 	;	    24	    Date stamp of file
 14638                              <1> 	;	    26	    File size in bytes
 14639                              <1> 	;	    30	    Filename and extension (zero terminated)
 14640                              <1> 	;	If cf = 1:
 14641                              <1> 	;	    Error Codes: (in AX)
 14642                              <1> 	;	       18 - No more files
 14643                              <1>         ;
 14644                              <1> 	; TRDOS 386 (v2.0) 
 14645                              <1> 	; 16/10/2016
 14646                              <1> 	;	
 14647                              <1>         ; INPUT ->
 14648                              <1>        	; 	   none
 14649                              <1> 	; OUTPUT ->
 14650                              <1> 	;	   EAX = 0 if CH input of 'Find First File' > 0
 14651                              <1> 	;	   EAX = First cluster number of file
 14652                              <1> 	;		 if CH input of 'Find First File' = 0	
 14653                              <1> 	;	   EDX = File parameters table/structure address
 14654                              <1> 	;
 14655                              <1> 	;          cf = 1 -> Error code in AL
 14656                              <1> 	;
 14657                              <1>  	; Modified Registers: EAX (at the return of system call)
 14658                              <1> 
 14659                              <1> 	;	
 14660                              <1> 	; Note: If byte [FFF_Valid] = 0
 14661                              <1> 	;	'sysfnf' will return with 'no more files' error.
 14662                              <1> 	;	If byte [FFF_Valid] = 24
 14663                              <1> 	;	'sysfnf' will return with 32 bytes basic parameters
 14664                              <1> 	;	at the address which is in EDX.
 14665                              <1> 	;	If byte [FFF_Valid] = 128
 14666                              <1> 	;	'sysfnf' will return with 128 bytes Find File 
 14667                              <1> 	;	Structure/Table at the address which is in EDX.
 14668                              <1> 	
 14669 00010FEB 803D[38850100]00    <1> 	cmp	byte [FFF_Valid], 0
 14670 00010FF2 7713                <1> 	ja	short stsfnf_0
 14671                              <1>  	; 'no more files !' error 
 14672                              <1> 	;mov	eax, ERR_NO_MORE_FILES ; 12
 14673                              <1> 	; 30/07/2022
 14674 00010FF4 29C0                <1> 	sub	eax, eax
 14675 00010FF6 B00C                <1> 	mov	al, ERR_NO_MORE_FILES ; 12
 14676 00010FF8 A3[20900100]        <1> 	mov	[u.r0], eax
 14677 00010FFD A3[88900100]        <1> 	mov	[u.error], eax
 14678 00011002 E930BEFFFF          <1> 	jmp	error
 14679                              <1> stsfnf_0:
 14680                              <1> 	;cmp	byte [FFF_Valid], 128
 14681                              <1> 	;je	short stsfnf_1
 14682                              <1> 	;cmp	byte [FFF_Valid], 24
 14683                              <1> 	;je	short stsfnf_1
 14684                              <1> 	;mov	[FFF_Valid], 24 ; Default
 14685                              <1> stsfnf_1:
 14686 00011007 0FB61D[4A790100]    <1> 	movzx	ebx, byte [Current_Drv]
 14687 0001100E 66891D[3E850100]    <1> 	mov	[SWP_DRV], bx
 14688 00011015 8A15[EA810100]      <1> 	mov	dl, [FindFile_Drv]
 14689 0001101B 38DA                <1> 	cmp	dl, bl
 14690 0001101D 7535                <1> 	jne	short stsfnf_2
 14691 0001101F 86FB                <1> 	xchg	bh, bl
 14692 00011021 BE00010900          <1> 	mov	esi, Logical_DOSDisks
 14693 00011026 01DE                <1> 	add	esi, ebx
 14694 00011028 EB37                <1> 	jmp	short sysfnf_3
 14695                              <1> 
 14696                              <1> sysfnf_8:
 14697 0001102A E87CB4FFFF          <1> 	call	load_FAT_sub_directory	 
 14698 0001102F 7275                <1> 	jc	short sysfnf_err_1 ; read error (no FNF stop)
 14699                              <1> 
 14700                              <1> sysfnf_9:
 14701 00011031 E8EF7BFFFF          <1> 	call	find_next_file
 14702 00011036 7263                <1> 	jc	short sysfnf_5
 14703                              <1> 	; 08/08/2022
 14704                              <1> 	; esi = FindFile_Drv
 14705                              <1> 
 14706 00011038 A0[39850100]        <1> 	mov	al, [FFF_Attrib]
 14707                              <1> 	;or	al, al
 14708                              <1> 	;jz	short sysfnf_10 ; 0 = No filter
 14709 0001103D 34FF                <1> 	xor	al, 0FFh
 14710 0001103F 20D8                <1> 	and	al, bl
 14711 00011041 75EE                <1> 	jnz	short sysfnf_9 ; search for next file until
 14712                              <1> 			       ; an error return from
 14713                              <1> 			       ; find_next_file procedure
 14714                              <1> sysfnf_10:
 14715                              <1>         ;movzx	ecx, byte [FFF_Valid]
 14716                              <1> 	;cmp	cl, 128 ; complete FindFile structure/table 
 14717                              <1> 	;je	sysfnf_11
 14718                              <1> 	;;cmp	cl, 24  ; basic parameters
 14719                              <1> 	;;je	sysfnf_12       
 14720                              <1> 	;jmp	sysfnf_12
 14721                              <1> 	; 30/07/2022
 14722 00011043 0FB60D[38850100]    <1> 	movzx	ecx, byte [FFF_Valid]
 14723 0001104A 80F980              <1> 	cmp	cl, 128
 14724                              <1> 	;jne	short sysfnf_12
 14725                              <1> 	;jmp	short sysfnf_11	
 14726                              <1> 	; 08/08/2022
 14727                              <1> 	;je	short sysfnf_6 ; esi = FindFile_Drv
 14728                              <1> 	; 29/08/2023 (BugFix)
 14729 0001104D 7481                <1> 	je	short sysfff_6 ; esi = FindFile_Drv
 14730                              <1> 	
 14731 0001104F E944FFFFFF          <1> 	jmp	sysfnf_12
 14732                              <1> 
 14733                              <1> stsfnf_2:
 14734 00011054 FE05[3F850100]      <1> 	inc	byte [SWP_DRV_chg]
 14735                              <1> 
 14736 0001105A E82C68FFFF          <1> 	call	change_current_drive
 14737 0001105F 7245                <1> 	jc	short sysfnf_err_1 ; read error ! 
 14738                              <1> 				   ; (do not stop, because
 14739                              <1> 				   ; we don't have a
 14740                              <1> 				   ; 'no more files'
 14741                              <1> 				   ; -file not found- error,
 14742                              <1> 				   ; next sysfnf system call
 14743                              <1> 				   ; may solve the problem,
 14744                              <1> 				   ; after re-placing the disk)
 14745                              <1> sysfnf_3:
 14746 00011061 A1[60820100]        <1> 	mov	eax, [FindFile_DirCluster]
 14747 00011066 21C0                <1> 	and	eax, eax
 14748 00011068 7550                <1> 	jnz	short sysfnf_6
 14749                              <1>         
 14750 0001106A 803D[49790100]02    <1> 	cmp	byte [Current_FATType], 2
 14751 00011071 772C                <1> 	ja	short sysfnf_err_0 ; invalid, we neeed to stop !?
 14752 00011073 803D[49790100]01    <1> 	cmp	byte [Current_FATType], 1
 14753 0001107A 7223                <1> 	jb	short sysfnf_err_0 ; invalid, we neeed to stop !?
 14754                              <1> 
 14755 0001107C 3805[71800100]      <1> 	cmp	byte [DirBuff_ValidData], al ; 0
 14756 00011082 7608                <1> 	jna	short sysfnf_4 
 14757                              <1> 
 14758 00011084 3B05[76800100]      <1> 	cmp	eax, [DirBuff_Cluster] ; 0 ?
 14759 0001108A 74A5                <1> 	je	short sysfnf_9
 14760                              <1> 
 14761                              <1> 	;cmp	byte [Current_Dir_Level], 0
 14762                              <1>         ;ja	short sysfnf_4  
 14763                              <1>         ;jna	short sysfnf_9 
 14764                              <1> 
 14765                              <1> sysfnf_4:
 14766 0001108C FE05[3F850100]      <1> 	inc	byte [SWP_DRV_chg]
 14767 00011092 E896B3FFFF          <1> 	call 	load_FAT_root_directory
 14768 00011097 7398                <1> 	jnc	short sysfnf_9
 14769                              <1> 	; eax = error code (17, 'drv not ready or read error')
 14770 00011099 EB0B                <1> 	jmp	short sysfnf_err_1 ; read error ! (no FNF stop)
 14771                              <1> 				   ; (if you want, try again, 
 14772                              <1> 				   ;  after re-placing the disk)
 14773                              <1> sysfnf_5:	
 14774 0001109B 3C0C                <1> 	cmp	al, 12 ; 'no more files' error
 14775 0001109D 7507                <1> 	jne	short sysfnf_err_1 ; (no FNF stop -sysfnf will try
 14776                              <1> 				   ;  to read the directory again,
 14777                              <1> 				   ;  if the user calls sysfnf
 14778                              <1> 				   ;  just after this error return-)
 14779                              <1> 	; (FNF stop -sysfnf will not try
 14780                              <1> 	;  to read the directory again-)	
 14781                              <1> 
 14782                              <1> sysfnf_err_0:
 14783 0001109F C605[38850100]00    <1> 	mov	byte [FFF_Valid], 0 ; FNF stop sign
 14784                              <1> sysfnf_err_1:
 14785 000110A6 A3[20900100]        <1> 	mov	[u.r0], eax
 14786 000110AB A3[88900100]        <1> 	mov	[u.error], eax
 14787 000110B0 E875110000          <1> 	call	reset_working_path
 14788 000110B5 E97DBDFFFF          <1> 	jmp	error
 14789                              <1> 	  
 14790                              <1> sysfnf_6:
 14791 000110BA 803D[71800100]00    <1> 	cmp	byte [DirBuff_ValidData], 0
 14792 000110C1 760D                <1> 	jna	short sysfnf_7
 14793                              <1> 
 14794 000110C3 3B05[76800100]      <1> 	cmp	eax, [DirBuff_Cluster]
 14795                              <1> 	;je	short sysfnf_9
 14796                              <1> 	; 08/08/2022
 14797 000110C9 7505                <1> 	jne	short sysfnf_7
 14798 000110CB E961FFFFFF          <1> 	jmp	sysfnf_9
 14799                              <1> sysfnf_7:
 14800 000110D0 FE05[3F850100]      <1> 	inc	byte [SWP_DRV_chg]
 14801 000110D6 803D[49790100]01    <1> 	cmp	byte [Current_FATType], 1
 14802                              <1> 	;jnb	short sysfnf_8
 14803                              <1> 	; 08/08/2022
 14804 000110DD 7205                <1> 	jb	short sysfnf_13
 14805 000110DF E946FFFFFF          <1> 	jmp	sysfnf_8
 14806                              <1> sysfnf_13:
 14807                              <1> 	; Singlix (TRFS) File System 
 14808                              <1> 	; (access via compatibility buffer)
 14809 000110E4 E8FCB3FFFF          <1> 	call	load_FS_sub_directory
 14810                              <1> 	;jnc	short sysfnf_9
 14811                              <1> 	;jmp	short sysfnf_err_1 ; read error (no FNF stop)
 14812                              <1> 	; 08/08/2022
 14813 000110E9 72BB                <1> 	jc	short sysfnf_err_1
 14814 000110EB E941FFFFFF          <1> 	jmp	sysfnf_9
 14815                              <1> 
 14816                              <1> writei:
 14817                              <1> 	; 08/08/2022
 14818                              <1> 	; 30/07/2022
 14819                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5
 14820                              <1> 	; 26/10/2016
 14821                              <1> 	; 25/10/2016
 14822                              <1> 	; 23/10/2016
 14823                              <1> 	; 22/10/2016
 14824                              <1> 	; 19/10/2016 - TRDOS 386 (TRDOS v2.0)
 14825                              <1> 	; 19/05/2015 - 20/05/2015 (Retro UNIX 386 v1)
 14826                              <1> 	; 12/03/2013 - 31/07/2013 (Retro UNIX 8086 v1)
 14827                              <1> 	;
 14828                              <1> 	; Write data to file with first cluster number in EAX
 14829                              <1> 	; 
 14830                              <1> 	; INPUTS ->
 14831                              <1> 	;    EAX - First cluster number of the file
 14832                              <1> 	;    EBX - File number (Open file index number)
 14833                              <1> 	;    u.count - byte count to be written
 14834                              <1> 	;    u.base - points to user buffer
 14835                              <1> 	;    u.fofp - points to dword with current file offset
 14836                              <1> 	;    i.size - file size
 14837                              <1> 	;    cdev - logical dos drive number of the file
 14838                              <1> 	; OUTPUTS ->
 14839                              <1> 	;    u.count - cleared
 14840                              <1> 	;    u.nread - accumulates total bytes passed back
 14841                              <1> 	;    i.size - new file size (if file byte offset overs file size)
 14842                              <1> 	;    u.fofp - points to u.off (with new offset value)	
 14843                              <1> 	;
 14844                              <1> 	; (Retro UNIX Prototype : 11/11/2012 - 18/11/2012, UNIXCOPY.ASM)
 14845                              <1> 	; ((Modified registers: eax, edx, ebx, ecx, esi, edi, ebp)) 	
 14846                              <1> 
 14847 000110F0 31C9                <1> 	xor	ecx, ecx
 14848 000110F2 890D[4C900100]      <1> 	mov 	[u.nread], ecx  ; 0
 14849 000110F8 66890D[84900100]    <1> 	mov	[u.pcount], cx ; 19/05/2015
 14850 000110FF 390D[48900100]      <1> 	cmp 	[u.count], ecx
 14851 00011105 7701                <1> 	ja 	short writei_1 ; 08/08/2022
 14852 00011107 C3                  <1> 	retn
 14853                              <1> 	; 23/07/2022
 14854                              <1> 	;jna	short dskw_8 ; retn
 14855                              <1> 	
 14856                              <1> writei_1:
 14857                              <1> dskw:
 14858 00011108 881D[F8840100]      <1> 	mov	[writei.ofn], bl ; Open file number
 14859 0001110E 880D[33850100]      <1> 	mov	[setfmod], cl ; 0 ; reset 'update lm date&time' sign
 14860                              <1> dskw_0: 
 14861                              <1> 	; 26/10/2016
 14862                              <1> 	; 22/10/2016, 23/10/2016, 25/10/2016
 14863                              <1> 	; 19/10/2016 - TRDOS 386 (TRDOS v2.0)
 14864                              <1> 	; 31/05/2015 - 25/07/2015 (Retro UNIX 386 v1)
 14865                              <1> 	; 26/04/2013 - 20/09/2013 (Retro UNIX 8086 v1)
 14866                              <1> 	;
 14867                              <1> 	; 01/08/2013 (mkdir_w check)
 14868 00011114 E8D0000000          <1>  	call	mget_w
 14869                              <1> 	; eax = sector/block number
 14870                              <1> 
 14871 00011119 8B1D[34900100]      <1> 	mov     ebx, [u.fofp]
 14872 0001111F 8B13                <1> 	mov	edx, [ebx]
 14873 00011121 81E2FF010000        <1> 	and	edx, 1FFh  ; / test the lower 9 bits of the file offset
 14874 00011127 750C                <1> 	jnz	short dskw_1 ; / if its non-zero, branch
 14875                              <1> 			     ; if zero, file offset = 0,
 14876                              <1> 		       	     ; / 512, 1024,...(i.e., start of new block)
 14877 00011129 813D[48900100]0002- <1> 	cmp	dword [u.count], 512
 14877 00011131 0000                <1>
 14878                              <1> 				; / if zero, is there enough data to fill
 14879                              <1> 				; / an entire block? (i.e., no. of
 14880 00011133 7331                <1> 	jnb	short dskw_2 ; / bytes to be written greater than 512.? 
 14881                              <1> 			     ; / Yes, branch. Don't have to read block
 14882                              <1> dskw_1: ; in as no past info. is to be saved 
 14883                              <1> 	; (the entire block will be overwritten).
 14884                              <1> 	; 23/10/2016
 14885                              <1> 
 14886 00011135 BB[4C940100]        <1> 	mov	ebx, writei_buffer
 14887                              <1> 	; esi = logical dos drive description table address
 14888                              <1> 	; eax = sector number
 14889                              <1> 	; ebx = buffer address (in kernel's memory space)
 14890                              <1> 	; ecx = sector count
 14891                              <1> 	; 30/07/2022
 14892                              <1> 	;mov	ecx, 1
 14893 0001113A 31C9                <1> 	xor	ecx, ecx
 14894 0001113C FEC1                <1> 	inc	cl
 14895                              <1> 	; ecx = 1
 14896 0001113E E84A0D0000          <1> 	call	disk_read
 14897                              <1> 	;call	dskrd 	; / no, must retain old info.. 
 14898                              <1> 		       	; / Hence, read block 'r1' into an I/O buffer
 14899 00011143 7321                <1> 	jnc	short dskw_2
 14900                              <1> 
 14901                              <1> 	; disk read error
 14902                              <1> 	; 30/07/2022
 14903                              <1> 	;mov	eax, 17 ; drive not ready or READ ERROR !
 14904 00011145 29C0                <1> 	sub	eax, eax
 14905 00011147 B011                <1> 	mov	al, 17
 14906                              <1> dskw_err: ; jump from disk write error
 14907 00011149 A3[20900100]        <1> 	mov	[u.r0], eax
 14908 0001114E A3[88900100]        <1> 	mov	[u.error], eax
 14909                              <1> 
 14910 00011153 803D[33850100]00    <1> 	cmp	byte [setfmod], 0
 14911                              <1> 	;jna	error
 14912                              <1> 	; 23/07/2022
 14913 0001115A 7605                <1> 	jna	short writei_err
 14914                              <1> 
 14915 0001115C E8A9030000          <1> 	call	update_file_lmdt ; update last modif. date&time of the file
 14916                              <1> 	;mov	byte [setfmod], 0	
 14917                              <1> writei_err:
 14918 00011161 E9D1BCFFFF          <1> 	jmp	error
 14919                              <1> 
 14920                              <1> dskw_2: ; 3:
 14921                              <1> 	; 23/10/2016
 14922 00011166 C605[D4840100]01    <1> 	mov	byte [writei.valid], 1 ; writei buffer contains valid data
 14923 0001116D 56                  <1> 	push	esi ; logical dos drive description table address
 14924                              <1> 	; EAX (r1) = block/sector number
 14925                              <1> 	;call	wslot
 14926                              <1> 		; jsr r0,wslot / set write and inhibit bits in I/O queue, 
 14927                              <1> 			   ; / proc. status=0, r5 points to 1st word of data
 14928 0001116E 803D[86900100]00    <1> 	cmp	byte [u.kcall], 0
 14929 00011175 770F                <1> 	ja	short dskw_4 ; zf=0 -> the caller is 'mkdir'
 14930                              <1> 	;
 14931 00011177 66833D[84900100]00  <1> 	cmp	word [u.pcount], 0
 14932 0001117F 7705                <1> 	ja	short dskw_4
 14933                              <1> dskw_3:
 14934                              <1> 	; [u.base] = virtual address to transfer (as source address)
 14935 00011181 E832FAFFFF          <1> 	call	trans_addr_r ; translate virtual address to physical (r)
 14936                              <1> dskw_4:
 14937 00011186 BB[4C940100]        <1> 	mov	ebx, writei_buffer
 14938                              <1> 	; EBX (r5) = system (I/O) buffer address
 14939 0001118B E894FAFFFF          <1> 	call	sioreg
 14940                              <1> 	; ESI = file (user data) offset
 14941                              <1> 	; EDI = sector (I/O) buffer offset
 14942                              <1> 	; ECX = byte count
 14943                              <1> 	;
 14944 00011190 F3A4                <1>   	rep	movsb
 14945                              <1> 	; 25/07/2015
 14946                              <1> 	; eax = remain bytes in buffer
 14947                              <1>         ;       (check if remain bytes in the buffer > [u.pcount])
 14948 00011192 09C0                <1> 	or	eax, eax
 14949 00011194 75EB                <1> 	jnz	short dskw_3 ; (page end before system buffer end!)	
 14950                              <1> 
 14951                              <1> 	; 23/10/2016
 14952 00011196 B101                <1> 	mov	cl, 1
 14953 00011198 5E                  <1> 	pop	esi
 14954 00011199 A1[D8840100]        <1> 	mov	eax, [writei.sector]
 14955                              <1> 	; esi = logical dos drive description table address
 14956                              <1> 	; eax = sector number
 14957                              <1> 	; ebx = writei buffer address
 14958                              <1> 	; ecx = sector count
 14959 0001119E E8DB0C0000          <1> 	call	disk_write ; / yes, write the block
 14960 000111A3 7313                <1> 	jnc	short dskw_5
 14961                              <1> 
 14962                              <1> 	;mov	eax, 18 ; drive not ready or WRITE ERROR !
 14963                              <1> 	; 30/08/2022
 14964 000111A5 29C0                <1> 	sub	eax, eax
 14965 000111A7 B012                <1> 	mov	al, 18
 14966 000111A9 EB9E                <1> 	jmp	short dskw_err
 14967                              <1> 
 14968                              <1> dskw_7:
 14969                              <1>  	; update last modif. date&time of the file
 14970                              <1> 	; (also updates file size as OF_SIZE)
 14971 000111AB E85A030000          <1> 	call	update_file_lmdt
 14972                              <1> 	;mov	byte [setfmod], 0	
 14973                              <1> 
 14974                              <1> 	; 03/08/2013
 14975 000111B0 C605[86900100]00    <1> 	mov	byte [u.kcall], 0
 14976                              <1> 	; 23/10/2016
 14977                              <1> 	;mov	eax, [writei.fclust]
 14978                              <1> dskw_8:		; 23/07/2022
 14979 000111B7 C3                  <1> 	retn
 14980                              <1> 
 14981                              <1> dskw_5:
 14982                              <1> 	; 26/10/2016
 14983 000111B8 0FB61D[F8840100]    <1> 	movzx	ebx, byte [writei.ofn] ; open file number
 14984 000111BF C0E302              <1> 	shl	bl, 2 ; *4
 14985 000111C2 8B83[44860100]      <1> 	mov	eax, [ebx+OF_POINTER]
 14986 000111C8 3B83[C4860100]      <1> 	cmp	eax, [ebx+OF_SIZE]
 14987 000111CE 7606                <1> 	jna	short dskw_6
 14988 000111D0 8983[C4860100]      <1> 	mov	[ebx+OF_SIZE], eax
 14989                              <1> dskw_6:
 14990                              <1> 	;shr	bl, 2
 14991 000111D6 833D[48900100]00    <1>         cmp     dword [u.count], 0 ; / any more data to write?
 14992 000111DD 76CC                <1> 	jna	short dskw_7
 14993 000111DF A1[E8840100]        <1> 	mov	eax, [writei.fclust]
 14994 000111E4 E92BFFFFFF          <1> 	jmp	dskw_0 ; / yes, branch
 14995                              <1> 
 14996                              <1> mget_w:
 14997                              <1> 	; 08/08/2022
 14998                              <1> 	; 25/07/2022
 14999                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5
 15000                              <1> 	; 02/11/2016
 15001                              <1> 	; 01/11/2016
 15002                              <1> 	; 23/10/2016, 31/10/2016
 15003                              <1> 	; 22/10/2016 - TRDOS 386 (TRDOS v2.0)
 15004                              <1> 	; 03/06/2015 (Retro UNIX 386 v1, 'mget', u.5s)
 15005                              <1> 	; 22/03/2013 - 31/07/2013 (Retro UNIX 8086 v1)
 15006                              <1> 	;
 15007                              <1> 	; Get existing or (allocate) a new disk block for file
 15008                              <1> 	; 
 15009                              <1> 	; INPUTS ->
 15010                              <1> 	;    [u.fofp] = file offset pointer
 15011                              <1> 	;    [i.size] = file size
 15012                              <1> 	;    [u.count] = byte count	 
 15013                              <1> 	;    EAX = First cluster
 15014                              <1> 	;    [cdev] = Logical dos drive number 	  
 15015                              <1> 	;    [writei.ofn] = File Number
 15016                              <1> 	;		   (Open file index, 0 based)
 15017                              <1> 	;    ([u.off] = file offset)
 15018                              <1> 	; OUTPUTS ->
 15019                              <1> 	;    EAX = logical sector number
 15020                              <1> 	;    ESI = Logical Dos Drive Description Table address
 15021                              <1> 	;
 15022                              <1> 	; Modified registers: EDX, EBX, ECX, ESI, EDI, EBP  
 15023                              <1> 
 15024 000111E9 8B35[34900100]      <1>         mov     esi, [u.fofp]
 15025 000111EF 8B2E                <1> 	mov	ebp, [esi] ; u.off (or EBX*4+OF_POINTER)
 15026                              <1> 
 15027 000111F1 29C9                <1> 	sub	ecx, ecx
 15028 000111F3 8A2D[05900100]      <1> 	mov	ch, [cdev]
 15029                              <1> 
 15030 000111F9 BE00010900          <1> 	mov	esi, Logical_DOSDisks
 15031 000111FE 01CE                <1> 	add	esi, ecx
 15032                              <1> 
 15033                              <1> 	; 31/10/2016
 15034 00011200 89C3                <1> 	mov	ebx, eax ; First Cluster or FDT address
 15035                              <1> 
 15036 00011202 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
 15037                              <1> 	;jna	mget_w_14 ; Singlix FS
 15038                              <1> 	; 23/07/2022
 15039 00011206 7705                <1> 	ja	short mget_w_20
 15040 00011208 E9D8010000          <1> 	jmp	mget_w_14  ; Singlix FS	
 15041                              <1>  
 15042                              <1> mget_w_20:
 15043 0001120D 0FB74611            <1> 	movzx	eax, word [esi+LD_BPB+BytesPerSec]
 15044 00011211 0FB65613            <1> 	movzx	edx, byte [esi+LD_BPB+SecPerClust]
 15045 00011215 8815[D6840100]      <1> 	mov	[writei.spc], dl  ; sectors per cluster
 15046 0001121B F7E2                <1> 	mul	edx
 15047                              <1> 	; edx = 0
 15048                              <1> 	; eax = bytes per cluster (<= 65536)
 15049                              <1> 
 15050                              <1> 	; 02/11/2016
 15051 0001121D 89C1                <1> 	mov	ecx, eax
 15052 0001121F 48                  <1> 	dec	eax
 15053 00011220 66A3[DC840100]      <1> 	mov	[writei.bpc], ax	
 15054                              <1> 	
 15055 00011226 89E8                <1> 	mov	eax, ebp
 15056 00011228 0305[48900100]      <1> 	add	eax, [u.count] ; next file position
 15057 0001122E 3B05[28910100]      <1> 	cmp	eax, [i.size] ; <= file size ?
 15058                              <1> 	;jna	mget_w_4 ; no
 15059                              <1> 	; 23/07/2022
 15060 00011234 7705                <1> 	ja	short mget_w_21
 15061 00011236 E907010000          <1> 	jmp	mget_w_4
 15062                              <1> mget_w_21:
 15063 0001123B F7F1                <1> 	div	ecx
 15064 0001123D A3[E4840100]        <1> 	mov	[writei.c_index], eax ; cluster index
 15065                              <1> 	; edx = byte offset in cluster (<= 65535)
 15066                              <1> 	;mov	[writei.offset], dx
 15067                              <1> 	;shr	dx, 9 ; / 512
 15068                              <1> 	;mov	[writei.s_index], dl ; sector index in cluster (0 to spc -1)
 15069                              <1> 
 15070 00011242 29D2                <1> 	sub	edx, edx ; 01/11/2016
 15071 00011244 8915[D8840100]      <1> 	mov 	[writei.sector], edx ; 0
 15072 0001124A 668915[DE840100]    <1> 	mov	[writei.offset], dx  ; byte offset in cluster 
 15073 00011251 8815[D7840100]      <1> 	mov	[writei.s_index], dl ; sector index in cluster (0 to spc -1)
 15074                              <1> 
 15075 00011257 89D8                <1> 	mov	eax, ebx ; First Cluster
 15076                              <1> 
 15077                              <1> 	; is this the 1st mget_w or a next mget_w call ? (by 'writei')
 15078 00011259 3815[D4840100]      <1> 	cmp	byte [writei.valid], dl ; 0 
 15079 0001125F 7624                <1> 	jna	short mget_w_0
 15080                              <1> 
 15081 00011261 8815[D4840100]      <1> 	mov 	byte [writei.valid], dl ; 0 ; reset ('writei' will set it) 
 15082                              <1> 
 15083 00011267 3B05[E8840100]      <1> 	cmp	eax, [writei.fclust]
 15084 0001126D 7516                <1> 	jne	short mget_w_0
 15085                              <1> 
 15086 0001126F 8A0D[05900100]      <1> 	mov	cl, [cdev]
 15087 00011275 3A0D[D5840100]      <1> 	cmp	cl, [writei.drv]
 15088 0001127B 7508                <1> 	jne	short mget_w_0
 15089                              <1>  	; [writei.l_clust] & [writei.l_index] are valid, 
 15090                              <1> 	;  we don't need to get last cluster & last cluster index
 15091 0001127D 8B0D[F4840100]      <1> 	mov	ecx, [writei.l_index]
 15092 00011283 EB61                <1> 	jmp	short mget_w_2
 15093                              <1> mget_w_0:
 15094 00011285 A3[E8840100]        <1> 	mov	[writei.fclust], eax ; first cluster
 15095                              <1> 	; edx = 0
 15096 0001128A A3[E0840100]        <1> 	mov	[writei.cluster], eax ; first cluster ; 01/11/2016
 15097 0001128F 8915[EC840100]      <1> 	mov 	[writei.fs_index], edx ; 0 ; current cluster index
 15098                              <1> 
 15099                              <1> 	; FAT file system (FAT12, FAT16, FAT32)
 15100 00011295 E8D6B7FFFF          <1> 	call	get_last_cluster
 15101                              <1> 	;jc	short mget_w_err ; eax = error code
 15102                              <1> 	; 08/08/2022
 15103 0001129A 7305                <1> 	jnc	short mget_w_25
 15104 0001129C E992000000          <1> 	jmp	mget_w_err
 15105                              <1> mget_w_25:		
 15106 000112A1 A3[F0840100]        <1> 	mov	[writei.lclust], eax ; last cluster
 15107                              <1> 
 15108 000112A6 8B0D[14830100]      <1> 	mov	ecx, [glc_index] ; last cluster index
 15109 000112AC 890D[F4840100]      <1> 	mov	[writei.l_index], ecx
 15110                              <1> 
 15111 000112B2 A0[F8840100]        <1> 	mov	al, [writei.ofn]
 15112 000112B7 FEC0                <1> 	inc	al
 15113 000112B9 A2[33850100]        <1> 	mov	[setfmod], al ; update lm date&time sign
 15114                              <1> 
 15115                              <1> mget_w_1:
 15116 000112BE 3B0D[E4840100]      <1> 	cmp	ecx, [writei.c_index]  ; last cluster index
 15117 000112C4 7320                <1> 	jnb	short mget_w_2 ; 01/11/2016
 15118                              <1> 
 15119 000112C6 A1[F0840100]        <1> 	mov	eax, [writei.lclust]
 15120                              <1> 	; EAX = Last cluster
 15121 000112CB E8ABB8FFFF          <1> 	call	add_new_cluster
 15122 000112D0 7261                <1> 	jc	short mget_w_err ; eax = error code
 15123                              <1> 	; edx = 0
 15124 000112D2 A3[F0840100]        <1> 	mov	[writei.lclust], eax ; (new) last cluster
 15125 000112D7 8B0D[F4840100]      <1> 	mov	ecx, [writei.l_index]
 15126 000112DD 41                  <1> 	inc	ecx ; add 1 to last cluster index
 15127 000112DE 890D[F4840100]      <1> 	mov	[writei.l_index], ecx ; current last cluster index
 15128                              <1> 
 15129 000112E4 EBD8                <1> 	jmp	short mget_w_1
 15130                              <1> 
 15131                              <1> mget_w_2:
 15132 000112E6 89E9                <1> 	mov	ecx, ebp
 15133 000112E8 030D[48900100]      <1> 	add	ecx, [u.count]
 15134 000112EE 890D[28910100]      <1> 	mov	[i.size], ecx ; save new file size
 15135                              <1> 	;sub	edx, edx ; 0
 15136                              <1> 
 15137 000112F4 A0[05900100]        <1> 	mov	al, [cdev]
 15138 000112F9 A2[D5840100]        <1> 	mov	[writei.drv], al ; physical drive number
 15139                              <1> 	; edx = 0
 15140 000112FE 89E8                <1> 	mov	eax, ebp ; file offset
 15141 00011300 0FB70D[DC840100]    <1> 	movzx	ecx, word [writei.bpc] ; bytes per cluster - 1
 15142 00011307 41                  <1> 	inc	ecx ; bytes per cluster
 15143 00011308 F7F1                <1> 	div	ecx
 15144                              <1> 	; edx = byte offset in cluster (<= 65535)
 15145                              <1> 	; eax = cluster index
 15146 0001130A A3[E4840100]        <1> 	mov	[writei.c_index], eax
 15147 0001130F 668915[DE840100]    <1> 	mov	[writei.offset], dx
 15148                              <1> 	;shr	dx, 9 ; / 512
 15149                              <1> 	; 23/07/2022
 15150 00011316 C1EA09              <1> 	shr	edx, 9
 15151 00011319 8815[D7840100]      <1> 	mov	[writei.s_index], dl ; sector index in cluster (0 to spc -1)
 15152                              <1> 
 15153                              <1> mget_w_3:
 15154 0001131F 3B05[F4840100]      <1> 	cmp	eax, [writei.l_index] ; last cluster index
 15155 00011325 7538                <1> 	jne	short mget_w_5
 15156                              <1> 
 15157 00011327 A3[EC840100]        <1> 	mov	[writei.fs_index], eax ; cluster index (for next check)
 15158 0001132C A1[F0840100]        <1> 	mov	eax, [writei.lclust] ; last cluster
 15159 00011331 EB6E                <1> 	jmp	short mget_w_10
 15160                              <1> 
 15161                              <1> mget_w_err:
 15162 00011333 A3[88900100]        <1> 	mov	[u.error], eax
 15163 00011338 A3[20900100]        <1> 	mov	[u.r0], eax
 15164 0001133D E9F5BAFFFF          <1> 	jmp	error
 15165                              <1> 
 15166                              <1> mget_w_4: ; 02/11/2016
 15167                              <1> 	; eax = next file position
 15168 00011342 2B05[48900100]      <1> 	sub	eax, [u.count] ; current file position
 15169                              <1> 	; edx = 0
 15170                              <1> 	; ecx = bytes per cluster
 15171 00011348 F7F1                <1> 	div	ecx
 15172 0001134A A3[E4840100]        <1> 	mov	[writei.c_index], eax ; cluster index
 15173 0001134F 668915[DE840100]    <1> 	mov	[writei.offset], dx
 15174                              <1> 	;shr	dx, 9 ; / 512
 15175                              <1> 	; 23/07/2022
 15176 00011356 C1EA09              <1> 	shr	edx, 9
 15177 00011359 8815[D7840100]      <1> 	mov	[writei.s_index], dl ; sector index in cluster (0 to spc -1)
 15178                              <1> 
 15179                              <1> mget_w_5:
 15180 0001135F 21C0                <1> 	and	eax, eax ; 0 = First Cluster's index number
 15181 00011361 750C                <1> 	jnz	short mget_w_6
 15182                              <1> 
 15183 00011363 A3[EC840100]        <1> 	mov	[writei.fs_index], eax ; cluster index (for next check)
 15184 00011368 A1[E8840100]        <1> 	mov	eax, [writei.fclust] ; first cluster
 15185 0001136D EB32                <1> 	jmp	short mget_w_10
 15186                              <1> 
 15187                              <1> mget_w_6:
 15188 0001136F 3B05[EC840100]      <1> 	cmp	eax, [writei.fs_index] ; current cluster index (>0)
 15189 00011375 7507                <1> 	jne	short mget_w_7
 15190 00011377 A1[E0840100]        <1> 	mov	eax, [writei.cluster] ; current cluster 
 15191 0001137C EB3A                <1> 	jmp	short mget_w_11
 15192                              <1> 
 15193                              <1> mget_w_7:
 15194 0001137E 89C1                <1> 	mov	ecx, eax
 15195 00011380 2B0D[EC840100]      <1> 	sub	ecx, [writei.fs_index]
 15196 00011386 730D                <1> 	jnc	short mget_w_8
 15197                              <1> 	; get cluster by index from the first cluster
 15198 00011388 A1[E8840100]        <1> 	mov	eax, [writei.fclust]
 15199 0001138D 8B0D[E4840100]      <1> 	mov	ecx, [writei.c_index]
 15200 00011393 EB05                <1> 	jmp	short mget_w_9
 15201                              <1> 
 15202                              <1> mget_w_8:
 15203 00011395 A1[E0840100]        <1> 	mov	eax, [writei.cluster] ; beginning cluster
 15204                              <1> 	; ecx = cluster sequence number after the beginning cluster
 15205                              <1> 	; sub	edx, edx ; 0
 15206                              <1> 
 15207                              <1> mget_w_9:
 15208                              <1> 	; EAX = Beginning cluster
 15209                              <1> 	; EDX = Sector index in disk/file section
 15210                              <1> 	;	(Only for SINGLIX file system!)
 15211                              <1> 	; ECX = Cluster sequence number after the beginning cluster
 15212                              <1> 	; ESI = Logical DOS Drive Description Table address
 15213 0001139A E8D0B8FFFF          <1> 	call	get_cluster_by_index
 15214 0001139F 7292                <1> 	jc	short mget_w_err ; error code in EAX
 15215                              <1> 
 15216                              <1> 	; EAX = Cluster number		
 15217                              <1> mget_w_10:
 15218 000113A1 A3[E0840100]        <1> 	mov	[writei.cluster], eax ; FDT number for Singlix File System
 15219                              <1> 
 15220 000113A6 807E0300            <1> 	cmp	byte [esi+LD_FATType], 0
 15221 000113AA 7628                <1> 	jna	short mget_w_13
 15222                              <1> 	; 01/11/2016
 15223 000113AC 8B15[E4840100]      <1> 	mov	edx, [writei.c_index]
 15224 000113B2 8915[EC840100]      <1> 	mov	[writei.fs_index], edx
 15225                              <1> mget_w_11:
 15226                              <1> 	;sub	eax, 2
 15227                              <1> 	; 23/07/2022
 15228 000113B8 48                  <1> 	dec	eax
 15229 000113B9 48                  <1> 	dec	eax
 15230 000113BA 0FB615[D6840100]    <1> 	movzx	edx, byte [writei.spc]
 15231 000113C1 F7E2                <1> 	mul	edx
 15232                              <1> 
 15233 000113C3 034668              <1> 	add	eax, [esi+LD_DATABegin]
 15234 000113C6 8A15[D7840100]      <1> 	mov	dl, [writei.s_index]
 15235 000113CC 01D0                <1> 	add	eax, edx
 15236                              <1> mget_w_12:
 15237 000113CE A3[D8840100]        <1> 	mov	[writei.sector], eax
 15238                              <1> 	;; buffer validation must be done in writei
 15239                              <1> 	;;mov	byte [writei.valid], 1 
 15240 000113D3 C3                  <1> 	retn
 15241                              <1> 
 15242                              <1> mget_w_13:
 15243                              <1> 	; EAX = FDT number (Current Section)
 15244                              <1> 	; EDX = Sector index from the first section (0,1,2,3,4...)
 15245 000113D4 2B15[EC840100]      <1> 	sub	edx, [writei.fs_index]	
 15246                              <1> 	; EDX = Sector index from current section
 15247 000113DA 8915[EC840100]      <1> 	mov	[writei.fs_index], edx
 15248 000113E0 40                  <1> 	inc	eax ; the first data sector in FS disk section	
 15249 000113E1 01D0                <1> 	add	eax, edx
 15250 000113E3 EBE9                <1> 	jmp	short mget_w_12
 15251                              <1> 
 15252                              <1> mget_w_14:
 15253 000113E5 8A4E12              <1> 	mov	cl, [esi+LD_FS_BytesPerSec+1]
 15254 000113E8 D0E9                <1> 	shr	cl, 1 ;  ; 1 for 512 bytes, 4 for 2048 bytes
 15255 000113EA 880D[D6840100]      <1> 	mov	[writei.spc], cl  ; sectors per cluster
 15256                              <1> 	; NOTE: writei bytes per sector value is always 512 ! 
 15257 000113F0 66C705[DC840100]00- <1> 	mov	word [writei.bpc], 512
 15257 000113F8 02                  <1>
 15258                              <1> 
 15259 000113F9 89E9                <1> 	mov	ecx, ebp
 15260 000113FB 030D[48900100]      <1> 	add	ecx, [u.count] ; next file position
 15261 00011401 3B0D[28910100]      <1> 	cmp	ecx, [i.size] ; <= file size ?
 15262                              <1> 	;jna	mget_w_19 ; no
 15263 00011407 7705                <1> 	ja	short mget_w_22
 15264                              <1> 	; 23/07/2022
 15265 00011409 E9C6000000          <1> 	jmp	mget_w_19
 15266                              <1> 
 15267                              <1> mget_w_22:
 15268 0001140E 29D2                <1> 	sub	edx, edx ; 0
 15269 00011410 8915[D8840100]      <1> 	mov 	[writei.sector], edx ; 0
 15270 00011416 668915[DE840100]    <1> 	mov	[writei.offset], dx  ; byte offset in cluster 
 15271 0001141D 8815[D7840100]      <1> 	mov	[writei.s_index], dl ; sector index in cluster (0 to spc -1)
 15272                              <1> 
 15273 00011423 C1E909              <1> 	shr	ecx, 9 ; 1 cluster = 512 bytes
 15274 00011426 890D[E4840100]      <1> 	mov	[writei.c_index], ecx ; section/cluster index
 15275                              <1> 	
 15276 0001142C 89D8                <1> 	mov	eax, ebx ; FDT number (First FDT address)
 15277                              <1> 
 15278                              <1> 	; is this the 1st mget_w or a next mget_w call ? (by 'writei')
 15279 0001142E 3815[D4840100]      <1> 	cmp	byte [writei.valid], dl ; 0 
 15280 00011434 7624                <1> 	jna	short mget_w_15
 15281                              <1> 
 15282 00011436 8815[D4840100]      <1> 	mov 	byte [writei.valid], dl ; 0 ; reset ('writei' will set it) 
 15283                              <1> 
 15284 0001143C 3B05[E8840100]      <1> 	cmp	eax, [writei.fclust]
 15285 00011442 7516                <1> 	jne	short mget_w_15
 15286                              <1> 
 15287 00011444 8A0D[05900100]      <1> 	mov	cl, [cdev]
 15288 0001144A 3A0D[D5840100]      <1> 	cmp	cl, [writei.drv]
 15289 00011450 7508                <1> 	jne	short mget_w_15
 15290                              <1>  	; [writei.l_clust] & [writei.l_index] are valid, 
 15291                              <1> 	;  we don't need to get last cluster & last cluster index
 15292 00011452 8B0D[F4840100]      <1> 	mov	ecx, [writei.l_index]
 15293 00011458 EB4A                <1> 	jmp	short mget_w_17
 15294                              <1> mget_w_15:
 15295 0001145A A3[E8840100]        <1> 	mov	[writei.fclust], eax ; first section (FDT number)
 15296                              <1> 	; edx = 0
 15297 0001145F 8915[E0840100]      <1> 	mov	[writei.cluster], edx ; 0 ; current section
 15298 00011465 8915[EC840100]      <1> 	mov 	[writei.fs_index], edx ; 0 ; curret section index
 15299                              <1> 
 15300                              <1> 	; eax = FDT number (section 0 header address)
 15301 0001146B E828B8FFFF          <1> 	call	get_last_section
 15302                              <1> 	;jc	short mget_w_err ; eax = error code
 15303                              <1> 	; 08/08/2022
 15304 00011470 7305                <1> 	jnc	short mget_w_26
 15305 00011472 E9BCFEFFFF          <1> 	jmp	mget_w_err
 15306                              <1> mget_w_26:
 15307 00011477 8915[EC840100]      <1> 	mov 	[writei.fs_index], edx ; sector index in last section
 15308                              <1> 		
 15309 0001147D A3[F0840100]        <1> 	mov	[writei.lclust], eax ; last section address
 15310                              <1> 
 15311 00011482 8B0D[14830100]      <1> 	mov	ecx, [glc_index] ; last section index
 15312 00011488 890D[F4840100]      <1> 	mov	[writei.l_index], ecx
 15313                              <1> 
 15314 0001148E A0[F8840100]        <1> 	mov	al, [writei.ofn]
 15315 00011493 FEC0                <1> 	inc	al
 15316 00011495 A2[33850100]        <1> 	mov	[setfmod], al ; update lm date&time sign
 15317                              <1> 
 15318                              <1> mget_w_16:
 15319                              <1> 	; edx = (existing) last section (sector) index
 15320 0001149A 8B0D[E4840100]      <1> 	mov	ecx, [writei.c_index] ; final section (sector) index
 15321 000114A0 29D1                <1> 	sub	ecx, edx
 15322 000114A2 7630                <1> 	jna	short mget_w_19
 15323                              <1> 	; ecx = sector count
 15324                              <1> mget_w_17:
 15325 000114A4 A1[F0840100]        <1> 	mov	eax, [writei.lclust]
 15326                              <1> 	; ESI = Logical dos drv desc. table address
 15327                              <1>         ; EAX = Last section
 15328                              <1>         ; (ECX = 0 for directory) 
 15329                              <1>         ; ECX = sector count (except FDT)
 15330 000114A9 E840AEFFFF          <1> 	call	add_new_fs_section
 15331 000114AE 730F                <1> 	jnc	short mget_w_18
 15332                              <1> 
 15333                              <1> 	; If error number = 27h (insufficient disk space)
 15334                              <1> 	; it is needed to check free consequent sectors
 15335                              <1> 	; (1 data sector at least and +1 section header sector) 
 15336                              <1> 
 15337 000114B0 83F827              <1> 	cmp	eax, 27h
 15338                              <1> 	;jne	mget_w_err ; eax = error code
 15339                              <1> 	; 25/07/2022
 15340 000114B3 7405                <1> 	je	short mget_w_24
 15341                              <1> mget_w_23:
 15342 000114B5 E979FEFFFF          <1> 	jmp	mget_w_err
 15343                              <1> mget_w_24:
 15344                              <1> 	; ecx = count of free consequent sectors
 15345                              <1> 	; ecx must be > 1 (1 data + 1 header sector)
 15346 000114BA 49                  <1> 	dec	ecx
 15347                              <1> 	;jz	short mget_w_err
 15348                              <1> 	;jmp	short mget_w_17
 15349                              <1> 	; 23/07/2022
 15350 000114BB 75E7                <1> 	jnz	short mget_w_17
 15351                              <1> 	;jmp	mget_w_err
 15352                              <1> 	; 25/07/2022
 15353 000114BD EBF6                <1> 	jmp	short mget_w_23
 15354                              <1> 
 15355                              <1> mget_w_18:
 15356 000114BF A3[F0840100]        <1> 	mov	[writei.lclust], eax ; (new) last section
 15357                              <1> 	; ecx = sector count (except section header)
 15358 000114C4 8B15[F4840100]      <1> 	mov	edx, [writei.l_index]
 15359 000114CA 01CA                <1> 	add	edx, ecx ; add sector count to index
 15360 000114CC 8915[F4840100]      <1> 	mov	[writei.l_index], edx
 15361 000114D2 EBC6                <1> 	jmp	short mget_w_16
 15362                              <1> 
 15363                              <1> mget_w_19:
 15364 000114D4 89E9                <1> 	mov	ecx, ebp
 15365 000114D6 030D[48900100]      <1> 	add	ecx, [u.count]
 15366 000114DC 890D[28910100]      <1> 	mov	[i.size], ecx ; save new file size
 15367                              <1> 	;sub	edx, edx ; 0
 15368                              <1> 
 15369 000114E2 A0[05900100]        <1> 	mov	al, [cdev]
 15370 000114E7 A2[D5840100]        <1> 	mov	[writei.drv], al ; physical drive number
 15371                              <1> 	; edx = 0
 15372 000114EC 89E8                <1> 	mov	eax, ebp ; file offset
 15373 000114EE 89C2                <1> 	mov	edx, eax
 15374                              <1> 	; 1 cluster = 512 bytes (for Singlix FS)
 15375 000114F0 C1E809              <1> 	shr	eax, 9  ; / 512
 15376 000114F3 81E2FF010000        <1> 	and	edx, 1FFh
 15377                              <1> 	; edx = byte offset in cluster/sector (<= 511)
 15378                              <1> 	; eax = section (sector/cluster) index
 15379 000114F9 A3[E4840100]        <1> 	mov	[writei.c_index], eax
 15380 000114FE 668915[DE840100]    <1> 	mov	[writei.offset], dx
 15381                              <1> 	;mov	byte [writei.s_index], 0 ; sector index in cluster
 15382 00011505 E915FEFFFF          <1> 	jmp	mget_w_3
 15383                              <1> 
 15384                              <1> update_file_lmdt: ; & update file size
 15385                              <1> 	; 30/07/2022
 15386                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
 15387                              <1> 	; 26/10/2016
 15388                              <1> 	; 24/10/2016
 15389                              <1> 	; 23/10/2016
 15390                              <1> 	; 22/10/2016 - TRDOS 386 (TRDOS v2.0)
 15391                              <1> 	;
 15392                              <1> 	; Update last modification date&time of file
 15393                              <1> 	; (call from syswrite -> writei)
 15394                              <1> 	; ((also updates file size)) // 26/10/2016
 15395                              <1> 	; 
 15396                              <1> 	; INPUT:
 15397                              <1> 	;      byte [setfmod] = open file number
 15398                              <1> 	; OUTPUT:
 15399                              <1> 	;      cf = 0 -> success !
 15400                              <1> 	;      cf = 1 -> lmdt update has been failed!
 15401                              <1> 	;
 15402                              <1> 	; Modified registers: eax, ebx, ecx, edx, esi, edi
 15403                              <1> 	;
 15404                              <1> 
 15405                              <1> 	;cmp	byte [setfmod], 0
 15406                              <1> 	;jna	short uflmdt_2 ; nothing to do
 15407                              <1> 
 15408 0001150A 31C0                <1> 	xor	eax, eax
 15409                              <1> 
 15410 0001150C 0FB61D[33850100]    <1> 	movzx	ebx, byte [setfmod]
 15411 00011513 FECB                <1> 	dec	bl ; open file index number (0 based)
 15412                              <1> 
 15413 00011515 8AA3[C4850100]      <1> 	mov	ah, [ebx+OF_DRIVE]
 15414 0001151B BE00010900          <1> 	mov	esi, Logical_DOSDisks
 15415 00011520 01C6                <1> 	add	esi, eax
 15416 00011522 C0E302              <1> 	shl	bl, 2 ; *4	
 15417 00011525 8B8B[44850100]      <1> 	mov	ecx, [ebx+OF_FCLUSTER] ; first cluster
 15418 0001152B 8B93[C4870100]      <1> 	mov	edx, [ebx+OF_DIRCLUSTER] ; dir cluster
 15419                              <1> 
 15420 00011531 D0EB                <1> 	shr	bl, 1 ; /2
 15421 00011533 0FB7BB[C4890100]    <1> 	movzx	edi, word [ebx+OF_DIRENTRY]
 15422                              <1> 	
 15423 0001153A 803D[71800100]01    <1> 	cmp	byte [DirBuff_ValidData], 1
 15424 00011541 7265                <1> 	jb	short uflmdt_4
 15425                              <1> 
 15426 00011543 A0[6F800100]        <1> 	mov	al, [DirBuff_DRV]
 15427 00011548 2C41                <1> 	sub	al, 'A'	
 15428 0001154A 38E0                <1> 	cmp	al, ah
 15429 0001154C 755A                <1> 	jne	short uflmdt_4 ; different drive
 15430 0001154E 8A4603              <1> 	mov	al, [esi+LD_FATType] 
 15431 00011551 3A05[70800100]      <1> 	cmp	al, [DirBuff_FATType]
 15432 00011557 7552                <1> 	jne	short uflmdt_5 ; different FS type
 15433 00011559 3B15[76800100]      <1> 	cmp	edx, [DirBuff_Cluster]
 15434 0001155F 754A                <1> 	jne	short uflmdt_5 ; different cluster
 15435                              <1> 
 15436                              <1> uflmdt_1:
 15437                              <1> 	; Directory buffer is ready here!
 15438                              <1> 	; OF_FCLUSTER must be compared/verified
 15439 00011561 BE00000800          <1> 	mov	esi, Directory_Buffer
 15440                              <1> 	;shl	di, 5 ; dir entry index * 32
 15441                              <1> 	; 23/07/2022
 15442 00011566 C1E705              <1> 	shl	edi, 5 
 15443 00011569 01FE                <1> 	add	esi, edi ; offset
 15444                              <1> 	;
 15445 0001156B F6460B18            <1> 	test	byte [esi+DirEntry_Attr], 18h ; Vol & Dir
 15446 0001156F 7564                <1> 	jnz	short uflmdt_2 ; not a valid file !
 15447 00011571 668B4614            <1> 	mov	ax, [esi+DirEntry_FstClusHI]
 15448 00011575 C1E010              <1> 	shl	eax, 16
 15449 00011578 668B461A            <1> 	mov	ax, [esi+DirEntry_FstClusLO]
 15450 0001157C 39C8                <1> 	cmp	eax, ecx ; same first cluster ?
 15451                              <1> 	;je	short uflmdt_3 ; yes, it is OK !!!	
 15452                              <1> 	; 23/07/2022
 15453 0001157E 7555                <1> 	jne	short uflmdt_2
 15454                              <1> 	
 15455                              <1> uflmdt_3:
 15456                              <1> 	; Update directory entry
 15457                              <1> 	; 26/10/2016
 15458 00011580 D0E3                <1> 	shl	bl, 1 ; *2 
 15459 00011582 8B83[C4860100]      <1> 	mov	eax, [ebx+OF_SIZE] ; file size
 15460 00011588 89461C              <1> 	mov	[esi+DirEntry_FileSize], eax
 15461                              <1> 	;
 15462 0001158B E8539AFFFF          <1> 	call	convert_current_date_time
 15463                              <1> 	; OUTPUT -> DX = Date in dos dir entry format
 15464                              <1>         ; 	    AX = Time in dos dir entry format	
 15465 00011590 66894616            <1> 	mov	[esi+DirEntry_WrtTime], ax
 15466 00011594 66895618            <1> 	mov	[esi+DirEntry_WrtDate], dx	
 15467 00011598 66895612            <1> 	mov	[esi+DirEntry_LastAccDate], dx
 15468 0001159C C605[71800100]02    <1> 	mov	byte [DirBuff_ValidData], 2
 15469                              <1> 	;call	save_directory_buffer
 15470                              <1> 	;retn
 15471                              <1> 	; 23/07/2022
 15472 000115A3 E9D09AFFFF          <1> 	jmp	save_directory_buffer	
 15473                              <1> 
 15474                              <1> uflmdt_4:
 15475                              <1> 	; Directory buffer sector read&write
 15476                              <1> 	; 23/10/2016
 15477                              <1> 	;
 15478 000115A8 8A4603              <1> 	mov	al, [esi+LD_FATType]
 15479                              <1> uflmdt_5:
 15480 000115AB BB[54960100]        <1> 	mov	ebx, rw_buffer ; Common r/w sector buffer addr
 15481                              <1> 		
 15482 000115B0 20C0                <1> 	and	al, al ; 0 = Singlix FS
 15483 000115B2 7428                <1> 	jz	short uflmdt_11
 15484                              <1> 
 15485                              <1> ;uflmdt_12:
 15486 000115B4 21D2                <1> 	and	edx, edx
 15487 000115B6 752B                <1> 	jnz	short uflmdt_9
 15488                              <1> 
 15489 000115B8 3C02                <1> 	cmp	al, 2  ; 3 = FAT32
 15490 000115BA 7724                <1> 	ja	short uflmdt_8
 15491                              <1> 
 15492 000115BC 89F8                <1> 	mov	eax, edi ; directory entry index number
 15493                              <1> 	;shr	ax, 4 ; 16 entries per sector	 
 15494                              <1> 	; 23/07/2022
 15495 000115BE C1E804              <1> 	shr	eax, 4
 15496 000115C1 034664              <1> 	add	eax, [esi+LD_ROOTBegin]
 15497                              <1> 	; eax = root directory sector
 15498                              <1> uflmdt_6:
 15499 000115C4 50                  <1> 	push	eax ; * ; disk sector address
 15500 000115C5 51                  <1> 	push	ecx ; first cluster	
 15501 000115C6 B901000000          <1> 	mov	ecx, 1
 15502                              <1> 	; ecx = sector count
 15503 000115CB E8BD080000          <1> 	call	disk_read
 15504 000115D0 59                  <1> 	pop	ecx
 15505 000115D1 7324                <1> 	jnc	short uflmdt_10
 15506 000115D3 58                  <1> 	pop	eax ; *
 15507                              <1> uflmdt_7:
 15508 000115D4 C3                  <1> 	retn
 15509                              <1> 
 15510                              <1> uflmdt_2:	
 15511                              <1> 	; save directory buffer if has modified/changed sign
 15512                              <1> 	; (It is good to save dir buff even if the searched
 15513                              <1> 	; directory entry is not found !?)
 15514 000115D5 E89E9AFFFF          <1> 	call	save_directory_buffer
 15515 000115DA F9                  <1> 	stc	; update failed
 15516 000115DB C3                  <1> 	retn
 15517                              <1> 
 15518                              <1> uflmdt_11:
 15519                              <1> 	; 24/10/2016
 15520                              <1> 	; Update last modification date & time of a file
 15521                              <1> 	; on a disk with Singlix File System.
 15522                              <1> 	;
 15523                              <1> 	; (Method: Read the FDT -File Description Table-
 15524                              <1> 	; sector of the file and update the lmdt data fields,
 15525                              <1> 	; then write FDT sector to the disk.
 15526                              <1> 	; /// It is easy but there is compatibility buffer
 15527                              <1> 	; method also for changing directory entry data and
 15528                              <1> 	; also there are some programming issues for Singlix
 15529                              <1> 	; file system (TRFS), which are not completed yet!)
 15530                              <1> 	;
 15531                              <1> 	; Not ready yet ! (24/10/2016)
 15532                              <1> 	; /// Temporary code for error return ! ///
 15533 000115DC 31C0                <1> 	xor	eax, eax
 15534 000115DE F9                  <1> 	stc
 15535 000115DF C3                  <1> 	retn	
 15536                              <1> 
 15537                              <1> uflmdt_8:
 15538 000115E0 8B5632              <1> 	mov	edx, [esi+LD_BPB+FAT32_RootFClust]
 15539                              <1> uflmdt_9:
 15540 000115E3 83FA02              <1> 	cmp	edx, 2
 15541 000115E6 72EC                <1> 	jb	short uflmdt_7 ; invalid, nothing to do
 15542                              <1> 
 15543                              <1> 	;sub	edx, 2
 15544                              <1> 	; 30/07/2022
 15545 000115E8 4A                  <1> 	dec	edx
 15546 000115E9 4A                  <1> 	dec	edx
 15547 000115EA 89D0                <1> 	mov	eax, edx
 15548 000115EC 0FB65613            <1> 	movzx	edx, byte [esi+LD_BPB+SecPerClust]
 15549 000115F0 F7E2                <1> 	mul	edx
 15550 000115F2 034668              <1> 	add	eax, [esi+LD_DATABegin]
 15551                              <1> 	; eax = sub directory (data) sector 
 15552 000115F5 EBCD                <1> 	jmp	short uflmdt_6
 15553                              <1> 
 15554                              <1> uflmdt_10:
 15555                              <1> 	; Directory sector buffer is ready here!
 15556                              <1> 	; OF_FCLUSTER must be compared/verified
 15557                              <1> 	; edi = dir entry index number (<= 2047)
 15558 000115F7 6683E70F            <1> 	and	di, 0Fh ; 16 entries per sector
 15559                              <1> 	;shl	di, 5 ; dir entry index * 32
 15560                              <1> 	; 23/07/2022
 15561 000115FB C1E705              <1> 	shl	edi, 5
 15562 000115FE 81C7[54960100]      <1> 	add	edi, rw_buffer
 15563                              <1> 	;
 15564 00011604 F6470B18            <1> 	test	byte [edi+DirEntry_Attr], 18h ; Vol & Dir
 15565 00011608 75CB                <1> 	jnz	short uflmdt_2 ; not a valid file !
 15566 0001160A 668B5714            <1> 	mov	dx, [edi+DirEntry_FstClusHI]
 15567 0001160E C1E210              <1> 	shl	edx, 16
 15568 00011611 668B571A            <1> 	mov	dx, [edi+DirEntry_FstClusLO]
 15569 00011615 39CA                <1> 	cmp	edx, ecx ; same first cluster ?
 15570 00011617 75BC                <1> 	jne	short uflmdt_2 ; no !?
 15571                              <1> 
 15572                              <1> 	; Update directory entry
 15573 00011619 E8C599FFFF          <1> 	call	convert_current_date_time
 15574                              <1> 	; OUTPUT -> DX = Date in dos dir entry format
 15575                              <1>         ; 	    AX = Time in dos dir entry format	
 15576 0001161E 66894716            <1> 	mov	[edi+DirEntry_WrtTime], ax
 15577 00011622 66895718            <1> 	mov	[edi+DirEntry_WrtDate], dx	
 15578 00011626 66895712            <1> 	mov	[edi+DirEntry_LastAccDate], dx
 15579                              <1> 	
 15580 0001162A 58                  <1> 	pop	eax ; *
 15581                              <1> 
 15582 0001162B BB[54960100]        <1> 	mov	ebx, rw_buffer ; Common r/w sector buffer addr
 15583 00011630 B901000000          <1> 	mov	ecx, 1
 15584                              <1> 	; esi = logical dos description table address
 15585                              <1> 	; eax = disk sector number/address (LBA)
 15586                              <1> 	; ecx = sector count
 15587                              <1> 	; ebx = buffer address
 15588 00011635 E844080000          <1> 	call	disk_write
 15589 0001163A 7299                <1> 	jc	short uflmdt_2
 15590                              <1> ;uflmdt_12:	
 15591                              <1> 	; save directory buffer if has modified/changed sign
 15592                              <1> 	;call	save_directory_buffer
 15593                              <1> 	;retn
 15594                              <1> 	; 23/07/2022
 15595 0001163C E9379AFFFF          <1> 	jmp	save_directory_buffer
 15596                              <1> 
 15597                              <1> 
 15598                              <1> sysalloc:
 15599                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
 15600                              <1> 	; 14/10/2017
 15601                              <1> 	; 20/08/2017 - 01/09/2017
 15602                              <1> 	; 20/02/2017 - 04/03/2017 - 15/05/2017
 15603                              <1> 	; 19/02/2017 - TRDOS 386 (TRDOS v2.0)
 15604                              <1> 	; (TRDOS 386 feature only!)
 15605                              <1> 	;
 15606                              <1> 	; Allocate Contiguous Memory Block/Pages (for user)
 15607                              <1> 	; (System call for DMA Buffer allocation etc.)	
 15608                              <1> 	;
 15609                              <1> 	; INPUT ->
 15610                              <1> 	;	EBX = Virtual address (for user)
 15611                              <1> 	;	     (Physical memory block/aperture
 15612                              <1> 	;	     will be mapped to this virtual address) 
 15613                              <1> 	;	ECX = Byte Count
 15614                              <1> 	;	     (will be rounded up to page border)
 15615                              <1> 	;	If ECX = 0
 15616                              <1> 	;	    System call will return with an error (cf=1)
 15617                              <1> 	;	    but ECX will contain maximum size of
 15618                              <1> 	;	    available memory aperture and physical
 15619                              <1> 	;	    (beginning) address of that aperture
 15620                              <1> 	;	    (which have maximum size) will be in EAX.
 15621                              <1> 	;	EDX = Upper limit of the requested physical memory
 15622                              <1> 	;	      block/pages.
 15623                              <1> 	;	     (The last byte address of the memory aperture 
 15624                              <1> 	;	      must not be equal to or above this limit.)	
 15625                              <1> 	;	If EDX = 0
 15626                              <1> 	; 	   there is NOLIMIT !
 15627                              <1> 	;	If EDX = 0FFFFFFFFh (-1) 
 15628                              <1> 	;	   ESI = Lower Limit !
 15629                              <1> 	;		(Beginning of the block must not be 'less'
 15630                              <1> 	;		than this.) (Must be equal to or above...)
 15631                              <1> 	;	   EDI = Upper Limit !
 15632                              <1> 	;		(End of the block must be !less! than this)
 15633                              <1> 	;		(The last byte addr of the memory aperture 
 15634                              <1> 	;		must not be equal to or above this limit.)
 15635                              <1> 	;
 15636                              <1> 	; OUTPUT ->
 15637                              <1> 	;	If CF = 0
 15638                              <1> 	;	EAX = Physical address of the allocated memory block
 15639                              <1> 	;	ECX = Allocated bytes (as rounded up to page borders)
 15640                              <1> 	;	EBX = Virtual address (as rounded up)
 15641                              <1> 	;	IF CF = 1
 15642                              <1> 	;	    Requested (size of) Memory block could not be 
 15643                              <1> 	;	    allocated to the user!	
 15644                              <1> 	;	IF CF = 1 & EAX = 0 (Insufficient memory error!)
 15645                              <1> 	;	   ECX = Total number of free bytes
 15646                              <1> 	;	         (not size of available contiguous bytes!)		 	
 15647                              <1> 	;	If CF = 1 & EAX > 0
 15648                              <1> 	;	   there is not a memory aperture with requested size
 15649                              <1> 	;	   but total free mem is not less than requested size.
 15650                              <1> 	;	   EAX = Physical addr of available memory aperture
 15651                              <1> 	;	   	 with max size 
 15652                              <1> 	;	        (but it doesn't fit to the conditions!) 	
 15653                              <1> 	;	   ECX = Size of available memory aperture in bytes.
 15654                              <1> 	;	If CF = 1 -> EAX = 0FFFFFFFFh	
 15655                              <1> 	;	   Conditions/Parameters are wrong !		 		
 15656                              <1> 	;	   ECX is same with input value.
 15657                              <1> 	;
 15658                              <1> 	; Note:	Previously allocated pages will be deallocated if
 15659                              <1> 	;       new allocation conditions are met.
 15660                              <1> 	;
 15661                              <1> 	; Note: u.break control may be included in future versions	
 15662                              <1> 	;
 15663                              <1> 
 15664 00011641 31C0                <1> 	xor	eax, eax ; 0
 15665                              <1> 	; 14/10/2017
 15666 00011643 4A                  <1> 	dec	edx ; is there a limit ?
 15667 00011644 7810                <1> 	js	short sysalloc_1 ;  0 -> 0FFFFFFFFh -> NO LIMIT
 15668 00011646 42                  <1> 	inc	edx ; > 0
 15669                              <1> 	; Check upper address limit
 15670                              <1> 	;(round up to page borders)
 15671 00011647 81C1FF0F0000        <1> 	add	ecx, PAGE_SIZE-1 ; 4095
 15672 0001164D 6681E100F0          <1> 	and	cx, ~PAGE_OFF ; not 4095
 15673 00011652 39CA                <1> 	cmp	edx, ecx ; upper limit - block size
 15674 00011654 7224                <1> 	jb	short sysalloc_err
 15675                              <1> sysalloc_1:
 15676                              <1> 	; EAX = Beginning address (physical)
 15677                              <1> 	; EAX = 0 -> Allocate mem block from the 1st proper aperture	
 15678                              <1> 	; ECX = Number of bytes to be allocated		
 15679 00011656 E87046FFFF          <1> 	call	allocate_memory_block
 15680 0001165B 721D                <1> 	jc	short sysalloc_err
 15681                              <1> 	; 01/09/2017
 15682 0001165D 29C2                <1> 	sub	edx, eax ; upper limit address - beginning address
 15683 0001165F 760F                <1> 	jna	short sysalloc_3 ; begin addr not less than the limit
 15684 00011661 39CA                <1> 	cmp	edx, ecx
 15685 00011663 720B                <1> 	jb	short sysalloc_3 ; end address overs the limit
 15686                              <1> sysalloc_2:	
 15687                              <1> 	; EAX = Beginning (physical) addr of the allocated mem block
 15688                              <1> 	; ECX = Num of allocated bytes (rounded up to page borders) 
 15689 00011665 50                  <1> 	push	eax ; * ; 04/03/2017	
 15690                              <1> 	; Here, requested contiquous memory pages have been allocated
 15691                              <1> 	; on Memory Allocation Table but user's page directory 
 15692                              <1> 	; and page tables have not been updated yet!
 15693 00011666 51                  <1> 	push	ecx ; **
 15694                              <1> 	; ebx = virtual address (will be rounded up to page border)
 15695                              <1> 	; ecx = number of bytes to be deallocated
 15696                              <1> 	;	will be adjusted to ebx+ecx round down - ebx round up
 15697 00011667 E8BD49FFFF          <1> 	call	deallocate_user_pages 
 15698 0001166C 731F                <1> 	jnc	short sysalloc_4 ; EAX = Deallocated memory bytes
 15699 0001166E 59                  <1> 	pop	ecx ; **
 15700 0001166F 58                  <1> 	pop	eax ; *
 15701                              <1> sysalloc_3:
 15702                              <1> 	; error !
 15703                              <1> 	; restore Memory Allocation Table Content
 15704 00011670 E87648FFFF          <1> 	call	deallocate_memory_block
 15705 00011675 31C0                <1> 	xor	eax, eax ; 0
 15706 00011677 48                  <1> 	dec	eax ; 0FFFFFFFFh ; 15/05/2017
 15707 00011678 EB09                <1> 	jmp	short sysalloc_wrong
 15708                              <1> sysalloc_err:
 15709 0001167A 8B2D[1C900100]      <1> 	mov	ebp, [u.usp]  ; ebp points to user's registers
 15710 00011680 894D18              <1> 	mov	[ebp+24], ecx ; return to user with ecx value 
 15711                              <1> sysalloc_wrong:
 15712                              <1> 	; eax = 0FFFFFFFFh
 15713 00011683 A3[20900100]        <1> 	mov	[u.r0], eax
 15714 00011688 E9AAB7FFFF          <1> 	jmp	error
 15715                              <1> sysalloc_4:
 15716 0001168D 8B2D[1C900100]      <1> 	mov	ebp, [u.usp]  ; ebp points to user's registers
 15717 00011693 894518              <1> 	mov	[ebp+24], eax ; return to user with ecx value 
 15718 00011696 895D10              <1> 	mov	[ebp+16], ebx ; new value of ebx (rounded up)
 15719 00011699 89C1                <1> 	mov	ecx, eax ; byte count (from 'deallocate_user_pages')
 15720 0001169B 5A                  <1> 	pop	edx ; ** ; discard (another) byte count
 15721 0001169C 58                  <1> 	pop	eax ; *
 15722 0001169D A3[20900100]        <1> 	mov	[u.r0], eax ; physical address
 15723                              <1> 	
 15724 000116A2 51                  <1> 	push	ecx ; 20/08/2017
 15725                              <1> 	;
 15726                              <1> 	; Write newly allocated contiguous (physical) pages
 15727                              <1> 	; on page dir and page tables of current user/process	
 15728                              <1> 	; as PRESENT, USER, WRITABLE
 15729                              <1> 	; (then clear allocated pages)
 15730 000116A3 E8694AFFFF          <1> 	call	allocate_user_pages
 15731                              <1> 	;jnc	sysret ; OK! return to process with success...
 15732                              <1> 
 15733                              <1> 	; 20/08/2017 ('sysdma' modification)
 15734 000116A8 59                  <1> 	pop	ecx
 15735 000116A9 A1[20900100]        <1> 	mov	eax, [u.r0]   ; physical address (of the block)
 15736                              <1> 
 15737 000116AE 7219                <1> 	jc	short sysalloc_6
 15738                              <1> 
 15739 000116B0 833D[F48E0100]FF    <1> 	cmp	dword [dma_addr], 0FFFFFFFFh ; -1	
 15740                              <1> 	;jb	sysret
 15741                              <1> 	; 23/07/2022
 15742 000116B7 720B                <1> 	jb	short sysalloc_5 ; jmp sysret
 15743                              <1> 
 15744 000116B9 A3[F48E0100]        <1> 	mov	[dma_addr], eax ; save dma address for sysdma
 15745 000116BE 890D[F88E0100]      <1> 	mov	[dma_size], ecx ; save dma buff size for sysdma
 15746                              <1> sysalloc_5:
 15747 000116C4 E98EB7FFFF          <1> 	jmp	sysret
 15748                              <1> 		
 15749                              <1> sysalloc_6:
 15750                              <1> 	;
 15751                              <1> 	; unexpected error ! insufficient memory !? conflict !?
 15752                              <1> 	; (!!?there is not a free page for a new page table?!!)
 15753                              <1> 	; We need to terminate process with error message !!!  
 15754                              <1> 	;
 15755 000116C9 8B2D[1C900100]      <1> 	mov	ebp, [u.usp]  ; ebp points to user's registers
 15756 000116CF 8B4D18              <1> 	mov	ecx, [ebp+24] ; byte count
 15757                              <1> 	
 15758                              <1> 	; 20/08/2017
 15759                              <1> 	;mov	eax, [u.r0]   ; physical address (of the block)
 15760                              <1> 	
 15761                              <1> 	;
 15762                              <1> 	; restore Memory Allocation Table Content
 15763 000116D2 E81448FFFF          <1> 	call	deallocate_memory_block
 15764                              <1> 	;
 15765 000116D7 803D[BE670000]03    <1> 	cmp	byte [CRT_MODE], 3 ; 80x25 text mode?
 15766 000116DE 7407                <1> 	je	short sysalloc_7 ; yes
 15767                              <1> 	; Current mode is VGA (or CGA graphics) mode,
 15768                              <1> 	; We need to return to text mode for displaying
 15769                              <1> 	; error message just before 'sysexit'.  
 15770 000116E0 B003                <1> 	mov	al, 3
 15771 000116E2 E85304FFFF          <1> 	call	_set_mode
 15772                              <1> sysalloc_7:
 15773 000116E7 BE[26340100]        <1> 	mov	esi, beep_Insufficient_Memory ; error message
 15774 000116EC E85956FFFF          <1> 	call	print_msg ; print/display the message
 15775 000116F1 B801000000          <1> 	mov	eax, 1 ; ax=1 is needed for 'sysexit' procedure
 15776 000116F6 E999B8FFFF          <1> 	jmp	sysexit ; and terminate the process !
 15777                              <1> 
 15778                              <1> sysdalloc:
 15779                              <1> 	; 19/02/2017 - TRDOS 386 (TRDOS v2.0)
 15780                              <1> 	; (TRDOS 386 feature only!)
 15781                              <1> 	;
 15782                              <1> 	; Deallocate Memory Block/Pages (for user)
 15783                              <1> 	; (Complementary call for sysalloc.)	
 15784                              <1> 	;
 15785                              <1> 	; INPUT ->
 15786                              <1> 	;	EBX = Virtual address (for user)
 15787                              <1> 	;	      (will be rounded up to page border)
 15788                              <1> 	;	ECX = Byte Count
 15789                              <1> 	;	     (will be adjusted to page borders)
 15790                              <1> 	;	If ICX = 0
 15791                              <1> 	;	   nothing to do
 15792                              <1> 	;	If EBX + ECX > User's ESP
 15793                              <1> 	;	   nothing to do		
 15794                              <1> 	; 
 15795                              <1> 	; Note: u.break control may be included in future versions	
 15796                              <1> 	;
 15797                              <1> 	; OUTPUT ->
 15798                              <1> 	;	If CF = 0
 15799                              <1> 	;	   EAX = Deallocated memory bytes
 15800                              <1> 	;	   EBX = Virtual address (as rounded up)	
 15801                              <1> 	;	IF CF = 1
 15802                              <1> 	;	   EAX = 0
 15803                              <1> 	;
 15804                              <1> 	; Note:	Main purpose of this call is to deallocate/release
 15805                              <1> 	;	previously allocated (physically) contiguous memory
 15806                              <1> 	;	pages but beginning (virtual) address may not be
 15807                              <1> 	;	followed by physically contiguous pages. So, this
 15808                              <1> 	;	system call will deallocate user's virtually
 15809                              <1> 	;	contiguous memory pages. Also, there is not any
 15810                              <1> 	;	objections to use this system call without sysalloc
 15811                              <1> 	;	system call; only possible objection is to lost data
 15812                              <1> 	;	within user's memory space, if the beginning address
 15813                              <1> 	;	and size is not proper.
 15814                              <1> 	;
 15815                              <1> 	; Note: Empty page tables will not be deallocated!!!
 15816                              <1> 	;       (they will be deallocated at process termination)
 15817                              <1> 	;
 15818                              <1> 	; Note: When the program terminates itself or when it is 
 15819                              <1> 	;	terminated by operating system kernel, all allocated
 15820                              <1> 	;	memory pages will be deallocated during termination
 15821                              <1> 	;	stage. So, 'sysdalloc' is not necessary except 
 15822                              <1> 	;	forgiving memory block to other programs/processes.
 15823                              <1> 	;	
 15824 000116FB 8B15[18900100]      <1> 	mov	edx, [u.sp]
 15825 00011701 8B420C              <1> 	mov	eax, [edx+12] ; user's stack pointer
 15826 00011704 29C8                <1> 	sub	eax, ecx ; esp - byte count
 15827 00011706 24FC                <1> 	and	al, 0FCh ; dword alignment
 15828 00011708 39D8                <1> 	cmp	eax, ebx
 15829 0001170A 7220                <1> 	jb	short sysdalloc_err ; deallocation overlaps with stack 	
 15830                              <1> 
 15831 0001170C 31C0                <1> 	xor	eax, eax
 15832 0001170E 21C9                <1> 	and	ecx, ecx
 15833 00011710 7407                <1> 	jz	short sysdalloc_2
 15834                              <1> 	
 15835 00011712 E81249FFFF          <1> 	call	deallocate_user_pages
 15836 00011717 7213                <1> 	jc	short sysdalloc_err
 15837                              <1> 
 15838                              <1> sysdalloc_2:
 15839 00011719 A3[20900100]        <1> 	mov	[u.r0], eax
 15840 0001171E 8B2D[1C900100]      <1> 	mov	ebp, [u.usp]
 15841 00011724 895D10              <1> 	mov	[ebp+16], ebx ; new value of ebx
 15842 00011727 E92BB7FFFF          <1> 	jmp	sysret
 15843                              <1> 
 15844                              <1> sysdalloc_err:
 15845 0001172C A3[20900100]        <1> 	mov	[u.r0], eax ; 0
 15846 00011731 E901B7FFFF          <1> 	jmp	error
 15847                              <1> 
 15848                              <1> syscalbac:
 15849                              <1> 	; SYS CALLBACK
 15850                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
 15851                              <1> 	; 03/08/2020
 15852                              <1> 	; 16/04/2017
 15853                              <1> 	; 14/04/2017
 15854                              <1> 	; 13/04/2017
 15855                              <1> 	; 28/02/2017
 15856                              <1> 	; 26/02/2017
 15857                              <1> 	; 24/02/2017
 15858                              <1> 	; 21/02/2017 - TRDOS 386 (TRDOS v2.0)
 15859                              <1> 	; (TRDOS 386 feature only!)
 15860                              <1> 	;
 15861                              <1> 	; Link or unlink IRQ callback service to/from user (ring 3)	
 15862                              <1> 	;
 15863                              <1> 	; INPUT ->
 15864                              <1> 	;	BL = IRQ number (Hardware interrupt request number)
 15865                              <1> 	;	     (0 t0 15 but IRQ 0,1,2,6,8,14,15 are prohibited)
 15866                              <1> 	;	     IRQ numbers 3,4,5,7,9,10,11,12,13 are valid
 15867                              <1> 	;	     (numbers >15 are invalid)
 15868                              <1> 	;
 15869                              <1> 	;	BH = 0 = Unlink IRQ (in BL) from user (ring 3) service
 15870                              <1> 	;	     1 = Link IRQ by using Signal Response Byte method
 15871                              <1> 	;	     2 = Link IRQ by using Callback service method 		
 15872                              <1> 	;	     3 = Link IRQ by using Auto Increment S.R.B. method 	
 15873                              <1> 	;	    >3 = invalid 
 15874                              <1> 	;	
 15875                              <1> 	;	CL = Signal Return/Response Byte value 
 15876                              <1> 	;
 15877                              <1> 	;	If BH = 3, kernel will put a counter value  ; 03/08/2020
 15878                              <1> 	;	          (into the S.R.B. addr)
 15879                              <1> 	;		  between 0 to 255. (start value = CL+1)
 15880                              <1> 	;	
 15881                              <1> 	;	NOTE: counter value, for example: even and odd numbers
 15882                              <1> 	;	      may be used for -audio- DMA buffer switch 
 15883                              <1> 	;	      within double buffer method, etc. 		
 15884                              <1> 	;
 15885                              <1> 	;	EDX = Signal return (Response) byte address
 15886                              <1> 	;	       		  - or -
 15887                              <1> 	;	      Interrupt/Callback service/routine address
 15888                              <1> 	; 	
 15889                              <1> 	;	      (virtual address in user's memory space)
 15890                              <1> 	;
 15891                              <1> 	; OUTPUT ->
 15892                              <1> 	;	CF = 0 & EAX = 0 -> Successful setting
 15893                              <1> 	;	CF = 1 & EAX > 0 -> IRQ is prohibited or locked 
 15894                              <1> 	;			by another process
 15895                              <1> 	;		 eax = ERR_PERM_DENIED -> prohibited or locked
 15896                              <1> 	;		 eax = ERR_INV_PARAMETER -> 
 15897                              <1> 	;		       invalid parameter/option or bad address
 15898                              <1> 	;
 15899                              <1> 	;	NOTE: Timer callbacks are set by using 'systimer'
 15900                              <1> 	;	      system call (IRQ 0, PIT and IRQ 8, RTC)
 15901                              <1> 	;
 15902                              <1> 	;	      Direct keyboard access is performed by using
 15903                              <1> 	;	      Keyboard Interrupt (INT 32h)	 	
 15904                              <1> 	;	
 15905                              <1> 	;	      It is prohibited here because:
 15906                              <1> 	;		1) Signal Response Byte method has not advantage
 15907                              <1> 	;		   against INT 32h, function AH = 1. Also,
 15908                              <1> 	;		   keyboard service interrupt will return with
 15909                              <1> 	;		   ascii and scan codes (AL, AH) while
 15910                              <1> 	;		   SRB method has only 1 byte space for ascii code
 15911                              <1> 	;		   or scan code. One byte signal response is used 
 15912                              <1> 	;		   for ensuring very simple and very fast
 15913                              <1> 	;		   virtual to physical memory address conversion
 15914                              <1> 	;		   without any memory page crossover risk. 
 15915                              <1> 	;		   (Otherwise double page conversion or word 
 15916                              <1> 	;		   alignment would be needed.)
 15917                              <1> 	;		2) Badly written user code (callback code)
 15918                              <1> 	;		   can prevent keyboard and timesharing functions
 15919                              <1> 	;		   of the operating system via continuous and long
 15920                              <1> 	;		   keyboard event handling by callback service.
 15921                              <1> 	;		   (It can cause to lose immediate keystroke 
 15922                              <1> 	;		   response from hardware to user.)
 15923                              <1> 	;		3) If user will check any keyboard events, 'getkey'
 15924                              <1> 	;		   (or 'getchar') must have more priority than other
 15925                              <1> 	;		   (video etc.) events because only control ability
 15926                              <1> 	;		   on a procedural infinite loop is a keyboard or
 15927                              <1> 	;		   mouse event. So user can use keyboard function
 15928                              <1> 	;		   at the end or at the beginning of a loop.
 15929                              <1> 	;		   In this case, INT 32h is used for that purpose
 15930                              <1> 	;		   and timer interrupt etc. callbacks can be used
 15931                              <1> 	;		   for dynamic and synchronized data refresh/transfer
 15932                              <1> 	;		   while cpu is in a static loop (without polling).
 15933                              <1> 	;		   Keyboard Int callback is not more useful because 
 15934                              <1> 	;		   already a manual check (a key is pressed or not)
 15935                              <1> 	;		   can be performed (via INT 32h, AH = 1) efficiently
 15936                              <1> 	;		   in a loop to prevent a locked infinitive loop.
 15937                              <1> 	;
 15938                              <1> 	;	    Disk IRQs (6,14,15) have been phohibited from ring 3 
 15939                              <1> 	;	    callback because, disk operations (file system services
 15940                              <1> 	;	    etc.) are independent from user program, for fast disk r/w.
 15941                              <1> 	;	    They are not more useful at ring 3 while they are in use
 15942                              <1> 	;	    by standard diskio functions which are mandatory part of 
 15943                              <1> 	;	    (monolithic) OS kernel and mainprog command interpreter.
 15944                              <1> 	;	    INT 33h diskio functions are enough for user level disk
 15945                              <1> 	;	    r/w.				
 15946                              <1> 	;
 15947                              <1> 	; TRDOS 386 - IRQ CALLBACK structures (parameters):
 15948                              <1> 	;	
 15949                              <1> 	;	   [u.irqlock] = 1 word, IRQ flags (0-15) that indicates
 15950                              <1> 	;			which IRQs are locked by (that) user.
 15951                              <1> 	;		        Lock and unlock (by user) will change
 15952                              <1> 	;			these flags or 'terminate process' (sysexit)
 15953                              <1> 	;			will clear these flags and unlock those IRQs.
 15954                              <1> 	;			               
 15955                              <1> 	;		   	Bit 0 is for IRQ 0 and Bit 15 is for IRQ 15
 15956                              <1> 	;
 15957                              <1> 	;	   IRQ(x).owner	 : 1 byte, user, [u.uno], 0 = free (unlocked)	
 15958                              <1> 	;
 15959                              <1> 	;	   IRQ(x).method : 1 byte for callback method & status
 15960                              <1> 	;			   0 = Signal Response Byte method
 15961                              <1> 	;			   1 = Callback service method
 15962                              <1> 	;			   >1 = invalid for current 'syscalback'.
 15963                              <1> 	;			or(+) 80h = IRQ is in use by system (ring 0)
 15964                              <1> 	;			            function (audio etc.) or
 15965                              <1> 	;			   	    a device driver.	   	
 15966                              <1> 	;			(system function will ignore the lock/owner)
 15967                              <1> 	;
 15968                              <1> 	;	   IRQ(x).srb	: 1 byte, Signal Return/Response byte value
 15969                              <1> 	;			  (a fixed value by user or a counter value
 15970                              <1> 	;			 from 0 to 255, which is increased by every
 15971                              <1> 	;			 interrupt just before putting it into 
 15972                              <1> 	;			 the Signal Response byte address
 15973                              <1> 	;			 (This is not used in callback serv method)
 15974                              <1> 	;	    	  
 15975                              <1> 	;	   IRQ(x).addr	: 1 dword
 15976                              <1> 	;			  Signal Response Byte address (physical)
 15977                              <1> 	;			  		-or-
 15978                              <1> 	;			  Callback service address (virtual)
 15979                              <1> 	;
 15980                              <1> 	;	   IRQ(x).dev	: 1 byte
 15981                              <1> 	;			  0 = Default device or kernel function
 15982                              <1> 	;			  		-or-
 15983                              <1> 	;			  1-255 = Assigned device driver number
 15984                              <1> 	;
 15985                              <1> 	;	   (x) = 3,4,5,7,9,10,11,12,13
 15986                              <1> 	;
 15987                              <1> 	;	
 15988                              <1> 	;	NOTE: If user's process/program calls the kernel (INT 40h)
 15989                              <1> 	;	      while it is already running in a (ring 3) callback
 15990                              <1> 	;	      service, kernel will force (convert) system call to
 15991                              <1> 	;	      'sysrele' (sys release). So, this feature provides
 15992                              <1> 	;	      easy and simple usage of callback services without
 15993                              <1> 	;	      falling into deepless <please 'callback me' then 
 15994                              <1> 	;	      let me 'callback you'> cycles! (User must return
 15995                              <1> 	;	      from callback service by using 'sysrele' system
 15996                              <1> 	;	      call, without a significant delay. Otherwise user
 15997                              <1> 	;	      process/program may be late to catch the next event
 15998                              <1> 	;	      within same callback purpose.	    		 	
 15999                              <1> 	;
 16000                              <1> 
 16001 00011736 30C0                <1> 	xor	al, al ; the caller is 'syscalbac' sign/flag
 16002 00011738 E881150000          <1>  	call	set_irq_callback_service
 16003                              <1> 	; 16/04/2017
 16004 0001173D A3[20900100]        <1> 	mov	[u.r0], eax
 16005                              <1> 	;jnc	sysret
 16006                              <1> 	; 23/07/2022
 16007 00011742 7205                <1> 	jc	short syscalbac_err
 16008 00011744 E90EB7FFFF          <1> 	jmp	sysret
 16009                              <1> syscalbac_err:
 16010 00011749 A3[88900100]        <1> 	mov	dword [u.error], eax
 16011 0001174E E9E4B6FFFF          <1> 	jmp	error
 16012                              <1> 
 16013                              <1> sysfpstat:
 16014                              <1> 	; 28/02/2017 - TRDOS 386 (TRDOS v2.0)
 16015                              <1> 	; (TRDOS 386 feature only!)
 16016                              <1> 	;
 16017                              <1> 	; Set or reset FPU registers save/restore option (for user)
 16018                              <1> 	;	       (during software task switching, wswap-rswap)
 16019                              <1> 	;
 16020                              <1> 	; INPUT ->
 16021                              <1> 	;	BL = 0 -> reset
 16022                              <1> 	;	BL = 1 -> set (FPU register will be saved and restored)
 16023                              <1> 	;	
 16024                              <1> 	; OUTPUT ->
 16025                              <1> 	;	cf = 0 -> no error, FPU is ready... 
 16026                              <1> 	;		  (EAX = 0)
 16027                              <1> 	;	Cf = 1 -> error, 80387 FPU is not ready !
 16028                              <1> 	;		  (EAX = 0FFFFFFFFh)
 16029                              <1> 
 16030 00011753 31C0                <1> 	xor	eax, eax
 16031 00011755 803D[40850100]00    <1> 	cmp	byte [fpready], 0
 16032 0001175C 7613                <1> 	jna	short sysfpstat_err	
 16033                              <1> 
 16034 0001175E 80E301              <1> 	and	bl, 1 ; use BIT 0 only !
 16035 00011761 881D[9B900100]      <1> 	mov	[u.fpsave], bl
 16036 00011767 A3[20900100]        <1> 	mov	[u.r0], eax ; 0
 16037 0001176C E9E6B6FFFF          <1> 	jmp	sysret	 	
 16038                              <1> 
 16039                              <1> sysfpstat_err:
 16040 00011771 48                  <1> 	dec 	eax ; 0FFFFFFFFh
 16041 00011772 A3[20900100]        <1> 	mov 	[u.r0], eax ; -1
 16042 00011777 E9BBB6FFFF          <1> 	jmp 	error
 16043                              <1> 
 16044                              <1> sysdelete: ; Delete (Remove, Unlink) File
 16045                              <1> 	; 29/12/2017 (TRDOS 386 = TRDOS v2.0) 
 16046                              <1> 	;	
 16047                              <1>         ; INPUT ->
 16048                              <1>         ;          EBX = File name (ASCIIZ string) address
 16049                              <1> 	; OUTPUT ->
 16050                              <1> 	;          cf = 0 -> eax = 0
 16051                              <1> 	;          cf = 1 -> Error code in AL
 16052                              <1> 	;
 16053                              <1> 	; Modified Registers: EAX (at the return of system call)
 16054                              <1> 	;   
 16055                              <1> 
 16056 0001177C 89DE                <1> 	mov	esi, ebx
 16057                              <1> 	; file name is forced, change directory as temporary
 16058                              <1> 	;mov	ax, 1
 16059                              <1> 	;mov	[FFF_Valid], ah ; 0 ; reset
 16060                              <1> 	;call	set_working_path 
 16061 0001177E E8D2090000          <1> 	call	set_working_path_x
 16062 00011783 731D                <1> 	jnc	short sysdelete_1
 16063                              <1> 
 16064 00011785 21C0                <1> 	and	eax, eax  ; 0 -> Bad Path!  
 16065 00011787 7505                <1> 	jnz	short sysdelete_err
 16066                              <1> 	; eax = 0
 16067                              <1> sysdelete_path_err:
 16068 00011789 B813000000          <1> 	mov	eax, ERR_INV_PATH_NAME ; 'bad path name !'
 16069                              <1> sysdelete_err:
 16070 0001178E A3[20900100]        <1> 	mov	[u.r0], eax
 16071 00011793 A3[88900100]        <1> 	mov	[u.error], eax
 16072 00011798 E88D0A0000          <1> 	call 	reset_working_path
 16073 0001179D E995B6FFFF          <1> 	jmp	error
 16074                              <1> sysdelete_1:
 16075                              <1> 	;mov	esi, FindFile_Name
 16076 000117A2 66B80018            <1> 	mov	ax, 1800h ; Only files
 16077 000117A6 E8CD73FFFF          <1> 	call	find_first_file
 16078 000117AB 72E1                <1> 	jc	short sysdelete_err
 16079                              <1> sysdelete_2:
 16080                              <1> 	; check file attributes
 16081                              <1> 
 16082                              <1> 	;test	bl, 17 ; system, hidden, readonly, directory
 16083 000117AD F6C307              <1>         test	bl, 7 ; system, hidden, readonly 
 16084 000117B0 7407                <1>         jz	short sysdelete_3
 16085                              <1> 
 16086 000117B2 B80B000000          <1>         mov	eax, ERR_FILE_ACCESS ; 11 = 'permission denied !'
 16087 000117B7 EBD5                <1>         jmp	short sysdelete_err
 16088                              <1> sysdelete_3:
 16089 000117B9 6621D2              <1> 	and	dx, dx ; Ambiguous filename chars used sign (DX>0)
 16090 000117BC 7407                <1> 	jz	short sysdelete_4
 16091 000117BE B81A000000          <1> 	mov	eax, ERR_INV_FILE_NAME ; 26 = 'invalid file name !'
 16092 000117C3 EBC9                <1>         jmp	short sysdelete_err
 16093                              <1> sysdelete_4:
 16094                              <1> 	;mov	bh, [LongName_EntryLength]
 16095 000117C5 883D[B2820100]      <1> 	mov	[DelFile_LNEL], bh ; Long name entry length (if > 0)
 16096                              <1> 	; edi = Directory Entry Offset (DirBuff)
 16097                              <1> 	; esi = Directory Entry (FFF Structure)
 16098 000117CB E8D99BFFFF          <1> 	call	remove_file
 16099 000117D0 72BC                <1> 	jc	short sysdelete_err
 16100                              <1> sysrmdir_5:
 16101 000117D2 31C0                <1> 	xor	eax, eax ; 0
 16102 000117D4 A3[20900100]        <1> 	mov	[u.r0], eax
 16103                              <1> 	;mov	[u.error], eax
 16104 000117D9 E84C0A0000          <1> 	call 	reset_working_path
 16105 000117DE E974B6FFFF          <1> 	jmp	sysret
 16106                              <1> 
 16107                              <1> 
 16108                              <1> sysrmdir: ; Remove (Unlink) Directory
 16109                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
 16110                              <1> 	; 19/01/2021
 16111                              <1> 	; 29/12/2017 (TRDOS 386 = TRDOS v2.0) 
 16112                              <1> 	;	
 16113                              <1>         ; INPUT ->
 16114                              <1>         ;          EBX = Pointer to directory name
 16115                              <1> 	; OUTPUT ->
 16116                              <1> 	;          cf = 0 -> eax = 0
 16117                              <1> 	;          cf = 1 -> Error code in AL
 16118                              <1> 	;
 16119                              <1> 	; Modified Registers: EAX (at the return of system call)
 16120                              <1> 	;  
 16121                              <1> 
 16122                              <1> 	; 19/01/2021
 16123 000117E3 803D[72900100]00    <1> 	cmp	byte [u.uid], 0  ; root (super user) ?
 16124 000117EA 7614                <1> 	jna	short sysrmdir_0
 16125                              <1> 
 16126                              <1> 	;mov	dword [u.r0], ERR_PERM_DENIED
 16127 000117EC B80B000000          <1> 	mov	eax, ERR_PERM_DENIED ; ERR_NOT_SUPERUSER
 16128 000117F1 A3[20900100]        <1> 	mov	[u.r0], eax
 16129 000117F6 A3[88900100]        <1> 	mov	[u.error], eax
 16130 000117FB E937B6FFFF          <1> 	jmp	error
 16131                              <1> 
 16132                              <1> sysrmdir_0:
 16133 00011800 89DE                <1> 	mov	esi, ebx
 16134                              <1> 	; file name is forced, change directory as temporary
 16135                              <1> 	;mov	ax, 1
 16136                              <1> 	;mov	[FFF_Valid], ah ; 0 ; reset
 16137                              <1> 	;call	set_working_path 
 16138 00011802 E84E090000          <1> 	call	set_working_path_x
 16139 00011807 7308                <1> 	jnc	short sysrmdir_1
 16140                              <1> 
 16141 00011809 21C0                <1> 	and	eax, eax  ; 0 -> Bad Path!  
 16142 0001180B 7513                <1> 	jnz	short sysrmdir_err
 16143                              <1> 	; eax = 0
 16144                              <1> sysrmdir_not_found:
 16145                              <1> 	;mov	eax, ERR_DIR_NOT_FOUND ; Directory not found !
 16146                              <1> 	; 23/07/2022
 16147 0001180D B00C                <1> 	mov	al, ERR_DIR_NOT_FOUND
 16148 0001180F EB0F                <1> 	jmp	short sysrmdir_err
 16149                              <1> ;sysrmdir_err:
 16150                              <1> ;	mov	[u.r0], eax
 16151                              <1> ;	mov	[u.error], eax
 16152                              <1> ;	call 	reset_working_path
 16153                              <1> ;	jmp	error
 16154                              <1> sysrmdir_1:
 16155                              <1> 	;mov	esi, FindFile_Name
 16156 00011811 66B81008            <1> 	mov	ax, 0810h ; Only directories
 16157 00011815 E85E73FFFF          <1> 	call	find_first_file
 16158 0001181A 7318                <1> 	jnc	short sysrmdir_2
 16159                              <1> 
 16160                              <1> 	; eax = 2 (File not found !)
 16161 0001181C 3C02                <1> 	cmp	al, 2 ; ERR_NOT_FOUND
 16162 0001181E 74ED                <1> 	je	short sysrmdir_not_found
 16163                              <1> 	;jmp	short sysrmdir_err
 16164                              <1> 	; 23/07/2022
 16165                              <1> sysrmdir_err:
 16166 00011820 A3[20900100]        <1> 	mov	[u.r0], eax
 16167 00011825 A3[88900100]        <1> 	mov	[u.error], eax
 16168                              <1> sysrmdir_8:	; 23/07/2022
 16169 0001182A E8FB090000          <1> 	call 	reset_working_path
 16170 0001182F E903B6FFFF          <1> 	jmp	error
 16171                              <1> sysrmdir_2:
 16172                              <1> 	; check directory attributes
 16173                              <1> 
 16174 00011834 F6C307              <1>         test	bl, 7 ; system, hidden, readonly 
 16175 00011837 7407                <1>         jz	short sysrmdir_3
 16176                              <1> 
 16177 00011839 B80B000000          <1>         mov	eax, ERR_DIR_ACCESS ; 11 = 'permission denied !'
 16178 0001183E EBE0                <1>         jmp	short sysrmdir_err
 16179                              <1> sysrmdir_3:
 16180 00011840 6621D2              <1> 	and	dx, dx ; Ambiguous filename chars used sign (DX>0)
 16181 00011843 7407                <1> 	jz	short sysrmdir_4
 16182                              <1> 	;mov	eax, ERR_NOT_DIR ; 'not a valid directory !'
 16183 00011845 B813000000          <1> 	mov	eax, ERR_INV_PATH_NAME ; 'bad path name !'
 16184 0001184A EBD4                <1>         jmp	short sysrmdir_err
 16185                              <1> sysrmdir_4:
 16186                              <1> 	;mov	bh, [LongName_EntryLength]
 16187 0001184C 883D[B2820100]      <1> 	mov	[DelFile_LNEL], bh ; Long name entry length (if > 0)
 16188                              <1> 	; edi = Directory Entry Offset (DirBuff)
 16189                              <1> 	; esi = Directory Entry (FFF Structure)
 16190 00011852 E8C179FFFF          <1> 	call	delete_sub_directory
 16191                              <1> 	;jnc	sysrmdir_5
 16192                              <1> 	; 23/07/2022
 16193 00011857 7205                <1> 	jc	short sysrmdir_6
 16194 00011859 E974FFFFFF          <1> 	jmp	sysrmdir_5
 16195                              <1> 
 16196                              <1> ;	jc	short sysrmdir_6
 16197                              <1> ;
 16198                              <1> ;	xor	eax, eax ; 0
 16199                              <1> ;sysrmdir_5:
 16200                              <1> ;	mov	[u.r0], eax
 16201                              <1> ;	;mov	[u.error], eax
 16202                              <1> ;	call 	reset_working_path
 16203                              <1> ;	jmp	sysret
 16204                              <1> 
 16205                              <1> sysrmdir_6:
 16206 0001185E A3[20900100]        <1> 	mov	[u.r0], eax
 16207 00011863 A3[88900100]        <1> 	mov	[u.error], eax
 16208                              <1> 
 16209 00011868 09C0                <1> 	or	eax, eax ; EAX = 0 -> Directory not empty!
 16210 0001186A 7414                <1> 	jz	short sysrmdir_9
 16211                              <1> 
 16212                              <1> 	; EAX > 0 -> Error code in AL (or AX or EAX)
 16213                              <1> 
 16214 0001186C 833D[66800100]01    <1> 	cmp	dword [FAT_ClusterCounter], 1
 16215 00011873 72B5                <1> 	jb	short sysrmdir_8
 16216                              <1> sysrmdir_7:
 16217                              <1> 	; ESI = Logical DOS Drive Description Table address	
 16218 00011875 66BB00FF            <1> 	mov	bx, 0FF00h ; BH = FFh -> use ESI for Drive parameters
 16219                              <1> 	           ; BL = 0 -> Recalculate free cluster count
 16220 00011879 E874B0FFFF          <1> 	call	calculate_fat_freespace	
 16221                              <1> 	; 23/07/2022
 16222 0001187E EBAA                <1> 	jmp	short sysrmdir_8
 16223                              <1> ;sysrmdir_8:
 16224                              <1> ;	call 	reset_working_path
 16225                              <1> ;	jmp	error
 16226                              <1> 
 16227                              <1> sysrmdir_9:
 16228 00011880 A1[66800100]        <1> 	mov	eax, [FAT_ClusterCounter]
 16229 00011885 09C0                <1> 	or	eax, eax ; 0 ?
 16230                              <1> 	;jz	short sysrmdir_err
 16231                              <1> 	; 23/07/2022
 16232 00011887 74A1                <1> 	jz	short sysrmdir_8
 16233                              <1> 
 16234                              <1> 	; ESI = Logical DOS Drive Description Table address	
 16235 00011889 66BB01FF            <1> 	mov	bx, 0FF01h ; BH = FFh -> use ESI for Drive parameters
 16236                              <1> 	           ; BL = 1 -> add free clusters
 16237 0001188D E860B0FFFF          <1> 	call	calculate_fat_freespace
 16238 00011892 09C9                <1> 	or	ecx, ecx
 16239 00011894 7494                <1>         jz	short sysrmdir_8 ; ecx = 0 -> OK
 16240                              <1> 	; ecx > 0 -> Error (Recalculation is needed)
 16241 00011896 EBDD                <1> 	jmp	short sysrmdir_7
 16242                              <1> 
 16243                              <1> 
 16244                              <1> syschdir: ; Change Current (Working) Drive & Directory (for user)
 16245                              <1> 	; 30/12/2017 (TRDOS 386 = TRDOS v2.0) 
 16246                              <1> 	;	
 16247                              <1>         ; INPUT ->
 16248                              <1>         ;          EBX = Directory name (ASCIIZ string) address
 16249                              <1> 	; OUTPUT ->
 16250                              <1> 	;          cf = 0 -> eax = 0
 16251                              <1> 	;          cf = 1 -> Error code in AL
 16252                              <1> 	;
 16253                              <1> 	; Modified Registers: EAX (at the return of system call)
 16254                              <1> 	;
 16255                              <1> 	; NOTE: If drive name is not included, only the working
 16256                              <1> 	; directory (for user, not for drive/OS) will be chanded.
 16257                              <1> 	; If there is a drive name (as A:, B:, C:, D: etc.)
 16258                              <1> 	; at the beginning of the ASCIIZ (directory) string,
 16259                              <1> 	; working drive and working directory (for user) 
 16260                              <1> 	; will be changed together.
 16261                              <1> 	; (When the program is terminated, MainProg -internal 
 16262                              <1> 	; shell- will reset working directory to the previous
 16263                              <1> 	; -current- logical drive's current directory again.) 	
 16264                              <1>   
 16265 00011898 89DE                <1> 	mov	esi, ebx
 16266                              <1> 	; file name is not forced, change directory as temporary
 16267 0001189A 31C0                <1> 	xor	eax, eax
 16268                              <1> 	;mov	[FFF_Valid], ah ; 0 ; reset
 16269                              <1> 	;call	set_working_path 
 16270 0001189C E8B8080000          <1> 	call	set_working_path_xx
 16271 000118A1 731D                <1> 	jnc	short syschdir_ok
 16272 000118A3 21C0                <1> 	and	eax, eax  ; 0 -> Bad Path!  
 16273 000118A5 7505                <1> 	jnz	short syschdir_err
 16274                              <1> 	; eax = 0
 16275                              <1> syschdir_not_found:
 16276 000118A7 B80C000000          <1> 	mov	eax, ERR_DIR_NOT_FOUND ; Directory not found !
 16277                              <1> syschdir_err:
 16278 000118AC A3[20900100]        <1> 	mov	[u.r0], eax
 16279 000118B1 A3[88900100]        <1> 	mov	[u.error], eax
 16280 000118B6 E86F090000          <1> 	call 	reset_working_path
 16281 000118BB E977B5FFFF          <1> 	jmp	error
 16282                              <1> syschdir_ok:
 16283 000118C0 31C0                <1> 	xor	eax, eax ; 0
 16284 000118C2 A3[20900100]        <1> 	mov	[u.r0], eax
 16285                              <1> 	;mov	[u.error], eax
 16286 000118C7 E98BB5FFFF          <1> 	jmp	sysret
 16287                              <1> 
 16288                              <1> 
 16289                              <1> syschmod: ; Get & Change File (or Directory) Attributes
 16290                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
 16291                              <1> 	; 19/01/2021
 16292                              <1> 	; 30/12/2017 (TRDOS 386 = TRDOS v2.0) 
 16293                              <1> 	;	
 16294                              <1>         ; INPUT ->
 16295                              <1>         ;          EBX = File/Directory (ASCIIZ) name address
 16296                              <1> 	;	    CL = New attributes (if CL < 40h)
 16297                              <1> 	;	    CL >= 40h -> Get File Attributes		
 16298                              <1> 	; OUTPUT ->
 16299                              <1> 	;          cf = 0 -> EAX = File attributes (in AL)
 16300                              <1> 	;          cf = 1 -> Error code in AL
 16301                              <1> 	;
 16302                              <1> 	; Modified Registers: EAX (at the return of system call)
 16303                              <1> 	;  
 16304                              <1> 	; MSDOS File Attributes:    (bit value of attrib byte)
 16305                              <1> 	;	ATTR_READ_ONLY	=	01h  (bit 0, 'R')
 16306                              <1> 	;	ATTR_HIDDEN	=	02h  (bit 1, 'H')
 16307                              <1> 	;	ATTR_SYSTEM	=	04h  (bit 2, 'S')
 16308                              <1> 	;	ATTR_VOLUME_ID	=	08h  (bit 3)
 16309                              <1> 	;	ATTR_DIRECTORY	=	10h  (bit 4)
 16310                              <1> 	;	ATTR_ARCHIVE	=	20h  (bit 5, 'A')
 16311                              <1> 	;	ATTR_LONG_NAME	=	ATTR_READONLY |
 16312                              <1> 	;				ATTR_HIDDEN |
 16313                              <1> 	;				ATTR_SYSTEM |
 16314                              <1> 	;				ATTR_VOLUME_ID				
 16315                              <1> 	;	The upper two bits of attributes must be 0.
 16316                              <1> 
 16317                              <1> 	; Note:	* If ATTR_DIRECTORY is set, only directory names
 16318                              <1> 	;	  will be searched (and S,H,R,A attributeds of 
 16319                              <1> 	;	  the directory will be changed.)
 16320                              <1> 	;	* If ATTR_VOLUME_ID is set, 'syschmod' system call
 16321                              <1> 	;	  will return with 'permission denied' error.
 16322                              <1> 	;	* If ATTR_DIRECTORY is not set, only file names
 16323                              <1> 	;	  will be searched (and S,H,R,A attributes of the
 16324                              <1> 	;	  file will be changed.)
 16325                              <1> 	;
 16326                              <1> 	; (Ony Super User can change S,H,R attributes.) 
 16327                              <1> 
 16328 000118CC 80F940              <1> 	cmp	cl, 40h	
 16329 000118CF 7327                <1> 	jnb	short syschmod_0
 16330                              <1> 
 16331 000118D1 F6C108              <1> 	test	cl, 08h ; ATTR_VOLUME_ID
 16332 000118D4 750E                <1> 	jnz	short syschmod_perm_err
 16333                              <1> 
 16334                              <1> 	; 19/01/2021
 16335 000118D6 803D[72900100]00    <1> 	cmp	byte [u.uid], 0  ; root (super user) ?
 16336 000118DD 7619                <1> 	jna	short syschmod_0
 16337                              <1> 
 16338                              <1> 	; Not super user..
 16339 000118DF F6C107              <1> 	test	cl, 07h	; S,H,R attributes
 16340 000118E2 7414                <1> 	jz	short syschmod_0
 16341                              <1> 
 16342                              <1> syschmod_perm_err:
 16343                              <1> 	;mov	dword [u.r0], ERR_PERM_DENIED
 16344 000118E4 B80B000000          <1> 	mov	eax, ERR_PERM_DENIED ; 'permission denied !'
 16345 000118E9 A3[20900100]        <1> 	mov	[u.r0], eax
 16346 000118EE A3[88900100]        <1> 	mov	[u.error], eax
 16347 000118F3 E93FB5FFFF          <1> 	jmp	error
 16348                              <1> 
 16349                              <1> syschmod_0:
 16350 000118F8 880D[00830100]      <1> 	mov	[Attributes], cl
 16351 000118FE 89DE                <1> 	mov	esi, ebx
 16352                              <1> 	; file name is forced, change directory as temporary
 16353                              <1> 	;mov	ax, 1
 16354                              <1> 	;mov	[FFF_Valid], ah ; 0 ; reset
 16355                              <1> 	;call	set_working_path 
 16356 00011900 E850080000          <1> 	call	set_working_path_x
 16357 00011905 7308                <1> 	jnc	short syschmod_1
 16358 00011907 21C0                <1> 	and	eax, eax  ; 0 -> Bad Path!  
 16359 00011909 751E                <1> 	jnz	short syschmod_err
 16360                              <1> 	; eax = 0
 16361                              <1> syschmod_path_not_found:
 16362                              <1> 	;mov	eax, ERR_INV_PATH_NAME ; 'Bad path name !'
 16363                              <1> 	; 23/07/2022
 16364 0001190B B013                <1> 	mov	al, ERR_INV_PATH_NAME
 16365                              <1> ;syschmod_err:
 16366                              <1> 	;mov	[u.r0], eax
 16367                              <1> 	;mov	[u.error], eax
 16368                              <1> 	;call 	reset_working_path
 16369                              <1> 	;jmp	error
 16370                              <1> 	; 23/07/2022
 16371 0001190D EB1A                <1> 	jmp	short syschmod_err
 16372                              <1> syschmod_1:
 16373 0001190F B008                <1> 	mov	al, 08h ; Except volume labels (& long names)
 16374 00011911 A0[00830100]        <1> 	mov	al, [Attributes]
 16375 00011916 2410                <1> 	and	al, 10h ;
 16376                              <1> 	;mov	esi, FindFile_Name
 16377                              <1> 	;mov	ax, 1800h ; Only files
 16378                              <1> 	;mov	ax, 0810h ; Only directories
 16379 00011918 E85B72FFFF          <1> 	call	find_first_file
 16380                              <1> 	;jnc	short syschmod_2
 16381 0001191D 720A                <1> 	jc	short syschmod_err
 16382                              <1> 
 16383                              <1> 	;; eax = 2 (File not found !)
 16384                              <1> 	;cmp	al, 2 ; ERR_NOT_FOUND
 16385                              <1> 	;jne	short syschmod_err
 16386                              <1> 
 16387                              <1> 	;and	byte [Attributes], 10h
 16388                              <1> 	;jz	short syschmod_err
 16389                              <1> 
 16390                              <1> 	;; Directory not found !
 16391                              <1> 	;mov	al, 3 ; ERR_PATH_NOT_FOUND
 16392                              <1> 	;jmp	short syschmod_err
 16393                              <1> 
 16394                              <1> syschmod_2:
 16395 0001191F 6621D2              <1> 	and	dx, dx ; Ambiguous filename chars used sign (DX>0)
 16396 00011922 7419                <1> 	jz	short syschmod_3
 16397 00011924 B81A000000          <1> 	mov	eax, ERR_INV_FILE_NAME ; 'invalid file name !'
 16398                              <1>         ;jmp	short syschmod_err
 16399                              <1> syschmod_err:
 16400 00011929 A3[20900100]        <1> 	mov	[u.r0], eax
 16401 0001192E A3[88900100]        <1> 	mov	[u.error], eax
 16402 00011933 E8F2080000          <1> 	call 	reset_working_path
 16403 00011938 E9FAB4FFFF          <1> 	jmp	error
 16404                              <1> syschmod_3:
 16405                              <1> 	; EDI = Directory buffer entry offset/address
 16406                              <1> 	; BL = File (or Directory) Attributes 
 16407                              <1> 	; mov	bl, [EDI+0Bh]
 16408                              <1> 
 16409                              <1> 	; check directory attributes
 16410 0001193D 8A3D[00830100]      <1> 	mov	bh, [Attributes] ; new attributes
 16411 00011943 80FF40              <1> 	cmp	bh, 40h  ;>=40 -> get file/directory attributes
 16412 00011946 732D                <1> 	jnb	short syschmod_6
 16413                              <1> 
 16414                              <1> 	; set file/directory attributes
 16415 00011948 F6C307              <1> 	test	bl, 7 ; system, hidden, readonly 
 16416 0001194B 7409                <1>         jz	short syschmod_4
 16417                              <1> 
 16418                              <1> 	; 19/01/2021
 16419 0001194D 803D[72900100]00    <1> 	cmp	byte [u.uid], 0  ; root (super user) ?
 16420 00011954 778E                <1> 	ja	short syschmod_perm_err
 16421                              <1> syschmod_4:
 16422 00011956 66817F0CA101        <1> 	cmp	word [edi+DirEntry_NTRes], 01A1h ; Singlix FS
 16423 0001195C 7424                <1> 	je	short syschmod_7
 16424                              <1> 
 16425 0001195E 887F0B              <1> 	mov	[edi+0Bh], bh    ; Attributes (New!)
 16426                              <1> 
 16427 00011961 C605[71800100]02    <1> 	mov	byte [DirBuff_ValidData], 2 ; modified sign
 16428                              <1> 					    ; to force write	
 16429 00011968 E80B97FFFF          <1> 	call 	save_directory_buffer
 16430 0001196D 72BA                <1> 	jc	short syschmod_err
 16431                              <1> 
 16432                              <1> syschmod_5:
 16433 0001196F 8A1D[00830100]      <1> 	mov	bl, [Attributes]
 16434                              <1> syschmod_6:
 16435 00011975 0FB6C3              <1> 	movzx	eax, bl
 16436 00011978 A3[20900100]        <1> 	mov	[u.r0], eax
 16437                              <1> 	;mov	dword [u.error], 0
 16438 0001197D E9D5B4FFFF          <1> 	jmp	sysret
 16439                              <1> 
 16440                              <1> syschmod_7:
 16441 00011982 29C0                <1> 	sub	eax, eax
 16442 00011984 8A25[6F800100]      <1>         mov     ah, [DirBuff_DRV]
 16443 0001198A BE00010900          <1> 	mov	esi, Logical_DOSDisks
 16444 0001198F 01C6                <1>         add     esi, eax
 16445 00011991 807E04A1            <1>         cmp     byte [esi+LD_FSType], 0A1h
 16446 00011995 7304                <1> 	jnc	short syschmod_8
 16447 00011997 B01D                <1> 	mov	al, ERR_INV_DATA ; 29 = Invalid Data
 16448 00011999 EB8E                <1> 	jmp	short syschmod_err
 16449                              <1> 
 16450                              <1> syschmod_8:
 16451                              <1> 	; BH = New MS-DOS File Attributes
 16452 0001199B 88F8                <1> 	mov	al, bh ; File/Directory Attributes
 16453 0001199D 30E4                <1> 	xor	ah, ah ; Attributes in MS-DOS format sign	  
 16454 0001199F E8B682FFFF          <1> 	call	change_fs_file_attributes
 16455                              <1> 	;jc	syschmod_err
 16456                              <1> 	;jmp	short syschmod_5
 16457                              <1> 	; 23/07/2022
 16458 000119A4 73C9                <1> 	jnc	short syschmod_5
 16459 000119A6 EB81                <1> 	jmp	short syschmod_err
 16460                              <1> 
 16461                              <1> 
 16462                              <1> sysdrive: ; Get/Set Current (Working) Drive (for user)
 16463                              <1> 	; 30/12/2017 (TRDOS 386 = TRDOS v2.0) 
 16464                              <1> 	;	
 16465                              <1>         ; INPUT ->
 16466                              <1>         ;          BL = Logical DOS Drive number (0=A: ... 2=C:)
 16467                              <1> 	;	   If BL = 0FFh -> Get Current Drive 	
 16468                              <1> 	; OUTPUT ->
 16469                              <1> 	;          cf = 0 -> 
 16470                              <1> 	;		   AL = Current Drive number	
 16471                              <1> 	;		   AH = The Last Logical DOS Drive no.
 16472                              <1> 	;          cf = 1 -> Error code in AL
 16473                              <1> 	;
 16474                              <1> 	; Modified Registers: EAX (at the return of system call)
 16475                              <1> 	;
 16476                              <1> 	; NOTE: If the requested logical dos drive is ready, 
 16477                              <1> 	;	it's current current directory will be the user's
 16478                              <1> 	;	(program's) current directory.
 16479                              <1> 	;	(When the program is terminated, MainProg -internal 
 16480                              <1> 	;	shell- will reset the previous -current- logical drive
 16481                              <1> 	;       as current drive again).	
 16482                              <1>   
 16483 000119A8 80FBFF              <1> 	cmp	bl, 0FFh
 16484 000119AB 7435                <1> 	je	short sysdrive_ok
 16485 000119AD 3A1D[BC300100]      <1> 	cmp	bl, [Last_DOS_DiskNo]
 16486 000119B3 771E                <1> 	ja	short sysdrive_err	
 16487                              <1> 
 16488                              <1> 	; Save current drive and reset mode
 16489                              <1> 	; for 'reset_working_path' procedure (for MainProg)
 16490 000119B5 30C0                <1> 	xor	al, al
 16491 000119B7 66A3[3C850100]      <1> 	mov	[SWP_Mode], ax ; ah = 0
 16492 000119BD A0[4A790100]        <1> 	mov	al, [Current_Drv]
 16493 000119C2 FEC4                <1> 	inc	ah ; mov ah, 1
 16494 000119C4 66A3[3E850100]      <1> 	mov	[SWP_DRV], ax 
 16495                              <1> 
 16496 000119CA 88DA                <1> 	mov	dl, bl
 16497 000119CC E8BA5EFFFF          <1> 	call	change_current_drive
 16498 000119D1 730F                <1> 	jnc	short sysdrive_ok
 16499                              <1> sysdrive_err:
 16500 000119D3 C705[20900100]0F00- <1> 	mov	dword [u.r0], ERR_DRV_NOT_RDY ; 'drive not ready !'
 16500 000119DB 0000                <1>
 16501 000119DD E955B4FFFF          <1> 	jmp	error
 16502                              <1> sysdrive_ok:
 16503 000119E2 A0[4A790100]        <1> 	mov	al, [Current_Drv]
 16504 000119E7 8A25[BC300100]      <1> 	mov	ah, [Last_DOS_DiskNo]
 16505 000119ED A3[20900100]        <1> 	mov	[u.r0], eax
 16506 000119F2 E960B4FFFF          <1> 	jmp	sysret
 16507                              <1> 
 16508                              <1> 
 16509                              <1> sysdir: ; Get Current (Working) Drive & Directory (for user)
 16510                              <1> 	; 30/12/2017 (TRDOS 386 = TRDOS v2.0) 
 16511                              <1> 	;	
 16512                              <1>         ; INPUT ->
 16513                              <1>         ;          EBX = Current directory name buffer address
 16514                              <1> 	;		(Buffer length = 92 bytes)
 16515                              <1> 	; OUTPUT ->
 16516                              <1> 	;          AL = Current drive (0=A: .. 2=C:)
 16517                              <1> 	;	   If CF = 1 -> AL = error code
 16518                              <1> 	;
 16519                              <1> 	; Modified Registers: EAX (at the return of system call)
 16520                              <1> 	;
 16521                              <1> 	; Note: Required directory name buffer length may be 
 16522                              <1> 	;	<= 92 bytes for current TRDOS 386 version.
 16523                              <1> 	;	(7*12 name chars + 7 slash + 0)
 16524                              <1> 
 16525 000119F7 89E5                <1> 	mov	ebp, esp
 16526 000119F9 83EC60              <1> 	sub	esp, 96
 16527 000119FC 53                  <1> 	push	ebx ; User's buffer address
 16528 000119FD 30D2                <1> 	xor	dl, dl ; 0 = current drive
 16529 000119FF E8F28BFFFF          <1>   	call	get_current_directory
 16530 00011A04 72CD                <1> 	jc	short sysdrive_err ; 'drive not ready !' error
 16531 00011A06 89E6                <1> 	mov	esi, esp ; System's buffer address
 16532 00011A08 5F                  <1> 	pop	edi  ; User's buffer address
 16533                              <1> 	; ecx = transfer (byte) count (<=92)
 16534 00011A09 E883F4FFFF          <1> 	call	transfer_to_user_buffer
 16535 00011A0E 89EC                <1> 	mov	esp, ebp
 16536 00011A10 730F                <1> 	jnc	short sysdir_ok
 16537                              <1> sysdir_err:
 16538 00011A12 C705[20900100]2E00- <1> 	mov	dword [u.r0], ERR_BUFFER  ; 'buffer error !'
 16538 00011A1A 0000                <1>
 16539 00011A1C E916B4FFFF          <1> 	jmp	error
 16540                              <1> sysdir_ok:	
 16541 00011A21 8A0D[4A790100]      <1> 	mov	cl, [Current_Drv]
 16542 00011A27 890D[20900100]      <1> 	mov	[u.r0], ecx
 16543 00011A2D E925B4FFFF          <1> 	jmp	sysret
 16544                              <1> 
 16545                              <1> 
 16546                              <1> sysldrvt: ; Get copy of Logical DOS Drive Description Table
 16547                              <1> 	; 30/12/2017 (TRDOS 386 = TRDOS v2.0) 
 16548                              <1> 	;	
 16549                              <1>         ; INPUT ->
 16550                              <1> 	;	    BL = Logical DOS drive number (zero based)	
 16551                              <1>         ;          ECX = Logical DOS drv desc table buffer addr
 16552                              <1> 	;		(Buffer length = 256 bytes)
 16553                              <1> 	; OUTPUT ->
 16554                              <1> 	;          cf = 0 -> 
 16555                              <1> 	;		   AL = Current Drive number	
 16556                              <1> 	;		   AH = The Last Logical DOS Drive no.
 16557                              <1> 	;          cf = 1 -> Error code in AL
 16558                              <1> 	;		   AH = The Last Logical DOS Drive no.
 16559                              <1> 	;
 16560                              <1> 	; Modified Registers: EAX (at the return of system call)
 16561                              <1> 	;
 16562                              <1> 	; Note: Required description table buffer length is
 16563                              <1> 	;	256 bytes for current TRDOS 386 version.
 16564                              <1> 	
 16565 00011A32 89CF                <1> 	mov	edi, ecx ; Destination address (user space)
 16566 00011A34 88DC                <1> 	mov	ah, bl
 16567 00011A36 30C0                <1> 	xor	al, al
 16568 00011A38 BE00010900          <1> 	mov	esi, Logical_DOSDisks
 16569 00011A3D 01C6                <1> 	add	esi, eax ; Source address (system space)	 
 16570 00011A3F B900010000          <1> 	mov	ecx, 256 ; Byte count 
 16571                              <1> 			 ; Logical Dos Drv Desc Table size
 16572 00011A44 E848F4FFFF          <1> 	call	transfer_to_user_buffer
 16573 00011A49 72C7                <1> 	jc	short sysdir_err
 16574 00011A4B 8A2D[BC300100]      <1> 	mov	ch, [Last_DOS_DiskNo]
 16575 00011A51 EBCE                <1> 	jmp	short sysdir_ok
 16576                              <1> 
 16577                              <1> 
 16578                              <1> systime: ; Get System Date&Time
 16579                              <1> 	; 30/12/2017 (TRDOS 386 = TRDOS v2.0) 
 16580                              <1> 	;	
 16581                              <1>         ; INPUT -> BL =
 16582                              <1> 	;	    0 = Get Date&Time in Unix/Epoch format
 16583                              <1> 	;	    1 = Get Time in MSDOS format
 16584                              <1> 	;	    2 = Get Date in MSDOS format
 16585                              <1> 	;	    3 = Get Date&Time in MSDOS format
 16586                              <1> 	;	    4 & other values =
 16587                              <1> 	;		System timer ticks will be returned
 16588                              <1> 	;		in EAX and Carry Flag will be set.
 16589                              <1> 	;		(CF will not be set if BL = 4)	 	
 16590                              <1> 	; OUTPUT ->
 16591                              <1> 	;	For BL input = 3
 16592                              <1> 	;          EAX = Current Time (RTC)
 16593                              <1> 	;		AL = Second (DL in MSDOS)
 16594                              <1> 	;		AH = Minute (CL in MSDOS)
 16595                              <1> 	;	   	HW of EAX = Hour (CH in MSDOS)	
 16596                              <1> 	;	   EDX = Current System Date (RTC)
 16597                              <1> 	;		DL = Day (DL in MSDOS)
 16598                              <1> 	;		DH = Month (DH in MSDOS)
 16599                              <1> 	;		HW of EDX = Year (CX in MSDOS)	
 16600                              <1> 	;
 16601                              <1> 	;	For BL input = 2
 16602                              <1> 	;	   EAX = Current System Date (RTC)
 16603                              <1> 	;		DL = Day (DL in MSDOS)
 16604                              <1> 	;		DH = Month (DH in MSDOS)
 16605                              <1> 	;		HW of EDX = Year (CX in MSDOS)
 16606                              <1> 	;
 16607                              <1> 	;	For BL input = 1
 16608                              <1> 	;          EAX = Current Time (RTC)
 16609                              <1> 	;		AL = Second (DL in MSDOS)
 16610                              <1> 	;		AH = Minute (CL in MSDOS)
 16611                              <1> 	;	   	HW of EAX = Hour (CH in MSDOS)	
 16612                              <1> 	;
 16613                              <1> 	;	For BL input = 0
 16614                              <1> 	;          EAX = Unix (Epoch) Time Ticks/Seconds
 16615                              <1> 	;
 16616                              <1> 	;	For BL input  = 4
 16617                              <1> 	;	   EAX = System timer ticks
 16618                              <1> 	;
 16619                              <1> 	;	If CF = 1 (for other values of BL input)
 16620                              <1> 	;	   EAX = System timer ticks (no error code!)	
 16621                              <1> 	;		
 16622                              <1> 	; Modified Registers: EAX, (EDX)
 16623                              <1> 	;		 (at the return of system call)
 16624                              <1> 	;
 16625                              <1> 
 16626 00011A53 20DB                <1> 	and	bl, bl
 16627 00011A55 750F                <1> 	jnz	short systime_1
 16628 00011A57 E84354FFFF          <1> 	call	epoch
 16629                              <1> systime_0:
 16630 00011A5C A3[20900100]        <1> 	mov	[u.r0], eax
 16631 00011A61 E9F1B3FFFF          <1> 	jmp	sysret
 16632                              <1> systime_1:
 16633 00011A66 80FB04              <1> 	cmp	bl, 4
 16634 00011A69 7211                <1> 	jb	short systime_2
 16635 00011A6B A1[08790100]        <1> 	mov	eax, [TIMER_LH] ; 18.2 Hz timer ticks
 16636                              <1> 				; Note: [TIMER_LH] may be set
 16637                              <1> 				; to wrong timer value due to
 16638                              <1> 				; program functions.
 16639                              <1> 				; (This value must not be
 16640                              <1> 				; accepted as [TIMER_LH]/18.2
 16641                              <1> 				; seconds since the midnight.)
 16642 00011A70 76EA                <1> 	jna	short systime_0
 16643 00011A72 A3[20900100]        <1> 	mov	[u.r0], eax	
 16644 00011A77 E9BBB3FFFF          <1> 	jmp	error ; cf = 1 & [u.r0] = eax = timer ticks 
 16645                              <1> 
 16646                              <1> systime_2:
 16647                              <1> 	;push	ebx
 16648 00011A7C E89853FFFF          <1> 	call	get_rtc_date_time
 16649                              <1> 	;pop	ebx
 16650 00011A81 F6C301              <1> 	test	bl, 1
 16651 00011A84 7429                <1> 	jz	short systime_4
 16652 00011A86 30E4                <1> 	xor	ah, ah
 16653 00011A88 A0[56750100]        <1> 	mov	al, [hour]
 16654 00011A8D 88C2                <1> 	mov	dl, al
 16655 00011A8F C1E010              <1> 	shl	eax, 16
 16656 00011A92 A0[5A750100]        <1> 	mov	al, [second]
 16657 00011A97 8A25[58750100]      <1> 	mov	ah, [minute]
 16658 00011A9D F6C302              <1> 	test	bl, 2
 16659 00011AA0 74BA                <1> 	jz	short systime_0
 16660                              <1> 	; Check time & date match risk 
 16661                              <1> 	; (23:59:59 may cause to wrong
 16662                              <1> 	; date -new day with previous date-...)
 16663 00011AA2 80FA17              <1> 	cmp	dl, 23
 16664 00011AA5 7206                <1> 	jb	short systime_3
 16665 00011AA7 663D3B3B            <1> 	cmp	ax, (59*256)+59 ; if hour is 23:59:59
 16666 00011AAB 73CF                <1> 	jnb	short systime_2 ; wait for 1 second
 16667                              <1> systime_3:
 16668                              <1> 	; eax = time
 16669 00011AAD 89C6                <1> 	mov	esi, eax
 16670                              <1> systime_4:	
 16671 00011AAF 66A1[50750100]      <1> 	mov	ax, [year]
 16672 00011AB5 C1E010              <1> 	shl	eax, 16
 16673 00011AB8 A0[54750100]        <1> 	mov	al, [day]
 16674 00011ABD 8A25[52750100]      <1> 	mov	ah, [month]
 16675                              <1> 	; eax = date
 16676 00011AC3 80E301              <1> 	and	bl, 1
 16677 00011AC6 7494                <1> 	jz	short systime_0
 16678 00011AC8 96                  <1> 	xchg	esi, eax
 16679                              <1> 	; eax = time, esi = date
 16680 00011AC9 8B2D[1C900100]      <1> 	mov	ebp, [u.usp]  ; EBP points to user's registers
 16681                              <1> 	; (user) edx <-- (system) esi
 16682 00011ACF 897514              <1> 	mov	[ebp+20], esi ; return to user with EDX value 
 16683 00011AD2 EB88                <1> 	jmp	short systime_0
 16684                              <1> 
 16685                              <1> 
 16686                              <1> sysstime: ; Set System Date&Time
 16687                              <1> 	; 31/12/2017
 16688                              <1> 	; 30/12/2017 (TRDOS 386 = TRDOS v2.0) 
 16689                              <1> 	;	
 16690                              <1>         ; INPUT -> BL =
 16691                              <1> 	;	    0 = Set Date&Time in Unix/Epoch format
 16692                              <1> 	;	    1 = Set Time in MSDOS format
 16693                              <1> 	;	    2 = Set Date in MSDOS format
 16694                              <1> 	;	    3 = Set Date&Time in MSDOS format
 16695                              <1> 	;	    4 = Set System Timer (Ticks)
 16696                              <1> 	;	    5 = Convert/Save current time to/as
 16697                              <1> 	;		18.2 Hz system timer ticks
 16698                              <1> 	;	    6 = Convert MSDOS Date&Time to UNIX format
 16699                              <1> 	;		without setting system date&time ; (test)
 16700                              <1> 	;	    7 = Convert UNIX Date&Time to MSDOS format
 16701                              <1> 	;		without setting system date&time ; (test)
 16702                              <1> 	;	   8-0FFh = invalid !
 16703                              <1> 	;	  ECX = Time (or Timer) value in selected format  	
 16704                              <1> 	;	  EDX = Date value in MSDOS format if BL=2,3,6	
 16705                              <1> 	; 	
 16706                              <1> 	; OUTPUT ->
 16707                              <1> 	;	If CF = 0 ->
 16708                              <1> 	;          EAX = Set value
 16709                              <1> 	;	If CF = 1 -> (invalid BL input)
 16710                              <1> 	;	   EAX = Ticks count [TIMER_LH]	
 16711                              <1> 	;
 16712                              <1> 
 16713 00011AD4 20DB                <1> 	and	bl, bl ; 0
 16714 00011AD6 7511                <1> 	jnz	short sysstime_0
 16715 00011AD8 89C8                <1> 	mov	eax, ecx
 16716 00011ADA E84554FFFF          <1> 	call	convert_from_epoch
 16717 00011ADF E8E554FFFF          <1> 	call	set_rtc_date_time
 16718 00011AE4 E96EB3FFFF          <1> 	jmp	sysret
 16719                              <1> sysstime_0:
 16720 00011AE9 80FB08              <1> 	cmp	bl, 8
 16721 00011AEC 722D                <1> 	jb	short sysstime_1
 16722                              <1> 	; invalid input (>7)
 16723 00011AEE A1[08790100]        <1> 	mov	eax, [TIMER_LH] ; 18.2 Hz timer ticks
 16724                              <1> 				; Note: [TIMER_LH] may be set
 16725                              <1> 				; to wrong timer value due to
 16726                              <1> 				; program functions.
 16727                              <1> 				; (This value must not be
 16728                              <1> 				; accepted as [TIMER_LH]/18.2
 16729                              <1> 				; seconds since the midnight.)
 16730 00011AF3 A3[20900100]        <1> 	mov	[u.r0], eax	
 16731 00011AF8 E93AB3FFFF          <1> 	jmp	error ; cf = 1 & [u.r0] = eax = timer ticks 
 16732                              <1> 
 16733                              <1> sysstime_8:	
 16734                              <1> 	; BL = 7
 16735 00011AFD 89C8                <1> 	mov	eax, ecx ; seconds since 1/1/1970 00:00:00
 16736 00011AFF E82054FFFF          <1> 	call	convert_from_epoch
 16737 00011B04 30E4                <1> 	xor	ah, ah
 16738 00011B06 A0[56750100]        <1> 	mov	al, [hour]
 16739 00011B0B C1E010              <1> 	shl	eax, 16
 16740 00011B0E A0[5A750100]        <1> 	mov	al, [second]
 16741 00011B13 8A25[58750100]      <1> 	mov	ah, [minute]
 16742 00011B19 EB92                <1> 	jmp	short systime_3
 16743                              <1> 
 16744                              <1> sysstime_1:
 16745 00011B1B 80FB04              <1> 	cmp	bl, 4
 16746 00011B1E 743F                <1> 	je	short sysstime_2 ; set system timer ticks	
 16747 00011B20 80FB05              <1> 	cmp	bl, 5
 16748 00011B23 754B                <1> 	jne	short sysstime_4
 16749                              <1> 	; convert current time to system timer ticks (18.2Hz)
 16750 00011B25 E8EF52FFFF          <1> 	call	get_rtc_date_time
 16751 00011B2A 0FB60D[56750100]    <1> 	movzx	ecx, byte [hour]
 16752 00011B31 B8100E0000          <1> 	mov	eax, 60*60 ; 1 hour = 3600 seconds
 16753 00011B36 F7E1                <1> 	mul	ecx
 16754 00011B38 89C3                <1> 	mov	ebx, eax	
 16755 00011B3A B13C                <1> 	mov	cl, 60  ; 1 minute = 60 seconds
 16756 00011B3C 0FB605[58750100]    <1> 	movzx	eax, byte [minute]
 16757 00011B43 F7E1                <1> 	mul	ecx
 16758 00011B45 01D8                <1> 	add	eax, ebx  
 16759 00011B47 8A0D[5A750100]      <1> 	mov	cl, [second]
 16760 00011B4D 01C8                <1> 	add	eax, ecx
 16761 00011B4F B1B6                <1> 	mov	cl, 182
 16762 00011B51 F7E1                <1> 	mul	ecx
 16763 00011B53 83C009              <1> 	add	eax, 9
 16764 00011B56 83D200              <1> 	adc	edx, 0
 16765 00011B59 B10A                <1> 	mov	cl, 10
 16766 00011B5B F7F1                <1> 	div	ecx
 16767                              <1> 	; eax = ((182*seconds)+9)/10
 16768 00011B5D 89C1                <1> 	mov	ecx, eax
 16769                              <1> sysstime_2:
 16770 00011B5F 890D[08790100]      <1> 	mov	[TIMER_LH], ecx ; 18.2 * seconds
 16771                              <1> sysstime_3:
 16772 00011B65 890D[20900100]      <1> 	mov	[u.r0], ecx
 16773 00011B6B E9E7B2FFFF          <1> 	jmp	sysret
 16774                              <1> sysstime_4:
 16775 00011B70 80FB06              <1> 	cmp	bl, 6
 16776 00011B73 7788                <1> 	ja	short sysstime_8
 16777                              <1> 
 16778 00011B75 890D[20900100]      <1> 	mov	[u.r0], ecx
 16779                              <1> 
 16780 00011B7B 880D[5A750100]      <1> 	mov	[second], cl
 16781 00011B81 882D[58750100]      <1> 	mov	[minute], ch
 16782 00011B87 C1E910              <1> 	shr	ecx, 16
 16783 00011B8A 880D[56750100]      <1> 	mov	[hour], cl
 16784                              <1> 	; BL = 1,2,3,6
 16785 00011B90 80FB01              <1> 	cmp	bl, 1
 16786 00011B93 762A                <1> 	jna	short sysstime_5
 16787                              <1> 	; BL = 2,3,6
 16788 00011B95 8815[54750100]      <1> 	mov	[day], dl
 16789 00011B9B 8835[52750100]      <1> 	mov	[month], dh
 16790 00011BA1 C1EA10              <1> 	shr	edx, 16
 16791 00011BA4 668915[50750100]    <1> 	mov	[year], dx
 16792 00011BAB 80E303              <1> 	and	bl, 3
 16793 00011BAE 742D                <1> 	jz	short sysstime_7 ; 6
 16794                              <1> 	; BL = 2,3
 16795 00011BB0 F6C301              <1> 	test	bl, 1
 16796 00011BB3 7419                <1> 	jz	short sysstime_6 ; 2
 16797                              <1> 	; BL = 3
 16798 00011BB5 E80F54FFFF          <1> 	call	set_rtc_date_time
 16799 00011BBA E998B2FFFF          <1> 	jmp	sysret
 16800                              <1> sysstime_5:
 16801                              <1> 	; BL = 1
 16802 00011BBF E84654FFFF          <1> 	call	set_time_bcd
 16803 00011BC4 E84E47FFFF          <1> 	call	set_rtc_time
 16804 00011BC9 E989B2FFFF          <1> 	jmp	sysret	
 16805                              <1> sysstime_6:
 16806                              <1> 	; BL = 2
 16807 00011BCE E80A54FFFF          <1> 	call	set_date_bcd
 16808 00011BD3 E8A247FFFF          <1> 	call	set_rtc_date
 16809 00011BD8 E97AB2FFFF          <1> 	jmp	sysret
 16810                              <1> sysstime_7:
 16811                              <1> 	; BL = 6
 16812                              <1> 	; [year], [month], [day], 
 16813                              <1> 	; [hour], [minute], [second]
 16814 00011BDD E8C252FFFF          <1> 	call	convert_to_epoch
 16815 00011BE2 89C1                <1> 	mov	ecx, eax ; seconds since 1/1/1970 00:00:00
 16816 00011BE4 E97CFFFFFF          <1> 	jmp	sysstime_3
 16817                              <1> 
 16818                              <1> sysrename: ; Rename File (or Directory)
 16819                              <1> 	; 08/08/2022
 16820                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
 16821                              <1> 	; 19/01/2021
 16822                              <1> 	; 31/12/2017 (TRDOS 386 = TRDOS v2.0) 
 16823                              <1> 	;	
 16824                              <1>         ; INPUT ->
 16825                              <1>         ;          EBX = File/Directory (ASCIIZ) name address
 16826                              <1> 	;	   ECX = New name (in same dir, no path name)			
 16827                              <1> 	; OUTPUT ->
 16828                              <1> 	;          cf = 0 -> EAX = 0
 16829                              <1> 	;          cf = 1 -> Error code in AL
 16830                              <1> 
 16831                              <1> 	; 19/01/2021
 16832 00011BE9 803D[72900100]00    <1> 	cmp	byte [u.uid], 0  ; root (super user) ?
 16833                              <1> 	;jna	short sysrename_0
 16834                              <1> 	; 23/07/2022
 16835 00011BF0 7717                <1> 	ja	short sysrename_perm_err
 16836                              <1> 
 16837                              <1> ;sysrename_perm_err:
 16838                              <1> ;	;mov	dword [u.r0], ERR_PERM_DENIED
 16839                              <1> ;	mov	eax, ERR_PERM_DENIED ; 'permission denied !'
 16840                              <1> ;	mov	[u.r0], eax
 16841                              <1> ;	mov	[u.error], eax
 16842                              <1> ;	jmp	error
 16843                              <1> 
 16844                              <1> sysrename_0:
 16845 00011BF2 51                  <1> 	push	ecx ; new file name address (in user space)
 16846 00011BF3 89DE                <1> 	mov	esi, ebx
 16847                              <1> 	; file name is forced, change directory as temporary
 16848                              <1> 	;mov	ax, 1
 16849                              <1> 	;mov	[FFF_Valid], ah ; 0 ; reset
 16850                              <1> 	;call	set_working_path 
 16851 00011BF5 E85B050000          <1> 	call	set_working_path_x
 16852 00011BFA 7321                <1> 	jnc	short sysrename_1
 16853 00011BFC 21C0                <1> 	and	eax, eax  ; 0 -> Bad Path!  
 16854 00011BFE 753B                <1> 	jnz	short sysrename_err
 16855                              <1> 	; eax = 0
 16856                              <1> sysrename_path_not_found:
 16857 00011C00 B813000000          <1> 	mov	eax, ERR_INV_PATH_NAME ; 'Bad path name !'
 16858                              <1> 	; 23/07/2022
 16859 00011C05 B013                <1> 	mov	al, ERR_INV_PATH_NAME
 16860 00011C07 EB32                <1> 	jmp	short sysrename_err
 16861                              <1> ;sysrename_err:
 16862                              <1> ;	pop	ecx ; new file name address (in user space)
 16863                              <1> ;sysrename_error:
 16864                              <1> ;	mov	[u.r0], eax
 16865                              <1> ;	mov	[u.error], eax
 16866                              <1> ;	call 	reset_working_path
 16867                              <1> ;	jmp	error
 16868                              <1> 	
 16869                              <1> 	; 23/07/2022
 16870                              <1> sysrename_perm_err:
 16871                              <1> 	;mov	dword [u.r0], ERR_PERM_DENIED
 16872 00011C09 B80B000000          <1> 	mov	eax, ERR_PERM_DENIED ; 'permission denied !'
 16873 00011C0E A3[20900100]        <1> 	mov	[u.r0], eax
 16874 00011C13 A3[88900100]        <1> 	mov	[u.error], eax
 16875 00011C18 E91AB2FFFF          <1> 	jmp	error
 16876                              <1> 
 16877                              <1> sysrename_1:
 16878 00011C1D B008                <1> 	mov	al, 08h ; Except volume labels (& long names)
 16879 00011C1F A0[00830100]        <1> 	mov	al, [Attributes]
 16880 00011C24 2410                <1> 	and	al, 10h ;
 16881                              <1> 	;mov	esi, FindFile_Name
 16882                              <1> 	;mov	ax, 1800h ; Only files
 16883                              <1> 	;mov	ax, 0810h ; Only directories
 16884 00011C26 66B80008            <1> 	mov	ax, 0800h ; Find File or Directory
 16885 00011C2A E8496FFFFF          <1> 	call	find_first_file
 16886                              <1> 	;jnc	short sysrename_2
 16887 00011C2F 720A                <1> 	jc	short sysrename_err
 16888                              <1> sysrename_2:
 16889                              <1> 	; ESI = Directory Entry (FindFile_DirEntry) Location
 16890                              <1> 	; EDI = Directory Buffer Directory Entry Location
 16891                              <1> 	; EAX = File Size
 16892                              <1> 	;  BL = Attributes of The File/Directory
 16893                              <1> 	;  BH = Long Name Yes/No Status (>0 is YES)
 16894                              <1> 	;  DX > 0 : Ambiguous filename chars are used
 16895                              <1> 
 16896 00011C31 6621D2              <1> 	and	dx, dx ; Ambiguous filename chars used sign (DX>0)
 16897 00011C34 741A                <1> 	jz	short sysrename_3
 16898 00011C36 B81A000000          <1> 	mov	eax, ERR_INV_FILE_NAME ; 'invalid file name !'
 16899                              <1> 	;jmp	short sysrename_err
 16900                              <1> 	; 23/07/2022	
 16901                              <1> sysrename_err:
 16902 00011C3B 59                  <1> 	pop	ecx ; new file name address (in user space)
 16903                              <1> sysrename_error:
 16904 00011C3C A3[20900100]        <1> 	mov	[u.r0], eax
 16905 00011C41 A3[88900100]        <1> 	mov	[u.error], eax
 16906 00011C46 E8DF050000          <1> 	call 	reset_working_path
 16907 00011C4B E9E7B1FFFF          <1> 	jmp	error
 16908                              <1> sysrename_3:
 16909                              <1> 	; EDI = Directory buffer entry offset/address
 16910                              <1> 	; BL = File (or Directory) Attributes 
 16911                              <1> 	; mov	bl, [EDI+0Bh]
 16912                              <1> 
 16913 00011C50 5A                  <1> 	pop	edx ; new file name address (in user space)
 16914                              <1> 
 16915                              <1> 	; check file/directory attributes
 16916 00011C51 F6C307              <1> 	test	bl, 7 ; system, hidden, readonly 
 16917 00011C54 75B3                <1>         jnz	short sysrename_perm_err
 16918                              <1> sysrename_4:
 16919 00011C56 66817F0CA101        <1> 	cmp	word [edi+DirEntry_NTRes], 01A1h ; Singlix FS
 16920 00011C5C 74AB                <1> 	je	short sysrename_perm_err ; -temporary!-
 16921                              <1> 
 16922                              <1> 	; save old file name & file info (FFF structure)
 16923 00011C5E BE[EA810100]        <1> 	mov	esi, FindFile_Drv
 16924 00011C63 BF[30830100]        <1> 	mov	edi, SourceFile_Drv
 16925                              <1> 	;mov	ecx, 128/4
 16926                              <1> 	; 23/07/2022
 16927 00011C68 29C9                <1> 	sub	ecx, ecx
 16928 00011C6A B120                <1> 	mov	cl, 128/4
 16929 00011C6C F3A5                <1> 	rep	movsd
 16930                              <1> 
 16931 00011C6E 89D6                <1> 	mov	esi, edx ; new file name address (in user space)
 16932 00011C70 BF[B0830100]        <1> 	mov	edi, DestinationFile_Drv
 16933 00011C75 E8C28FFFFF          <1> 	call	parse_path_name
 16934 00011C7A 72C0                <1> 	jc	short sysrename_error ; eax = 1 (Bad file name)
 16935                              <1> 
 16936                              <1> 	; same drive ? 
 16937 00011C7C A0[EA810100]        <1> 	mov	al, [FindFile_Drv]
 16938 00011C81 3A05[B0830100]      <1> 	cmp	al, [DestinationFile_Drv]
 16939                              <1> 	;jne	short sysrename_perm_err ; Permission denied
 16940 00011C87 7509                <1> 	jne	short sysrename_5 ; Bad file name
 16941                              <1>  
 16942                              <1> 	; no path name !? (rename file in same directory)
 16943 00011C89 803D[B1830100]20    <1> 	cmp	byte [DestinationFile_Directory], 20h
 16944 00011C90 7607                <1> 	jna	short sysrename_6
 16945                              <1> sysrename_5:
 16946 00011C92 B801000000          <1> 	mov	eax, ERR_BAD_CMD_ARG ; 1 = Bad file name 
 16947                              <1> 				     ; (Bad argument)
 16948 00011C97 EBA3                <1> 	jmp	short sysrename_error
 16949                              <1> sysrename_6:
 16950 00011C99 803D[F2830100]20    <1> 	cmp	byte [DestinationFile_Name], 20h
 16951 00011CA0 76F0                <1> 	jna	short sysrename_5
 16952                              <1> 
 16953 00011CA2 BE[F2830100]        <1> 	mov	esi, DestinationFile_Name
 16954 00011CA7 E87172FFFF          <1> 	call	check_filename ; is it a valid msdos file name?
 16955 00011CAC 728E                <1> 	jc	short sysrename_error ; 26 = ERR_INV_FILE_NAME 
 16956                              <1> 	
 16957                              <1> 	;mov	esi, DestinationFile_Name
 16958 00011CAE 66B80008            <1> 	mov	ax, 0800h ; Find File or Directory
 16959 00011CB2 E8C16EFFFF          <1> 	call	find_first_file
 16960 00011CB7 720A                <1> 	jc	short sysrename_7
 16961                              <1> 	
 16962 00011CB9 B80E000000          <1> 	mov	eax, ERR_FILE_EXISTS  ; file already exists !
 16963                              <1> jmp_sysrename_err:	; 08/08/2022
 16964 00011CBE E979FFFFFF          <1> 	jmp	sysrename_error
 16965                              <1> sysrename_7:
 16966                              <1> 	; eax = 2 (File not found !)
 16967 00011CC3 3C02                <1> 	cmp	al, 2 ; ERR_NOT_FOUND
 16968                              <1> 	;jne	short sysrename_error
 16969                              <1> 	; 08/08/2022
 16970 00011CC5 75F7                <1> 	jne	short jmp_sysrename_err
 16971                              <1> 
 16972                              <1> 	; 31/12/2017
 16973                              <1> 	; Following code is also part of 'rename_file' in
 16974                              <1> 	; 'trdosk3.s' (MainProg's 'rename' command) ; 13/11/2017
 16975 00011CC7 BE[F2830100]        <1> 	mov	esi, DestinationFile_Name ; (Rename_NewName)
 16976 00011CCC 668B0D[AA830100]    <1> 	mov	cx, [SourceFile_DirEntryNumber] 
 16977 00011CD3 66A1[96830100]      <1> 	mov	ax, [SourceFile_DirEntry+20] ; First Cluster, HW 
 16978 00011CD9 C1E010              <1> 	shl	eax, 16
 16979 00011CDC 66A1[9C830100]      <1> 	mov	ax, [SourceFile_DirEntry+26] ; First Cluster, LW 
 16980 00011CE2 0FB61D[7F830100]    <1>   	movzx	ebx, byte [SourceFile_LongNameEntryLength]  
 16981 00011CE9 E85697FFFF          <1>    	call	rename_directory_entry
 16982                              <1> 	;jc	short sysrename_error
 16983                              <1> 	; 08/08/2022
 16984 00011CEE 72CE                <1> 	jc	short jmp_sysrename_err
 16985                              <1> 	;xor	eax, eax
 16986 00011CF0 A3[20900100]        <1> 	mov	[u.r0], eax ; 0
 16987                              <1> 	;mov	[u.error], eax
 16988 00011CF5 E830050000          <1> 	call 	reset_working_path
 16989 00011CFA E958B1FFFF          <1> 	jmp	sysret
 16990                              <1> 
 16991                              <1> sysmem: ; Get Total&Free Memory amount 
 16992                              <1> 	; 31/12/2017 (TRDOS 386 = TRDOS v2.0) 
 16993                              <1> 	;	
 16994                              <1>         ; INPUT -> 
 16995                              <1> 	;	none	
 16996                              <1> 	; OUTPUT ->
 16997                              <1> 	;	EAX = Total memory count (in bytes)
 16998                              <1> 	;	EBX = Virtually available memory amount (in bytes)
 16999                              <1> 	;	      = 4GB - CORE (4MB)	
 17000                              <1> 	;	ECX = Free memory count (in bytes)
 17001                              <1> 	;	EDX = Calculated free memory count (in bytes)
 17002                              <1> 	
 17003 00011CFF A1[8C780100]        <1> 	mov	eax, [memory_size] ; in pages
 17004 00011D04 C1E00C              <1> 	shl	eax, 12		   ; in bytes
 17005 00011D07 A3[20900100]        <1> 	mov	[u.r0], eax
 17006 00011D0C E8D724FFFF          <1> 	call	calc_free_mem
 17007                              <1> 	; edx = calculated free pages
 17008                              <1> 	; ecx = 0
 17009 00011D11 8B2D[1C900100]      <1> 	mov	ebp, [u.usp]  ; EBP points to user's registers
 17010 00011D17 C745100000C0FF      <1> 	mov	dword [ebp+16], ECORE ; EBX (for user)
 17011                              <1> 				; 0FFC00000h ; 4GB - 4MB
 17012 00011D1E C1E20C              <1> 	shl	edx, 12
 17013 00011D21 895514              <1> 	mov	[ebp+20], edx ; EDX (for user)
 17014 00011D24 8B0D[90780100]      <1> 	mov 	ecx, [free_pages]
 17015 00011D2A C1E10C              <1> 	shl	ecx, 12	; free bytes
 17016 00011D2D 894D18              <1> 	mov	[ebp+24], ecx ; ECX (for user)
 17017                              <1> 	;mov	[free_pages], edx	
 17018 00011D30 E922B1FFFF          <1> 	jmp	sysret
 17019                              <1> 
 17020                              <1> sysprompt:
 17021                              <1> 	; Set TRDOS 386 Command Interpreter (MainProg) prompt 
 17022                              <1> 	; 30/07/2022 (TRDOS 386 Kernel v2.0.5)
 17023                              <1> 	; 31/12/2017 (TRDOS 386 = TRDOS v2.0) 
 17024                              <1> 	;	
 17025                              <1>         ; INPUT -> 
 17026                              <1> 	;	EBX = 0 -> use default prompt
 17027                              <1> 	;	EBX > 0 -> prompt string (ASCIIZ) address
 17028                              <1> 	;		  (Max. 11 characters except ZERO tail)	
 17029                              <1> 	; OUTPUT ->
 17030                              <1> 	;	(EAX = 0)
 17031                              <1> 	;	CF = 0 -> Successful
 17032                              <1> 	;	CF = 1 -> Failed
 17033                              <1> 
 17034 00011D35 21DB                <1> 	and	ebx, ebx
 17035 00011D37 750A                <1> 	jnz	short sysprompt_0
 17036                              <1> 
 17037 00011D39 E82168FFFF          <1> 	call	default_command_prompt ; '['+'TRDOS'+']'
 17038 00011D3E E914B1FFFF          <1> 	jmp	sysret
 17039                              <1> 
 17040                              <1> sysprompt_0:
 17041 00011D43 31C0                <1> 	xor	eax, eax
 17042 00011D45 A3[20900100]        <1> 	mov	[u.r0], eax 
 17043 00011D4A 89DE                <1> 	mov	esi, ebx
 17044                              <1> 	;mov	ecx, 12
 17045                              <1> 	; 30/07/2022
 17046 00011D4C 31C9                <1> 	xor	ecx, ecx
 17047 00011D4E B10C                <1> 	mov	cl, 12
 17048 00011D50 89E5                <1> 	mov	ebp, esp
 17049 00011D52 29CC                <1> 	sub	esp, ecx
 17050 00011D54 49                  <1> 	dec	ecx ; 11
 17051 00011D55 89E7                <1> 	mov	edi, esp
 17052 00011D57 E87FF1FFFF          <1> 	call	transfer_from_user_buffer
 17053 00011D5C 7211                <1> 	jc	short sysprompt_err
 17054 00011D5E 803E20              <1> 	cmp	byte [esi], 20h
 17055 00011D61 760C                <1> 	jna	short sysprompt_err
 17056 00011D63 E80968FFFF          <1> 	call	set_command_prompt
 17057 00011D68 89EC                <1> 	mov	esp, ebp
 17058 00011D6A E9E8B0FFFF          <1> 	jmp	sysret
 17059                              <1> sysprompt_err:
 17060                              <1> syspath_err:
 17061 00011D6F 89EC                <1> 	mov	esp, ebp
 17062 00011D71 E9C1B0FFFF          <1> 	jmp	error
 17063                              <1> 
 17064                              <1> syspath:
 17065                              <1> 	; Get/Set Run Path
 17066                              <1> 	;
 17067                              <1> 	; 30/07/2022 (TRDOS 386 Kernel v2.0.5)
 17068                              <1> 	; 31/12/2017 (TRDOS 386 = TRDOS v2.0) 
 17069                              <1> 	;	
 17070                              <1>         ; INPUT -> 
 17071                              <1> 	;	EBX = 0 -> get path (to buffer address in ECX)
 17072                              <1> 	;	EBX > 0 -> set path
 17073                              <1> 	;	    EBX = Path string buffer address (ASCIIZ)
 17074                              <1> 	;	    	  (Path description except 'PATH=')
 17075                              <1> 	;	ECX = Buffer address (if EBX = 0)
 17076                              <1> 	;	      (ECX will not be used if EBX > 0)	
 17077                              <1> 	;	DL = Buffer size (0 = 256 byte)	
 17078                              <1> 	;
 17079                              <1> 	; OUTPUT ->
 17080                              <1> 	;	CF = 0 -> Successful (EAX = String length)
 17081                              <1> 	;	CF = 1 -> Failed (EAX = 0)
 17082                              <1> 	;
 17083                              <1> 	; NOTE: 'PATH=' or 'PATH' must be excluded
 17084                              <1> 	;  (It must not be at the beginning of the string.)
 17085                              <1> 
 17086 00011D76 89E5                <1> 	mov	ebp, esp
 17087 00011D78 81EC00010000        <1> 	sub	esp, 256
 17088 00011D7E 89E7                <1> 	mov	edi, esp
 17089                              <1> 
 17090 00011D80 31C0                <1> 	xor	eax, eax
 17091 00011D82 A3[20900100]        <1> 	mov	[u.r0], eax 
 17092                              <1> 	
 17093 00011D87 21DB                <1> 	and	ebx, ebx
 17094 00011D89 752A                <1> 	jnz	short syspath_0
 17095                              <1> 
 17096                              <1> 	; EBX = 0 -> get run path
 17097 00011D8B 89CB                <1> 	mov	ebx, ecx ; buffer addr (in user's mem space)
 17098 00011D8D BE[91310100]        <1> 	mov	esi, Cmd_Path  ; 'PATH' address
 17099 00011D92 0FB6CA              <1> 	movzx	ecx, dl
 17100                              <1> 	;sub	cl, 1 ; 0 -> 255, 1 -> 0
 17101                              <1> 	;adc	cx, 1 ; 255 -> 256, 0 -> 1
 17102                              <1> 	; 30/07/2022
 17103 00011D95 FEC9                <1> 	dec	cl ; 0 -> 255, 1 -> 0
 17104 00011D97 41                  <1> 	inc	ecx ; 255 -> 256, 0 -> 1 
 17105                              <1> 	; EDI = Output buffer 
 17106                              <1> 	; CX = Buffer length
 17107                              <1> 	; AL = 0 -> use ASCIIZ word in [ESI]
 17108                              <1> 	; ESI = 'PATH' address (with zero tail)
 17109 00011D98 E8837FFFFF          <1> 	call	get_environment_string
 17110 00011D9D 72D0                <1> 	jc	short syspath_err
 17111 00011D9F 89DF                <1> 	mov	edi, ebx ; User's buffer address
 17112 00011DA1 89E6                <1> 	mov	esi, esp 
 17113                              <1> 	; EDI = User's buffer address
 17114                              <1> 	; ECX = transfer (byte) count
 17115 00011DA3 E8E9F0FFFF          <1> 	call	transfer_to_user_buffer
 17116 00011DA8 72C5                <1> 	jc	short syspath_err
 17117 00011DAA 890D[20900100]      <1> 	mov	[u.r0], ecx 
 17118 00011DB0 E9A2B0FFFF          <1> 	jmp	sysret
 17119                              <1> 
 17120                              <1> syspath_0:
 17121 00011DB5 89DE                <1> 	mov	esi, ebx
 17122 00011DB7 0FB6CA              <1> 	movzx	ecx, dl
 17123                              <1> 	;sub	cl, 1 ; 0 -> 255, 1 -> 0
 17124                              <1> 	;adc	cx, 1 ; 255 -> 256, 0 -> 1
 17125                              <1> 	; 30/07/2022
 17126 00011DBA FEC9                <1> 	dec	cl ; 0 -> 255, 1 -> 0
 17127 00011DBC 41                  <1> 	inc	ecx ; 255 -> 256, 0 -> 1
 17128 00011DBD E819F1FFFF          <1> 	call	transfer_from_user_buffer
 17129 00011DC2 72AB                <1> 	jc	short syspath_err
 17130                              <1> 	;(*) 'PATH=' will be added to 
 17131                              <1> 	;         the head of the string
 17132 00011DC4 83EC08              <1> 	sub	esp, 8 ;(*)
 17133 00011DC7 89FE                <1> 	mov	esi, edi ;(*)
 17134 00011DC9 E8367FFFFF          <1> 	call	set_path_x ;(*)
 17135 00011DCE 729F                <1> 	jc	short syspath_err
 17136 00011DD0 8915[20900100]      <1> 	mov	[u.r0], edx ; run path string length
 17137 00011DD6 E97CB0FFFF          <1> 	jmp	sysret	
 17138                              <1> 
 17139                              <1> sysenv:
 17140                              <1> 	; Get/Set Environment Variables
 17141                              <1> 	;
 17142                              <1> 	; 30/07/2022
 17143                              <1> 	; 23/07/2022 - TRDOS 386 v2.0.5
 17144                              <1> 	; 31/12/2017 (TRDOS 386 = TRDOS v2.0) 
 17145                              <1> 	;	
 17146                              <1>         ; INPUT -> 
 17147                              <1> 	;	EBX = 0 -> get (all) environment variables
 17148                              <1> 	;	      (Required Buffer length = 512 bytes)
 17149                              <1> 	;	EBX > 0 -> set (one) environment variable
 17150                              <1> 	;	      (If there is not a '=' after
 17151                              <1> 	;	      the environment variable name, it will
 17152                              <1> 	;	      accepted as 'get environment variable'.) 
 17153                              <1> 	;	       EBX = Buffer address
 17154                              <1> 	;	ECX = Buffer address (if EBX = 0)
 17155                              <1> 	;	      (ECX will not be used if EBX > 0)	
 17156                              <1> 	;	      (Note: Buffer size is 512 bytes.)	
 17157                              <1> 	;	DL = Buffer size (0 = 256 byte)
 17158                              <1> 	;	     (For one envrionment variable)		
 17159                              <1> 	;
 17160                              <1> 	; OUTPUT ->
 17161                              <1> 	;	(EAX = 0)
 17162                              <1> 	;	CF = 0 -> Successful (EAX = String length)
 17163                              <1> 	;	CF = 1 -> Failed (EAX = 0)
 17164                              <1> 	;
 17165                              <1> 	; Note: Environment variable name, for example,
 17166                              <1> 	;	'PATH=' must be included at the beginning
 17167                              <1> 	;	of the environment string. If the variable
 17168                              <1> 	;	name is as 'PATH' but it is not as 'PATH='
 17169                              <1> 	;	the variable string (row) will be returned.
 17170                              <1> 	;	If variable name is as 'PATH=' but there is
 17171                              <1> 	;	not a following text after the variable name,
 17172                              <1> 	;	the environment variable will be reset/deleted.
 17173                              <1> 
 17174 00011DDB 89E5                <1> 	mov	ebp, esp
 17175 00011DDD 81EC00020000        <1> 	sub	esp, 512
 17176 00011DE3 89E7                <1> 	mov	edi, esp
 17177                              <1> 
 17178 00011DE5 31C0                <1> 	xor	eax, eax
 17179 00011DE7 A3[20900100]        <1> 	mov	[u.r0], eax 
 17180                              <1> 	
 17181 00011DEC 21DB                <1> 	and	ebx, ebx
 17182 00011DEE 751F                <1> 	jnz	short sysenv_0
 17183                              <1> 
 17184                              <1> 	; EBX = 0 -> get (all) environment variables
 17185 00011DF0 89EC                <1> 	mov	esp, ebp
 17186 00011DF2 BE00300900          <1> 	mov	esi, Env_Page  ; Environment page
 17187 00011DF7 89CF                <1> 	mov	edi, ecx ; buffer addr (in user's mem space)
 17188                              <1> 	;mov	ecx, 512
 17189                              <1> 	; 30/07/2022
 17190 00011DF9 29C9                <1> 	sub	ecx, ecx
 17191 00011DFB B502                <1> 	mov	ch, 2
 17192                              <1> 	; ecx = 512
 17193 00011DFD E88FF0FFFF          <1> 	call	transfer_to_user_buffer
 17194                              <1> 	;jc	error
 17195                              <1> 	; 23/07/2022
 17196 00011E02 725B                <1> 	jc	short sysenv_error
 17197 00011E04 890D[20900100]      <1> 	mov	[u.r0], ecx 
 17198 00011E0A E948B0FFFF          <1> 	jmp	sysret
 17199                              <1> 
 17200                              <1> sysenv_0:
 17201 00011E0F 89DE                <1> 	mov	esi, ebx ; * ; user's buffer address
 17202 00011E11 0FB6CA              <1> 	movzx	ecx, dl
 17203                              <1> 	;sub	cl, 1 ; 0 -> 255, 1 -> 0
 17204                              <1> 	;adc	cx, 1 ; 255 -> 256, 0 -> 1
 17205                              <1> 	; 30/07/2022
 17206 00011E14 FEC9                <1> 	dec	cl ; 0 -> 255, 1 -> 0
 17207 00011E16 41                  <1> 	inc	ecx ; 255 -> 256, 0 -> 1
 17208 00011E17 E8BFF0FFFF          <1> 	call	transfer_from_user_buffer
 17209 00011E1C 723F                <1> 	jc	short sysenv_err
 17210 00011E1E 89FE                <1> 	mov	esi, edi
 17211 00011E20 8A06                <1> 	mov	al, [esi]
 17212 00011E22 3C20                <1> 	cmp	al, 20h
 17213 00011E24 7637                <1> 	jna	short sysenv_err
 17214 00011E26 3C3D                <1> 	cmp	al, '='
 17215 00011E28 7433                <1> 	je	short sysenv_err
 17216 00011E2A 56                  <1> 	push	esi
 17217                              <1> sysenv_1:
 17218 00011E2B 46                  <1> 	inc	esi
 17219 00011E2C 803E3D              <1> 	cmp	byte [esi], '='
 17220 00011E2F 7433                <1> 	je	short sysenv_3
 17221 00011E31 803E20              <1> 	cmp	byte [esi], 20h
 17222 00011E34 73F5                <1> 	jnb	short sysenv_1
 17223 00011E36 C60600              <1> 	mov	byte [esi], 0 
 17224 00011E39 5E                  <1> 	pop	esi
 17225                              <1> 	; EDI = Output buffer 
 17226                              <1> 	; CX = Buffer length
 17227 00011E3A 30C0                <1> 	xor	al, al
 17228                              <1> 	; AL = 0 -> use ASCIIZ word in [ESI]
 17229                              <1> 	; ESI = Environment variable name address
 17230 00011E3C E8DF7EFFFF          <1> 	call	get_environment_string
 17231 00011E41 721A                <1> 	jc	short sysenv_err
 17232 00011E43 89DF                <1> 	mov	edi, ebx ; * ; user's buffer address
 17233 00011E45 89C1                <1> 	mov	ecx, eax ; String length
 17234 00011E47 89E6                <1> 	mov	esi, esp 
 17235                              <1> 	; ESI = system buffer address
 17236                              <1> 	; EDI = User's buffer address
 17237                              <1> 	; ECX = transfer (byte) count
 17238 00011E49 E843F0FFFF          <1> 	call	transfer_to_user_buffer
 17239 00011E4E 720D                <1> 	jc	short sysenv_err
 17240 00011E50 890D[20900100]      <1> 	mov	[u.r0], ecx ; transfer (byte) count
 17241                              <1> sysenv_2:
 17242 00011E56 89EC                <1> 	mov	esp, ebp
 17243 00011E58 E9FAAFFFFF          <1> 	jmp	sysret
 17244                              <1> sysenv_err:
 17245 00011E5D 89EC                <1> 	mov	esp, ebp
 17246                              <1> sysenv_error:	; 23/07/2022
 17247 00011E5F E9D3AFFFFF          <1> 	jmp	error
 17248                              <1> sysenv_3:
 17249 00011E64 46                  <1> 	inc	esi
 17250 00011E65 803E20              <1> 	cmp	byte [esi], 20h
 17251 00011E68 73FA                <1> 	jnb	short sysenv_3
 17252 00011E6A C60600              <1> 	mov	byte [esi], 0	
 17253 00011E6D 5E                  <1> 	pop	esi
 17254 00011E6E E8707FFFFF          <1> 	call	set_environment_string
 17255 00011E73 72E8                <1> 	jc	short sysenv_err
 17256 00011E75 8915[20900100]      <1> 	mov	[u.r0], edx
 17257 00011E7B EBD9                <1> 	jmp	short sysenv_2
 17258                              <1> 
 17259                              <1> ; 23/07/2022 - TRDOS 386 v2.0.5
 17260                              <1> 
 17261                              <1> ; 22/01/2021
 17262                              <1> ; temporary - 24/01/2016
 17263                              <1> 
 17264                              <1> iget:
 17265                              <1> 	;retn
 17266                              <1> isintr:
 17267                              <1> 	;retn
 17268                              <1> iopen:
 17269                              <1> 	;retn
 17270                              <1> iclose:
 17271                              <1> 	;retn
 17272                              <1> sndc:
 17273                              <1> 	;retn
 17274                              <1> access:
 17275                              <1> 	;retn
 17276                              <1> sleep:
 17277 00011E7D C3                  <1> 	retn
  3431                                  %include 'trdosk7.s' ; 24/01/2016
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.6) - DISK READ&WRITE : trdosk7.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 29/08/2023  (Previous: 25/07/2022 - Kernel v2.0.5)
     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 00011E7E 807E0500            <1> 	cmp	byte [esi+LD_LBAYes], 0
    20 00011E82 7774                <1>         ja      short lba_write
    21                              <1> 
    22                              <1> chs_write:
    23                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
    24                              <1> 	; 25/02/2016
    25                              <1> 	; 23/02/2016
    26 00011E84 C605[39810100]03    <1> 	mov	byte [disk_rw_op], 3 ; CHS write
    27 00011E8B EB0D                <1> 	jmp	short chs_rw
    28                              <1> 
    29                              <1> disk_read:
    30                              <1> 	; 25/02/2016
    31                              <1> 	; 24/02/2016
    32                              <1> 	; 23/02/2016
    33                              <1> 	; 17/02/2016
    34                              <1> 	; 14/02/2016
    35                              <1> 	; 31/01/2016 (TRDOS 386 = TRDOS v2.0)
    36                              <1> 	; 17/10/2010
    37                              <1> 	; 18/04/2010
    38                              <1> 	;
    39                              <1> 	; INPUT -> EAX = Logical Block Address
    40                              <1> 	;	   ESI = Logical Dos Disk Table Offset (DRV)	
    41                              <1> 	;	   ECX = Sector Count	
    42                              <1> 	; 	   EBX = Destination Buffer
    43                              <1> 	; OUTPUT -> 
    44                              <1> 	;	   cf = 0 or cf = 1
    45                              <1> 	; (Modified registers: EAX, EBX, ECX, EDX)
    46                              <1> 
    47 00011E8D 807E0500            <1> 	cmp	byte [esi+LD_LBAYes], 0
    48 00011E91 776E                <1>         ja      short lba_read
    49                              <1> 
    50                              <1> chs_read:
    51                              <1> 	; 29/08/2023 (TRDOS 386 Kernel v2.0.6)
    52                              <1> 	; 25/07/2022 (TRDOS 386 Kernel v2.0.5)
    53                              <1> 	; 25/02/2016
    54                              <1> 	; 24/02/2016
    55                              <1> 	; 23/02/2016
    56                              <1> 	; 31/01/2016 (TRDOS 386 = TRDOS v2.0)
    57                              <1> 	; 20/07/2011
    58                              <1> 	; 04/07/2009
    59                              <1> 	;
    60                              <1> 	; INPUT -> EAX = Logical Block Address
    61                              <1> 	;	   ECX = Number of sectors to read
    62                              <1> 	; 	   ESI = Logical Dos Disk Table Offset (DRV)
    63                              <1> 	; 	   EBX = Destination Buffer
    64                              <1> 	; OUTPUT -> 
    65                              <1> 	;	   cf = 0 or cf = 1
    66                              <1> 	; (Modified registers: EAX; EBX, ECX, EDX)
    67                              <1> 
    68                              <1> 	; 23/02/2016
    69 00011E93 C605[39810100]02    <1> 	mov	byte [disk_rw_op], 2 ; CHS read
    70                              <1> 
    71                              <1> chs_rw:
    72                              <1> 	;;movzx	edx, word [esi+LD_BPB+SecPerTrack]
    73                              <1> 	;movzx	edx, byte [esi+LD_BPB+SecPerTrack] ; <= 63
    74                              <1> 	;mov	[disk_rw_spt], dl
    75                              <1> 
    76                              <1> chs_read_next_sector:
    77 00011E9A C605[3A810100]04    <1> 	mov	byte [retry_count], 4
    78                              <1>      
    79                              <1> chs_read_retry:
    80                              <1> 	;mov	[sector_count], ecx ; 23/02/2016
    81                              <1> 
    82 00011EA1 50                  <1> 	push	eax			; Linear sector #
    83 00011EA2 51                  <1> 	push	ecx			; # of FAT/FILE/DIR sectors
    84                              <1>                 
    85 00011EA3 0FB74E1E            <1> 	movzx	ecx, word [esi+LD_BPB+SecPerTrack]
    86                              <1> 	;movzx	ecx, byte [disk_rw_spt] ; 23/02/2016
    87 00011EA7 29D2                <1> 	sub	edx, edx
    88 00011EA9 F7F1                <1> 	div	ecx
    89                              <1> 	; eax = track, dx (dl ) = sector (on track)
    90                              <1> 	;sub	cl, dl ; 24/02/2016 (spt - sec)
    91                              <1> 	;push	ecx ; *
    92                              <1> 	; 25/07/2022
    93                              <1> 	;mov	cx, dx			; Sector (zero based)
    94                              <1> 	;inc	cx			; To make it 1 based
    95                              <1> 	;push	cx
    96                              <1> 	; 29/08/2023
    97                              <1> 	;mov	ecx, edx
    98                              <1> 	;inc	ecx
    99                              <1> 	;push	ecx
   100 00011EAB 42                  <1> 	inc	edx
   101 00011EAC 52                  <1> 	push	edx ; dl = sector number (on track)
   102                              <1> 	;
   103 00011EAD 668B4E20            <1> 	mov	cx, [esi+LD_BPB+Heads]
   104                              <1> 	;sub	dx, dx
   105                              <1> 	; 25/07/2022
   106 00011EB1 29D2                <1> 	sub	edx, edx
   107 00011EB3 F7F1                <1> 	div	ecx			; Convert track to head & cyl
   108                              <1> 	; eax (ax) = cylinder, dx (dl) = head (max. FFh)
   109 00011EB5 88D6                <1> 	mov	dh, dl
   110                              <1> 	;pop	cx			; AX=Cyl, DH=Head, CX=Sector
   111                              <1> 	; 25/07/2022
   112 00011EB7 59                  <1> 	pop	ecx ; sector number (on track)
   113 00011EB8 8A5602              <1> 	mov	dl, [esi+LD_PhyDrvNo]
   114                              <1> 
   115 00011EBB 88C5                <1> 	mov	ch, al			; NOTE: max. 1023 cylinders !                   
   116 00011EBD C0CC02              <1> 	ror	ah, 2			; Rotate 2 bits right
   117 00011EC0 08E1                <1> 	or	cl, ah
   118                              <1> 
   119                              <1> 	; 24/02/2016
   120                              <1> 	;pop	eax ; * (spt - sec) (example: 63 - 0 = 63)
   121                              <1> 	;cmp	eax, [sector_count]
   122                              <1> 	;jb	short chs_write_sectors
   123                              <1> 	;je	short chs_read_sectors
   124                              <1> 	;; (# of sectors to read is more than remaining sectors on the track)
   125                              <1> 	;mov	al, [sector_count]
   126                              <1> ;chs_read_sectors: ; read or write !
   127 00011EC2 B001                <1> 	mov	al, 1 ; 25/02/2016
   128 00011EC4 8A25[39810100]      <1> 	mov	ah, [disk_rw_op]  ; 02h = chs read, 03h = chs write 
   129                              <1> 	;
   130 00011ECA E8EC30FFFF          <1> 	call	int13h			; BIOS Service func ( ah ) = 2
   131                              <1>                                         ; Read disk sectors
   132                              <1>                                         ; AL-sec num CH-track CL-sec
   133                              <1>                                         ; DH-head DL-drive ES:BX-buffer
   134                              <1>                                         ; CF-flag AH-stat AL-sec read
   135                              <1> 	                                ; If CF = 1 then (If AH > 0)
   136 00011ECF 8825[3B810100]      <1> 	mov	[disk_rw_err], ah
   137                              <1> 	
   138 00011ED5 59                  <1> 	pop	ecx
   139 00011ED6 58                  <1> 	pop	eax
   140 00011ED7 7314                <1> 	jnc	short chs_read_ok
   141                              <1> 
   142 00011ED9 803D[3B810100]09    <1> 	cmp	byte [disk_rw_err], 09h ; DMA crossed 64K segment boundary
   143 00011EE0 7408                <1> 	je	short chs_read_error_retn
   144                              <1>              
   145 00011EE2 FE0D[3A810100]      <1> 	dec	byte [retry_count]
   146 00011EE8 75B7                <1> 	jnz	short chs_read_retry
   147                              <1> 
   148                              <1> chs_read_error_retn:
   149 00011EEA F9                  <1> 	stc
   150                              <1> 	;retn
   151 00011EEB EB67                <1> 	jmp	short update_drv_error_byte
   152                              <1> 
   153                              <1> ;chs_write_sectors: ; read or write 
   154                              <1> 	;; (# of sectors to read is less than remaining sectors on the track)
   155                              <1> 	;mov	[sector_count], al
   156                              <1> 	;jmp	short chs_read_sectors
   157                              <1> 
   158                              <1> chs_read_ok:
   159                              <1> 	;; 23/02/2016
   160                              <1> 	;movzx	edx, byte [sector_count] ; sector count (<= spt)	
   161                              <1>         ;sub    ecx, edx  ; remaining sector count
   162                              <1> 	;jna	short update_drv_error_byte	
   163                              <1> 	;add	eax, edx ; next disk sector
   164                              <1> 	;shl	edx, 9 ; 512 * sector count
   165                              <1> 	;add	ebx, edx ; next buffer byte address 
   166                              <1>         ;jmp	chs_read_next_sector        
   167                              <1> 	; 25/02/2016
   168 00011EED 40                  <1> 	inc	eax ; next sector
   169 00011EEE 81C300020000        <1> 	add	ebx, 512
   170 00011EF4 E2A4                <1> 	loop	chs_read_next_sector
   171 00011EF6 EB5C                <1> 	jmp	short update_drv_error_byte
   172                              <1> 
   173                              <1> lba_write:
   174                              <1> 	; 23/02/2016
   175 00011EF8 C605[39810100]1C    <1> 	mov	byte [disk_rw_op], 1Ch ; LBA write
   176 00011EFF EB07                <1> 	jmp	short lba_rw
   177                              <1> 
   178                              <1> lba_read:
   179                              <1> 	; 14/07/2022
   180                              <1> 	; 23/02/2016
   181                              <1> 	; 17/02/2016
   182                              <1> 	; 14/02/2016
   183                              <1> 	; 13/02/2016
   184                              <1> 	; 31/01/2016 (TRDOS 386 = TRDOS v2.0)
   185                              <1> 	; 10/07/2015 (Retro UNIX 386 v1)
   186                              <1> 	;
   187                              <1> 	; INPUT -> EAX = Logical Block Address
   188                              <1> 	;	   ESI = Logical Dos Disk Table Offset (DRV)	
   189                              <1> 	;	   ECX = Sector Count	
   190                              <1> 	; 	   EBX = Destination Buffer
   191                              <1> 	; OUTPUT -> 
   192                              <1> 	;	   cf = 0 or cf = 1
   193                              <1> 	; (Modified registers: EAX, EBX, ECX, EDX)
   194                              <1> 
   195                              <1> 	; LBA read/write (with private LBA function) 
   196                              <1> 	;((Retro UNIX 386 v1 - DISK I/O code by Erdogan Tan))
   197                              <1> 
   198                              <1> 	; 23/02/2016
   199 00011F01 C605[39810100]1B    <1> 	mov	byte [disk_rw_op], 1Bh ; LBA read
   200                              <1> 
   201                              <1> lba_rw:
   202                              <1> 	; 17/02/2016
   203 00011F08 57                  <1> 	push	edi
   204                              <1> 
   205 00011F09 890D[3C810100]      <1> 	mov	[sector_count], ecx ; total sector (read) count
   206                              <1> 
   207 00011F0F 8A5602              <1> 	mov	dl, [esi+LD_PhyDrvNo]
   208                              <1> 	; dl = physical drive number (0,1, 80h, 81h, 82h, 83h)
   209                              <1> 
   210                              <1> lba_read_next:
   211                              <1> 	; 14/07/2022
   212 00011F12 BF00010000          <1> 	mov	edi, 256
   213 00011F17 39F9                <1> 	cmp	ecx, edi
   214                              <1> 	;cmp	ecx, 256
   215 00011F19 7602                <1> 	jna	short lba_read_rsc
   216                              <1> 	;mov	ecx, 256 ; 17/02/2016
   217 00011F1B 89F9                <1> 	mov	ecx, edi
   218                              <1> lba_read_rsc:
   219 00011F1D 290D[3C810100]      <1> 	sub	[sector_count], ecx ; remain sectors
   220                              <1> 
   221 00011F23 89CF                <1> 	mov	edi, ecx 
   222 00011F25 89C1                <1> 	mov	ecx, eax ; sector number/address
   223                              <1> 
   224 00011F27 C605[3A810100]04    <1> 	mov	byte [retry_count], 4
   225                              <1> lba_read_retry:
   226 00011F2E 89F8                <1> 	mov	eax, edi
   227                              <1> 	;
   228                              <1> 	; ecx = sector number
   229                              <1> 	; al = sector count (0 - 255) /// (0 = 256)
   230                              <1> 	; dl = drive number
   231                              <1> 	; ebx = buffer offset
   232                              <1> 	;
   233                              <1> 	; Function 1Bh = LBA read, 1Ch = LBA write
   234                              <1> 	; 23/02/2016
   235 00011F30 8A25[39810100]      <1> 	mov	ah, [disk_rw_op] ; 1Bh = LBA read, 1Ch = LBA write
   236 00011F36 E88030FFFF          <1> 	call	int13h
   237                              <1> 	; al = ? (changed)
   238                              <1> 	; ah = error code
   239 00011F3B 8825[3B810100]      <1> 	mov	[disk_rw_err], ah
   240 00011F41 7332                <1> 	jnc	short lba_read_ok
   241 00011F43 80FC80              <1> 	cmp	ah, 80h ; time out?
   242 00011F46 740A                <1>         je      short lba_read_stc_retn
   243 00011F48 FE0D[3A810100]      <1> 	dec	byte [retry_count]
   244 00011F4E 7FDE                <1> 	jg	short lba_read_retry
   245 00011F50 7438                <1> 	jz	short lba_read_reset
   246                              <1> 	; sf = 1
   247                              <1> 
   248                              <1> lba_read_stc_retn:
   249 00011F52 F9                  <1> 	stc
   250                              <1> lba_read_retn:
   251 00011F53 5F                  <1> 	pop	edi
   252                              <1> 
   253                              <1> update_drv_error_byte:
   254 00011F54 9C                  <1> 	pushf
   255 00011F55 53                  <1> 	push	ebx
   256                              <1> 	;push	cx
   257 00011F56 51                  <1> 	push	ecx ; 14/07/2022
   258                              <1> 	;or	ecx, ecx
   259                              <1> 	;jz	short udrv_errb0
   260 00011F57 8A0D[3B810100]      <1> 	mov	cl, [disk_rw_err]
   261                              <1> udrv_errb0:
   262 00011F5D 0FB65E02            <1> 	movzx	ebx, byte [esi+LD_PhyDrvNo]
   263 00011F61 80FB02              <1> 	cmp	bl, 2
   264 00011F64 7203                <1>         jb      short udrv_errb1
   265 00011F66 80EB7E              <1> 	sub	bl, 7Eh
   266                              <1> 	;cmp	bl, 5
   267                              <1> 	;ja	short udrv_errb2	
   268                              <1> udrv_errb1:
   269 00011F69 81C3[45660000]      <1>         add     ebx, drv.error ; 13/02/2016
   270 00011F6F 880B                <1> 	mov	[ebx], cl ; error code
   271                              <1> udrv_errb2:
   272                              <1> 	;pop	cx
   273 00011F71 59                  <1> 	pop	ecx  ; 14/07/2022
   274 00011F72 5B                  <1> 	pop	ebx
   275 00011F73 9D                  <1> 	popf
   276 00011F74 C3                  <1> 	retn
   277                              <1> 
   278                              <1> lba_read_ok:
   279 00011F75 89C8                <1> 	mov	eax, ecx ; sector number
   280 00011F77 01F8                <1> 	add	eax, edi ; sector number (next)
   281 00011F79 C1E709              <1> 	shl	edi, 9 ; sector count * 512
   282 00011F7C 01FB                <1> 	add	ebx, edi ; next buffer offset
   283                              <1> 
   284 00011F7E 8B0D[3C810100]      <1> 	mov	ecx, [sector_count] ; remaining sectors
   285 00011F84 09C9                <1> 	or	ecx, ecx
   286 00011F86 758A                <1> 	jnz	short lba_read_next
   287 00011F88 EBC9                <1> 	jmp	short lba_read_retn
   288                              <1> 
   289                              <1> lba_read_reset:
   290 00011F8A B40D                <1> 	mov	ah, 0Dh ; Alternate reset
   291 00011F8C E82A30FFFF          <1>         call	int13h
   292                              <1> 	; al = ? (changed)
   293                              <1> 	; ah = error code
   294 00011F91 739B                <1> 	jnc	short lba_read_retry
   295 00011F93 EBBE                <1> 	jmp	short lba_read_retn
  3432                                  %include 'trdosk8.s' ; 24/01/2016
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.7) - MAIN PROGRAM : trdosk8.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 04/12/2023  (Previous: 09/08/2022)
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 24/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.15 (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> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
    20                              <1> 	; 23/12/2016
    21                              <1> 	; 10/06/2016
    22                              <1> 	; 22/05/2016
    23                              <1> 	; 20/05/2016
    24                              <1> 	; 19/05/2016 - TRDOS 386 (TRDOS v2.0)
    25                              <1> 	; TRDOS 386 feature only !
    26                              <1> 	;
    27                              <1> 	; INPUT ->
    28                              <1> 	;	AL = process number (next process)
    29                              <1> 	;
    30                              <1> 	;	this process must be added to run sequence
    31                              <1> 	;
    32                              <1> 	;	[u.pri] = priority of present process
    33                              <1> 	;
    34                              <1> 	;	DL = priority (queue)
    35                              <1> 	;	     0 = background (low) ; run on background 
    36                              <1> 	;	     1 = regular (normal) ; run as regular
    37                              <1> 	;	     2 = event (high)     ; run for event
    38                              <1> 	;
    39                              <1> 	;	1) If the requested process is already running:
    40                              <1> 	;	   a) If present priority is high ([u.pri]=2) 
    41                              <1> 	;	      and requested priority is also high, 
    42                              <1> 	;	      there is nothing to do! Because it has been
    43                              <1> 	;	      done already (before this attempt).		 	
    44                              <1> 	;	   b) If present priority is high ([u.pri]=2)
    45                              <1> 	;	      and requested priority is not high, there is
    46                              <1> 	;	      nothing to do! Because, it's current
    47                              <1> 	;	      run queue is unspecified, here. (It may be in
    48                              <1> 	;	      a waiting list or in a run queue; if the new
    49                              <1> 	;	      priority would be used to add it to relavant
    50                              <1>         ;             run queue, this would be wrong, unnecessary
    51                              <1> 	;	      and destabilizing duplication!)
    52                              <1> 	;	   c) If present priority is not high ([u.pri]<2)
    53                              <1>         ;             and requested priority is high (event),
    54                              <1> 	;	      process will be added to present priority's
    55                              <1> 	;	      run queue and then, priority will be changed
    56                              <1> 	;	      to high ([u.pri]=2).
    57                              <1> 	;	   d) If present priority is not high ([u.pri]<2)
    58                              <1> 	;	      and requested priority is not high, [u.pri]
    59                              <1> 	;	      value will be changed. There is nothing to do
    60                              <1> 	;	      in addition. (The new priority value will be
    61                              <1> 	;	      used by 'tswap/tswitch' procedure at 'sysret'
    62                              <1> 	;	      or 'sysrele' stage.)
    63                              <1> 	;
    64                              <1> 	;	2) If the requested process is not running:
    65                              <1> 	;	   a) If requested priority of the requested
    66                              <1> 	;	      (next) process is high (event) and priority
    67                              <1> 	;	      of present process is not high, the requested
    68                              <1> 	;	      process will be added to ('runq_event') high
    69                              <1> 	;	      priority run queue and then present (running)
    70                              <1> 	;	      process will be stopped (swapped/switched out)
    71                              <1> 	;	      immediately if it is in user mode, or it's 
    72                              <1> 	;	      [u.quant] value will be reset to 0 and (then) 
    73                              <1> 	;	      it will be stopped at 'sysret' stage.			
    74                              <1> 	;	   b) If requested priority of the requested
    75                              <1> 	;	      (next) process is high (event) and priority
    76                              <1> 	;	      of present process is also high, the requested
    77                              <1> 	;	      process will be added to ('runq_event') high
    78                              <1> 	;	      priority run queue and present (running) 
    79                              <1> 	;	      process will be allowed to run until it's 
    80                              <1> 	;	      time quantum will be elapsed ([u.quant]=0).	
    81                              <1> 	;	   c) If requested priority of the requested
    82                              <1> 	;	      (next) process is not high ('run for event'), 
    83                              <1> 	;	      there is nothing to do. Because, it's current
    84                              <1> 	;	      run queue is unspecified, here. (It may be in
    85                              <1> 	;	      a waiting list or in a run queue; if the new
    86                              <1> 	;	      priority would be used to add it to relavant
    87                              <1>         ;             run queue, this would be wrong, unnecessary
    88                              <1> 	;	      and destabilizing duplication!) 
    89                              <1> 	;
    90                              <1> 	; OUTPUT ->
    91                              <1> 	;	none
    92                              <1> 	;
    93                              <1> 	;	[u.pri] = priority of present process
    94                              <1> 	;
    95                              <1> 	;	cf = 1, if the request could not be fulfilled.
    96                              <1> 	;			 	     	  
    97                              <1> 	;	NOTE: 
    98                              <1>         ;          * Processes in 'run as regular' queue can run
    99                              <1> 	;	     if there is no process in 'run for event' queue
   100                              <1> 	;	     ('run for event' processes have higher priority)	 		 
   101                              <1> 	;	   * When [u.quant] time quantum of a process is
   102                              <1> 	;	     elapsed, it's high priority ('run for event')
   103                              <1> 	;	     status will be disabled, it can be run in sequence
   104                              <1> 	;	     of it's actual run queue.
   105                              <1> 	;	   * A 'run on background' process will always be 
   106                              <1> 	;	     sequenced in 'run on background' (low priority)
   107                              <1> 	;	     queue, it can run only when other priority queues
   108                              <1> 	;	     are empty. (idle time processes, e.g. printing)  	 	
   109                              <1> 	;
   110                              <1> 	; Modified registers: eax, ebx, edx
   111                              <1> 	;
   112                              <1> 
   113                              <1> srunseq_0:
   114 00011F95 3A05[71900100]      <1>         cmp     al, [u.uno]     ; same process ?
   115 00011F9B 750C                <1> 	jne	short srunseq_2 ; no
   116                              <1> 
   117 00011F9D 8A25[6A900100]      <1> 	mov	ah, [u.pri] 	; present/current priority
   118 00011FA3 80FC02              <1> 	cmp	ah, 2       	; 'run for event' priority level
   119 00011FA6 7220                <1> 	jb	short srunseq_6 ; no
   120                              <1> 
   121                              <1> srunseq_1:
   122                              <1> 	; there is nothing to do!
   123 00011FA8 C3                  <1> 	retn
   124                              <1> 
   125                              <1> srunseq_2:
   126                              <1> 	;;this not necessary ! 23/12/2016
   127                              <1>         ;;cmp	al, nproc	; number of processes = 16 
   128                              <1> 	;;jnb	short srunseq_5	; error ! invalid process number 
   129                              <1> 
   130                              <1> 	; dl = priority
   131 00011FA9 80FA02              <1> 	cmp	dl, 2 		; event queue
   132 00011FAC 72FA                <1> 	jb	short srunseq_1 ; requested process is not present
   133                              <1> 				; process and priority of requested
   134                              <1> 				; process is not high (event), 
   135                              <1> 				; there is nothing to do!
   136                              <1> 	
   137                              <1> 	; requested process is not present process
   138                              <1> 	; & priority of requested process is high
   139 00011FAE 3A15[6A900100]      <1> 	cmp	dl, [u.pri] 	; priority of present process
   140 00011FB4 7606                <1> 	jna	short srunseq_3 ; is high, also
   141                              <1> 	;
   142                              <1> 	; present process will be swapped/switched out
   143 00011FB6 FE05[15850100]      <1> 	inc	byte [p_change] ; 1
   144                              <1> 
   145                              <1> srunseq_3:
   146                              <1> 	; add process to 'runq_event' queue for new event
   147 00011FBC BB[0E900100]        <1> 	mov	ebx, runq_event ; high priority run queue
   148                              <1> 
   149                              <1> srunseq_4:
   150                              <1> 	; al = process number
   151                              <1> 	; ebx = run queue
   152                              <1> 	;call	putlu
   153                              <1> 	;retn
   154                              <1> 	; 29/07/2022
   155 00011FC1 E9F7EDFFFF          <1> 	jmp	putlu
   156                              <1> 
   157                              <1> srunseq_5:
   158 00011FC6 F5                  <1> 	cmc
   159 00011FC7 C3                  <1> 	retn
   160                              <1> 
   161                              <1> srunseq_6:
   162                              <1> 	; present priority of the process is not high
   163                              <1> 	
   164 00011FC8 8815[6A900100]      <1> 	mov	[u.pri], dl ; new priority 
   165                              <1> 			    ; (will be used by 'tswap')
   166                              <1> 
   167 00011FCE 80FA02              <1> 	cmp	dl, 2 		; high priority ?
   168 00011FD1 72F3                <1> 	jb	short srunseq_5 ; no, there is nothing to do
   169                              <1> 				; in addition
   170                              <1> 
   171                              <1> 	; process must be added to relevant run queue, here!
   172                              <1> 	; (new priority is high/event priority and process
   173                              <1> 	; will not be added to a run queue by 'tswap')
   174                              <1> 
   175 00011FD3 BB[10900100]        <1> 	mov	ebx, runq_normal ; 'run as regular' queue
   176                              <1> 
   177 00011FD8 20E4                <1> 	and	ah, ah  ;  previous value of [u.pri]
   178 00011FDA 75E5                <1> 	jnz	short srunseq_4
   179                              <1> 
   180 00011FDC 43                  <1> 	inc	ebx
   181 00011FDD 43                  <1> 	inc	ebx
   182                              <1> 	; ebx = runq_background ; 'run on backgroud' queue 
   183                              <1> 
   184 00011FDE EBE1                <1> 	jmp	short srunseq_4
   185                              <1> clock:
   186                              <1> 	; 23/05/2016
   187                              <1> 	; 22/05/2016
   188                              <1> 	; 20/05/2016
   189                              <1> 	; 19/05/2016 - TRDOS 386 (TRDOS v2.0)
   190                              <1> 	; 14/05/2015 - 14/10/2015 (Retro UNIX 386 v1)
   191                              <1> 	; 07/12/2013 - 10/04/2014 (Retro UNIX 8086 v1)
   192                              <1> 
   193 00011FE0 803D[68900100]00    <1> 	cmp	byte [u.quant], 0
   194 00011FE7 772C                <1> 	ja	short clk_1
   195                              <1> 	;
   196 00011FE9 803D[71900100]01    <1> 	cmp     byte [u.uno], 1 ; /etc/init ? (for Retro UNIX 8086 & 386 v1)
   197                              <1> 				; MainProg (Kernel's Command Interpreter)
   198                              <1> 				; for TRDOS 386.
   199 00011FF0 7623                <1> 	jna	short clk_1 ; yes, do not swap out
   200                              <1> 	;
   201 00011FF2 803D[14900100]FF    <1> 	cmp     byte [sysflg], 0FFh ; user or system space ?
   202 00011FF9 7520                <1> 	jne	short clk_2 	    ; system space (sysflg <> 0FFh)
   203                              <1> 	;
   204 00011FFB 66833D[6C900100]00  <1> 	cmp	word [u.intr], 0
   205 00012003 7616                <1> 	jna	short clk_2
   206                              <1> 	;
   207                              <1> 	; 23/05/2016
   208 00012005 803D[16850100]00    <1> 	cmp	byte [multi_tasking], 0
   209 0001200C 760D                <1> 	jna	short clk_2
   210                              <1> 	;
   211 0001200E FE05[15850100]      <1> 	inc	byte [p_change] ; it is time to change running process	
   212 00012014 C3                  <1> 	retn
   213                              <1> clk_1:
   214 00012015 FE0D[68900100]      <1> 	dec	byte [u.quant]
   215                              <1> clk_2:
   216 0001201B C3                  <1> 	retn   ; return to (hardware) timer interrupt routine
   217                              <1> 
   218                              <1> ; 12/10/2017
   219                              <1> ; 15/01/2017
   220                              <1> ; 14/01/2017
   221                              <1> ; 07/01/2017
   222                              <1> ; 02/01/2017
   223                              <1> ; 17/08/2016
   224                              <1> ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
   225                              <1> int34h: ; #IOCTL# (I/O port access support for ring 3)
   226                              <1> 	;
   227                              <1> 	; 23/05/2016
   228                              <1> 	; 20/06/2016
   229                              <1> 	; 29/04/2016 - TRDOS 386 (TRDOS v2.0)
   230                              <1> 	;
   231                              <1> 	; INPUT ->
   232                              <1> 	;	AH = 0 -> read port  (physical IO port) -byte-
   233                              <1> 	;	AH = 1 -> write port (physical IO port) -byte-
   234                              <1> 	;		AL = data byte
   235                              <1> 	;	AH = 2 -> read port  (physical IO port) -word-
   236                              <1> 	;	AH = 3 -> write port (physical IO port) -word-
   237                              <1> 	;		BX = data word
   238                              <1> 	;	AH = 4 -> read port  (physical IO port) -dword-
   239                              <1> 	;	AH = 5 -> write port (physical IO port) -dword-
   240                              <1> 	;		EBX = data dword
   241                              <1> 	;	; 12/10/2017
   242                              <1> 	;	AH = 6 -> read port (physical IO port) twice -byte-
   243                              <1> 	;	AH = 7 -> write port (physical IO port) twice -byte-
   244                              <1> 	;		BX = data word	
   245                              <1> 	;
   246                              <1> 	;	DX = Port number (<= 0FFFFh)
   247                              <1> 	;
   248                              <1> 	; OUTPUT ->
   249                              <1> 	;	AL = data byte (in al, dx)
   250                              <1> 	;	AX = data word (in ax, dx)
   251                              <1> 	;	EAX = data dword (in eax, dx)
   252                              <1> 	;
   253                              <1> 	;	(ECX = actual TRANSFER COUNT for string functions)
   254                              <1> 	;
   255                              <1> 	;
   256                              <1> 	; Modified registers: EAX
   257                              <1> 	;
   258                              <1> 
   259                              <1> 	;cmp	ah, 5
   260                              <1> 	;ja	short int34h_5 ; invalid function !
   261                              <1> 
   262                              <1> 	; 12/10/2017
   263 0001201C 80FC07              <1> 	cmp	ah, 7
   264 0001201F 7743                <1> 	ja	short int34h_5 ; invalid function !
   265                              <1> 
   266                              <1> 	;; 15/01/2017
   267                              <1> 	; 14/01/2017
   268                              <1> 	; 02/01/2017
   269                              <1> 	;;mov	byte [ss:intflg], 34h	; IOCTL interrupt 
   270 00012021 FB                  <1> 	sti
   271                              <1> 	
   272                              <1> 	;sti	; enable interrupts
   273 00012022 80642408FE          <1> 	and	byte [esp+8], 11111110b	; clear carry bit of eflags register
   274                              <1> 
   275 00012027 80FC01              <1> 	cmp	ah, 1
   276 0001202A 7205                <1> 	jb	short int34h_0
   277 0001202C 7705                <1> 	ja	short int34h_1
   278                              <1> 
   279 0001202E EE                  <1> 	out	dx, al
   280                              <1> 	;iretd
   281 0001202F EB01                <1> 	jmp	short int34h_iret
   282                              <1> 
   283                              <1> int34h_0:
   284 00012031 EC                  <1> 	in	al, dx
   285                              <1> 	;iretd
   286                              <1> int34h_iret:
   287                              <1> 	;cli	; 07/01/2017
   288                              <1> 	;; 15/01/2017
   289                              <1> 	;;mov	byte [ss:intflg], 0 ; reset
   290 00012032 CF                  <1> 	iretd 
   291                              <1> 
   292                              <1> int34h_1:
   293 00012033 F6C401              <1> 	test	ah, 1
   294 00012036 7516                <1> 	jnz	short int34h_3 ; out
   295                              <1> 
   296                              <1> 	; in
   297 00012038 80FC02              <1> 	cmp	ah, 2
   298 0001203B 7707                <1> 	ja	short int34h_2
   299                              <1> 
   300 0001203D 6689D8              <1> 	mov	ax, bx
   301 00012040 66ED                <1> 	in	ax, dx
   302                              <1> 	;iretd
   303 00012042 EBEE                <1> 	jmp	short int34h_iret
   304                              <1> 
   305                              <1> int34h_2:
   306 00012044 80FC04              <1> 	cmp	ah, 4
   307 00012047 772C                <1> 	ja	short int34h_7	; 12/10/2017
   308                              <1> 	; ah = 4
   309 00012049 89D8                <1> 	mov	eax, ebx
   310 0001204B ED                  <1> 	in	eax, dx
   311                              <1> 	;iretd
   312 0001204C EBE4                <1> 	jmp	short int34h_iret
   313                              <1> 
   314                              <1> int34h_3:
   315 0001204E 80FC03              <1> 	cmp	ah, 3
   316 00012051 7707                <1> 	ja	short int34h_4
   317                              <1> 
   318 00012053 6689D8              <1> 	mov	ax, bx
   319 00012056 66EF                <1> 	out	dx, ax
   320                              <1> 	;iretd
   321 00012058 EBD8                <1> 	jmp	short int34h_iret
   322                              <1> 
   323                              <1> int34h_4:
   324 0001205A 80FC05              <1> 	cmp	ah, 5
   325 0001205D 770B                <1> 	ja	short int34h_6	; 12/10/2017
   326                              <1> 	; ah = 5
   327 0001205F 89D8                <1> 	mov	eax, ebx
   328 00012061 EF                  <1> 	out	dx, eax
   329                              <1> 	;iretd
   330 00012062 EBCE                <1> 	jmp	short int34h_iret
   331                              <1> 
   332                              <1> int34h_5:
   333 00012064 804C240801          <1> 	or	byte [esp+8], 1	; set carry bit of eflags register
   334 00012069 CF                  <1> 	iretd
   335                              <1> 
   336                              <1> 	; 12/10/2017
   337                              <1> int34h_6:
   338 0001206A 6689D8              <1> 	mov	ax, bx
   339 0001206D EE                  <1> 	out	dx, al
   340 0001206E EB00                <1> 	jmp	short $+2
   341 00012070 86E0                <1> 	xchg	ah, al
   342 00012072 EE                  <1> 	out	dx, al
   343                              <1> 	;xchg	al, ah
   344                              <1> 	;iretd
   345 00012073 EB06                <1> 	jmp	short int34h_8
   346                              <1> int34h_7:
   347 00012075 EC                  <1> 	in	al, dx
   348 00012076 EB00                <1> 	jmp	short $+2
   349 00012078 88C4                <1> 	mov	ah, al
   350 0001207A EC                  <1> 	in	al, dx
   351                              <1> int34h_8:
   352 0001207B 86C4                <1> 	xchg	al, ah
   353 0001207D CF                  <1> 	iretd
   354                              <1> 			
   355                              <1> INT4Ah:
   356                              <1> 	; 24/01/2016
   357                              <1> 	; this procedure will be called by 'RTC_INT' (in 'timer.s')
   358 0001207E C3                  <1> 	retn
   359                              <1> 
   360                              <1> ; u0.s
   361                              <1> ; Retro UNIX 386 v1 Kernel (v0.2) - SYS0.INC
   362                              <1> ; Last Modification: 20/11/2015
   363                              <1> 
   364                              <1> com2_int:
   365                              <1> 	; 07/11/2015 
   366                              <1> 	; 24/10/2015
   367                              <1> 	; 23/10/2015
   368                              <1> 	; 14/03/2015 (Retro UNIX 386 v1 - Beginning)
   369                              <1> 	; 28/07/2014 (Retro UNIX 8086 v1)
   370                              <1> 	; < serial port 2 interrupt handler >
   371                              <1> 	;
   372 0001207F 890424              <1> 	mov 	[esp], eax ; overwrite call return address
   373                              <1> 	;push	eax
   374 00012082 66B80900            <1> 	mov	ax, 9
   375 00012086 EB07                <1> 	jmp	short comm_int
   376                              <1> com1_int:
   377                              <1> 	; 07/11/2015
   378                              <1> 	; 24/10/2015
   379 00012088 890424              <1> 	mov 	[esp], eax ; overwrite call return address
   380                              <1> 	; 23/10/2015
   381                              <1> 	;push	eax
   382 0001208B 66B80800            <1> 	mov	ax, 8
   383                              <1> comm_int:
   384                              <1> 	; 20/11/2015
   385                              <1> 	; 18/11/2015
   386                              <1> 	; 17/11/2015
   387                              <1> 	; 16/11/2015
   388                              <1> 	; 09/11/2015
   389                              <1> 	; 08/11/2015
   390                              <1> 	; 07/11/2015
   391                              <1> 	; 06/11/2015 (serial4.asm, 'serial')	
   392                              <1> 	; 01/11/2015
   393                              <1> 	; 26/10/2015
   394                              <1> 	; 23/10/2015
   395 0001208F 53                  <1> 	push	ebx
   396 00012090 56                  <1> 	push	esi
   397 00012091 57                  <1> 	push	edi
   398 00012092 1E                  <1> 	push 	ds
   399 00012093 06                  <1> 	push 	es
   400                              <1> 	; 18/11/2015
   401 00012094 0F20DB              <1> 	mov	ebx, cr3
   402 00012097 53                  <1> 	push	ebx ; ****
   403                              <1> 	;
   404 00012098 51                  <1> 	push	ecx ; ***
   405 00012099 52                  <1> 	push	edx ; **
   406                              <1> 	;
   407 0001209A BB10000000          <1> 	mov	ebx, KDATA
   408 0001209F 8EDB                <1> 	mov	ds, bx
   409 000120A1 8EC3                <1> 	mov	es, bx
   410                              <1> 	;
   411 000120A3 8B0D[88780100]      <1> 	mov	ecx, [k_page_dir]
   412 000120A9 0F22D9              <1> 	mov	cr3, ecx
   413                              <1> 	; 20/11/2015
   414                              <1> 	; Interrupt identification register
   415 000120AC 66BAFA02            <1> 	mov	dx, 2FAh ; COM2
   416                              <1> 	;
   417 000120B0 3C08                <1> 	cmp 	al, 8 
   418 000120B2 7702                <1> 	ja 	short com_i0
   419                              <1> 	;
   420                              <1> 	; 20/11/2015
   421                              <1> 	; 17/11/2015
   422                              <1> 	; 16/11/2015
   423                              <1> 	; 15/11/2015
   424                              <1> 	; 24/10/2015
   425                              <1> 	; 14/03/2015 (Retro UNIX 386 v1 - Beginning)
   426                              <1> 	; 28/07/2014 (Retro UNIX 8086 v1)
   427                              <1> 	; < serial port 1 interrupt handler >
   428                              <1> 	;
   429 000120B4 FEC6                <1> 	inc	dh ; 3FAh ; COM1 Interrupt id. register
   430                              <1> com_i0:
   431                              <1> 	;push	eax ; *
   432                              <1> 	; 07/11/2015
   433 000120B6 A2[F2780100]        <1> 	mov 	byte [ccomport], al
   434                              <1> 	; 09/11/2015
   435 000120BB 0FB7D8              <1> 	movzx	ebx, ax ; 8 or 9
   436                              <1> 	; 17/11/2015
   437                              <1>  	; reset request for response status
   438 000120BE 88A3[E8780100]      <1> 	mov	[ebx+req_resp-8], ah ; 0
   439                              <1> 	;
   440                              <1> 	; 20/11/2015
   441 000120C4 EC                  <1> 	in	al, dx		; read interrupt id. register
   442 000120C5 EB00                <1> 	JMP	$+2	   	; I/O DELAY
   443 000120C7 2404                <1> 	and	al, 4		; received data available?	
   444 000120C9 7470                <1> 	jz	short com_eoi	; (transmit. holding reg. empty)
   445                              <1> 	;
   446                              <1> 	; 20/11/2015
   447 000120CB 80EA02              <1> 	sub	dl, 3FAh-3F8h	; data register (3F8h, 2F8h)
   448 000120CE EC                  <1> 	in	al, dx     	; read character
   449                              <1> 	;JMP	$+2	   	; I/O DELAY
   450                              <1> 	; 08/11/2015
   451                              <1> 	; 07/11/2015
   452 000120CF 89DE                <1> 	mov	esi, ebx 
   453 000120D1 89DF                <1> 	mov	edi, ebx
   454 000120D3 81C6[EC780100]      <1> 	add 	esi, rchar - 8 ; points to last received char
   455 000120D9 81C7[EE780100]      <1> 	add	edi, schar - 8 ; points to last sent char
   456 000120DF 8806                <1> 	mov	[esi], al ; received char (current char)
   457                              <1> 	; query
   458 000120E1 20C0                <1> 	and	al, al
   459 000120E3 7527                <1> 	jnz	short com_i2
   460                              <1>    	; response
   461                              <1> 	; 17/11/2015
   462                              <1> 	; set request for response status
   463 000120E5 FE83[E8780100]      <1>         inc     byte [ebx+req_resp-8] ; 1 
   464                              <1> 	;
   465 000120EB 6683C205            <1> 	add	dx, 3FDh-3F8h	; (3FDh, 2FDh)
   466 000120EF EC                  <1> 	in	al, dx	   	; read line status register 
   467 000120F0 EB00                <1> 	JMP	$+2	   	; I/O DELAY
   468 000120F2 2420                <1> 	and	al, 20h	   	; transmitter holding reg. empty?
   469 000120F4 7445                <1> 	jz	short com_eoi 	; no
   470 000120F6 B0FF                <1> 	mov 	al, 0FFh   	; response			
   471 000120F8 6683EA05            <1> 	sub	dx, 3FDh-3F8h 	; data port (3F8h, 2F8h)
   472 000120FC EE                  <1> 	out	dx, al	   	; send on serial port
   473                              <1> 	; 17/11/2015
   474 000120FD 803F00              <1> 	cmp 	byte [edi], 0   ; query ? (schar)
   475 00012100 7502                <1> 	jne 	short com_i1    ; no
   476 00012102 8807                <1> 	mov	[edi], al 	; 0FFh (responded)
   477                              <1> com_i1:
   478                              <1> 	; 17/11/2015
   479                              <1> 	; reset request for response status (again)
   480 00012104 FE8B[E8780100]      <1>         dec     byte [ebx+req_resp-8] ; 0 
   481 0001210A EB2F                <1> 	jmp	short com_eoi
   482                              <1> com_i2:	
   483                              <1> 	; 08/11/2015
   484 0001210C 3CFF                <1> 	cmp 	al, 0FFh	; (response ?)
   485 0001210E 7417                <1> 	je	short com_i3	; (check for response signal)
   486                              <1> 	; 07/11/2015
   487 00012110 3C04                <1> 	cmp	al, 04h	; EOT
   488 00012112 751C                <1> 	jne	short com_i4	
   489                              <1> 	; EOT = 04h (End of Transmit) - 'CTRL + D'
   490                              <1> 	;(an EOT char is supposed as a ctrl+brk from the terminal)
   491                              <1> 	; 08/11/2015
   492                              <1> 		; ptty -> tty 0 to 7 (pseudo screens)
   493 00012114 861D[B6780100]      <1> 	xchg	bl, [ptty]  ; tty number (8 or 9)
   494 0001211A E8AF4CFFFF          <1> 	call 	ctrlbrk
   495 0001211F 861D[B6780100]      <1> 	xchg	[ptty], bl ; (restore ptty value and BL value)
   496                              <1> 	;mov	al, 04h ; EOT
   497                              <1> 	; 08/11/2015
   498 00012125 EB09                <1> 	jmp	short com_i4	
   499                              <1> com_i3:
   500                              <1> 	; 08/11/2015
   501                              <1> 	; If 0FFh has been received just after a query
   502                              <1> 	; (schar, ZERO), it is a response signal.
   503                              <1> 	; 17/11/2015
   504 00012127 803F00              <1>         cmp     byte [edi], 0 ; query ? (schar)
   505 0001212A 7704                <1> 	ja	short com_i4 ; no
   506                              <1> 	; reset query status (schar)
   507 0001212C 8807                <1> 	mov	[edi], al ; 0FFh
   508 0001212E FEC0                <1> 	inc	al ; 0
   509                              <1> com_i4:
   510                              <1> 	; 27/07/2014
   511                              <1> 	; 09/07/2014
   512 00012130 D0E3                <1> 	shl	bl, 1	
   513 00012132 81C3[B8780100]      <1> 	add	ebx, ttychr
   514                              <1> 	; 23/07/2014 (always overwrite)
   515                              <1> 	;;cmp	word [ebx], 0
   516                              <1> 	;;ja	short com_eoi
   517                              <1> 	;
   518 00012138 668903              <1> 	mov	[ebx], ax   ; Save ascii code
   519                              <1> 			    ; scan code = 0
   520                              <1> com_eoi:
   521                              <1> 	;mov	al, 20h
   522                              <1> 	;out	20h, al	   ; end of interrupt
   523                              <1> 	;
   524                              <1> 	; 07/11/2015
   525                              <1>       	;pop	eax ; *
   526 0001213B A0[F2780100]        <1> 	mov	al, byte [ccomport] ; current COM port
   527                              <1> 	 ; al = tty number (8 or 9)
   528 00012140 E80F000000          <1>         call	wakeup
   529                              <1> com_iret:
   530                              <1> 	; 23/10/2015
   531 00012145 5A                  <1> 	pop	edx ; **
   532 00012146 59                  <1> 	pop	ecx ; ***
   533                              <1> 	; 18/11/2015
   534                              <1> 	;pop	eax ; ****
   535                              <1> 	;mov	cr3, eax
   536                              <1> 	;jmp	iiret
   537 00012147 E98FECFEFF          <1> 	jmp	iiretp
   538                              <1> 
   539                              <1> ;iiretp: ; 01/09/2015
   540                              <1> ;	; 28/08/2015
   541                              <1> ;	pop	eax ; (*) page directory
   542                              <1> ;	mov	cr3, eax
   543                              <1> ;iiret:
   544                              <1> ;	; 22/08/2014
   545                              <1> ;	mov	al, 20h ; END OF INTERRUPT COMMAND TO 8259
   546                              <1> ;	out	20h, al	; 8259 PORT
   547                              <1> ;	;
   548                              <1> ;	pop	es
   549                              <1> ;	pop	ds
   550                              <1> ;	pop	edi
   551                              <1> ;	pop	esi
   552                              <1> ;	pop	ebx ; 29/08/2014
   553                              <1> ;	pop 	eax
   554                              <1> ;	iretd
   555                              <1> 
   556                              <1> ; 21/11/2023
   557                              <1> %if 0
   558                              <1> 
   559                              <1> sp_init:
   560                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
   561                              <1> 	; 07/11/2015
   562                              <1> 	; 29/10/2015
   563                              <1> 	; 26/10/2015
   564                              <1> 	; 23/10/2015
   565                              <1> 	; 29/06/2015
   566                              <1> 	; 14/03/2015 (Retro UNIX 386 v1 - 115200 baud)
   567                              <1> 	; 28/07/2014 (Retro UNIX 8086 v1 - 9600 baud)
   568                              <1> 	; Initialization of Serial Port Communication Parameters
   569                              <1> 	; (COM1 base port address = 3F8h, COM1 Interrupt = IRQ 4)
   570                              <1> 	; (COM2 base port address = 2F8h, COM1 Interrupt = IRQ 3)
   571                              <1> 	;
   572                              <1> 	; ((Modified registers: EAX, ECX, EDX, EBX))
   573                              <1> 	;
   574                              <1> 	; INPUT:  (29/06/2015)
   575                              <1> 	;	AL = 0 for COM1
   576                              <1> 	;	     1 for COM2
   577                              <1> 	;	AH = Communication parameters	
   578                              <1> 	;
   579                              <1> 	;  (*) Communication parameters (except BAUD RATE):
   580                              <1> 	;	Bit	4	3	2	1	0
   581                              <1> 	;		-PARITY--   STOP BIT  -WORD LENGTH-	 		 
   582                              <1> 	;  this one -->	00 = none    0 = 1 bit  11 = 8 bits
   583                              <1> 	;		01 = odd     1 = 2 bits	10 = 7 bits
   584                              <1> 	;		11 = even
   585                              <1> 	;  Baud rate setting bits: (29/06/2015)
   586                              <1> 	;		Retro UNIX 386 v1 feature only !
   587                              <1> 	;	Bit	7    6    5  | Baud rate
   588                              <1> 	;		------------------------
   589                              <1> 	;	value	0    0    0  | Default (Divisor = 1)
   590                              <1> 	;		0    0    1  | 9600 (12)
   591                              <1> 	;		0    1    0  | 19200 (6) 
   592                              <1> 	;		0    1	  1  | 38400 (3) 
   593                              <1> 	;		1    0	  0  | 14400 (8)
   594                              <1> 	;		1    0	  1  | 28800 (4)
   595                              <1> 	;		1    1    0  | 57600 (2)
   596                              <1> 	;		1    1    1  | 115200 (1) 	
   597                              <1> 	
   598                              <1> 	; References:	
   599                              <1> 	; (1) IBM PC-XT Model 286 BIOS Source Code
   600                              <1> 	;     RS232.ASM --- 10/06/1985 COMMUNICATIONS BIOS (RS232)
   601                              <1> 	; (2) Award BIOS 1999 - ATORGS.ASM
   602                              <1> 	; (3) http://wiki.osdev.org/Serial_Ports
   603                              <1> 	;
   604                              <1> 	; Set communication parameters for COM1 (= 03h)	
   605                              <1> 	;
   606                              <1> 	mov	ebx, com1p		; COM1 parameters  
   607                              <1> 	mov	dx, 3F8h		; COM1
   608                              <1> 	 ; 29/10/2015
   609                              <1> 	mov	cx, 301h  ; divisor = 1 (115200 baud)
   610                              <1> 	call	sp_i3	; call A4	
   611                              <1> 	test	al, 80h
   612                              <1> 	jz	short sp_i0 ; OK..
   613                              <1> 		; Error !
   614                              <1> 	;mov	dx, 3F8h
   615                              <1> 	sub	dl, 5 ; 3FDh -> 3F8h
   616                              <1> 	mov	cx, 30Eh  ; divisor = 12 (9600 baud)
   617                              <1> 	call	sp_i3	; call A4	
   618                              <1> 	test	al, 80h
   619                              <1> 	jnz	short sp_i1
   620                              <1> sp_i0:
   621                              <1>         ; (Note: Serial port interrupts will be disabled here...)	
   622                              <1>         ; (INT 14h initialization code disables interrupts.)
   623                              <1> 	;
   624                              <1> 	mov	byte [ebx], 0E3h ; 11100011b
   625                              <1> 	call	sp_i5 ; 29/06/2015
   626                              <1> sp_i1:
   627                              <1> 	inc	ebx
   628                              <1> 	mov	dx, 2F8h		; COM2
   629                              <1> 	 ; 29/10/2015
   630                              <1> 	mov	cx, 301h  ; divisor = 1 (115200 baud)
   631                              <1> 	call	sp_i3	; call A4	
   632                              <1> 	test	al, 80h
   633                              <1> 	jz	short sp_i2 ; OK..
   634                              <1> 		; Error !
   635                              <1> 	;mov	dx, 2F8h
   636                              <1> 	sub	dl, 5 ; 2FDh -> 2F8h
   637                              <1> 	mov	cx, 30Eh  ; divisor = 12 (9600 baud)
   638                              <1> 	call	sp_i3	; call A4	
   639                              <1> 	test	al, 80h
   640                              <1> 	jnz	short sp_i7
   641                              <1> sp_i2:
   642                              <1> 	mov	byte [ebx], 0E3h ; 11100011b
   643                              <1> sp_i6:
   644                              <1> 	;; COM2 - enabling IRQ 3
   645                              <1> 	; 29/07/2022
   646                              <1> 	; 07/11/2015
   647                              <1> 	; 26/10/2015
   648                              <1> 	pushf
   649                              <1> 	cli
   650                              <1> 	;
   651                              <1> 	mov	dx, 2FCh   		; modem control register
   652                              <1> 	in	al, dx 	   		; read register
   653                              <1> 	JMP	$+2	   		; I/O DELAY
   654                              <1> 	or	al, 8      		; enable bit 3 (OUT2)
   655                              <1> 	out	dx, al     		; write back to register
   656                              <1> 	JMP	$+2	   		; I/O DELAY
   657                              <1> 	;mov	dx, 2F9h   		; interrupt enable register
   658                              <1> 	; 29/07/2022
   659                              <1> 	mov	dl, 0F9h
   660                              <1> 	in	al, dx     		; read register
   661                              <1> 	JMP	$+2	   		; I/O DELAY
   662                              <1> 	;or	al, 1      		; receiver data interrupt enable and
   663                              <1> 	or	al, 3	   		; transmitter empty interrupt enable
   664                              <1> 	out	dx, al 	   		; write back to register
   665                              <1> 	JMP	$+2        		; I/O DELAY
   666                              <1> 	in	al, 21h    		; read interrupt mask register
   667                              <1> 	JMP	$+2	   		; I/O DELAY
   668                              <1> 	and	al, 0F7h   		; enable IRQ 3 (COM2)
   669                              <1> 	out	21h, al    		; write back to register
   670                              <1> 	;
   671                              <1> 	; 23/10/2015
   672                              <1> 	mov 	eax, com2_int
   673                              <1> 	mov	[com2_irq3], eax
   674                              <1> 	; 26/10/2015
   675                              <1> 	popf	
   676                              <1> sp_i7:
   677                              <1> 	retn
   678                              <1> 
   679                              <1> sp_i3:
   680                              <1> ;A4:  	;-----	INITIALIZE THE COMMUNICATIONS PORT
   681                              <1> 	; 28/10/2015
   682                              <1> 	inc	dl	; 3F9h (2F9h)	; 3F9h, COM1 Interrupt enable register 
   683                              <1> 	mov	al, 0
   684                              <1> 	out	dx, al			; disable serial port interrupt
   685                              <1> 	JMP	$+2			; I/O DELAY
   686                              <1> 	add	dl, 2 	; 3FBh (2FBh)	; COM1 Line control register (3FBh)
   687                              <1> 	mov	al, 80h			
   688                              <1> 	out	dx, al			; SET DLAB=1 ; divisor latch access bit
   689                              <1> 	;-----	SET BAUD RATE DIVISOR
   690                              <1> 	; 26/10/2015
   691                              <1> 	sub 	dl, 3   ; 3F8h (2F8h)	; register for least significant byte
   692                              <1> 					; of the divisor value
   693                              <1> 	mov	al, cl	; 1
   694                              <1> 	out	dx, al			; 1 = 115200 baud (Retro UNIX 386 v1)
   695                              <1> 					; 2 = 57600 baud
   696                              <1> 					; 3 = 38400 baud
   697                              <1> 					; 6 = 19200 baud
   698                              <1> 					; 12 = 9600 baud (Retro UNIX 8086 v1)
   699                              <1> 	JMP	$+2			; I/O DELAY
   700                              <1> 	sub	al, al
   701                              <1> 	inc	dl      ; 3F9h (2F9h)	; register for most significant byte
   702                              <1> 					; of the divisor value
   703                              <1> 	out	dx, al ; 0
   704                              <1> 	JMP	$+2			; I/O DELAY
   705                              <1> 	;	
   706                              <1> 	mov	al, ch ; 3		; 8 data bits, 1 stop bit, no parity
   707                              <1> 	;and	al, 1Fh ; Bits 0,1,2,3,4	
   708                              <1> 	add	dl, 2	; 3FBh (2FBh)	; Line control register
   709                              <1> 	out	dx, al			
   710                              <1> 	JMP	$+2			; I/O DELAY
   711                              <1> 	; 29/10/2015
   712                              <1> 	dec 	dl 	; 3FAh (2FAh)	; FIFO Control register (16550/16750)
   713                              <1> 	xor	al, al			; 0
   714                              <1> 	out	dx, al			; Disable FIFOs (reset to 8250 mode)
   715                              <1> 	JMP	$+2	
   716                              <1> sp_i4:
   717                              <1> ;A18:	;-----	COMM PORT STATUS ROUTINE
   718                              <1> 	; 29/06/2015 (line status after modem status)
   719                              <1> 	add	dl, 4	; 3FEh (2FEh)	; Modem status register
   720                              <1> sp_i4s:
   721                              <1> 	in	al, dx			; GET MODEM CONTROL STATUS
   722                              <1> 	JMP	$+2			; I/O DELAY
   723                              <1> 	mov	ah, al			; PUT IN (AH) FOR RETURN
   724                              <1> 	dec	dl	; 3FDh (2FDh)	; POINT TO LINE STATUS REGISTER
   725                              <1> 					; dx = 3FDh for COM1, 2FDh for COM2
   726                              <1> 	in	al, dx			; GET LINE CONTROL STATUS
   727                              <1> 	; AL = Line status, AH = Modem status
   728                              <1> 	retn
   729                              <1> 
   730                              <1> sp_status:
   731                              <1> 	; 29/06/2015
   732                              <1> 	; 27/06/2015 (Retro UNIX 386 v1)
   733                              <1> 	; Get serial port status
   734                              <1> 	mov	dx, 3FEh		; Modem status register (COM1)
   735                              <1> 	sub	dh, al			; dh = 2 for COM2 (al = 1)
   736                              <1> 					; dx = 2FEh for COM2
   737                              <1> 	jmp	short sp_i4s
   738                              <1> 
   739                              <1> sp_setp: ; Set serial port communication parameters
   740                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
   741                              <1> 	; 07/11/2015
   742                              <1> 	; 29/10/2015
   743                              <1> 	; 29/06/2015
   744                              <1> 	; Retro UNIX 386 v1 feature only !	
   745                              <1> 	;
   746                              <1> 	; INPUT:
   747                              <1> 	;	AL = 0 for COM1
   748                              <1> 	;	     1 for COM2
   749                              <1> 	;	AH = Communication parameters (*)
   750                              <1> 	; OUTPUT:
   751                              <1> 	;	CL = Line status
   752                              <1> 	;	CH = Modem status
   753                              <1> 	;   If cf = 1 -> Error code in [u.error]
   754                              <1> 	;		 'invalid parameter !' 
   755                              <1> 	;		 	 or
   756                              <1> 	;		 'device not ready !' error
   757                              <1> 	;	
   758                              <1> 	;  (*) Communication parameters (except BAUD RATE):
   759                              <1> 	;	Bit	4	3	2	1	0
   760                              <1> 	;		-PARITY--   STOP BIT  -WORD LENGTH-	 		 
   761                              <1> 	;  this one -->	00 = none    0 = 1 bit  11 = 8 bits
   762                              <1> 	;		01 = odd     1 = 2 bits	10 = 7 bits
   763                              <1> 	;		11 = even
   764                              <1> 	;  Baud rate setting bits: (29/06/2015)
   765                              <1> 	;		Retro UNIX 386 v1 feature only !
   766                              <1> 	;	Bit	7    6    5  | Baud rate
   767                              <1> 	;		------------------------
   768                              <1> 	;	value	0    0    0  | Default (Divisor = 1)
   769                              <1> 	;		0    0    1  | 9600 (12)
   770                              <1> 	;		0    1    0  | 19200 (6) 
   771                              <1> 	;		0    1	  1  | 38400 (3) 
   772                              <1> 	;		1    0	  0  | 14400 (8)
   773                              <1> 	;		1    0	  1  | 28800 (4)
   774                              <1> 	;		1    1    0  | 57600 (2)
   775                              <1> 	;		1    1    1  | 115200 (1) 
   776                              <1> 	;
   777                              <1> 	; (COM1 base port address = 3F8h, COM1 Interrupt = IRQ 4)
   778                              <1> 	; (COM2 base port address = 2F8h, COM1 Interrupt = IRQ 3)
   779                              <1> 	;
   780                              <1> 	; ((Modified registers: EAX, ECX, EDX, EBX))
   781                              <1> 	;
   782                              <1> 	mov	dx, 3F8h
   783                              <1> 	mov	ebx, com1p ; COM1 control byte offset
   784                              <1> 	cmp	al, 1
   785                              <1> 	ja 	short sp_invp_err
   786                              <1> 	jb	short sp_setp1 ;  COM1 (AL = 0)
   787                              <1> 	dec	dh ; 2F8h
   788                              <1> 	inc	ebx ; COM2 control byte offset
   789                              <1> sp_setp1:
   790                              <1> 	; 29/10/2015
   791                              <1> 	mov	[ebx], ah
   792                              <1> 	movzx 	ecx, ah
   793                              <1> 	shr	cl, 5 ; -> baud rate index
   794                              <1> 	and	ah, 1Fh ; communication parameters except baud rate
   795                              <1> 	mov	al, [ecx+b_div_tbl]
   796                              <1> 	mov	cx, ax
   797                              <1> 	call	sp_i3
   798                              <1> 	mov	cx, ax ; CL = Line status, CH = Modem status
   799                              <1> 	test	al, 80h
   800                              <1> 	jz	short sp_setp2
   801                              <1>         mov     byte [ebx], 0E3h ; Reset to initial value (11100011b)
   802                              <1> stp_dnr_err:
   803                              <1> 	mov	dword [u.error], ERR_DEV_NOT_RDY ; 'device not ready !'
   804                              <1> 	; CL = Line status, CH = Modem status
   805                              <1> 	stc
   806                              <1> 	retn
   807                              <1> sp_setp2:
   808                              <1> 	cmp	dh, 2 ; COM2 (2F?h)
   809                              <1> 	;jna	sp_i6 
   810                              <1> 		      ; COM1 (3F?h)
   811                              <1> 	; 29/07/2022
   812                              <1> 	ja	short sp_i5
   813                              <1> 	jmp	sp_i6
   814                              <1> sp_i5: 
   815                              <1> 	; 29/07/2022
   816                              <1> 	; 07/11/2015
   817                              <1> 	; 26/10/2015
   818                              <1> 	; 29/06/2015
   819                              <1> 	;
   820                              <1> 	;; COM1 - enabling IRQ 4
   821                              <1> 	pushf
   822                              <1> 	cli
   823                              <1> 	mov	dx, 3FCh   		; modem control register
   824                              <1> 	in	al, dx 	   		; read register
   825                              <1> 	JMP	$+2			; I/O DELAY
   826                              <1> 	or	al, 8      		; enable bit 3 (OUT2)
   827                              <1> 	out	dx, al     		; write back to register
   828                              <1> 	JMP	$+2			; I/O DELAY
   829                              <1> 	;mov	dx, 3F9h   		; interrupt enable register
   830                              <1> 	; 29/07/2022
   831                              <1> 	mov	dl, 0F9h
   832                              <1> 	in	al, dx     		; read register
   833                              <1> 	JMP	$+2			; I/O DELAY
   834                              <1> 	;or	al, 1      		; receiver data interrupt enable and
   835                              <1> 	or	al, 3	   		; transmitter empty interrupt enable
   836                              <1> 	out	dx, al 	   		; write back to register
   837                              <1> 	JMP	$+2        		; I/O DELAY
   838                              <1> 	in	al, 21h    		; read interrupt mask register
   839                              <1> 	JMP	$+2			; I/O DELAY
   840                              <1> 	and	al, 0EFh   		; enable IRQ 4 (COM1)
   841                              <1> 	out	21h, al    		; write back to register
   842                              <1> 	;
   843                              <1> 	; 23/10/2015
   844                              <1> 	mov 	eax, com1_int
   845                              <1> 	mov	[com1_irq4], eax
   846                              <1> 	; 26/10/2015
   847                              <1> 	popf
   848                              <1> 	retn
   849                              <1> 
   850                              <1> sp_invp_err:
   851                              <1> 	mov	dword [u.error], ERR_INV_PARAMETER ; 'invalid parameter !' 
   852                              <1> 	xor	ecx, ecx
   853                              <1> 	dec	ecx ; 0FFFFh
   854                              <1> 	stc
   855                              <1> 	retn
   856                              <1> 
   857                              <1> ; 29/10/2015
   858                              <1> b_div_tbl: ; Baud rate divisor table (115200/divisor)
   859                              <1> 	db 1, 12, 6, 3, 8, 4, 1
   860                              <1> 
   861                              <1> %endif
   862                              <1> 
   863                              <1> ; 23/10/2015
   864                              <1> com1_irq4:
   865 0001214C [54210100]          <1> 	dd dummy_retn
   866                              <1> com2_irq3:
   867 00012150 [54210100]          <1> 	dd dummy_retn
   868                              <1> 
   869                              <1> ; 21/11/2023
   870                              <1> dummy_retn:
   871                              <1> 	;retn
   872                              <1> wakeup:
   873                              <1> 	; 24/01/2016
   874 00012154 C3                  <1> 	retn
   875                              <1> 
   876                              <1> set_working_path_x:
   877                              <1> 		; 17/10/2016 (TRDOS 386 - FFF & FNF)
   878                              <1> 		;mov	ax, 1 
   879                              <1> 			; File name is needed/forced (AL=1)
   880                              <1> 			; Change directory as temporary (AH=0)	
   881                              <1> 		; 29/07/2022
   882 00012155 31C0                <1> 		xor	eax, eax
   883 00012157 FEC0                <1> 		inc	al
   884                              <1> 		; eax = 1
   885                              <1> set_working_path_xx: ; 30/12/2017 (syschdir)
   886                              <1> 		; This is needed for preventing wrong Find Next File
   887                              <1> 		; system call after sysopen, syscreate, sysmkdir etc. 
   888                              <1> 		; Find Next File must immediate follow Find First File)
   889                              <1> 
   890 00012159 8825[38850100]      <1> 		mov	[FFF_Valid], ah ; 0 ; reset ; 17/10/2016
   891                              <1> 
   892                              <1> set_working_path:
   893                              <1> 		; 08/08/2022
   894                              <1> 		; 29/07/2022 - TRDOS 386 Kernel v2.0.5
   895                              <1> 		; 16/10/2016
   896                              <1> 		; 12/10/2016
   897                              <1> 		; 10/10/2016
   898                              <1> 		; 05/10/2016 - TRDOS 386 (TRDOS v2.0)
   899                              <1> 		;
   900                              <1> 		; TRDOS v1.0 (DIR.ASM, "proc_set_working_path")
   901                              <1>                 ; 27/01/2011 - 08/02/2011 
   902                              <1> 		; Set/Changes current drive, directory and file
   903                              <1> 		; depending on command tail
   904                              <1> 		; (procedure is derivated from CMD_INTR.ASM 
   905                              <1> 		; file or dir locating code of internal commands)
   906                              <1> 		; (This procedure is prepared for INT 21H file/dir 
   907                              <1> 		; functions and also to get compact code for 
   908                              <1> 		; internal mainprog -command interpreter- commands)
   909                              <1> 		; 
   910                              <1> 		; INPUT: DS:SI -> Command tail (ASCIIZ string)
   911                              <1> 		; AL = 0 -> any, AL > 0 -> file name is forced
   912                              <1> 		; AH = CD -> Change directory permanently 
   913                              <1> 		; AH <> CD -> Change directory as temporary    
   914                              <1> 		; 
   915                              <1> 		; OUTPUT: ES=DS, FindFile structure has been set
   916                              <1> 		;        RUN_CDRV points previous current drive  
   917                              <1> 		;        DS:SI = FindFile structure address
   918                              <1> 		;        (DS=CS)       
   919                              <1> 		;        AX, BX, CX, DX, DI will be changed
   920                              <1> 		;   cf = 1 -> Error code in AX (AL)
   921                              <1> 		;        stc & AX = 0 -> Bad command or path name 
   922                              <1> 		; -----------------------------------------------
   923                              <1> 		;
   924                              <1> 		; TRDOS 386 (05/10/2016)
   925                              <1> 		; INPUT:
   926                              <1> 		;	ESI = File/Directory Path (ASCIIZ string)
   927                              <1> 		;             address in user's memory space
   928                              <1> 		;       AL = 0 -> any
   929                              <1> 		;       AL > 0 -> file name is forced
   930                              <1> 		;       AH = CD -> change directory as permanent
   931                              <1> 		;       AH <> CD -> change directory as temporary
   932                              <1> 		; 
   933                              <1> 		; OUTPUT:
   934                              <1> 		;	FindFile structure has been set
   935                              <1> 		;       RUN_CDRV points previous current drive  
   936                              <1> 		;       ESI = FindFile_Name address ; 12/10/2016
   937                              <1> 		;
   938                              <1> 		;       cf = 1 -> Error code in EAX (AL)
   939                              <1> 		;       stc & EAX = 0 -> Bad command or path name
   940                              <1> 		;  
   941                              <1> 		; Modified registers: EAX, EBX, ECX, EDX, ESI, EDI
   942                              <1> 
   943 0001215F 66A3[3C850100]      <1> 		mov	[SWP_Mode], ax
   944 00012165 A0[4A790100]        <1> 		mov	al, [Current_Drv]
   945 0001216A 30E4                <1> 		xor	ah, ah
   946 0001216C 66A3[3E850100]      <1> 		mov	[SWP_DRV], ax
   947                              <1> 
   948                              <1> 		; TRDOS 386 ring 3 (user's page directory)
   949                              <1> 		; to ring 0 (kernel's page directory) 
   950                              <1> 		; transfer modifications (05/10/2016).
   951                              <1> 
   952 00012172 55                  <1> 		push	ebp
   953 00012173 89E5                <1> 		mov	ebp, esp
   954                              <1> 		
   955                              <1> 		;mov	ecx, 128 ; maximum path length = 128 bytes
   956                              <1> 		; 29/07/2022
   957 00012175 31C9                <1> 		xor	ecx, ecx
   958 00012177 B180                <1> 		mov	cl, 128
   959 00012179 29CC                <1> 		sub	esp, ecx ; reserve 128 bytes (buffer) on stack
   960 0001217B 89E7                <1> 		mov	edi, esp ; destination address (kernel space)
   961                              <1> 		; esi = source address (virtual, in user's memory space)
   962 0001217D E859EDFFFF          <1> 		call	transfer_from_user_buffer
   963 00012182 720D                <1> 		jc	short loc_swp_xor_retn 
   964                              <1> 		
   965 00012184 89E6                <1> 		mov	esi, esp ; temporary buffer (the path) on stack
   966                              <1> loc_swp_fchar:
   967 00012186 8A06                <1> 		mov	al, [esi]
   968 00012188 3C20                <1> 		cmp	al, 20h
   969 0001218A 7711                <1> 		ja	short loc_swp_parse_path_name
   970                              <1> 		;je	short loc_swp_fchar_next
   971                              <1> 		; 29/07/2022
   972 0001218C 7203                <1> 		jb	short loc_swp_xor_retn
   973                              <1> 
   974                              <1> loc_swp_fchar_next:
   975 0001218E 46                  <1> 		inc	esi
   976 0001218F EBF5                <1> 		jmp	short loc_swp_fchar
   977                              <1> 
   978                              <1> loc_swp_xor_retn:
   979 00012191 31C0                <1> 		xor	eax, eax
   980 00012193 F9                  <1> 		stc
   981                              <1> loc_swp_retn:
   982 00012194 89EC                <1> 		mov	esp, ebp
   983 00012196 5D                  <1> 		pop	ebp
   984                              <1> 
   985                              <1> 		;mov	esi, FindFile_Drv
   986 00012197 BE[2C820100]        <1> 		mov	esi, FindFile_Name ; 12/10/2016
   987 0001219C C3                  <1> 		retn 
   988                              <1> 
   989                              <1> ;loc_swp_fchar_next:
   990                              <1> ;		inc	esi
   991                              <1> ;		jmp	short loc_swp_fchar  
   992                              <1> 
   993                              <1> loc_swp_parse_path_name:
   994 0001219D BF[EA810100]        <1> 		mov	edi, FindFile_Drv
   995 000121A2 E8958AFFFF          <1> 		call	parse_path_name
   996 000121A7 72EB                <1> 		jc	short loc_swp_retn
   997                              <1> 
   998                              <1> loc_swp_checkfile_name:
   999 000121A9 803D[3C850100]00    <1> 		cmp	byte [SWP_Mode], 0
  1000 000121B0 761E                <1> 		jna	short loc_swp_drv
  1001                              <1> 
  1002                              <1> 		; 10/10/2016 (valid file name checking)
  1003 000121B2 BE[2C820100]        <1> 		mov	esi, FindFile_Name
  1004 000121B7 803E20              <1> 		cmp	byte [esi], 20h
  1005 000121BA 76D5                <1> 		jna	short loc_swp_xor_retn
  1006                              <1> 
  1007                              <1> 		; 16/10/2016
  1008 000121BC C605[3B850100]00    <1> 		mov	byte [SWP_inv_fname], 0 ; reset 
  1009                              <1> 		; esi = file name address (ASCIIZ)
  1010 000121C3 E8556DFFFF          <1> 		call	check_filename
  1011 000121C8 7306                <1> 		jnc	short loc_swp_drv
  1012                              <1> 
  1013 000121CA FE05[3B850100]      <1> 		inc	byte [SWP_inv_fname] ; set 	
  1014                              <1> loc_swp_drv:
  1015 000121D0 8A35[4A790100]      <1> 		mov	dh, [Current_Drv]
  1016                              <1>                ;mov	[RUN_CDRV], dh
  1017                              <1> 
  1018 000121D6 8A15[EA810100]      <1> 		mov	dl, [FindFile_Drv]
  1019                              <1>                ;cmp	dl, dh
  1020 000121DC 3A15[4A790100]      <1> 		cmp	dl, [Current_Drv]
  1021 000121E2 740D                <1> 		je	short loc_swp_change_directory
  1022                              <1> 
  1023 000121E4 FE05[3F850100]      <1> 		inc	byte [SWP_DRV_chg]
  1024 000121EA E89C56FFFF          <1> 		call	change_current_drive
  1025 000121EF 72A3                <1> 		jc	short loc_swp_retn ; eax = error code
  1026                              <1> 		; eax = 0
  1027                              <1> 
  1028                              <1> loc_swp_change_directory:
  1029 000121F1 803D[EB810100]21    <1> 		cmp	byte [FindFile_Directory], 21h
  1030 000121F8 F5                  <1> 		cmc
  1031 000121F9 7399                <1> 		jnc	short loc_swp_retn
  1032                              <1> 
  1033 000121FB FE05[3F850100]      <1> 		inc	byte [SWP_DRV_chg]
  1034 00012201 FE05[BD300100]      <1> 		inc	byte [Restore_CDIR]
  1035 00012207 BE[EB810100]        <1> 		mov	esi, FindFile_Directory
  1036 0001220C 8A25[3D850100]      <1> 		mov	ah, [SWP_Mode+1] 
  1037 00012212 E83984FFFF          <1> 		call	change_current_directory
  1038                              <1> 		;jc	short loc_swp_retn ; eax = error code
  1039                              <1> 		; 08/08/2022
  1040 00012217 7305                <1> 		jnc	short loc_swp_change_prompt_dir_string
  1041 00012219 E976FFFFFF          <1> 		jmp	loc_swp_retn	
  1042                              <1> 
  1043                              <1> loc_swp_change_prompt_dir_string:
  1044                              <1> 		; esi = PATH_Array
  1045                              <1> 		; eax = Current Directory First Cluster
  1046                              <1> 		; edi = Logical DOS Drive Description Table	
  1047 0001221E E85B83FFFF          <1> 		call	change_prompt_dir_str 
  1048 00012223 29C0                <1> 		sub	eax, eax ; 0
  1049 00012225 E96AFFFFFF          <1> 		jmp	loc_swp_retn 
  1050                              <1> 
  1051                              <1> reset_working_path:
  1052                              <1> 		; 06/10/2016 - TRDOS 386 (TRDOS v2.0)
  1053                              <1> 		;
  1054                              <1> 		; TRDOS v1.0 (DIR.ASM, "proc_reset_working_path")
  1055                              <1> 		; 05/02/2011 - 08/02/2011 
  1056                              <1> 		;
  1057                              <1> 		; Restores current drive and directory 
  1058                              <1> 		; 
  1059                              <1> 		; INPUT: none
  1060                              <1> 		; OUTPUT: DL = SWP_DRV, EAX = 0 -> OK
  1061                              <1> 		;
  1062                              <1> 		;    AX = 0 -> ESI = Logical Dos Drv Desc. Table
  1063                              <1> 		;
  1064                              <1> 		;    EAX, EBX, ECX, EDX, ESI, EDI will be changed
  1065                              <1> 		;
  1066                              <1> 
  1067                              <1>   
  1068 0001222A 31C0                <1> 		xor	eax, eax
  1069 0001222C 48                  <1> 		dec	eax 
  1070                              <1> 
  1071 0001222D 668B15[3E850100]    <1> 		mov	dx, [SWP_DRV]
  1072 00012234 08F6                <1> 		or	dh, dh
  1073 00012236 742E                <1> 		jz	short loc_rwp_return
  1074                              <1> 
  1075 00012238 3A15[4A790100]      <1> 		cmp	dl, [Current_Drv]
  1076 0001223E 7407                <1> 		je	short loc_rwp_restore_cdir
  1077                              <1> loc_rwp_restore_cdrv:
  1078 00012240 E84656FFFF          <1> 		call	change_current_drive 
  1079 00012245 EB10                <1> 		jmp	short loc_rwp_restore_ok
  1080                              <1> loc_rwp_restore_cdir:
  1081 00012247 31DB                <1> 		xor	ebx, ebx
  1082 00012249 88D7                <1> 		mov	bh, dl
  1083 0001224B BE00010900          <1> 		mov	esi, Logical_DOSDisks
  1084 00012250 01DE                <1> 		add	esi, ebx
  1085                              <1> 
  1086 00012252 E8EA56FFFF          <1> 		call	restore_current_directory
  1087                              <1> 
  1088                              <1> loc_rwp_restore_ok:
  1089 00012257 668B15[3E850100]    <1> 		mov	dx, [SWP_DRV]
  1090 0001225E 31C0                <1> 		xor	eax, eax  
  1091 00012260 66A3[3F850100]      <1> 		mov	[SWP_DRV_chg], ax
  1092                              <1> loc_rwp_return:
  1093 00012266 C3                  <1> 		retn
  1094                              <1> 
  1095                              <1> get_file_name:
  1096                              <1> 		; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  1097                              <1> 		; 15/10/2016 - TRDOS 386 (TRDOS v2.0)
  1098                              <1> 		; Convert file name 
  1099                              <1> 		;	from directory entry format
  1100                              <1>                 ; 	to (8.3) dot file name format 
  1101                              <1> 		;
  1102                              <1> 		; TRDOS v1.0 (DIR.ASM, "get_file_name")
  1103                              <1>                 ; 2005 - 09/10/2011 	
  1104                              <1> 		; INPUT: 
  1105                              <1> 		;	DS:SI -> Directory Entry Format File Name
  1106                              <1> 		;       ES:DI -> DOS Dot File Name Address
  1107                              <1> 		; OUTPUT:
  1108                              <1> 		;	DS:SI -> DOS Dot File Name Address
  1109                              <1>                 ;	ES:DI -> Directory Entry Format File Name
  1110                              <1> 		;	
  1111                              <1> 		; TRDOS 386 (15/10/2016)
  1112                              <1> 		; INPUT:
  1113                              <1> 		;	ESI = File name addr in dir entry format
  1114                              <1> 		;	EDI = Dot file name address (destination)
  1115                              <1> 		; OUTPUT: 
  1116                              <1> 		;	File name is converted and moved
  1117                              <1> 		;	to destination (as 8.3 dot filename)
  1118                              <1> 		;  
  1119                              <1> 		; Modified registers: EAX, ECX
  1120                              <1> 
  1121                              <1>                 ; 2005 (TRDOS 8086) - 2016 (TRDOS 386)
  1122                              <1>                             
  1123 00012267 57                  <1> 		push	edi
  1124 00012268 56                  <1> 		push	esi
  1125 00012269 AC                  <1> 		lodsb
  1126 0001226A 3C20                <1> 		cmp	al, 20h
  1127 0001226C 7629                <1> 		jna	short pass_gfn_ext
  1128 0001226E 56                  <1> 		push	esi
  1129 0001226F AA                  <1> 		stosb
  1130                              <1> 		;mov	ecx, 7
  1131                              <1> 		; 29/07/2022
  1132 00012270 31C9                <1> 		xor	ecx, ecx
  1133 00012272 B107                <1> 		mov	cl, 7
  1134                              <1> loc_gfn_next_char:
  1135 00012274 AC                  <1> 		lodsb
  1136 00012275 3C20                <1> 		cmp	al, 20h
  1137 00012277 7603                <1> 		jna	short pass_gfn_fn
  1138 00012279 AA                  <1> 		stosb
  1139 0001227A E2F8                <1> 		loop	loc_gfn_next_char
  1140                              <1> pass_gfn_fn:
  1141 0001227C 5E                  <1> 		pop	esi
  1142 0001227D 83C607              <1> 		add	esi, 7
  1143 00012280 AC                  <1> 		lodsb
  1144 00012281 3C20                <1> 		cmp	al, 20h
  1145 00012283 7612                <1> 		jna	short pass_gfn_ext
  1146 00012285 B42E                <1> 		mov	ah, '.'
  1147 00012287 86E0                <1> 		xchg	ah, al
  1148 00012289 66AB                <1> 		stosw
  1149 0001228B AC                  <1> 		lodsb
  1150 0001228C 3C20                <1> 		cmp	al, 20h
  1151 0001228E 7607                <1> 		jna	short pass_gfn_ext
  1152 00012290 AA                  <1> 		stosb
  1153 00012291 AC                  <1> 		lodsb
  1154 00012292 3C20                <1> 		cmp	al, 20h
  1155 00012294 7601                <1> 		jna	short pass_gfn_ext
  1156 00012296 AA                  <1> 		stosb
  1157                              <1> pass_gfn_ext:		
  1158 00012297 30C0                <1> 		xor	al, al
  1159 00012299 AA                  <1> 		stosb
  1160 0001229A 5E                  <1> 		pop	esi
  1161 0001229B 5F                  <1> 		pop	edi
  1162 0001229C C3                  <1> 		retn
  1163                              <1> 
  1164                              <1> set_hardware_int_vector:
  1165                              <1> 		; 18/03/2017
  1166                              <1> 		; 03/03/2017
  1167                              <1> 		; 28/02/2017 - TRDOS 386 (TRDOS v2.0)
  1168                              <1> 		;
  1169                              <1> 		; SET/RESET HARDWARE INTERRUPT GATE
  1170                              <1> 		;
  1171                              <1> 		; Changes interrupt gate descriptor table
  1172                              <1> 		; (without changing default interrupt list)
  1173                              <1> 		;
  1174                              <1> 		; INPUT:
  1175                              <1> 		;	AL = IRQ number (0 to 15)
  1176                              <1> 		;	AH > 0 -> set
  1177                              <1> 		;	AH = 0 -> reset
  1178                              <1> 		;	
  1179                              <1> 		; Modified registers: eax, ebx, edx, edi 
  1180                              <1> 		;
  1181                              <1> 		
  1182 0001229D C0E002              <1> 		shl	al, 2 ; IRQ number * 4
  1183 000122A0 0FB6D8              <1> 		movzx	ebx, al
  1184                              <1> 
  1185 000122A3 08E4                <1> 		or	ah, ah
  1186 000122A5 7508                <1> 		jnz	short shintv_1 ; set (for user call service)
  1187                              <1> 		
  1188                              <1> 		; 18/03/2017
  1189 000122A7 81C3[A8380100]      <1> 		add	ebx, IRQ_list ; reset to default interrupt list
  1190 000122AD EB06                <1> 		jmp	short shintv_2
  1191                              <1> shintv_1:
  1192 000122AF 81C3[D6220100]      <1> 		add	ebx, IRQ_u_list
  1193                              <1> shintv_2:	
  1194 000122B5 8B13                <1> 		mov	edx, [ebx] ; IRQ handler address
  1195                              <1> 		
  1196                              <1> 		; 03/03/2017
  1197 000122B7 D0E0                <1> 		shl	al, 1 ; IRQ number * 8 
  1198                              <1> 		; 18/03/2017
  1199 000122B9 0FB6F8              <1> 		movzx	edi, al 
  1200 000122BC 81C7[A0760100]      <1> 		add	edi, idt + (8*32) ; IRQ 0 offset = idt + 256
  1201                              <1> 		
  1202 000122C2 89D0                <1> 		mov	eax, edx ; IRQ handler address
  1203 000122C4 BB00000800          <1> 		mov	ebx, 80000h
  1204                              <1> 
  1205                              <1> 		;mov	edx, eax
  1206 000122C9 66BA008E            <1> 		mov	dx, 8E00h
  1207 000122CD 6689C3              <1> 		mov	bx, ax
  1208 000122D0 89D8                <1> 		mov	eax, ebx ; /* selector = 0x0008 = cs */
  1209                              <1>        			         ; /* interrupt gate - dpl=0, present */
  1210 000122D2 AB                  <1> 		stosd	; selector & offset bits 0-15 	
  1211 000122D3 8917                <1> 		mov	[edi], edx ; attributes & offset bits 16-23
  1212                              <1> 
  1213 000122D5 C3                  <1> 		retn
  1214                              <1> IRQ_u_list:
  1215                              <1> 		; 28/02/2017
  1216 000122D6 [88090000]          <1> 		dd	timer_int
  1217 000122DA [E4100000]          <1> 		dd	kb_int
  1218 000122DE [6B0B0000]          <1> 		dd	irq2
  1219 000122E2 [16230100]          <1> 		dd	IRQ_service3
  1220 000122E6 [20230100]          <1> 		dd	IRQ_service4
  1221 000122EA [2A230100]          <1> 		dd	IRQ_service5
  1222 000122EE [514E0000]          <1> 		dd	fdc_int	
  1223 000122F2 [34230100]          <1> 		dd	IRQ_service7
  1224 000122F6 [F30A0000]          <1> 		dd	rtc_int
  1225 000122FA [3E230100]          <1> 		dd	IRQ_service9
  1226 000122FE [48230100]          <1> 		dd	IRQ_service10
  1227 00012302 [52230100]          <1> 		dd	IRQ_service11
  1228 00012306 [5C230100]          <1> 		dd	IRQ_service12
  1229 0001230A [66230100]          <1> 		dd	IRQ_service13
  1230 0001230E [71570000]          <1> 		dd	hdc1_int
  1231 00012312 [94570000]          <1> 		dd	hdc2_int
  1232                              <1> 
  1233                              <1> 		; 03/03/2017
  1234                              <1> 		; 27/02/2017
  1235                              <1> IRQ_service3:
  1236 00012316 36C605[AC8A0100]03  <1> 		mov	byte [ss:IRQnum], 3
  1237 0001231E EB4E                <1> 		jmp	short IRQ_service
  1238                              <1> IRQ_service4:
  1239 00012320 36C605[AC8A0100]04  <1> 		mov	byte [ss:IRQnum], 4
  1240 00012328 EB44                <1> 		jmp	short IRQ_service
  1241                              <1> IRQ_service5:
  1242 0001232A 36C605[AC8A0100]05  <1> 		mov	byte [ss:IRQnum], 5
  1243 00012332 EB3A                <1> 		jmp	short IRQ_service
  1244                              <1> IRQ_service7:
  1245 00012334 36C605[AC8A0100]07  <1> 		mov	byte [ss:IRQnum], 7
  1246 0001233C EB30                <1> 		jmp	short IRQ_service
  1247                              <1> IRQ_service9:
  1248 0001233E 36C605[AC8A0100]09  <1> 		mov	byte [ss:IRQnum], 9
  1249 00012346 EB26                <1> 		jmp	short IRQ_service
  1250                              <1> IRQ_service10:
  1251 00012348 36C605[AC8A0100]0A  <1> 		mov	byte [ss:IRQnum], 10
  1252 00012350 EB1C                <1> 		jmp	short IRQ_service
  1253                              <1> IRQ_service11:
  1254 00012352 36C605[AC8A0100]0B  <1> 		mov	byte [ss:IRQnum], 11
  1255 0001235A EB12                <1> 		jmp	short IRQ_service
  1256                              <1> IRQ_service12:
  1257 0001235C 36C605[AC8A0100]0C  <1> 		mov	byte [ss:IRQnum], 12
  1258 00012364 EB08                <1> 		jmp	short IRQ_service
  1259                              <1> IRQ_service13:
  1260 00012366 36C605[AC8A0100]0D  <1> 		mov	byte [ss:IRQnum], 13
  1261                              <1> 		;jmp	short IRQ_service
  1262                              <1> IRQ_service:
  1263                              <1> 		; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  1264                              <1> 		; 13/06/2017
  1265                              <1> 		; 11/06/2017
  1266                              <1> 		; 10/06/2017
  1267                              <1> 		; 01/03/2017, 04/03/2017
  1268                              <1> 		; 27/02/2017, 28/02/2017
  1269 0001236E 1E                  <1> 		push	ds
  1270 0001236F 06                  <1> 		push	es
  1271 00012370 0FA0                <1> 		push	fs
  1272 00012372 0FA8                <1> 		push	gs
  1273                              <1> 
  1274 00012374 60                  <1> 		pushad	; eax,ecx,edx,ebx,esp,ebp,esi,edi
  1275 00012375 66B91000            <1> 		mov     cx, KDATA
  1276 00012379 8ED9                <1>         	mov     ds, cx
  1277 0001237B 8EC1                <1>         	mov     es, cx
  1278 0001237D 8EE1                <1>         	mov     fs, cx
  1279 0001237F 8EE9                <1>         	mov     gs, cx
  1280                              <1> 
  1281 00012381 0F20D8              <1> 		mov	eax, cr3
  1282 00012384 A3[A88A0100]        <1> 		mov	[IRQ_cr3], eax
  1283                              <1> 
  1284 00012389 A1[88780100]        <1> 		mov	eax, [k_page_dir]
  1285 0001238E 0F22D8              <1> 		mov	cr3, eax 
  1286                              <1> 
  1287 00012391 A0[AC8A0100]        <1> 		mov	al, [IRQnum]
  1288                              <1> 
  1289                              <1> 		;mov	cl, [sysflg]
  1290                              <1> 		;mov	[u.r_mode], cl  ; system (0) or user mode (FFh) 
  1291                              <1> IRQsrv_0:
  1292 00012396 0FB6D8              <1> 		movzx	ebx, al
  1293 00012399 8A9B[E0370100]      <1> 		mov	bl, [ebx+IRQenum] ; IRQ (available) index number + 1
  1294                              <1> 		; 01/03/2017
  1295 0001239F FECB                <1> 		dec	bl  ; IRQ index number, 0 to 8
  1296                              <1> 		;js	IRQsrv_5 ; not available to use here!?
  1297                              <1> 		; 29/07/2022
  1298 000123A1 785E                <1> 		js	short IRQsrv_j5  ; (jump to IRQsrv_5)		
  1299                              <1> 		;		 
  1300 000123A3 80BB[728A0100]80    <1> 		cmp	byte [ebx+IRQ.method], 80h ; using by a dev or kernel? 
  1301 000123AA 7205                <1> 		jb	short IRQsrv_1 ; no
  1302                              <1> 
  1303                              <1> 		; If the IRQ service is already owned by TRDOS 386 kernel
  1304                              <1> 		;	 or a Device driver
  1305                              <1> 		; we need to call 'dev_IRQ_service'
  1306                              <1> 
  1307                              <1> 		; IRQ number in AL
  1308 000123AC E80E010000          <1> 		call	dev_IRQ_service	 ; IRQ service for device drivers	
  1309                              <1> 		; IRQ number in AL
  1310                              <1> IRQsrv_1:		
  1311                              <1> 		; check user callback service status
  1312                              <1> 		; AL = IRQ number
  1313                              <1> 		; EBX = IRQ (Available) Index number
  1314                              <1> 
  1315 000123B1 A2[97900100]        <1> 		mov	[u.irqwait], al ; set waiting IRQ flag
  1316                              <1> 
  1317 000123B6 8A83[608A0100]      <1> 		mov	al, [ebx+IRQ.owner]
  1318 000123BC 20C0                <1> 		and	al, al
  1319                              <1> 		;jz	IRQsrv_5 ; it is not owned by a user/proc
  1320                              <1> 		; 29/07/2022
  1321 000123BE 7441                <1> 		jz	short IRQsrv_j5  ; (jump to IRQsrv_5)
  1322                              <1> 
  1323                              <1> 		; 03/03/2017
  1324 000123C0 89DA                <1> 		mov	edx, ebx
  1325 000123C2 C0E202              <1> 		shl	dl, 2
  1326 000123C5 8B92[848A0100]      <1> 		mov	edx, [edx+IRQ.addr] ; S.R.B. or Callback service addr
  1327                              <1> 		
  1328 000123CB 8AA3[728A0100]      <1> 		mov	ah, [ebx+IRQ.method]
  1329 000123D1 F6C401              <1> 		test	ah, 1
  1330 000123D4 7530                <1> 		jnz	short IRQsrv_4 ; Callback service method
  1331                              <1> 
  1332                              <1> 		; Signal Response Byte method
  1333                              <1> 		;mov	edx, [edx+IRQ.addr] ; Signal Response Byte address
  1334                              <1> 		;			    ; (Physical address, non-swappable) 	
  1335 000123D6 80E402              <1> 		and	ah, 2 ; bit 1, (S.R.B.) counter (auto increment) method
  1336 000123D9 8AA3[7B8A0100]      <1> 		mov	ah, [ebx+IRQ.srb] ; Signal Response Byte value
  1337 000123DF 7408                <1> 		jz	short IRQsrv_2 ; fixed S.R.B. value
  1338                              <1> 		; counter method (auto increment)
  1339 000123E1 FEC4                <1> 		inc	ah
  1340 000123E3 88A3[7B8A0100]      <1> 		mov	[ebx+IRQ.srb], ah ; next (count) number
  1341                              <1> IRQsrv_2:
  1342 000123E9 8822                <1> 		mov	[edx], ah ; put S.R.B. val to the user's S.R.B. addr
  1343 000123EB C605[97900100]00    <1> 		mov	byte [u.irqwait], 0 ; clear waiting IRQ flag
  1344                              <1> 
  1345 000123F2 3A05[71900100]      <1> 		cmp	al, [u.uno]
  1346                              <1> 		;je	IRQsrv_5 ; the owner is current user/process
  1347                              <1> 		; 29/07/2022
  1348 000123F8 7407                <1> 		je	short IRQsrv_j5  ; (jump to IRQsrv_5)
  1349                              <1> IRQsrv_3:
  1350                              <1> 		; the owner is not current user/process
  1351                              <1> 		; AL = process number
  1352 000123FA B202                <1> 		mov	dl, 2 ; priority, 2 = event (high)	
  1353 000123FC E894FBFFFF          <1> 		call	set_run_sequence
  1354                              <1> 
  1355                              <1> 		; [u.irqwait] = waiting IRQ number for callback service
  1356                              <1> IRQsrv_j5:		; 29/07/2022
  1357 00012401 E998000000          <1> 		jmp	IRQsrv_5
  1358                              <1> IRQsrv_4:
  1359 00012406 3A05[71900100]      <1> 		cmp	al, [u.uno]  ; is the owner is current user/process?
  1360 0001240C 75EC                <1> 		jne	short IRQsrv_3 ; no !
  1361                              <1> 
  1362                              <1> 		; Check if an IRQ callback service already in progress
  1363 0001240E 803D[98900100]00    <1> 		cmp	byte [u.r_lock], 0
  1364                              <1> 		;ja	IRQsrv_5 ; nothing to do !  
  1365                              <1> 				     ; (we need to complete prev callback)
  1366                              <1> 		; 29/07/2022
  1367 00012415 77EA                <1> 		ja	short IRQsrv_j5  ; (jump to IRQsrv_5)
  1368                              <1> 
  1369 00012417 803D[94900100]00    <1> 		cmp	byte [u.t_lock], 0
  1370 0001241E 777E                <1> 		ja	short IRQsrv_5 ; nothing to do !  
  1371                              <1> 				     ; (we need to complete timer callback)
  1372                              <1> 
  1373                              <1> 		; 04/03/2017
  1374 00012420 C605[97900100]00    <1> 		mov	byte [u.irqwait], 0 ; reset/clear waiting IRQ flag
  1375                              <1> 
  1376 00012427 FE05[98900100]      <1> 		inc	byte [u.r_lock] ; 'IRQ callback service in progress' flag
  1377                              <1> 
  1378 0001242D 8A0D[14900100]      <1> 		mov	cl, [sysflg]   ; (system call) mode flag (kernel/user)
  1379 00012433 880D[99900100]      <1> 		mov	[u.r_mode], cl ; system mode (0) or user mode (FFh)
  1380                              <1> 
  1381                              <1> 		; 
  1382 00012439 8B2D[24780100]      <1> 		mov	ebp, [tss.esp0] ; kernel stack address (for ring 0)
  1383 0001243F 83ED14              <1> 		sub	ebp, 20		; eip, cs, eflags, esp, ss
  1384 00012442 892D[18900100]      <1> 	 	mov	[u.sp], ebp
  1385 00012448 8925[1C900100]      <1> 		mov	[u.usp], esp
  1386                              <1> 
  1387                              <1> 		;or	word [ebp+8], 200h ; 22/01/2017, force enabling interrupts
  1388                              <1> 
  1389 0001244E 8B44241C            <1> 		mov	eax, [esp+28] ; pushed eax
  1390 00012452 A3[20900100]        <1> 		mov	[u.r0], eax
  1391                              <1> 
  1392 00012457 E8F1E8FFFF          <1> 		call	wswap ; save user's registers & status
  1393                              <1> 
  1394                              <1> 		; software int is in ring 0 but IRQ handler must return to ring 3
  1395                              <1> 		; so, ring 3 return address and stack registers
  1396                              <1> 		; (eip, cs, eflags, esp, ss) 
  1397                              <1> 		; must be copied to IRQ handler return
  1398                              <1> 		; eip will be replaced by callback service routine address
  1399                              <1> 
  1400 0001245C C605[14900100]FF    <1> 		mov	byte [sysflg], 0FFh ; user mode
  1401                              <1> 
  1402                              <1> 		; system mode (system call)
  1403                              <1> 		;mov	ebp, [u.sp] ; EIP (u), CS (UCODE), EFLAGS (u),
  1404                              <1> 				    ; ESP (u), SS (UDATA)
  1405                              <1> 
  1406 00012463 8B4510              <1> 		mov	eax, [ebp+16]	; SS (UDATA)
  1407 00012466 89E6                <1> 		mov	esi, esp
  1408 00012468 50                  <1> 		push	eax
  1409 00012469 50                  <1> 		push	eax
  1410 0001246A 89E7                <1> 		mov	edi, esp
  1411 0001246C 893D[1C900100]      <1> 		mov	[u.usp], edi
  1412 00012472 B908000000          <1> 		mov	ecx, ((ESPACE/4) - 4) ; except DS, ES, FS, GS
  1413 00012477 F3A5                <1> 		rep	movsd
  1414 00012479 B104                <1> 		mov	cl, 4	
  1415 0001247B F3AB                <1> 		rep	stosd
  1416 0001247D 893D[18900100]      <1> 		mov	[u.sp], edi
  1417 00012483 89EE                <1> 		mov	esi, ebp
  1418 00012485 B105                <1> 		mov	cl, 5 ; EIP (u), CS (UCODE), EFLAGS (u), ESP (u), SS (UDATA)
  1419 00012487 F3A5                <1> 		rep	movsd
  1420                              <1> 		;
  1421                              <1> 
  1422 00012489 8B0D[78900100]      <1> 		mov	ecx, [u.pgdir]
  1423 0001248F 890D[A88A0100]      <1> 		mov	[IRQ_cr3], ecx
  1424                              <1> 
  1425                              <1> set_IRQ_callback_addr:
  1426                              <1> 		;
  1427                              <1> 		; This routine sets return address
  1428                              <1> 		; to start of user's interrupt
  1429                              <1> 		; service (callback) address
  1430                              <1> 		;
  1431                              <1> 		; INPUT:
  1432                              <1> 		;	EDX = callback routine/service address
  1433                              <1> 		;	      (virtual, not physical address!)	
  1434                              <1> 		;	[u.sp] = kernel stack, points to
  1435                              <1> 		;		 user's EIP,CS,EFLAGS,ESP,SS
  1436                              <1> 		;		 registers.
  1437                              <1> 		; OUTPUT:
  1438                              <1> 		;	EIP (user) = callback (service) address
  1439                              <1> 		;	CS (user) = UCODE
  1440                              <1> 		;	EFLAGS (user) = flags before callback 	 
  1441                              <1> 		;       ESP (user) = ESP-4 (user, before callback) 
  1442                              <1> 		;	[ESP](user) = EIP (user) before callback
  1443                              <1> 		;
  1444                              <1> 		; Note: If CPU was in user mode while entering 
  1445                              <1> 		;	the timer interrupt service routine,
  1446                              <1> 		;	'IRET' will get return to callback routine
  1447                              <1> 		;	immediately. If CPU was in system/kernel mode  
  1448                              <1> 		;	'iret' will get return to system call and
  1449                              <1> 		;	then, callback routine will be return address
  1450                              <1> 		;	from system call. (User's callback/service code
  1451                              <1> 		;	will be able to return to normal return address
  1452                              <1> 		;	via a 'sysrele' system call at the end.) 
  1453                              <1> 		;
  1454                              <1> 		; Note: User's IRQ callback service code must be ended
  1455                              <1> 		;	with a 'sysrele' system call !
  1456                              <1> 		;
  1457                              <1> 		;	For example:
  1458                              <1> 		;
  1459                              <1> 		;	audio_IRQ_callback:
  1460                              <1> 		;	    ...	 
  1461                              <1> 		;	    <load DMA buffer with audio data>
  1462                              <1> 		;	    ...
  1463                              <1> 		;	    mov eax, 39 ; 'sysrele'
  1464                              <1> 		;	    int 40h ; TRDOS 386 system call (interrupt)		
  1465                              <1> 		;
  1466                              <1> 		
  1467                              <1> 		;mov	edx, [edx+IRQ.addr] ; Callback service address
  1468                              <1> 		;			    ; (Virtual address)
  1469                              <1> 		
  1470 00012495 8B2D[18900100]      <1> 		mov	ebp, [u.sp]; kernel's stack, points to EIP (user)
  1471 0001249B 895500              <1> 		mov	[ebp], edx
  1472                              <1> IRQsrv_5:
  1473                              <1> 		; EOI & return
  1474                              <1> 		; 01/08/2020
  1475                              <1> 		; 11/06/2017
  1476                              <1> 		; 10/06/2017 
  1477                              <1> 		;mov	al, [IRQnum]
  1478 0001249E B020                <1> 		mov	al, 20h ; 01/08/2020
  1479 000124A0 FA                  <1> 		cli
  1480                              <1> 		;cmp	al, 7
  1481 000124A1 803D[AC8A0100]07    <1> 		cmp	byte [IRQnum], 7 ; 01/08/2020	
  1482 000124A8 7602                <1> 		jna	short IRQsrv_6
  1483                              <1> 		;
  1484                              <1> 		;;mov	al, EOI	; end of interrupt
  1485                              <1> 		;mov	al, 20h ; 01/08/2020
  1486                              <1> 		;cli		; disable interrupts till stack cleared
  1487                              <1> 		;out	INTB00, al ; For controll2 #2
  1488 000124AA E6A0                <1> 		out	0A0h, al
  1489                              <1> IRQsrv_6:
  1490                              <1> 		;mov	byte [IRQnum], 0 ; reset
  1491                              <1> 		;;mov	al, EOI	; end of interrupt
  1492                              <1> 		;mov	al, 20h ; 01/08/2020
  1493                              <1> 		;cli		; disable interrupts till stack cleared
  1494                              <1> 		;out	INTA00, al ; end of interrupt to 8259 - 1
  1495 000124AC E620                <1> 		out	20h, al	
  1496                              <1> IRQsrv_7:	
  1497                              <1> 		;; 13/06/2017
  1498                              <1> 		;or	word [ebp+8], 200h ; force enabling interrupts
  1499                              <1> 		;
  1500 000124AE 8B0D[A88A0100]      <1> 		mov 	ecx, [IRQ_cr3]	; previous content of cr3 register
  1501 000124B4 0F22D9              <1>  		mov	cr3, ecx	; restore cr3 register content
  1502                              <1> 		;
  1503 000124B7 61                  <1> 		popad ; edi,esi,ebp,(icrement esp by 4),ebx,edx,ecx,eax
  1504                              <1> 		;
  1505 000124B8 0FA9                <1> 		pop	gs
  1506 000124BA 0FA1                <1> 		pop	fs
  1507 000124BC 07                  <1> 		pop	es
  1508 000124BD 1F                  <1> 		pop	ds
  1509                              <1> 		;
  1510 000124BE CF                  <1> 		iretd	; return from interrupt
  1511                              <1> 
  1512                              <1> ; 17/04/2021
  1513                              <1> ; ('get_device_number' procedure is disabled as temporary)
  1514                              <1> 
  1515                              <1> ;get_device_number:
  1516                              <1> ;		; 08/10/2016
  1517                              <1> ;		; 07/10/2016 - TRDOS 386 (TRDOS v2.0)
  1518                              <1> ;		;
  1519                              <1> ;		; This procedure compares name of requested
  1520                              <1> ;		; device with kernel device names and
  1521                              <1> ;		; installable device names. If names match, 
  1522                              <1> ;		; the relevant device index (entry) number 
  1523                              <1> ;		; will be returned the caller (sysopen) 
  1524                              <1> ;		; for the requested device.
  1525                              <1> ;		;
  1526                              <1> ;		; NOTE: Installable device drivers must
  1527                              <1> ;		; be loaded before using 'sysopen'
  1528                              <1> ;		; (opendev) system call.
  1529                              <1> ;		;
  1530                              <1> ;		; INPUT:
  1531                              <1> ;		;    ESI = device name address (ASCIIZ)
  1532                              <1> ;		;         (in kernel's memory space)  
  1533                              <1> ;  		;    max name length = 8 without '/dev/')
  1534                              <1> ;		;    Device name will be capitalized 
  1535                              <1> ;		;    and if there is, '/dev/' will be
  1536                              <1> ;		;    removed from name before comparising)
  1537                              <1> ;		;
  1538                              <1> ;		; OUTPUT:
  1539                              <1> ;		;    cf = 0 -> 
  1540                              <1> ;		;      EAX (AL) = device entry/index number 	 	
  1541                              <1> ;		;    cf = 1 -> device not found (installed)
  1542                              <1> ;		;	       or invalid device name
  1543                              <1> ;		;	       (AL=0)
  1544                              <1> ;		;    device_name = device name address (asciiz)
  1545                              <1> ;			;
  1546                              <1> ;		; Modified registers: EAX, EBX, ESI, EDI
  1547                              <1> ;
  1548                              <1> ;		mov	edi, device_name
  1549                              <1> ;		call 	lodsb_capitalize
  1550                              <1> ;		mov	ah, al
  1551                              <1> ;		cmp	al, '/'
  1552                              <1> ;		jne	short gdn_1
  1553                              <1> ;		mov	edi, device_name
  1554                              <1> ;		call 	lodsb_capitalize
  1555                              <1> ;gdn_0:
  1556                              <1> ;		and	al, al ; 0 ?
  1557                              <1> ;		jz	short gdn_err ; null name after '/'
  1558                              <1> ;gdn_1:
  1559                              <1> ;		cmp	al, 'D'
  1560                              <1> ;		jne	short gdn_2
  1561                              <1> ;		call 	lodsb_capitalize
  1562                              <1> ;		cmp	al, 'E'
  1563                              <1> ;		jne	short gdn_2
  1564                              <1> ;		call 	lodsb_capitalize
  1565                              <1> ;		cmp	al, 'V'
  1566                              <1> ;		jne	short gdn_2			
  1567                              <1> ;		lodsb
  1568                              <1> ;		cmp	al, '/'
  1569                              <1> ;		je	short gdn_4
  1570                              <1> ;gdn_2:
  1571                              <1> ;		cmp	ah, '/'
  1572                              <1> ;		jne	short gdn_5
  1573                              <1> ;gdn_err:		
  1574                              <1> ;		; invalid device name or device not found
  1575                              <1> ;		xor	eax, eax ; 0
  1576                              <1> ;		stc
  1577                              <1> ;		retn
  1578                              <1> ;gdn_3:
  1579                              <1> ;		cmp	al, '/'
  1580                              <1> ;		jne	short gdn_5
  1581                              <1> ;gdn_4:
  1582                              <1> ;		mov	edi, device_name
  1583                              <1> ;		jmp	short gdn_6
  1584                              <1> ;gdn_5:
  1585                              <1> ;		cmp	al, 0
  1586                              <1> ;		je	short gdn_7
  1587                              <1> ;gdn_6:
  1588                              <1> ;		call	lodsb_capitalize
  1589                              <1> ;		cmp	edi, device_name + 8
  1590                              <1> ;		jb	short gdn_3
  1591                              <1> ;		cmp	al, 0
  1592                              <1> ;		jne	short gdn_err
  1593                              <1> ;		cmp	edi, device_name + 1
  1594                              <1> ;		jna	short gdn_err ; null name after '/'
  1595                              <1> ;gdn_7:
  1596                              <1> ;		stosb
  1597                              <1> ;		; zero padding ("NAME",0,0,0,0)
  1598                              <1> ;		cmp	edi, device_name + 8
  1599                              <1> ;		jb	short gdn_7
  1600                              <1> ;gdn_8:
  1601                              <1> ;		; search for kernel device names
  1602                              <1> ;		mov	esi, device_name 
  1603                              <1> ;		mov	edi, KDEV_NAME
  1604                              <1> ;		xor	eax, eax
  1605                              <1> ;gdn_9:
  1606                              <1> ;		cmpsd	
  1607                              <1> ;		jne	short gdn_10
  1608                              <1> ;		cmpsd
  1609                              <1> ;		jne	short gdn_11
  1610                              <1> ;		jmp	short gdn_17 ; match
  1611                              <1> ;gdn_10:
  1612                              <1> ;		cmpsd  ; add esi, 4 & add edi, 4
  1613                              <1> ;gdn_11:
  1614                              <1> ;		mov	esi, device_name
  1615                              <1> ;		inc	al
  1616                              <1> ;		cmp	al, NumOfKernelDevNames
  1617                              <1> ;		jb	short gdn_9
  1618                              <1> ;gdn_12:
  1619                              <1> ;		; search for installable device names
  1620                              <1> ;		; esi = offset device_name 
  1621                              <1> ;		mov	edi, IDEV_NAME
  1622                              <1> ;		sub	al, al ; 0
  1623                              <1> ;gdn_13:
  1624                              <1> ;		cmpsd	
  1625                              <1> ;		jne	short gdn_14
  1626                              <1> ;		cmpsd
  1627                              <1> ;		jne	short gdn_15
  1628                              <1> ;		jmp	short gdn_19 ; match
  1629                              <1> ;gdn_14:
  1630                              <1> ;		cmpsd  ; add esi, 4 & add edi, 4
  1631                              <1> ;gdn_15:
  1632                              <1> ;		mov	esi, device_name
  1633                              <1> ;		inc	al
  1634                              <1> ;		cmp	al, NumOfInstallableDevices
  1635                              <1> ;		jb	short gdn_13
  1636                              <1> ;
  1637                              <1> ;gdn_16: 	; error: invalid device name (not found) !
  1638                              <1> ;		xor	al, al
  1639                              <1> ;		stc
  1640                              <1> ;		retn
  1641                              <1> ;
  1642                              <1> ;gdn_17:	; name match (with one of kernel device names)
  1643                              <1> ;		;
  1644                              <1> ;		; convert KDEV_NAME index to 
  1645                              <1> ;		; KDEV_NUMBER index
  1646                              <1> ;		; (different names are used for same devices)
  1647                              <1> ;		; (example: "COM1" & "TTY8" = device number 18) 
  1648                              <1> ;		mov	ebx, eax ; < 256
  1649                              <1> ;		mov	al, [KDEV_NUMBER+ebx]
  1650                              <1> ;
  1651                              <1> ;		; check if empty dev entry in the list
  1652                              <1> ;		cmp	byte [DEV_OPENMODE+eax], 0
  1653                              <1> ;		ja	short gdn_18 ; it must be already set
  1654                              <1> ;
  1655                              <1> ;		; (re)set device name and access flags
  1656                              <1> ;		; (remain open work will be easy after that)
  1657                              <1> ;		; (NOTE: here, data will be copied to bss section)
  1658                              <1> ;		mov	bl, al
  1659                              <1> ;		sub	edi, 8 ; kernel device name address (data)
  1660                              <1> ;		shl	bx, 2 
  1661                              <1> ;		mov	[DEV_NAME_PTR+ebx], edi ; (all) device names
  1662                              <1> ;		mov	bl, [KDEV_ACCESS+eax] ; kernel dev list (data)
  1663                              <1> ;		mov	[DEV_ACCESS+eax], bl ; (all) device list (bss)
  1664                              <1> ;gdn_18:
  1665                              <1> ;		inc	al ; 1 to NumOfKernelDevNames (<=7Fh)
  1666                              <1> ;		; eax = device index/entry number
  1667                              <1> ;		retn		
  1668                              <1> ;
  1669                              <1> ;gdn_19:	; name match (with one of installable device names)
  1670                              <1> ;		;
  1671                              <1> ;		; al = 0 to NumOfInstallableDevices - 1 (<=7Fh)
  1672                              <1> ;
  1673                              <1> ;		mov	ebx, eax
  1674                              <1> ;		add	bl, NumOfKernelDevices 	; < NUMOFDEVICES	
  1675                              <1> ;
  1676                              <1> ;		; check if empty dev entry in the list
  1677                              <1> ;		cmp	byte [DEV_OPENMODE+ebx], 0
  1678                              <1> ;		ja	short gdn_20 ; it must be already set
  1679                              <1> ;
  1680                              <1> ;		; (re)set device name and access flags
  1681                              <1> ;		; (remain open work will be easy after that)
  1682                              <1> ;		sub	edi, 8 ; installable device name address
  1683                              <1> ;		shl	bx, 2 ;*4
  1684                              <1> ;		mov	[DEV_NAME_PTR+ebx], edi ; (all) device names
  1685                              <1> ;		shr	bx, 2
  1686                              <1> ;		mov	al, [IDEV_FLAGS+eax] ; installable dev list
  1687                              <1> ;		mov	[DEV_ACCESS+ebx], al ; (all) device list
  1688                              <1> ;gdn_20:	
  1689                              <1> ;		mov	al, bl
  1690                              <1> ;		; eax = device index/entry number ; < NUMOFDEVICES  
  1691                              <1> ;		retn
  1692                              <1> 
  1693                              <1> ;lodsb_capitalize:
  1694                              <1> ;	; 07/10/2016 - TRDOS 386 (TRDOS v2.0)
  1695                              <1> ;	; INPUT -> [esi] = character
  1696                              <1> ;	;          edi = destination
  1697                              <1> ;	; OUTPUT -> AL contains capitalized character
  1698                              <1> ;	;	   esi = esi+1
  1699                              <1> ;	;	   edi = edi+1	
  1700                              <1> ;	; 
  1701                              <1> ;	lodsb	
  1702                              <1> ;	cmp	al, 61h
  1703                              <1> ;    	jb	short lodsb_cap_retn
  1704                              <1> ;     	cmp	al, 7Ah
  1705                              <1> ;     	ja	short lodsb_cap_retn
  1706                              <1> ;     	and	al, 0DFh
  1707                              <1> ;lodsb_cap_retn:
  1708                              <1> ;	stosb
  1709                              <1> ;	retn
  1710                              <1> 
  1711                              <1> ; 17/04/2021
  1712                              <1> ; ('device_open' procedure is disabled as temporary)
  1713                              <1> 
  1714                              <1> ;device_open:
  1715                              <1> ;	; 08/10/2016 - TRDOS 386 (TRDOS v2.0)
  1716                              <1> ;	; Complete device opening work for sysopen (device)
  1717                              <1> ;	;
  1718                              <1> ;	; INPUT -> 
  1719                              <1> ;	;	EAX = Device Number (AL)
  1720                              <1> ;	;        CL = Open mode (1 = read, 2 = write)
  1721                              <1> ;	;	 CH = Device access byte (bit 0 = 0)		
  1722                              <1> ;	; OUTPUT ->
  1723                              <1> ;	;	EAX = Device Number	
  1724                              <1> ;	;	CF = 0 -> device has been opened
  1725                              <1> ;	;	CF = 1 -> device could not be opened
  1726                              <1> ;	;
  1727                              <1> ;	;  Modified registers: ebx, (edx, ecx, esi, edi, ebp)
  1728                              <1> ;	;
  1729                              <1> ;
  1730                              <1> ;	mov	ebx, eax
  1731                              <1> ;	shl	bx, 2 ; *4
  1732                              <1> ;
  1733                              <1> ;	test	ch, 80h ; bit 7, installable device driver flag
  1734                              <1> ;	jz	short d_open_2 ; Kernel device
  1735                              <1> ;	; installable device
  1736                              <1> ;d_open_1:
  1737                              <1> ;       jmp	dword [ebx+IDEV_OADDR-4]
  1738                              <1> ;d_open_2:
  1739                              <1> ;	jmp	dword [ebx+KDEV_OADDR-4]
  1740                              <1> 
  1741                              <1> ; 17/04/2021
  1742                              <1> ; ('device_close' procedure is disabled as temporary)
  1743                              <1> 
  1744                              <1> ;device_close:
  1745                              <1> ;	; 08/10/2016 - TRDOS 386 (TRDOS v2.0)
  1746                              <1> ;	; Complete device closing work for sysclose (device)
  1747                              <1> ;	;
  1748                              <1> ;	; INPUT -> 
  1749                              <1> ;	;	EAX = Device Number (AL)
  1750                              <1> ;	;        CL = Open mode (1 = read, 2 = write)
  1751                              <1> ;	;	 CH = Device access byte (bit 0 = 0)		
  1752                              <1> ;	; OUTPUT ->
  1753                              <1> ;	;	EAX = Device Number	
  1754                              <1> ;	;	CF = 0 -> device has been closed
  1755                              <1> ;	;	CF = 1 -> device could not be closed
  1756                              <1> ;	;
  1757                              <1> ;	; Modified registers: ebx, (edx, ecx, esi, edi, ebp)
  1758                              <1> ;	;
  1759                              <1> ;
  1760                              <1> ;	mov	ebx, eax
  1761                              <1> ;	shl	bx, 2 ; *4
  1762                              <1> ;
  1763                              <1> ;	test	ch, 80h ; bit 7, installable device driver flag
  1764                              <1> ;	jz	short d_close_2 ; Kernel device
  1765                              <1> ;	; installable device
  1766                              <1> ;d_close_1:
  1767                              <1> ;       jmp	dword [ebx+IDEV_CADDR-4]
  1768                              <1> ;d_close_2:
  1769                              <1> ;	jmp	dword [ebx+KDEV_CADDR-4]	
  1770                              <1> 
  1771                              <1> ;rnull:
  1772                              <1> ;	; 07/10/2016 - TRDOS 386 (TRDOS v2.0)
  1773                              <1> ;	; read null (read from null device)
  1774                              <1> ;	retn
  1775                              <1> 
  1776                              <1> ;wnull:
  1777                              <1> ;	; 07/10/2016 - TRDOS 386 (TRDOS v2.0)
  1778                              <1> ;	; write null (write to null device)
  1779                              <1> ;	retn
  1780                              <1> 
  1781                              <1> dev_IRQ_service:
  1782                              <1> 	; 12/05/2017
  1783                              <1> 	; 13/04/2017
  1784                              <1> 	; 27/02/2017 - TRDOS 386 (TRDOS v2.0)
  1785                              <1> 	; INPUT ->
  1786                              <1> 	;	AL = IRQ Number (0 to 15)
  1787                              <1> 	;	
  1788 000124BF 53                  <1> 	push	ebx
  1789 000124C0 0FB6D8              <1> 	movzx	ebx, al
  1790 000124C3 C0E302              <1> 	shl	bl, 2 ; * 4	
  1791 000124C6 8B9B[208A0100]      <1> 	mov	ebx, [ebx+DEV_INT_HNDLR]
  1792 000124CC 21DB                <1> 	and 	ebx, ebx
  1793 000124CE 7404                <1>         jz	short dIRQ_s_retn
  1794 000124D0 50                  <1> 	push	eax
  1795                              <1> 
  1796 000124D1 FFD3                <1> 	call	ebx
  1797                              <1> 
  1798 000124D3 58                  <1> 	pop	eax
  1799                              <1> dIRQ_s_retn:
  1800 000124D4 5B                  <1> 	pop	ebx
  1801 000124D5 C3                  <1> 	retn		
  1802                              <1> 
  1803                              <1> set_dev_IRQ_service:
  1804                              <1> 	; 09/08/2022
  1805                              <1> 	; 29/07/2022 (TRDOS 386 Kernel v2.0.5)
  1806                              <1> 	; 13/04/2017 - TRDOS 386 (TRDOS v2.0)
  1807                              <1> 	;
  1808                              <1> 	; Set Device Interrupt Service
  1809                              <1> 	;
  1810                              <1> 	; INPUT ->
  1811                              <1> 	;	AL = IRQ Number
  1812                              <1> 	;	EBX = Hardware Interrupt Service Address
  1813                              <1> 	;
  1814                              <1> 	; Note: There is not a validation check here
  1815                              <1> 	;	because this procedure is called by
  1816                              <1> 	;	TRDOS 386 kernel !
  1817                              <1> 	;       (Even if a device driver does not exist
  1818                              <1> 	;	this setting may be used by sysaudio
  1819                              <1> 	;	and other system calls for hardware
  1820                              <1> 	;	components which use IRQ method for I/O.)
  1821                              <1> 	;
  1822                              <1> 	;push	esi
  1823 000124D6 0FB6F0              <1> 	movzx	esi, al
  1824                              <1> 	;shl	si, 2 ; * 4	
  1825                              <1> 	; 09/08/2022
  1826 000124D9 C1E602              <1> 	shl	esi, 2 ; * 4
  1827 000124DC 899E[208A0100]      <1> 	mov	[esi+DEV_INT_HNDLR], ebx
  1828                              <1> 	;pop	esi
  1829 000124E2 C3                  <1> 	retn		
  1830                              <1> 
  1831                              <1> sysaudio: ; AUDIO FUNCTIONS
  1832                              <1> 	; 19/11/2023 (TRDOS 386 v2.0.7)
  1833                              <1> 	; 29/07/2022 (TRDOS 386 v2.0.5)
  1834                              <1> 	; 12/02/2021 (TRDOS 386 v2.0.3) 
  1835                              <1> 	; 28/07/2020
  1836                              <1> 	; 27/07/2020
  1837                              <1> 	; 10/10/2017
  1838                              <1> 	; 22/06/2017
  1839                              <1> 	; 28/05/2017, 04/06/2017, 05/06/2017, 10/06/2017
  1840                              <1> 	; 01/05/2017, 12/05/2017, 15/05/2017, 20/05/2017
  1841                              <1> 	; 21/04/2017, 22/04/2017, 23/04/2017, 24/04/2017
  1842                              <1> 	; 10/04/2017, 13/04/2017, 14/04/2017, 16/04/2017
  1843                              <1> 	; 03/04/2017 (VIA VT8237R)
  1844                              <1> 	; 01/04/2016 (trdosk6.s -> tdosk8.s)
  1845                              <1> 	; 16/05/2016 - TRDOS 386 (TRDOS v2.0)
  1846                              <1> 	;
  1847                              <1> 	; Inputs:
  1848                              <1> 	;
  1849                              <1> 	;	BH = 0 -> Beep (PC Speaker)
  1850                              <1> 	;	     BL = Duration Counter (1 for 1/64 second)
  1851                              <1> 	;	     CX = Frequency Divisor (1193180/Frequency)
  1852                              <1> 	;		 (1331 for 886 Hz)
  1853                              <1> 	;
  1854                              <1> 	;	01/04/2017	
  1855                              <1> 	;
  1856                              <1> 	; 	BH = 1 -> DETECT (& ENABLE) AUDIO DEVICE
  1857                              <1> 	;	     BL = 0 : PC SPEAKER
  1858                              <1> 	;		  1 : SOUND BLASTER 16
  1859                              <1> 	;		  2 : INTEL AC'97
  1860                              <1> 	;		  3 : VIA VT8237R (VT8233)			 				
  1861                              <1> 	;		  4 : INTEL HDA
  1862                              <1> 	;	      5-FEh : unknown/invalid
  1863                              <1> 	;	        ; 04/06/2017
  1864                              <1> 	;		FFh : Get current audio device id
  1865                              <1> 	;
  1866                              <1> 	; 	BH = 2 -> ALLOCATE AUDIO BUFFER (for user)
  1867                              <1> 	;		ECX = Audio Buffer Size (must be equal to
  1868                              <1> 	;		      the half of DMA buffer size) 
  1869                              <1> 	;		EDX = Virtual Address of the buffer
  1870                              <1> 	;		      (This is not DMA buffer!)
  1871                              <1> 	;
  1872                              <1> 	;	BH = 3 -> INITIALIZE AUDIO DEVICE
  1873                              <1> 	;	     BL = 0,2 -> for Signal Response Byte	 	
  1874                              <1> 	;	     	CL = Signal Response Byte Value (fixed)
  1875                              <1> 	;				if BL = 0
  1876                              <1> 	;	             auto increment of S.R.B. value
  1877                              <1> 	;			 	if BL = 2
  1878                              <1> 	;	        EDX = Signal Response (Return) Byte Address
  1879                              <1> 	;	     	   			
  1880                              <1> 	;	     BL = 1 for CallBack Method	 	
  1881                              <1> 	;	    	EDX = CallBack Service Address (Virtual)
  1882                              <1> 	;
  1883                              <1> 	;	     BL > 2 -> invalid function	
  1884                              <1> 	;
  1885                              <1> 	;	    (Audio buffer must be allocated before
  1886                              <1> 	;	     initialization.) 		
  1887                              <1> 	;
  1888                              <1> 	;	BH = 4 -> START TO PLAY
  1889                              <1> 	;	     BL = Mode
  1890                              <1> 	;		  Bit 0 = mono/stereo (1 = stereo)		
  1891                              <1> 	;		  Bit 1 = 8 bit / 16 bit (1 = 16 bit)
  1892                              <1> 	;	     CX = Sampling Rate (Hz)
  1893                              <1> 	;
  1894                              <1> 	;	BH = 5 -> PAUSE
  1895                              <1> 	;	     BL = Any
  1896                              <1> 	;
  1897                              <1> 	;	BH = 6 -> CONTINUE TO PLAY
  1898                              <1> 	;	     BL = Any
  1899                              <1> 	;
  1900                              <1> 	;	BH = 7 -> STOP
  1901                              <1> 	;	     BL = Any
  1902                              <1> 	;
  1903                              <1> 	;	BH = 8 -> RESET 
  1904                              <1> 	;	     BL = Any
  1905                              <1> 	;
  1906                              <1> 	;	BH = 9 -> CANCEL (CALLBACK or S.R.B. SERVICE)
  1907                              <1> 	;	     BL = Any	
  1908                              <1> 	;	
  1909                              <1> 	;	BH = 10 -> DEALLOCATE AUDIO BUFFER (for user)
  1910                              <1> 	;	     BL = Any
  1911                              <1> 	;
  1912                              <1> 	;	BH = 11 -> SET VOLUME LEVEL
  1913                              <1> 	;	     BL: (Bit 0 to 6)
  1914                              <1> 	;		  0 = Master (Playback, Lineout) volume
  1915                              <1> 	;	     CL = Left Channel Volume
  1916                              <1> 	;	     CH = Right Channel Volume
  1917                              <1> 	;	
  1918                              <1> 	;	     Note: If BL >= 80h (Bit 7 of BL is set),
  1919                              <1> 	;	     volume level will be set for next playing
  1920                              <1> 	;	     (actual volume level will not be changed
  1921                              <1> 	;	     immediately)	
  1922                              <1> 	;
  1923                              <1> 	;	BH = 12 -> DISABLE AUDIO DEVICE
  1924                              <1> 	;	     (reset audio device and unlink dma buffer)	
  1925                              <1> 	;	     BL = Any	  		  	  	
  1926                              <1> 	;
  1927                              <1> 	;    	12/05/2017
  1928                              <1> 	;	BH = 13 -> MAP DMA BUFFER TO USER
  1929                              <1> 	;	    (for direct access to system's dma buffer)
  1930                              <1> 	;
  1931                              <1> 	;	     ECX = map size in bytes 
  1932                              <1> 	;		  (will be rounded up to page borders)
  1933                              <1> 	;	     EDX = Virtual Address of the buffer
  1934                              <1> 	;		  (Will be rounded up to page borders)
  1935                              <1> 	;
  1936                              <1> 	;	05/06/2017	
  1937                              <1> 	;    	04/06/2017
  1938                              <1> 	;	BH = 14 -> GET AUDIO DEVICE INFO
  1939                              <1> 	;	     BL: 0 = Audio Controller Info
  1940                              <1> 	;	     ; 19/11/2023	
  1941                              <1> 	;	     BL: 1 = Audio (AC'97) Codec Info	
  1942                              <1> 	;	     BL > 1 = Invalid for now! 
  1943                              <1> 	;
  1944                              <1> 	;	22/06/2017	
  1945                              <1> 	;	BH = 15 -> GET CURRENT SOUND DATA (for graphics)
  1946                              <1> 	;	     BL: 0 -> PCM OUT data
  1947                              <1> 	;	       > 0 -> Invalid for now! 
  1948                              <1> 	;	     ECX = 0 -> Get DMA Buffer Pointer
  1949                              <1> 	;		 EDX = Not Used
  1950                              <1> 	;	     ECX > 0 -> Byte count for buffer (EDX)	 	
  1951                              <1> 	;	         EDX = Buffer Address (Virtual)	
  1952                              <1> 	;
  1953                              <1> 	;	10/10/2017	
  1954                              <1> 	;	BH = 16 -> UPDATE DMA BUFFER DATA
  1955                              <1> 	;		   (by using the Audio Buffer content)
  1956                              <1> 	;	     BL = 0 : Update dma half buffer in sequence
  1957                              <1> 	;		      (automatic destination)	
  1958                              <1> 	;		  1 : Update 1st half of the dma buffer
  1959                              <1> 	;		  2 : Update 2nd half of the dma buffer
  1960                              <1> 	;		  3-FEh: Invalid!
  1961                              <1> 	;		  FFh = Get current flag value
  1962                              <1> 	;			(Half buffer number -1)
  1963                              <1> 	;
  1964                              <1> 	; Outputs:
  1965                              <1> 	;
  1966                              <1> 	;	For BH = 0 -> Beep
  1967                              <1> 	;	    None
  1968                              <1> 	;
  1969                              <1> 	;	01/04/2017
  1970                              <1> 	;
  1971                              <1> 	; 	For BH = 1 -> DETECT (& ENABLE) AUDIO DEVICE
  1972                              <1> 	;	    AH = 0 : PC SPEAKER
  1973                              <1> 	;		 1 : SOUND BLASTER 16
  1974                              <1> 	;		 2 : INTEL AC'97
  1975                              <1> 	;		 3 : VIA VT8237R (VT8233)			 				
  1976                              <1> 	;		 4 : INTEL HDA
  1977                              <1> 	;	      5-FFh : unknown/invalid
  1978                              <1> 	;	    AL = mode status
  1979                              <1> 	;		 bit 0 = mono /stereo (1 = stereo)
  1980                              <1> 	;		 bit 1 = 8 bit / 16 bit (1 = 16 bit)
  1981                              <1> 	;	    04/06/2017
  1982                              <1> 	;	    EBX = PCI DEVICE/VENDOR ID (if >0)
  1983                              <1> 	;		 (BX = VENDOR ID) 
  1984                              <1> 	;	    (if CF = 1 -> Error code in EAX)
  1985                              <1> 	;
  1986                              <1> 	; 	For BH = 2 -> ALLOCATE AUDIO BUFFER (for user)
  1987                              <1> 	;	    EAX = Physical Address of the buffer
  1988                              <1> 	;	    (if CF = 1 -> Error code in EAX)
  1989                              <1> 	;
  1990                              <1> 	;	For BH = 3 -> INITIALIZE AUDIO DEVICE
  1991                              <1> 	;	    (if CF = 1 -> Error code in EAX)
  1992                              <1> 	;
  1993                              <1> 	;	For BH = 4 -> START TO PLAY
  1994                              <1> 	;	    none (if CF = 1 -> Error code in EAX)	
  1995                              <1> 	;
  1996                              <1> 	;	For BH = 5 -> PAUSE
  1997                              <1> 	;	    none (if CF = 1 -> Error code in EAX)	
  1998                              <1> 	;
  1999                              <1> 	;	For BH = 6 -> CONTINUE TO PLAY
  2000                              <1> 	;	    none (if CF = 1 -> Error code in EAX)	
  2001                              <1> 	;
  2002                              <1> 	;	For BH = 7 -> STOP
  2003                              <1> 	;	    none (if CF = 1 -> Error code in EAX)
  2004                              <1> 	;
  2005                              <1> 	;	For BH = 8 -> RESET 
  2006                              <1> 	;	    none (if CF = 1 -> Error code in EAX)
  2007                              <1> 	;
  2008                              <1> 	;	For BH = 9 -> CANCEL (CALLBACK or S.R.B. SERVICE)
  2009                              <1> 	;	    none (if CF = 1 -> Error code in EAX)
  2010                              <1> 	;	
  2011                              <1> 	;	For BH = 10 -> DEALLOCATE AUDIO BUFFER (for user)
  2012                              <1> 	;	    none (if CF = 1 -> Error code in EAX)
  2013                              <1> 	;
  2014                              <1> 	;	For BH = 11 -> SET VOLUME LEVEL
  2015                              <1> 	;	    none (if CF = 1 -> Error code in EAX)
  2016                              <1> 	;
  2017                              <1> 	;	For BH = 12 -> DISABLE AUDIO DEVICE
  2018                              <1> 	;	    none (if CF = 1 -> Error code in EAX)
  2019                              <1> 	; 
  2020                              <1> 	;    	12/05/2017
  2021                              <1> 	;	For BH = 13 -> MAP DMA BUFFER TO USER
  2022                              <1> 	;	    EAX = Physical Address of the buffer
  2023                              <1> 	;	    (if CF = 1 -> Error code in EAX)	
  2024                              <1> 	;
  2025                              <1> 	;    	04/06/2017
  2026                              <1> 	;	For BH = 14 -> GET AUDIO DEVICE INFO
  2027                              <1> 	;	(for BL = 0) ; 05/06/2017	
  2028                              <1> 	;	    EAX = IRQ Number in AL
  2029                              <1> 	;		  Audio Device Number in AH 
  2030                              <1> 	;	    EBX = DEV/VENDOR ID
  2031                              <1> 	;		 (DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV)
  2032                              <1> 	;	    ECX = BUS/DEV/FN 
  2033                              <1> 	;		 (00000000BBBBBBBBDDDDDFFF00000000)
  2034                              <1> 	;	    EDX = NABMBAR/NAMBAR (for AC97)
  2035                              <1> 	;		  (Low word, DX = NAMBAR address)
  2036                              <1> 	;	    EDX = Base IO Addr (DX) for SB16 & VT8233
  2037                              <1> 	;	    (if CF = 1 -> Error code in EAX)	
  2038                              <1> 	;	                 (ERR_DEV_NOT_RDY = 15) 
  2039                              <1> 	;	(for BL = 1) -for AC97- ; 19/11/2023	
  2040                              <1> 	;	    EAX = Extended Audio ID (MX28) in AX
  2041                              <1> 	;	     AX bit 0 - VRA bit
  2042                              <1> 	;	     HW of EAX = PCM output sample rate (HZ)
  2043                              <1> 	;	    EBX = VENDOR ID 1 (BX), VENDOR ID 2 (HW)
  2044                              <1> 	;	    (if CF = 1 -> Error code in EAX)	
  2045                              <1> 	;	                 (ERR_DEV_NOT_RDY = 15)
  2046                              <1> 	;	    Note: EAX & EBX = 0 (for SB16,VIA,HDA)		
  2047                              <1>  	;
  2048                              <1> 	;	22/06/2017	
  2049                              <1> 	;	For BH = 15 -> GET CURRENT SOUND DATA
  2050                              <1> 	;			 (for graphics)
  2051                              <1> 	;	(for BL = 0)
  2052                              <1> 	;	 If ECX input is 0 
  2053                              <1> 	;	    EAX = DMA Buffer Current Position (Offset)
  2054                              <1> 	;	 If ECX input >  0
  2055                              <1> 	;	    EAX = Actual transfer count 		 	
  2056                              <1> 	;	    (Sound samples will be copied from 
  2057                              <1> 	;	     Current DMA Buffer Position to EDX
  2058                              <1> 	;	     virtual address as EAX bytes.)
  2059                              <1> 	;	 ((If CF = 1 ->  Error code in EAX))
  2060                              <1> 	;
  2061                              <1> 	;	10/10/2017	
  2062                              <1> 	;	For BH = 16 -> UPDATE DMA BUFFER DATA
  2063                              <1> 	;	    EAX = 0, if the updated (or current)
  2064                              <1> 	;		     half buffer is DMA half buffer 1
  2065                              <1> 	;	    EAX = 1, if the updated (or current)
  2066                              <1> 	; 		     half buffer is DMA half buffer 2 	  	
  2067                              <1> 	;	    (If CF = 1 -> Error code in EAX)	
  2068                              <1> 	;	
  2069                              <1> 
  2070 000124E3 80FF11              <1> 	cmp	bh, AUDIO1L/4
  2071 000124E6 0F836BA9FFFF        <1> 	jnb	sysret
  2072                              <1> 
  2073 000124EC C0E702              <1> 	shl	bh, 2 ; *4	
  2074 000124EF 0FB6F7              <1> 	movzx	esi, bh
  2075                              <1> 
  2076                              <1> 	; 22/04/2017
  2077 000124F2 31C0                <1> 	xor	eax, eax
  2078 000124F4 A3[20900100]        <1> 	mov	[u.r0], eax  ; 0
  2079                              <1> 		
  2080 000124F9 FF96[04250100]      <1> 	call	dword [esi+AUDIO1]
  2081                              <1> 	;jc	error
  2082 000124FF E953A9FFFF          <1> 	jmp	sysret	
  2083                              <1> 
  2084 00012504 [6E230000]          <1> AUDIO1:	dd	_beep ; 12/02/2021	
  2085                              <1> 	;dd	beep ; FUNCTION = 0 (bl = Duration Counter
  2086                              <1> 		     ; 		     cx = Frequency Divisor
  2087 00012508 [48250100]          <1> 	dd	soundc_detect
  2088 0001250C [DD250100]          <1> 	dd	sound_alloc
  2089 00012510 [A8260100]          <1> 	dd	soundc_init
  2090 00012514 [6C280100]          <1> 	dd	sound_play
  2091 00012518 [FF280100]          <1> 	dd	sound_pause
  2092 0001251C [29290100]          <1> 	dd	sound_continue
  2093 00012520 [53290100]          <1> 	dd	sound_stop
  2094 00012524 [7E290100]          <1> 	dd	soundc_reset
  2095 00012528 [B1290100]          <1> 	dd	soundc_cancel
  2096 0001252C [D7290100]          <1> 	dd	sound_dalloc
  2097 00012530 [022A0100]          <1> 	dd	sound_volume
  2098 00012534 [422A0100]          <1> 	dd	soundc_disable
  2099 00012538 [B12A0100]          <1> 	dd	sound_dma_map
  2100 0001253C [1F2B0100]          <1> 	dd	soundc_info
  2101 00012540 [A32B0100]          <1> 	dd	sound_data
  2102 00012544 [452C0100]          <1> 	dd	sound_update
  2103                              <1> 	
  2104                              <1> AUDIO1L	EQU	$ - AUDIO1
  2105                              <1> 
  2106                              <1> soundc_detect:
  2107                              <1> 	; FUNCTION = 1
  2108                              <1> 	; bl = Audio device type number 
  2109                              <1> 	; (0 = pc speaker, 1 = sound blaster 16, 2 = intel ac97
  2110                              <1> 	;  3 = via vt823x, 4 = intel HDA, 0FFh = any)
  2111                              <1> 	
  2112                              <1> 	; 04/06/2017
  2113 00012548 8A25[B18A0100]      <1> 	mov	ah, [audio_device]
  2114 0001254E 80FBFF              <1> 	cmp	bl, 0FFh ; get current audio device id
  2115 00012551 7408                <1> 	je	short sysaudio0
  2116                              <1> 
  2117 00012553 20E4                <1> 	and	ah, ah
  2118 00012555 741E                <1> 	jz	short soundc_get_dev
  2119                              <1> 
  2120 00012557 38DC                <1> 	cmp	ah, bl
  2121 00012559 7567                <1> 	jne	short soundc_dev_err
  2122                              <1> 
  2123                              <1> sysaudio0:	
  2124 0001255B A0[E58A0100]        <1> 	mov	al, [audio_mode]
  2125                              <1> sysaudio1:
  2126 00012560 A3[20900100]        <1> 	mov	[u.r0], eax
  2127 00012565 8B1D[BC8A0100]      <1> 	mov	ebx, [audio_vendor] ; (DEVICE/VENDOR ID)
  2128 0001256B 8B2D[1C900100]      <1> 	mov	ebp, [u.usp]
  2129 00012571 895D10              <1> 	mov	[ebp+16], ebx  ; ebx
  2130 00012574 C3                  <1> 	retn
  2131                              <1> 
  2132                              <1> soundc_get_dev:
  2133                              <1> 	; 28/05/2017
  2134                              <1> 	; 03/04/2017, 24/04/2017
  2135 00012575 C605[B08A0100]00    <1> 	mov	byte [audio_pci], 0
  2136 0001257C 80FB03              <1> 	cmp	bl, 3 ; VIA VT8233 (VT8237R) Audio Controller & AC97 Codec
  2137                              <1> 	;jne	short soundc_get_dev_sb
  2138                              <1> 	; 28/05/2017
  2139 0001257F 7220                <1> 	jb	short soundc_get_dev_sb
  2140 00012581 773F                <1> 	ja	short soundc_dev_err  ; temporary (28/05/2017)
  2141                              <1> 	;  		
  2142 00012583 E845160000          <1> 	call	DetectVT8233
  2143 00012588 7238                <1> 	jc	short soundc_dev_err
  2144                              <1> 	; eax = 0
  2145                              <1> 
  2146                              <1> 	;mov	ebx, [audio_vendor]
  2147                              <1> 	; ebx = DEVICE/VENDOR ID
  2148                              <1> 	;	DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV
  2149                              <1> 
  2150 0001258A B003                <1> 	mov	al, 3  ; VIA VT8237R (VT3233) Audio Controller
  2151 0001258C 88C4                <1> 	mov	ah, al
  2152                              <1> 
  2153                              <1> soundc_get_pci_dev_ok: ; 28/05/2017
  2154 0001258E FE05[B08A0100]      <1> 	inc	byte [audio_pci] ; = 1
  2155                              <1> soundc_get_dev_ok:
  2156                              <1> 	
  2157                              <1> soundc_get_dev_sb16_ok:
  2158 00012594 A2[B18A0100]        <1> 	mov	[audio_device], al
  2159 00012599 8825[E58A0100]      <1> 	mov	[audio_mode], ah ; stereo (bit0), 16 bit (bit1) capability	
  2160 0001259F EBBF                <1> 	jmp	short sysaudio1
  2161                              <1> 
  2162                              <1> soundc_get_dev_sb:
  2163                              <1> 	; 24/04/2017
  2164 000125A1 80FB01              <1> 	cmp	bl, 1 ; Sound Blaster 16
  2165 000125A4 750E                <1> 	jne	short soundc_get_dev_ich ; 28/05/2017
  2166                              <1> 	;
  2167 000125A6 E8FB1A0000          <1> 	call	DetectSB
  2168 000125AB 7215                <1> 	jc	short soundc_dev_err
  2169 000125AD B801030000          <1> 	mov	eax, 0301h ; Sound Blaster 16
  2170 000125B2 EBE0                <1> 	jmp	short soundc_get_dev_sb16_ok
  2171                              <1> 
  2172                              <1> soundc_get_dev_ich:
  2173                              <1> 	; 28/05/2017
  2174                              <1> 	;cmp	bl, 2 ; Intel AC'97 Audio Controller (ICH)
  2175                              <1> 	;jne	short soundc_dev_err ; Temporary  (28/05/2017)
  2176                              <1> 	;			     ; (Here will be modified just after
  2177                              <1> 	;			     ; new sound card code will be ready!)  	
  2178 000125B4 E8FF150000          <1> 	call	DetectICH
  2179 000125B9 7207                <1> 	jc	short soundc_dev_err
  2180                              <1> 	;
  2181 000125BB B802030000          <1> 	mov	eax, 0302h ; AC'97 (ICH)
  2182 000125C0 EBCC                <1> 	jmp	short soundc_get_pci_dev_ok
  2183                              <1> 
  2184                              <1> soundc_dev_err:
  2185 000125C2 B80F000000          <1> 	mov	eax, ERR_DEV_NOT_RDY ; Device not ready !
  2186                              <1> 	; 29/07/2022
  2187                              <1> 	;sub	eax, eax
  2188                              <1> 	;mov	al, ERR_DEV_NOT_RDY
  2189 000125C7 EB05                <1> 	jmp	short sysaudio_err
  2190                              <1> 
  2191                              <1> soundc_respond_err:
  2192                              <1> 	; ERR_TIME_OUT ; 'time out !' error	
  2193 000125C9 B819000000          <1> 	mov	eax, ERR_DEV_NOT_RESP ; 'device not responding !' error
  2194                              <1> 	; 29/07/2022
  2195                              <1> 	;sub	eax, eax
  2196                              <1> 	;mov	al, ERR_DEV_NOT_RESP
  2197                              <1> sysaudio_err:
  2198 000125CE A3[20900100]        <1> 	mov	[u.r0], eax
  2199 000125D3 A3[88900100]        <1> 	mov	[u.error], eax
  2200 000125D8 E95AA8FFFF          <1> 	jmp	error
  2201                              <1> 
  2202                              <1> sound_alloc:
  2203                              <1> 	; FUNCTION = 2
  2204                              <1> 	; ecx = audio buffer size (in bytes)
  2205                              <1> 	; edx = audio buffer address (virtual)
  2206                              <1> 	; 25/11/2023
  2207                              <1> 	; 27/07/2020
  2208                              <1> 	; 28/05/2017
  2209                              <1> 	; 01/05/2017, 15/05/2017
  2210                              <1> 	; 21/04/2017, 24/04/2017
  2211 000125DD 803D[B08A0100]00    <1> 	cmp	byte [audio_pci], 0
  2212 000125E4 770F                <1> 	ja	short snd_alloc_0
  2213                              <1> 	; Max. 64KB DMA buffer !!!
  2214 000125E6 81F900800000        <1> 	cmp	ecx, 32768
  2215 000125EC 760F                <1> 	jna	short snd_alloc_6
  2216                              <1> 	; 25/11/2023
  2217                              <1> sound_buff_error:
  2218 000125EE B82E000000          <1> 	mov	eax, ERR_BUFFER ; Buffer error !
  2219                              <1> 	; 29/07/2022
  2220                              <1> 	;sub	eax, eax
  2221                              <1> 	;mov	al, ERR_BUFFER
  2222 000125F3 EBD9                <1> 	jmp	short sysaudio_err
  2223                              <1> snd_alloc_0:	
  2224                              <1> 	; 25/11/2023
  2225                              <1> 	; Max 128KB DMA buffer size (2 half buffers)
  2226 000125F5 81F900000100        <1> 	cmp	ecx, 65536
  2227 000125FB 77F1                <1> 	ja	short sound_buff_error
  2228                              <1> snd_alloc_6:
  2229                              <1> 	; 15/05/2017
  2230 000125FD 81F900100000        <1> 	cmp	ecx, 4096 ; PAGE_SIZE
  2231 00012603 72E9                <1> 	jb	short sound_buff_error
  2232                              <1> 	;
  2233 00012605 A1[C48A0100]        <1> 	mov	eax, [audio_buffer] ; audio buffer address (current)
  2234 0001260A 09C0                <1> 	or	eax, eax
  2235 0001260C 7446                <1> 	jz	short snd_alloc_2
  2236                              <1> 	; audio buffer exists !
  2237 0001260E 8A1D[71900100]      <1> 	mov	bl, [u.uno]
  2238 00012614 3A1D[D98A0100]      <1> 	cmp	bl, [audio_user]
  2239                              <1> 	;jne	sndc_owner_error ; not owner !
  2240                              <1> 	; 25/11/2023
  2241 0001261A 7405                <1> 	je	short snd_alloc_7
  2242 0001261C E9FB000000          <1> 	jmp	sndc_owner_error ; not owner !
  2243                              <1> snd_alloc_7:
  2244 00012621 39D0                <1> 	cmp	eax, edx ; same virtual buffer address ?
  2245 00012623 7508                <1> 	jne	short snd_alloc_1
  2246 00012625 3B0D[CC8A0100]      <1> 	cmp	ecx, [audio_buff_size]
  2247 0001262B 7469                <1> 	je	short snd_alloc_3 ; Nothing to do !
  2248                              <1> 				  ; Buffer has been set already!
  2249                              <1> snd_alloc_1:
  2250 0001262D 51                  <1> 	push	ecx
  2251 0001262E 52                  <1> 	push	edx
  2252 0001262F 89C3                <1> 	mov	ebx, eax ; audio buffer address (current)
  2253 00012631 8B0D[CC8A0100]      <1> 	mov	ecx, [audio_buff_size]
  2254 00012637 E8ED39FFFF          <1> 	call	deallocate_user_pages
  2255 0001263C 5A                  <1> 	pop	edx
  2256 0001263D 59                  <1> 	pop	ecx
  2257 0001263E 31C0                <1> 	xor	eax, eax ; 0
  2258 00012640 A3[C48A0100]        <1> 	mov	[audio_buffer], eax  ; 0
  2259 00012645 A3[C88A0100]        <1>  	mov	[audio_p_buffer], eax  ; 0
  2260 0001264A A3[CC8A0100]        <1>  	mov	[audio_buff_size], eax
  2261 0001264F A2[D98A0100]        <1> 	mov	[audio_user], al ; 0
  2262                              <1> snd_alloc_2:
  2263 00012654 89D3                <1> 	mov	ebx, edx
  2264                              <1> 	; 01/05/2017
  2265                              <1> 	;mov	edx, ~PAGE_OFF ; truncating page offsets
  2266                              <1> 	;		       ; for aligning to page borders	
  2267                              <1> 	;;and	eax, edx
  2268                              <1> 	;and	ebx, edx
  2269                              <1> 	; 26/11/2023
  2270                              <1> 	;and	ecx, edx
  2271 00012656 81E300F0FFFF        <1> 	and	ebx, ~PAGE_OFF
  2272 0001265C 89CA                <1> 	mov	edx, ecx
  2273                              <1> 	; 15/05/2017
  2274                              <1> 	; EAX = Beginning address (physical)
  2275                              <1> 	; EAX = 0 -> Allocate mem block from the 1st proper aperture	
  2276                              <1> 	; ECX = Number of bytes to be allocated		
  2277 0001265E E86836FFFF          <1> 	call	allocate_memory_block
  2278 00012663 7289                <1> 	jc	short sound_buff_error
  2279                              <1> 
  2280                              <1> 	; EAX = Physical address of the allocated memory block
  2281                              <1> 	; ECX = Allocated bytes (as rounded up to page border)
  2282                              <1> 	; EBX = Virtual address (as truncated to page border)
  2283 00012665 52                  <1> 	push	edx ; 26/11/2023
  2284 00012666 50                  <1> 	push	eax
  2285 00012667 53                  <1> 	push	ebx
  2286 00012668 51                  <1> 	push	ecx
  2287 00012669 E8A33AFFFF          <1> 	call	allocate_user_pages
  2288 0001266E 59                  <1> 	pop	ecx
  2289 0001266F 5B                  <1> 	pop	ebx
  2290 00012670 58                  <1> 	pop	eax
  2291 00012671 5A                  <1> 	pop	edx ; 26/11/2023
  2292 00012672 722A                <1> 	jc	short snd_alloc_4  ; insufficient memory, buff error
  2293                              <1> 	; eax = physical address of the user's audio buffer
  2294                              <1> 	; ebx = virtual address of the user's audio buffer
  2295                              <1> 	; 26/11/2023
  2296                              <1> 	; ecx = allocated buffer size (in bytes)
  2297                              <1> 	;		 -rounded up to page boundary-
  2298                              <1> 	; edx = requested buffer size (in bytes)
  2299 00012674 A3[C88A0100]        <1> 	mov	[audio_p_buffer], eax
  2300 00012679 891D[C48A0100]      <1> 	mov	[audio_buffer], ebx
  2301                              <1> 	; 26/11/2023
  2302                              <1> 	;mov	ecx, edx
  2303                              <1> 	;; 25/11/2023
  2304                              <1> 	;cmp	ecx, 65536
  2305                              <1> 	;jb	short snd_alloc_5
  2306                              <1> 	;dec	ecx
  2307                              <1> 	;; ecx = 65535
  2308                              <1> 	;; (DMA half buffer's sample count must be < 65536)
  2309                              <1> ;snd_alloc_5:
  2310                              <1>  	;mov	[audio_buff_size], ecx
  2311                              <1> 	; 26/11/2023
  2312 0001267F 8915[CC8A0100]      <1> 	mov	[audio_buff_size], edx
  2313 00012685 8A15[71900100]      <1> 	mov	dl, [u.uno]
  2314 0001268B 8815[D98A0100]      <1> 	mov	[audio_user], dl
  2315 00012691 A3[20900100]        <1> 	mov	[u.r0], eax
  2316                              <1> snd_alloc_3:
  2317                              <1> 	; 27/07/2020
  2318 00012696 C605[D88A0100]00    <1> 	mov	byte [audio_flag], 0 ; clear dma half buffer flag
  2319                              <1> 	;	
  2320 0001269D C3                  <1> 	retn
  2321                              <1> snd_alloc_4:
  2322                              <1> 	; 15/05/2017
  2323                              <1> 	; EAX = Beginning address (physical)
  2324                              <1> 	; ECX = Number of bytes to be deallocated
  2325 0001269E E84838FFFF          <1> 	call	deallocate_memory_block
  2326 000126A3 E946FFFFFF          <1> 	jmp	sound_buff_error ; insufficient memory, buff error
  2327                              <1> 
  2328                              <1> soundc_init:
  2329                              <1> 	; FUNCTION = 3 
  2330                              <1> 	; bl = method (0= s.r.b., 1= callback, 2= auto incr s.r.b.)
  2331                              <1> 	; cl = signal response byte (initial or fixed) value
  2332                              <1> 	; edx = signal response byte or callback address
  2333                              <1> 	; 04/12/2023
  2334                              <1> 	; 02/12/2023
  2335                              <1> 	; 07/08/2022
  2336                              <1> 	; 29/07/2022
  2337                              <1> 	; 27/07/2020
  2338                              <1> 	; 28/05/2017
  2339                              <1> 	; 12/05/2017, 20/05/2017
  2340                              <1> 	; 22/04/2017, 23/04/2017, 24/04/2017
  2341                              <1> 	; 13/04/2017, 14/04/2017, 16/04/2017, 21/04/2017
  2342                              <1> 	; 03/04/2017, 10/04/2017
  2343                              <1> 
  2344 000126A8 A0[B18A0100]        <1> 	mov	al, [audio_device]
  2345 000126AD 20C0                <1> 	and	al, al
  2346 000126AF 754A                <1> 	jnz	short sndc_init6
  2347                              <1> 	;
  2348 000126B1 C605[B08A0100]00    <1> 	mov	byte [audio_pci], 0
  2349 000126B8 52                  <1> 	push	edx
  2350 000126B9 53                  <1> 	push	ebx
  2351 000126BA 51                  <1> 	push	ecx
  2352 000126BB E8E6190000          <1> 	call	DetectSB
  2353 000126C0 7213                <1> 	jc	short sndc_init8
  2354 000126C2 66B80103            <1> 	mov	ax, 0301h ; Sound Blaster 16
  2355 000126C6 EB1E                <1> 	jmp	short sndc_init7
  2356                              <1> 
  2357                              <1> sndc_init11:
  2358                              <1> 	; 28/05/2017
  2359 000126C8 E8EB140000          <1> 	call	DetectICH ; Detect AC'97 (ICH) Audio Controller
  2360 000126CD 7217                <1> 	jc	short sndc_init7
  2361 000126CF 66B80203            <1> 	mov	ax, 0302h ; Intel AC'97 Audio Device
  2362 000126D3 EB0B                <1> 	jmp	short sndc_init12 ; (PCI device)
  2363                              <1> 
  2364                              <1> sndc_init8:
  2365 000126D5 E8F3140000          <1> 	call	DetectVT8233
  2366                              <1> 	;jc	short sndc_init7
  2367                              <1> 	; 29/07/2022
  2368 000126DA 72EC                <1> 	jc	short sndc_init11 ; 28/05/2017
  2369                              <1> 
  2370                              <1> 	; eax = 0
  2371 000126DC B003                <1> 	mov	al, 3	; VIA VT8237R (VT3233) Audio Controller
  2372 000126DE 88C4                <1> 	mov	ah, al
  2373                              <1> 
  2374                              <1> sndc_init12:
  2375 000126E0 FE05[B08A0100]      <1> 	inc	byte [audio_pci] ; = 1
  2376                              <1> sndc_init7:
  2377 000126E6 59                  <1> 	pop	ecx
  2378 000126E7 5B                  <1> 	pop	ebx
  2379 000126E8 5A                  <1> 	pop	edx
  2380                              <1> 	;jc	soundc_dev_err
  2381                              <1> 	; 29/07/2022
  2382 000126E9 7305                <1> 	jnc	short sndc_init14
  2383 000126EB E9D2FEFFFF          <1> 	jmp	soundc_dev_err
  2384                              <1> sndc_init14:
  2385 000126F0 A2[B18A0100]        <1> 	mov	[audio_device], al
  2386 000126F5 8825[E58A0100]      <1> 	mov	[audio_mode], ah ; stereo (bit0), 16 bit (bit1) capability
  2387                              <1> 
  2388                              <1> sndc_init6:
  2389 000126FB 833D[C48A0100]00    <1> 	cmp	dword [audio_buffer], 0
  2390                              <1> 	;jna	sound_buff_error
  2391                              <1> 	; 29/07/2022
  2392 00012702 7705                <1> 	ja	short sndc_init19
  2393 00012704 E9E5FEFFFF          <1> 	jmp	sound_buff_error ; 07/08/2022
  2394                              <1> sndc_init19:
  2395 00012709 A0[71900100]        <1> 	mov	al, [u.uno]
  2396 0001270E 8A25[D98A0100]      <1> 	mov	ah, [audio_user]
  2397 00012714 08E4                <1> 	or	ah, ah
  2398 00012716 7418                <1> 	jz	short sndc_init0
  2399 00012718 38E0                <1> 	cmp	al, ah
  2400 0001271A 7419                <1> 	je	short sndc_init1
  2401                              <1> 
  2402                              <1> sndc_owner_error:
  2403 0001271C B80B000000          <1> 	mov	eax, ERR_NOT_OWNER ; 'permission denied !' error
  2404                              <1> 	; 29/07/2022
  2405                              <1> 	;sub	eax, eax
  2406                              <1> 	;mov	al, ERR_NOT_OWNER
  2407                              <1> sndc_perm_error:
  2408 00012721 A3[20900100]        <1> 	mov	[u.r0], eax
  2409 00012726 A3[88900100]        <1> 	mov	[u.error], eax
  2410 0001272B E907A7FFFF          <1> 	jmp	error
  2411                              <1> sndc_init0:
  2412 00012730 A2[D98A0100]        <1> 	mov	[audio_user], al
  2413                              <1> sndc_init1:
  2414 00012735 8915[DC8A0100]      <1> 	mov	[audio_cb_addr], edx
  2415 0001273B 881D[DA8A0100]      <1> 	mov	[audio_cb_mode], bl
  2416 00012741 880D[DB8A0100]      <1> 	mov	[audio_srb], cl
  2417                              <1> 
  2418                              <1> 	; 27/07/2020
  2419                              <1> 	;mov	byte [audio_flag], 0  ; clear dma half buffer flag
  2420                              <1> 
  2421                              <1> 	; 24/04/2017
  2422 00012747 803D[B18A0100]03    <1> 	cmp	byte [audio_device], 3 ; VT8233 (VT8237R)
  2423 0001274E 7435                <1> 	je	short sndc_init9
  2424                              <1> 	;ja	short soundc_respond_err ; temporary (28/05/2017)
  2425 00012750 803D[B18A0100]01    <1> 	cmp	byte [audio_device], 1 ; SB 16
  2426 00012757 7510                <1> 	jne	short sndc_init13
  2427 00012759 BB[B8420100]        <1> 	mov	ebx, sb16_int_handler
  2428                              <1> 	; Note: 'SbInit' is at 'Start to Play' stage
  2429                              <1> 	; 20/05/2017
  2430 0001275E 66C705[E88A0100]08- <1> 	mov	word [audio_master_volume], 0808h ; 2/8
  2430 00012766 08                  <1>
  2431 00012767 EB34                <1> 	jmp	short sndc_init10
  2432                              <1> sndc_init13:
  2433                              <1> 	; 28/05/2017
  2434 00012769 803D[B18A0100]02    <1> 	cmp	byte [audio_device], 2 ; AC 97 (ICH)	
  2435                              <1> 	;jne	soundc_respond_err ; temporary (28/05/2017)
  2436                              <1> 	; 29/07/2022
  2437 00012770 7405                <1> 	je	short sndc_init16
  2438                              <1> sndc_init15:
  2439 00012772 E952FEFFFF          <1> 	jmp	soundc_respond_err
  2440                              <1> sndc_init16:
  2441 00012777 E8861C0000          <1> 	call	ac97_codec_config
  2442                              <1> 	;jc	soundc_respond_err ; codec error !
  2443                              <1> 	; 29/07/2022
  2444 0001277C 72F4                <1> 	jc	short sndc_init15
  2445                              <1> 
  2446 0001277E BB[1C460100]        <1> 	mov	ebx, ac97_int_handler
  2447 00012783 EB18                <1> 	jmp	short sndc_init10	
  2448                              <1> 
  2449                              <1> sndc_init9:
  2450                              <1> 	;call	reset_codec
  2451                              <1> 	;; eax = 1
  2452                              <1> 	;call	codec_io_w16 ; w32
  2453 00012785 E898150000          <1> 	call	init_codec ; 28/05/2017
  2454                              <1> 	;jc	soundc_respond_err ; codec error !
  2455                              <1> 	; 29/07/2022
  2456 0001278A 72E6                <1> 	jc	short sndc_init15
  2457                              <1> 
  2458 0001278C E8A8170000          <1> 	call	channel_reset
  2459                              <1> 
  2460                              <1> 	; setup the Codec (actually mixer registers) 
  2461 00012791 E8CF160000          <1>         call    codec_config  ; unmute codec, set rates.
  2462                              <1> 	;jc	soundc_respond_err ; codec error !
  2463                              <1> 	; 29/07/2022
  2464 00012796 72DA                <1> 	jc	short sndc_init15
  2465                              <1> 
  2466 00012798 BB[CB3E0100]        <1> 	mov	ebx, vt8233_int_handler
  2467                              <1> sndc_init10:
  2468                              <1> 	; 13/04/2017
  2469 0001279D A0[B28A0100]        <1> 	mov	al, [audio_intr] ; IRQ number	
  2470 000127A2 E82FFDFFFF          <1> 	call	set_dev_IRQ_service
  2471                              <1> 
  2472                              <1> 	; SETUP (audio) INTERRUPT CALLBACK SERVICE
  2473 000127A7 8A1D[B28A0100]      <1> 	mov	bl, [audio_intr] ; IRQ number
  2474 000127AD 8A3D[DA8A0100]      <1> 	mov	bh, [audio_cb_mode]
  2475 000127B3 FEC7                <1> 	inc	bh  ; 1 = Signal Response Byte method (fixed value)
  2476                              <1> 		    ; 2 = Callback service method
  2477                              <1> 		    ; 3 = Auto Increment S.R.B. method 	
  2478 000127B5 8A0D[DB8A0100]      <1> 	mov	cl, [audio_srb]
  2479 000127BB 8B15[DC8A0100]      <1> 	mov	edx, [audio_cb_addr]
  2480 000127C1 A0[D98A0100]        <1> 	mov	al, [audio_user]
  2481                              <1> 	; 14/04/2017
  2482 000127C6 E8F3040000          <1>  	call	set_irq_callback_service
  2483                              <1> 	; 16/04/2017
  2484 000127CB A3[20900100]        <1> 	mov	[u.r0], eax
  2485                              <1> 	;jnc	sysret
  2486 000127D0 7316                <1> 	jnc	short sndc_init2 ; 21/04/2017
  2487                              <1> 	;
  2488 000127D2 A3[88900100]        <1> 	mov	dword [u.error], eax
  2489                              <1> 
  2490 000127D7 A0[B28A0100]        <1> 	mov	al, [audio_intr] ; IRQ number	
  2491 000127DC 31DB                <1> 	xor	ebx, ebx ; reset IRQ handler address
  2492 000127DE E8F3FCFFFF          <1> 	call	set_dev_IRQ_service
  2493                              <1> 
  2494 000127E3 E94FA6FFFF          <1> 	jmp	error
  2495                              <1> 
  2496                              <1> sndc_init2:
  2497                              <1> 	; 21/04/2017
  2498 000127E8 8B0D[CC8A0100]      <1> 	mov	ecx, [audio_buff_size] ; audio buffer size
  2499 000127EE D1E1                <1> 	shl	ecx, 1 ; *2
  2500 000127F0 A1[D08A0100]        <1> 	mov	eax, [audio_dma_buff]
  2501 000127F5 21C0                <1> 	and	eax, eax
  2502 000127F7 741C                <1> 	jz	short sndc_init3
  2503                              <1> 
  2504 000127F9 8B15[D48A0100]      <1> 	mov	edx, [audio_dmabuff_size] ; dma buffer size
  2505 000127FF 39D1                <1> 	cmp	ecx, edx
  2506 00012801 742F                <1> 	je	short sndc_init5
  2507                              <1> 
  2508                              <1> 	; 04/12/2023
  2509 00012803 3D00000500          <1> 	cmp	eax, sb16_dma_buffer	; reserved buffer ?
  2510 00012808 7409                <1> 	je	short sndc_init20 ; it isn't an allocated mem buff
  2511                              <1> 
  2512 0001280A 87CA                <1> 	xchg	ecx, edx
  2513                              <1> 	; 26/11/2023 
  2514                              <1> 	; round up (always -rounded up- page count is allocated)
  2515                              <1> 	; ((so deallocation must be done for the rounded up value))
  2516                              <1> 	;add	ecx, PAGE_SIZE - 1   ; 4095
  2517                              <1> 	;call	deallocate_memory_block
  2518 0001280C E8D436FFFF          <1> 	call	deallocate_memory_block_x 
  2519                              <1> 			; deallocate ((ecx+4095)>>12) pages
  2520 00012811 87D1                <1> 	xchg	edx, ecx
  2521                              <1> sndc_init20:
  2522 00012813 31C0                <1> 	xor	eax, eax
  2523                              <1> sndc_init3:
  2524                              <1> 	; 12/05/2017
  2525 00012815 803D[B18A0100]01    <1> 	cmp	byte [audio_device], 1 ; SB 16
  2526 0001281C 7515                <1> 	jne	short sndc_init4
  2527 0001281E C705[D08A0100]0000- <1> 	mov	dword [audio_dma_buff], sb16_dma_buffer
  2527 00012826 0500                <1>
  2528 00012828 C705[D48A0100]0000- <1> 	mov	dword [audio_dmabuff_size], 65536
  2528 00012830 0100                <1>
  2529                              <1> 	;xor	eax, eax
  2530                              <1> 	;mov	[u.r0], eax ; 0 = no error, successful
  2531                              <1> sndc_init5:	; 29/07/2022
  2532 00012832 C3                  <1> 	retn 
  2533                              <1> 
  2534                              <1> sndc_init4:
  2535                              <1> 	; 02/12/2023 - TRDOS 386 v2.0.7
  2536 00012833 81F900000100        <1> 	cmp	ecx, 65536
  2537 00012839 7707                <1> 	ja	short sndc_init21
  2538 0001283B B800000500          <1> 	mov	eax, sb16_dma_buffer ; use already reserved buffer
  2539 00012840 EB0C                <1> 	jmp	short sndc_init17	
  2540                              <1> 
  2541                              <1> sndc_init21:
  2542                              <1> 	; EAX = Beginning address (physical)
  2543                              <1> 	; EAX = 0 -> Allocate mem block from the 1st proper aperture	
  2544                              <1> 	; ECX = Number of bytes to be allocated	(>0)	
  2545 00012842 E88434FFFF          <1> 	call	allocate_memory_block
  2546                              <1> 	;jc	sound_buff_error
  2547                              <1> 	; 29/07/2022
  2548 00012847 7305                <1> 	jnc	short sndc_init17
  2549 00012849 E9A0FDFFFF          <1> 	jmp	sound_buff_error
  2550                              <1> 
  2551                              <1> sndc_init17:	; 29/07/2022
  2552                              <1> 	; set dma buffer address and size parameters
  2553 0001284E A3[D08A0100]        <1> 	mov	[audio_dma_buff], eax ; dma buffer address
  2554 00012853 890D[D48A0100]      <1> 	mov	[audio_dmabuff_size], ecx ; dma buffer size
  2555                              <1> ;	; EAX = Beginning (physical) addr of the allocated mem block
  2556                              <1> ;	; ECX = Num of allocated bytes (rounded up to page borders)
  2557                              <1> ;	cmp	byte [audio_pci], 0 ; AC97 audio controller ?
  2558                              <1> ;	ja	short sndc_init4
  2559                              <1> ;
  2560                              <1> ;	; Sound Blaster 16 uses classic DMA
  2561                              <1> ;	mov	edx, eax
  2562                              <1> ;	add	edx, ecx
  2563                              <1> ;	cmp	edx, 1000000h ; 1st 16 MB
  2564                              <1> ;	jna	short sndc_init4
  2565                              <1> ;
  2566                              <1> ;	; error !
  2567                              <1> ;	; restore Memory Allocation Table Content
  2568                              <1> ;	; EAX = Beginning address (physical)
  2569                              <1> ;	; ECX = Number of bytes to be deallocated
  2570                              <1> ;	call	deallocate_memory_block
  2571                              <1> ;	; reset dma buffer address and size parameters
  2572                              <1> ;	xor	eax, eax ; 0
  2573                              <1> ;	mov	[audio_dma_buff], eax ; 0
  2574                              <1> ;	mov	[audio_dmabuff_size], ecx ; 0
  2575                              <1> ;	jmp	sound_buff_error				
  2576                              <1> ;
  2577                              <1> ;sndc_init4:
  2578 00012859 803D[B18A0100]03    <1> 	cmp	byte [audio_device], 3
  2579                              <1> 	;jne	short sndc_init5
  2580                              <1> 	; 29/07/2022
  2581 00012860 7505                <1> 	jne	short sndc_init18 ; 28/05/2017
  2582                              <1> 
  2583                              <1> ; 29/07/2022
  2584                              <1> ;	call	set_vt8233_bdl	
  2585                              <1> ;sndc_init5:
  2586                              <1> ;	;sub	eax, eax ; 0
  2587                              <1> ;	;mov	[u.r0], eax ; 0 = no error, successful
  2588                              <1> ;	retn
  2589                              <1> 
  2590 00012862 E90C170000          <1> 	jmp	set_vt8233_bdl
  2591                              <1> 
  2592                              <1> sndc_init18:
  2593                              <1> 	;call	set_ac97_bdl
  2594                              <1> 	;;jmp	short sndc_init5
  2595                              <1> 	;retn
  2596                              <1> 	; 29/07/2022
  2597 00012867 E9C61C0000          <1> 	jmp	set_ac97_bdl
  2598                              <1> 
  2599                              <1> sound_play:
  2600                              <1> 	; FUNCTION = 4 
  2601                              <1> 	; bl = Mode 
  2602                              <1> 	;      bit 0 = mono/stereo (1 = stereo)		
  2603                              <1> 	;      bit 1 = 8 bit / 16 bit (1 = 16 bit)
  2604                              <1> 	; cx = Sampling Rate (Hz)
  2605                              <1> 
  2606                              <1> 	; 13/06/2017
  2607                              <1> 	; Note: Even if Mode bits are not 11b,
  2608                              <1> 	; 	AC'97 Audio Controller (&Codec)
  2609                              <1> 	;	will play audio samples as 16 bit, stereo
  2610                              <1> 	;	samples.
  2611                              <1> 	;	(Program must fill the audio buffer
  2612                              <1> 	;	as required; 8 bit samples must be converted
  2613                              <1> 	;	to 16 bit samples and mono samples must be
  2614                              <1> 	;	converted to stereo samples...)
  2615                              <1> 	 
  2616                              <1> 	; 30/07/2022	
  2617                              <1> 	; 28/07/2020
  2618                              <1> 	; 27/07/2020	 	
  2619                              <1> 	; 28/05/2017
  2620                              <1> 	; 15/05/2017, 20/05/2017
  2621                              <1> 	; 21/04/2017, 24/04/2017
  2622                              <1> 	; ... device check at first
  2623 0001286C A0[B18A0100]        <1> 	mov	al, [audio_device]
  2624 00012871 08C0                <1> 	or	al, al ; 0 ; pc speaker or invalid 
  2625                              <1> 	;jz	beeper_gfx ; 'video.s' ; temporary 
  2626                              <1> 	; 30/07/022
  2627 00012873 7505                <1> 	jnz	short snd_play_7
  2628 00012875 E905FBFEFF          <1> 	jmp	beeper_gfx
  2629                              <1> 
  2630                              <1> snd_play_7:
  2631                              <1> ;	cmp	al, 3 ; VIA VT 8237R (vt8233)
  2632                              <1> ;	je	short snd_play_1
  2633                              <1> ;	cmp	al, 1 ; SB 16
  2634                              <1> ;	jne	soundc_dev_err ; temporary !
  2635                              <1> ;snd_play_0:
  2636                              <1> 	; ... buffer & (buffer) owner check at second
  2637 0001287A 833D[C48A0100]00    <1> 	cmp	dword [audio_buffer], 0
  2638                              <1> 	;jna	sound_buff_error
  2639                              <1> 	; 30/07/2022
  2640 00012881 763C                <1> 	jna	short snd_play_4 ; jmp sound_buff_error
  2641 00012883 A0[71900100]        <1> 	mov	al, [u.uno]
  2642 00012888 3A05[D98A0100]      <1> 	cmp	al, [audio_user]
  2643                              <1> 	;jne	sndc_owner_error
  2644                              <1> 	; 30/07/2022
  2645 0001288E 7405                <1> 	je	short snd_play_3
  2646 00012890 E987FEFFFF          <1> 	jmp	sndc_owner_error
  2647                              <1> snd_play_3:
  2648 00012895 66890D[E28A0100]    <1> 	mov	[audio_freq], cx ; sample frequency (Hertz)
  2649 0001289C 88D8                <1> 	mov	al, bl
  2650 0001289E 2401                <1> 	and	al, 1 ; mono/stereo (1= stereo)
  2651 000128A0 FEC0                <1> 	inc	al ; channels
  2652 000128A2 A2[E18A0100]        <1> 	mov	[audio_stmo], al ; sound channels (1 or 2)
  2653 000128A7 B008                <1> 	mov	al, 8
  2654 000128A9 F6C302              <1> 	test	bl, 2 ; bits per sample (1= 16 bit)
  2655 000128AC 7402                <1> 	jz	short snd_play_bps
  2656 000128AE D0E0                <1> 	shl	al, 1  
  2657                              <1> snd_play_bps:	
  2658 000128B0 A2[E08A0100]        <1> 	mov	[audio_bps], al
  2659                              <1> 
  2660                              <1> 	; Transfer ring 3 (user's) audio buffer content to dma buffer
  2661 000128B5 8B3D[D08A0100]      <1> 	mov	edi, [audio_dma_buff] ; dma buffer (ring 0)
  2662 000128BB 09FF                <1> 	or	edi, edi
  2663                              <1> 	;jz	sound_buff_error
  2664                              <1> 	; 30/07/2022
  2665 000128BD 7505                <1> 	jnz	short snd_play_5
  2666                              <1> snd_play_4:
  2667 000128BF E92AFDFFFF          <1> 	jmp	sound_buff_error
  2668                              <1> snd_play_5:
  2669                              <1> 	; 27/07/2020
  2670 000128C4 8B35[C88A0100]      <1> 	mov	esi, [audio_p_buffer] ; physical address (ring 3)
  2671                              <1> 	;mov	ecx, [audio_buff_size] ; 15/05/2017
  2672 000128CA 8B0D[D48A0100]      <1> 	mov	ecx, [audio_dmabuff_size] ; 27/07/2020
  2673                              <1> 	;or	ecx, ecx 
  2674                              <1> 	;jz	sound_buff_error
  2675                              <1> 	; 28/07/2020
  2676 000128D0 D1E9                <1> 	shr	ecx, 1  ; dma half buffer size
  2677                              <1> 
  2678 000128D2 8035[D88A0100]01    <1> 	xor	byte [audio_flag], 1 ;  0 -> 1, 1 -> 0
  2679 000128D9 7502                <1> 	jnz	short snd_play_0 ; [audio_flag] = 1
  2680                              <1> 				 ; fill dma half buffer 1
  2681                              <1> 	; [audio_flag] = 0
  2682                              <1> 	
  2683                              <1> 	; fill dma half buffer 2
  2684 000128DB 01CF                <1> 	add	edi, ecx
  2685                              <1> 
  2686                              <1> snd_play_0:
  2687                              <1> 	;rep	movsb
  2688 000128DD C1E902              <1> 	shr	ecx, 2  ; convert byte count to dword count
  2689 000128E0 F3A5                <1> 	rep	movsd
  2690                              <1> 
  2691                              <1> 	; here, if [audio_flag] = 0, interrupt handler will update
  2692                              <1> 				; dma half buffer 2 
  2693                              <1> 				; (user's audio buffer data will be 
  2694                              <1> 				; copied into dma half buffer 2) 
  2695                              <1> 	;; 20/05/2017
  2696                              <1> 	;mov	byte [audio_flag], 1 ; next half (on next time)
  2697                              <1> 
  2698                              <1> 	; 24/04/2017
  2699 000128E2 A0[B18A0100]        <1> 	mov	al, [audio_device]
  2700 000128E7 3C03                <1> 	cmp	al, 3 ; VT8233 (VT8237R) 
  2701 000128E9 7409                <1> 	je	short snd_play_1
  2702 000128EB 3C01                <1> 	cmp	al, 1 ; Sound Blaster 16
  2703 000128ED 750A                <1> 	jne	short snd_play_2  ; 28/05/2017
  2704                              <1> 
  2705                              <1> ; 30/07/2022
  2706                              <1> ;	call	SbInit_play
  2707                              <1> ;	;jc	soundc_respond_err
  2708                              <1> ;	;retn
  2709                              <1> ;	; 30/07/2022
  2710                              <1> ;	jnc	short snd_play_6  ; retn
  2711                              <1> ;	jmp	soundc_respond_err
  2712                              <1> 
  2713                              <1> 	; 30/07/2022
  2714 000128EF E972180000          <1> 	jmp	SbInit_play	; sb16_start_play
  2715                              <1> 
  2716                              <1> snd_play_1:	
  2717                              <1> 	;call	vt8233_start_play
  2718                              <1> 	;retn
  2719                              <1> 	; 30/07/2022
  2720 000128F4 E9B0160000          <1> 	jmp	vt8233_start_play
  2721                              <1> 
  2722                              <1> snd_play_2:
  2723                              <1> 	; 28/05/2017
  2724                              <1> 	;cmp	al, 2 ; AC'97
  2725                              <1> 	;jne	short snd_play_3
  2726                              <1> 
  2727                              <1> 	;call	ac97_start_play
  2728                              <1> 	;retn
  2729                              <1> 	; 30/07/2022
  2730 000128F9 E9671C0000          <1> 	jmp	ac97_start_play
  2731                              <1> 
  2732                              <1> ;snd_play_3:
  2733                              <1> ;	;call	hda_start_play
  2734                              <1> ;	retn
  2735                              <1> 	; 30/07/2022
  2736                              <1> 	;jmp	hda_start_play
  2737                              <1> 
  2738                              <1> snd_play_6:
  2739                              <1> 	; 30/07/2022
  2740 000128FE C3                  <1> 	retn
  2741                              <1> 
  2742                              <1> sound_pause:
  2743                              <1> 	; FUNCTION = 5
  2744                              <1> 	; Pause
  2745                              <1> 	; 28/05/2017
  2746                              <1> 	; 24/04/2017
  2747                              <1> 	; 22/04/2017
  2748 000128FF E81C030000          <1> 	call	snd_dev_check
  2749 00012904 7277                <1> 	jc	short snd_nothing ; temporary.
  2750 00012906 E822030000          <1> 	call	snd_buf_check
  2751 0001290B 7270                <1> 	jc	short snd_nothing ; temporary.
  2752 0001290D A0[B18A0100]        <1> 	mov	al, [audio_device]
  2753 00012912 3C03                <1> 	cmp	al, 3 ; VIA VT 8237R (vt8233)
  2754 00012914 7409                <1> 	je	short snd_pause_1
  2755 00012916 3C01                <1> 	cmp	al, 1 ; Sound Blaster 16
  2756 00012918 750A                <1> 	jne	short snd_pause_2 ; 28/05/2017
  2757 0001291A E91C1A0000          <1> 	jmp	sb16_pause
  2758                              <1> snd_pause_1:
  2759 0001291F E93A170000          <1> 	jmp	vt8233_pause
  2760                              <1> snd_pause_2:
  2761                              <1> 	; 28/05/2017
  2762                              <1> 	;cmp	al, 2 ; AC'97
  2763                              <1> 	;jne	short snd_nothing ; temporary.
  2764 00012924 E9491D0000          <1> 	jmp	ac97_pause
  2765                              <1> 
  2766                              <1> sound_continue:
  2767                              <1> 	; FUNCTION = 6
  2768                              <1> 	; Continue to play
  2769                              <1> 	; 28/05/2017
  2770                              <1> 	; 22/04/2017
  2771 00012929 E8F2020000          <1> 	call	snd_dev_check
  2772 0001292E 724D                <1> 	jc	short snd_nothing ; temporary.
  2773 00012930 E8F8020000          <1> 	call	snd_buf_check
  2774 00012935 7246                <1> 	jc	short snd_nothing ; temporary.
  2775 00012937 A0[B18A0100]        <1> 	mov	al, [audio_device]
  2776 0001293C 3C03                <1> 	cmp	al, 3 ; VIA VT 8237R (vt8233)
  2777 0001293E 7409                <1> 	je	short snd_cont_1
  2778 00012940 3C01                <1> 	cmp	al, 1 ; Sound Blaster 16
  2779 00012942 750A                <1> 	jne	short snd_cont_2 ; 28/05/2017
  2780 00012944 E9141A0000          <1> 	jmp	sb16_continue
  2781                              <1> snd_cont_1:
  2782 00012949 E9C2160000          <1> 	jmp	vt8233_play
  2783                              <1> snd_cont_2:
  2784                              <1> 	; 28/05/2017
  2785                              <1> 	;cmp	al, 2 ; AC'97
  2786                              <1> 	;;jne	short snd_nothing ; temporary.
  2787                              <1> 	; 30/07/2022
  2788                              <1> 	;jne	short snd_cont_3
  2789 0001294E E95E1C0000          <1> 	jmp	ac97_play
  2790                              <1> ;snd_cont_3:
  2791                              <1> 	;jmp	hda_play
  2792                              <1> 
  2793                              <1> sound_stop:
  2794                              <1> 	; FUNCTION = 7
  2795                              <1> 	; Stop playing
  2796                              <1> 	; 30/07/2022
  2797                              <1> 	; 28/05/2017
  2798                              <1> 	; 24/05/2017
  2799                              <1> 	; 21/04/2017, 22/04/2017, 24/04/2017
  2800 00012953 E8C8020000          <1> 	call	snd_dev_check
  2801 00012958 7223                <1> 	jc	short snd_nothing ; temporary.
  2802                              <1> 	;call	snd_buf_check
  2803 0001295A E8D7020000          <1> 	call	snd_user_check ; 24/05/2017
  2804 0001295F 721C                <1> 	jc	short snd_nothing ; temporary.	
  2805                              <1> 	
  2806 00012961 A0[B18A0100]        <1> 	mov	al, [audio_device]
  2807 00012966 3C03                <1> 	cmp	al, 3 ; VIA VT 8237R (vt8233)
  2808                              <1> 	;je	vt8233_stop
  2809                              <1> 	;; 28/05/2017
  2810                              <1> 	;;ja	short snd_nothing
  2811                              <1> 	; 30/07/2022
  2812 00012968 7505                <1> 	jne	short snd_stop_1
  2813 0001296A E9FB150000          <1> 	jmp	vt8233_stop
  2814                              <1> snd_stop_1:
  2815 0001296F 3C01                <1> 	cmp	al, 1 ; Sound Blaster 16
  2816                              <1> 	;je	sb16_stop
  2817                              <1> 	; 30/07/2022
  2818 00012971 7505                <1> 	jne	short snd_stop_2
  2819 00012973 E9071A0000          <1> 	jmp	sb16_stop
  2820                              <1> snd_stop_2:
  2821                              <1> 	;cmp	al, 2 
  2822                              <1> 	;;je	short ac97_stop
  2823                              <1> 	; 30/07/2022
  2824                              <1> 	;jne	short snd_stop_3
  2825 00012978 E9C71C0000          <1> 	jmp	ac97_stop ; temporary.
  2826                              <1> ;snd_stop_3:
  2827                              <1> 	;jmp	hda_stop
  2828                              <1> 
  2829                              <1> sndc_cancel_ok:
  2830                              <1> 	; 30/07/2022
  2831                              <1> sndc_reset_ok:
  2832                              <1> 	; 30/07/2022
  2833                              <1> snd_nothing:
  2834                              <1> 	; 21/04/2017
  2835 0001297D C3                  <1> 	retn
  2836                              <1> 
  2837                              <1> soundc_reset:
  2838                              <1> 	; FUNCTION = 8
  2839                              <1> 	; Reset Audio Controller
  2840                              <1> 	; 30/07/2022
  2841                              <1> 	; 28/05/2017
  2842                              <1> 	; 22/04/2017
  2843 0001297E E89D020000          <1> 	call	snd_dev_check
  2844 00012983 72F8                <1> 	jc	short snd_nothing ; temporary.
  2845 00012985 E8A3020000          <1> 	call	snd_buf_check
  2846 0001298A 72F1                <1> 	jc	short snd_nothing ; temporary.	
  2847                              <1> 	
  2848 0001298C A0[B18A0100]        <1> 	mov	al, [audio_device]
  2849                              <1> 	; 30/07/2022
  2850 00012991 3C03                <1> 	cmp	al, 3 ; VIA VT 8237R (vt8233)
  2851 00012993 7207                <1> 	jb	short sndc_reset_1
  2852                              <1> 	;je	vt8233_reset
  2853 00012995 77E6                <1> 	ja	short snd_nothing ; temporary.
  2854                              <1> 	;;ja	hda_reset
  2855                              <1> 	;ja	short sndc_reset_3
  2856                              <1> 	; 30/07/2022
  2857 00012997 E9CE160000          <1> 	jmp	vt8233_reset	
  2858                              <1> sndc_reset_1:
  2859 0001299C 3C01                <1> 	cmp	al, 1 ; Sound Blaster 16
  2860                              <1> 	;jne	ac97_reset	
  2861                              <1> 	; 30/07/2022
  2862 0001299E 750C                <1> 	jne	short sndc_reset_2
  2863 000129A0 E82B1A0000          <1> 	call	sb16_reset
  2864                              <1> 	;jc	soundc_respond_err
  2865                              <1> 	;retn
  2866                              <1> 	; 30/07/2022
  2867 000129A5 73D6                <1> 	jnc	short sndc_reset_ok
  2868 000129A7 E91DFCFFFF          <1> 	jmp	soundc_respond_err	
  2869                              <1> sndc_reset_2:
  2870                              <1> 	; 30/07/2022
  2871                              <1> 	;cmp	al, 2
  2872                              <1> 	;ja	short sndc_reset_3
  2873 000129AC E9951D0000          <1> 	jmp	ac97_reset
  2874                              <1> ;sndc_reset_3:
  2875                              <1> 	;jmp	hda_reset
  2876                              <1> 
  2877                              <1> soundc_cancel:
  2878                              <1> 	; FUNCTION = 9
  2879                              <1> 	; Cancel audio callback service
  2880                              <1> 	; 30/07/2022
  2881                              <1> 	; 22/04/2017
  2882 000129B1 A0[D98A0100]        <1> 	mov	al, [audio_user]	
  2883 000129B6 3A05[71900100]      <1> 	cmp	al, [u.uno]
  2884 000129BC 75BF                <1> 	jne	short snd_nothing
  2885                              <1> 	; RESET (audio) INTERRUPT CALLBACK SERVICE
  2886 000129BE 8A1D[B28A0100]      <1> 	mov	bl, [audio_intr] ; IRQ number
  2887 000129C4 A0[71900100]        <1> 	mov	al, [u.uno]
  2888 000129C9 28FF                <1> 	sub	bh, bh ; 0 ; unlink IRQ from user service
  2889 000129CB E8EE020000          <1>  	call	set_irq_callback_service
  2890                              <1> 	;jc	sndc_perm_error ; 'permission denied' error
  2891                              <1> 	;retn
  2892                              <1> 	; 30/07/2022
  2893 000129D0 73AB                <1> 	jnc	short sndc_cancel_ok
  2894 000129D2 E94AFDFFFF          <1> 	jmp	sndc_perm_error
  2895                              <1> 
  2896                              <1> sound_dalloc:
  2897                              <1> 	; FUNCTION = 10
  2898                              <1> 	; Deallocate (ring 3) audio buffer
  2899                              <1> 	; 22/04/2017
  2900 000129D7 A0[D98A0100]        <1> 	mov	al, [audio_user]	
  2901 000129DC 3A05[71900100]      <1> 	cmp	al, [u.uno]
  2902 000129E2 7599                <1> 	jne	short snd_nothing
  2903 000129E4 8B1D[C48A0100]      <1> 	mov	ebx, [audio_buffer]
  2904                              <1> 	;or	ebx, ebx
  2905                              <1> 	;jz	short snd_nothing
  2906 000129EA 8B0D[CC8A0100]      <1> 	mov	ecx, [audio_buff_size]
  2907 000129F0 E83436FFFF          <1> 	call	deallocate_user_pages
  2908 000129F5 31C0                <1> 	xor	eax, eax
  2909 000129F7 A3[C48A0100]        <1> 	mov	[audio_buffer], eax ; 0
  2910 000129FC A2[D98A0100]        <1> 	mov	[audio_user], al ; 0
  2911                              <1> ;sndc_cancel_ok:
  2912 00012A01 C3                  <1> 	retn
  2913                              <1> 
  2914                              <1> sound_volume:
  2915                              <1> 	; FUNCTION = 11
  2916                              <1> 	; Set sound volume level
  2917                              <1> 	; 30/07/2022
  2918                              <1> 	; 28/05/2017
  2919                              <1> 	; 20/05/2017
  2920                              <1> 	; 22/04/2017, 24/04/2017
  2921                              <1> 	; bl = component (0 = master/playback/lineout volume)
  2922                              <1> 	; cl = left channel volume level (0 to 31)
  2923                              <1> 	; ch = right channel volume level (0 to 31)
  2924                              <1> 
  2925 00012A02 80FB80              <1> 	cmp	bl, 80h
  2926 00012A05 720A                <1> 	jb	short snd_vol_1
  2927                              <1> 	;ja	snd_nothing ; temporary.
  2928                              <1> 	; 30/07/2022
  2929 00012A07 7707                <1> 	ja	short snd_vol_0
  2930                              <1> 	; Set volume level for next play (BL>= 80h)
  2931 00012A09 66890D[E88A0100]    <1> 	mov	[audio_master_volume], cx
  2932                              <1> snd_vol_0:
  2933 00012A10 C3                  <1> 	retn
  2934                              <1> snd_vol_1:
  2935                              <1> 	; set volume level immediate (BL< 80h)
  2936 00012A11 80FB00              <1> 	cmp	bl, 0
  2937                              <1> 	;ja	snd_nothing ; temporary.
  2938                              <1> 	; 30/07/2022
  2939 00012A14 77FA                <1> 	ja	short snd_vol_0
  2940                              <1> 
  2941 00012A16 E805020000          <1> 	call	snd_dev_check
  2942                              <1> 	;jc	snd_nothing ; temporary.
  2943                              <1> 	; 30/07/2022
  2944 00012A1B 72F3                <1> 	jc	short snd_vol_0
  2945 00012A1D E80B020000          <1> 	call	snd_buf_check
  2946                              <1> 	;jc	snd_nothing ; temporary.
  2947                              <1> 	; 30/07/2022
  2948 00012A22 72EC                <1> 	jc	short snd_vol_0	
  2949                              <1> 
  2950 00012A24 A0[B18A0100]        <1> 	mov	al, [audio_device]
  2951 00012A29 3C03                <1> 	cmp	al, 3 ; VIA VT 8237R (vt8233)
  2952                              <1> 	;je	vt8233_volume
  2953                              <1> 	; 30/07/2022
  2954 00012A2B 7207                <1> 	jb	short snd_vol_2
  2955                              <1> 	; 28/05/2017
  2956                              <1> 	;ja	snd_nothing ; temporary.
  2957                              <1> 	; 30/07/2022
  2958 00012A2D 77E1                <1> 	ja	short snd_vol_0
  2959                              <1> 	;ja	hda_volume
  2960                              <1> 	; 30/07/2022
  2961 00012A2F E94F160000          <1> 	jmp	vt8233_volume
  2962                              <1> snd_vol_2:	
  2963                              <1> 	; Sound Blaster 16
  2964 00012A34 3C01                <1> 	cmp	al, 1 ; SB 16
  2965                              <1> 	;je	sb16_volume
  2966                              <1> 	; 30/07/2022
  2967 00012A36 7705                <1> 	ja	short snd_vol_3
  2968 00012A38 E9CD180000          <1> 	jmp	sb16_volume
  2969                              <1> snd_vol_3:
  2970                              <1> 	; 30/07/2022
  2971                              <1> 	;cmp	al, 2
  2972                              <1> 	;ja	short snd_vol_4
  2973 00012A3D E9B21B0000          <1> 	jmp	ac97_volume
  2974                              <1> ;snd_vol_4:
  2975                              <1> 	;jmp	hda_volume
  2976                              <1> 
  2977                              <1> soundc_disable:
  2978                              <1> 	; FUNCTION = 12 
  2979                              <1> 	; Disable audio device (and unlink DMA memory)
  2980                              <1> 	; 30/07/2022
  2981                              <1> 	; 28/05/2017
  2982                              <1> 	; 24/05/2017
  2983                              <1> 	; 22/04/2017
  2984 00012A42 E8D9010000          <1> 	call	snd_dev_check
  2985                              <1> 	;jc	soundc_dev_err ; temporary.
  2986                              <1> 	; 30/07/2022
  2987 00012A47 7305                <1> 	jnc	short snd_disable_4
  2988 00012A49 E974FBFFFF          <1> 	jmp	soundc_dev_err
  2989                              <1> snd_disable_4:
  2990                              <1> 	;call	snd_buf_check
  2991                              <1> 	;;jc	sndc_owner_error ; temporary.
  2992                              <1> 	; 30/07/2022
  2993                              <1> 	;jnc	short snd_disable_5
  2994                              <1> 	;jmp	sndc_owner_error
  2995                              <1> ;snd_disable_5:
  2996 00012A4E A0[B18A0100]        <1> 	mov	al, [audio_device]
  2997 00012A53 3C03                <1> 	cmp	al, 3 ; VIA VT 8237R (vt8233)
  2998 00012A55 7414                <1> 	je	short snd_disable_1
  2999                              <1> 	;ja	snd_nothing ; temporary.
  3000                              <1> 	; 30/07/2022
  3001 00012A57 7757                <1> 	ja	short snd_disable_3 ; retn
  3002 00012A59 3C01                <1> 	cmp	al, 1 ; Sound Blaster 16
  3003 00012A5B 7507                <1> 	jne	short snd_disable_0
  3004 00012A5D E81D190000          <1> 	call	sb16_stop
  3005 00012A62 EB0C                <1> 	jmp	short snd_disable_2
  3006                              <1> snd_disable_0:
  3007 00012A64 E8DB1B0000          <1> 	call	ac97_stop
  3008 00012A69 EB05                <1> 	jmp	short snd_disable_2
  3009                              <1> snd_disable_1:
  3010 00012A6B E8FA140000          <1> 	call	vt8233_stop
  3011                              <1> snd_disable_2:
  3012 00012A70 A0[B28A0100]        <1> 	mov	al, [audio_intr]
  3013 00012A75 29DB                <1> 	sub	ebx, ebx ; 0 = reset
  3014 00012A77 E85AFAFFFF          <1> 	call	set_dev_IRQ_service
  3015                              <1> 
  3016                              <1> 	;mov	al, [audio_intr]
  3017 00012A7C 28E4                <1> 	sub	ah, ah ; 0 = reset
  3018 00012A7E E81AF8FFFF          <1> 	call	set_hardware_int_vector
  3019                              <1> 
  3020 00012A83 31C0                <1> 	xor	eax, eax
  3021 00012A85 A2[B18A0100]        <1> 	mov	byte [audio_device], al
  3022 00012A8A A2[B28A0100]        <1> 	mov	byte [audio_intr], al
  3023 00012A8F 8705[D08A0100]      <1> 	xchg	eax, [audio_dma_buff]
  3024                              <1> 	; 24/05/2017
  3025                              <1> 	;or	eax, eax
  3026                              <1> 	;jz	short snd_disable_3
  3027                              <1> 	;cmp	eax, sb16_dma_buffer ; default DMA buffer
  3028                              <1> 	;je	short snd_disable_3
  3029 00012A95 803D[B08A0100]00    <1> 	cmp	byte [audio_pci], 0 ; AC97 audio controller ?
  3030 00012A9C 7612                <1> 	jna	short snd_disable_3
  3031 00012A9E C605[B08A0100]00    <1> 	mov	byte [audio_pci], 0
  3032                              <1> 	;sub	ecx, ecx
  3033                              <1> 	;xchg	ecx, [audio_dmabuff_size]
  3034 00012AA5 8B0D[D48A0100]      <1> 	mov	ecx, [audio_dmabuff_size]
  3035                              <1> 	; 26/11/2023 
  3036                              <1> 	; round up (always -rounded up- page count is allocated)
  3037                              <1> 	; ((so deallocation must be done for the rounded up value))
  3038                              <1> 	;add	ecx, PAGE_SIZE - 1   ; 4095
  3039                              <1> 	;call	deallocate_memory_block
  3040 00012AAB E83534FFFF          <1> 	call	deallocate_memory_block_x 
  3041                              <1> 			; deallocate ((ecx+4095)>>12) pages
  3042                              <1> snd_disable_3:
  3043 00012AB0 C3                  <1> 	retn
  3044                              <1> 
  3045                              <1> sound_dma_map:
  3046                              <1> 	; FUNCTION = 13 
  3047                              <1> 	; Map audio dma buff addr to user's buffer addr
  3048                              <1> 	; 30/07/2022
  3049                              <1> 	; 12/05/2017
  3050 00012AB1 21C9                <1> 	and	ecx, ecx
  3051                              <1> 	;jz	sound_buff_error
  3052                              <1> 	; 30/07/2022
  3053 00012AB3 7505                <1> 	jnz	short snd_dma_map_3
  3054 00012AB5 E934FBFFFF          <1> 	jmp	sound_buff_error
  3055                              <1> snd_dma_map_3:
  3056 00012ABA 803D[B18A0100]01    <1> 	cmp	byte [audio_device], 1
  3057 00012AC1 722A                <1> 	jb	short snd_dma_map_1
  3058                              <1> snd_dma_map_0:
  3059 00012AC3 A1[D08A0100]        <1> 	mov	eax, [audio_dma_buff]
  3060 00012AC8 21C0                <1> 	and	eax, eax
  3061 00012ACA 7421                <1> 	jz	short snd_dma_map_1
  3062                              <1> 	;
  3063 00012ACC 8A1D[D98A0100]      <1> 	mov	bl, [audio_user]
  3064 00012AD2 08DB                <1> 	or	bl, bl
  3065 00012AD4 7417                <1> 	jz	short snd_dma_map_1
  3066 00012AD6 3A1D[71900100]      <1> 	cmp	bl, [u.uno]
  3067                              <1> 	;jne	sndc_owner_error
  3068                              <1> 	; 30/07/2022
  3069 00012ADC 7405                <1> 	je	short snd_dma_map_4
  3070 00012ADE E939FCFFFF          <1> 	jmp	sndc_owner_error
  3071                              <1> snd_dma_map_4:
  3072 00012AE3 8B1D[D48A0100]      <1> 	mov	ebx, [audio_dmabuff_size]
  3073 00012AE9 21DB                <1> 	and	ebx, ebx
  3074 00012AEB 750A                <1> 	jnz	short snd_dma_map_2
  3075                              <1> snd_dma_map_1:
  3076 00012AED B800000500          <1> 	mov	eax, sb16_dma_buffer
  3077 00012AF2 BB00000100          <1> 	mov	ebx, 65536
  3078                              <1> snd_dma_map_2:	
  3079 00012AF7 81C1FF0F0000        <1> 	add	ecx, PAGE_SIZE-1 ; 4095
  3080 00012AFD 6681E100F0          <1> 	and	cx, ~PAGE_OFF ; not 4095
  3081 00012B02 39D9                <1> 	cmp	ecx, ebx
  3082                              <1> 	;ja	sound_buff_error
  3083                              <1> 	; 30/07/2022
  3084 00012B04 7605                <1> 	jna	short snd_dma_map_6
  3085                              <1> snd_dma_map_5:
  3086 00012B06 E9E3FAFFFF          <1> 	jmp	sound_buff_error
  3087                              <1> snd_dma_map_6:
  3088 00012B0B 50                  <1> 	push	eax
  3089 00012B0C 89D3                <1> 	mov	ebx, edx
  3090 00012B0E C1E90C              <1> 	shr	ecx, 12 ; byte count to page count
  3091                              <1> 	; eax = physical address of (audio) dma buffer
  3092                              <1> 	; ebx = virtual address of (audio) dma buffer (user's pgdir) 
  3093                              <1> 	; ecx = page count (>0)
  3094 00012B11 E84534FFFF          <1> 	call	direct_memory_access
  3095 00012B16 58                  <1> 	pop	eax
  3096                              <1> 	;jc	sound_buff_error
  3097                              <1> 	; 30/07/2022
  3098 00012B17 72ED                <1> 	jc	short snd_dma_map_5
  3099 00012B19 A3[20900100]        <1> 	mov	[u.r0], eax
  3100 00012B1E C3                  <1> 	retn
  3101                              <1> 
  3102                              <1> soundc_info:
  3103                              <1> 	; FUNCTION = 14 
  3104                              <1> 	; Get Audio Controller Info
  3105                              <1> 	; 19/11/2023
  3106                              <1> 	; 30/07/2022
  3107                              <1> 	; 10/06/2017
  3108                              <1> 	; 05/06/2017
  3109                              <1> 	
  3110                              <1> 	;and	bl, bl ; 0
  3111                              <1> 	;jz	short sndc_info_0
  3112                              <1> 	
  3113                              <1> 	; 19/11/2023
  3114 00012B1F 80FB01              <1> 	cmp	bl, 1
  3115 00012B22 7609                <1> 	jna	short sndc_info_0
  3116                              <1> 
  3117                              <1> ; invalid parameter !
  3118                              <1> ; 30/07/2022
  3119                              <1> 	;mov	eax, ERR_INV_PARAMETER ; 23
  3120                              <1> ;sndc_inf_error:
  3121                              <1> ;	mov	[u.r0], eax
  3122                              <1> ;	mov	[u.error], eax
  3123                              <1> ;	jmp	error
  3124                              <1> 	; 30/07/2022
  3125 00012B24 29C0                <1> 	sub	eax, eax
  3126 00012B26 B017                <1> 	mov	al, ERR_INV_PARAMETER ; 23
  3127 00012B28 E9A1FAFFFF          <1> 	jmp	sysaudio_err
  3128                              <1> 
  3129                              <1> sndc_info_0:
  3130 00012B2D E8EE000000          <1> 	call	snd_dev_check
  3131                              <1> 	;jc	soundc_dev_err
  3132                              <1> 	; 30/07/2022
  3133 00012B32 7305                <1> 	jnc	short sndc_info_3
  3134                              <1> snd_data_dev_err:
  3135 00012B34 E989FAFFFF          <1> 	jmp	soundc_dev_err
  3136                              <1> sndc_info_3:
  3137                              <1> 	; 19/11/2023
  3138                              <1> 	;cmp	bl, 1
  3139                              <1> 	;je	short sndc_info_4
  3140 00012B39 20DB                <1> 	and	bl, bl
  3141 00012B3B 7546                <1> 	jnz	short sndc_info_4
  3142                              <1> 
  3143 00012B3D 8B1D[BC8A0100]      <1> 	mov	ebx, [audio_vendor]
  3144 00012B43 8B0D[B88A0100]      <1> 	mov	ecx, [audio_dev_id]
  3145                              <1> 	;mov	al,  [audio_device]
  3146 00012B49 3C02                <1> 	cmp	al, 2 ; AC'97 (ICH)
  3147 00012B4B 7513                <1> 	jne	short sndc_info_1
  3148                              <1> 	; Intel AC97 (ICH) Audio Controller (=2)	
  3149 00012B4D 668B15[B68A0100]    <1> 	mov	dx, [NABMBAR]
  3150 00012B54 C1E210              <1> 	shl	edx, 16
  3151 00012B57 668B15[B48A0100]    <1> 	mov	dx, [NAMBAR]
  3152 00012B5E EB07                <1> 	jmp	short sndc_info_2
  3153                              <1> sndc_info_1:
  3154                              <1> 	; 05/06/2017
  3155                              <1> 	; Note: Intel HDA code (here) is not ready yet!
  3156                              <1> 	; !!! SB16 or VT8233 (VT8237R) !!!
  3157 00012B60 0FB715[B68A0100]    <1> 	movzx	edx, word [audio_io_base]	
  3158                              <1> sndc_info_2:
  3159 00012B67 88C4                <1> 	mov	ah, al ; [audio_device]
  3160 00012B69 A0[B28A0100]        <1> 	mov	al, [audio_intr] 
  3161                              <1> 
  3162                              <1> 	; EAX = IRQ Number in AL
  3163                              <1> 	;	Audio Device Number in AH 
  3164                              <1> 	; EBX = DEV/VENDOR ID
  3165                              <1> 	;	(DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV)
  3166                              <1> 	; ECX = BUS/DEV/FN 
  3167                              <1> 	;	(00000000BBBBBBBBDDDDDFFF00000000)
  3168                              <1> 	; EDX = NABMBAR/NAMBAR (for AC97)
  3169                              <1> 	;	(Low word, DX = NAMBAR address)
  3170                              <1> 	; EDX = Base IO Addr (DX) for SB16 & VT8233
  3171                              <1> 
  3172                              <1> 	; 10/06/2017
  3173 00012B6E A3[20900100]        <1> 	mov	[u.r0], eax
  3174 00012B73 8B2D[1C900100]      <1> 	mov	ebp, [u.usp]
  3175 00012B79 895D10              <1> 	mov	[ebp+16], ebx  ; ebx
  3176 00012B7C 895514              <1> 	mov	[ebp+20], edx  ; edx
  3177 00012B7F 894D18              <1> 	mov	[ebp+24], ecx  ; ecx
  3178                              <1>   			  		
  3179 00012B82 C3                  <1>  	retn
  3180                              <1> 
  3181                              <1> sndc_info_4:
  3182                              <1> 	; 19/11/2023
  3183 00012B83 3C02                <1> 	cmp	al, 2 ; Intel AC97 (ICH) Audio Controller
  3184 00012B85 7413                <1> 	je	short sndc_info_7
  3185                              <1> sndc_info_5:
  3186                              <1> 	; return ZERO if it is not AC97 audio controller codec
  3187 00012B87 31C0                <1> 	xor	eax, eax ; 0
  3188 00012B89 31DB                <1> 	xor	ebx, ebx ; 0
  3189                              <1> sndc_info_6:	
  3190 00012B8B A3[20900100]        <1> 	mov	[u.r0], eax
  3191 00012B90 8B2D[1C900100]      <1> 	mov	ebp, [u.usp]
  3192 00012B96 895D10              <1> 	mov	[ebp+16], ebx  ; ebx
  3193 00012B99 C3                  <1> 	retn
  3194                              <1> sndc_info_7:
  3195 00012B9A E8741D0000          <1> 	call	ac97_codec_info
  3196 00012B9F 72E6                <1> 	jc	short sndc_info_5
  3197                              <1> 
  3198                              <1> 	; 26/11/2023 - temporary
  3199                              <1> 	;and	al, 0FEh	; clear VRA support bit for test
  3200                              <1> 
  3201 00012BA1 EBE8                <1> 	jmp	short sndc_info_6	
  3202                              <1> 
  3203                              <1> sound_data:
  3204                              <1> 	; FUNCTION = 15 
  3205                              <1> 	; Get Current Sound data for graphics
  3206                              <1> 	; 30/07/2022
  3207                              <1> 	; 22/06/2017
  3208                              <1> 	;
  3209 00012BA3 E878000000          <1> 	call	snd_dev_check
  3210                              <1> 	;jc	soundc_dev_err ; Device not ready !
  3211                              <1> 	; 30/07/2022
  3212 00012BA8 728A                <1> 	jc	short snd_data_dev_err
  3213                              <1> 
  3214 00012BAA 80FB00              <1> 	cmp	bl, 0
  3215 00012BAD 760A                <1> 	jna	short sound_data_0
  3216                              <1> 
  3217                              <1> 	; Only PCM OUT buffer data is valid for now!
  3218 00012BAF B817000000          <1> 	mov	eax, ERR_INV_PARAMETER  ; 23
  3219 00012BB4 E915FAFFFF          <1> 	jmp	sysaudio_err
  3220                              <1> 
  3221                              <1> sound_data_0:
  3222 00012BB9 A1[D08A0100]        <1> 	mov	eax, [audio_dma_buff]
  3223 00012BBE 09C0                <1> 	or	eax, eax
  3224                              <1> 	;jz	sound_buff_error
  3225                              <1> 	; 30/07/2022
  3226 00012BC0 741A                <1> 	jz	short sound_data_5
  3227                              <1> 
  3228 00012BC2 803D[B18A0100]04    <1> 	cmp	byte [audio_device], 4 ; Intel HDA
  3229 00012BC9 744C                <1> 	je	short sound_data_4 ; temporary ! (22/06/2017)
  3230                              <1> 
  3231 00012BCB 21C9                <1> 	and	ecx, ecx
  3232                              <1> 	;jnz	short sound_data_1 ; sample tranfer
  3233                              <1> 	
  3234                              <1> 	; Return only DMA Buffer pointer/offset... 
  3235                              <1> 	; (If DMA Buffer has been mapped to user's
  3236                              <1> 	;  memory space; program can get graphics
  3237                              <1> 	;  data by using only this pointer value.)
  3238                              <1> 	   	
  3239                              <1> 	;call	get_dma_buffer_offset
  3240                              <1> 	;; eax = DMA buffer offset
  3241                              <1> 	;;	(!not half buffer offset!)
  3242                              <1> 	;mov	[u.r0], eax
  3243                              <1> 	;retn
  3244                              <1> 
  3245                              <1> 	;jz	get_dma_buffer_offset
  3246                              <1> 	; 30/07/2022
  3247 00012BCD 7505                <1> 	jnz	short sound_data_1
  3248 00012BCF E9DE1C0000          <1> 	jmp	get_dma_buffer_offset		
  3249                              <1> 	
  3250                              <1> sound_data_1:
  3251                              <1> 	;mov	eax, [audio_dmabuff_size]
  3252                              <1> 	;shr	eax, 1 ; half buffer size
  3253                              <1> 	;cmp	ecx, eax
  3254                              <1> 	;ja	short sound_buff_error	
  3255                              <1> 
  3256 00012BD4 3B0D[D48A0100]      <1> 	cmp	ecx, [audio_dmabuff_size]
  3257                              <1> 	;ja	sound_buff_error
  3258                              <1> 	; 30/07/2022
  3259 00012BDA 7605                <1> 	jna	short sound_data_6
  3260                              <1> sound_data_5:
  3261 00012BDC E90DFAFFFF          <1> 	jmp	sound_buff_error	
  3262                              <1> sound_data_6:
  3263 00012BE1 89D0                <1> 	mov	eax, edx
  3264 00012BE3 25FF0F0000          <1> 	and	eax, PAGE_OFF ; 4095 (0FFFh)
  3265 00012BE8 81F900100000        <1> 	cmp	ecx, 4096
  3266 00012BEE 7604                <1> 	jna	short sound_data_2
  3267                              <1> 	;mov	ecx, 4096 ; max. 1 page
  3268                              <1> 	; 30/07/2022
  3269 00012BF0 31C9                <1> 	xor	ecx, ecx
  3270 00012BF2 B510                <1> 	mov	ch, 16
  3271                              <1> 	; ecx = 4096
  3272                              <1> sound_data_2:
  3273 00012BF4 01C8                <1> 	add	eax, ecx
  3274 00012BF6 3D00100000          <1> 	cmp	eax, 4096
  3275 00012BFB 7606                <1> 	jna	short sound_data_3
  3276 00012BFD 6625FF0F            <1> 	and	ax, PAGE_OFF ; 4095 (0FFFh)
  3277 00012C01 29C1                <1> 	sub	ecx, eax
  3278                              <1> 	; here, ECX has been adjusted to fit 
  3279                              <1> 	;	in page border..  (<= 4096, >0)
  3280                              <1> sound_data_3:
  3281 00012C03 51                  <1> 	push	ecx
  3282 00012C04 52                  <1> 	push	edx
  3283 00012C05 89D3                <1> 	mov	ebx, edx 
  3284 00012C07 E88A2FFFFF          <1> 	call	get_physical_addr
  3285 00012C0C 5A                  <1> 	pop	edx
  3286 00012C0D 59                  <1> 	pop	ecx
  3287                              <1> 	;jc	sound_buff_error
  3288                              <1> 	; 30/07/2022
  3289 00012C0E 72CC                <1> 	jc	short sound_data_5	
  3290                              <1> 	
  3291                              <1> 	; eax = physical address of user's buffer
  3292 00012C10 89C3                <1> 	mov	ebx, eax  
  3293                              <1> 	; ecx = byte (transfer) count
  3294                              <1> 	;call	get_current_sound_data
  3295                              <1> 	;retn
  3296 00012C12 E9F91B0000          <1> 	jmp	get_current_sound_data
  3297                              <1> 
  3298                              <1> sound_data_4:
  3299                              <1> 	; Intel HDA code is not ready yet !
  3300                              <1> 	; 22/06/2017
  3301 00012C17 31C0                <1> 	xor	eax, eax
  3302 00012C19 48                  <1> 	dec	eax
  3303 00012C1A A3[20900100]        <1> 	mov	[u.r0], eax ; 0FFFFFFFFh
  3304 00012C1F C3                  <1> 	retn 
  3305                              <1> 
  3306                              <1> snd_dev_check:
  3307                              <1> 	; 10/06/2017
  3308                              <1> 	; 05/06/2017
  3309                              <1> 	; 24/05/2017
  3310                              <1> 	; 22/04/2017
  3311                              <1> 	; 21/04/2017
  3312                              <1> 	; ... device check at first
  3313 00012C20 A0[B18A0100]        <1> 	mov	al, [audio_device]
  3314 00012C25 3C01                <1> 	cmp	al, 1 ; SB 16
  3315 00012C27 7203                <1> 	jb	short snd_dev_chk_retn ; error !
  3316                              <1> 	;cmp	al, 4 ; Intel HDA
  3317                              <1> 	;ja	short snd_dbchk_stc ; invalid !
  3318                              <1> 	; 10/06/2017
  3319 00012C29 3C05                <1> 	cmp	al, 5
  3320 00012C2B F5                  <1> 	cmc
  3321                              <1> snd_dev_chk_retn:
  3322 00012C2C C3                  <1> 	retn
  3323                              <1> 
  3324                              <1> snd_buf_check:
  3325                              <1> 	; 10/06/2017
  3326                              <1> 	; 22/04/2017
  3327                              <1> 	; 21/04/2017
  3328                              <1> 	; ... buffer & (buffer) owner check at second
  3329 00012C2D 833D[C48A0100]00    <1> 	cmp	dword [audio_buffer], 0
  3330 00012C34 760D                <1> 	jna	short snd_dbchk_stc
  3331                              <1> snd_user_check:
  3332 00012C36 A0[71900100]        <1> 	mov	al, [u.uno]
  3333 00012C3B 3A05[D98A0100]      <1> 	cmp	al, [audio_user]
  3334                              <1> 	;jne	short snd_dbchk_stc
  3335                              <1> 	;retn
  3336 00012C41 74E9                <1> 	je	short snd_dev_chk_retn
  3337                              <1> 
  3338                              <1> snd_dbchk_stc:
  3339 00012C43 F9                  <1> 	stc
  3340 00012C44 C3                  <1> 	retn
  3341                              <1> 
  3342                              <1> sound_update:
  3343                              <1> 	; FUNCTION = 16 
  3344                              <1> 	; bl = 
  3345                              <1> 	;    0 = automatic (sequental) update (with flag switch!)
  3346                              <1> 	;    1 = update dma half buffer 1 (without flag switch!)		
  3347                              <1> 	;    2 = update dma half buffer 2 (without flag switch!)
  3348                              <1> 	;  FFh = get current flag value	
  3349                              <1> 	;      0 = dma half buffer 1 (will be played next)
  3350                              <1> 	;      1 = dma half buffer 2 (will be played next)
  3351                              <1> 	
  3352                              <1> 	; 30/07/2022
  3353                              <1> 	; 10/10/2017
  3354                              <1> 	; ... device check at first
  3355 00012C45 A0[B18A0100]        <1> 	mov	al, [audio_device]
  3356 00012C4A 08C0                <1> 	or	al, al ; 0 ; pc speaker or invalid 
  3357                              <1> 	;jz	soundc_dev_err
  3358                              <1> 	; 30/07/2022
  3359 00012C4C 7505                <1> 	jnz	short snd_update_4
  3360 00012C4E E96FF9FFFF          <1> 	jmp	soundc_dev_err
  3361                              <1> snd_update_4:
  3362                              <1> 	; ... buffer & (buffer) owner check at second
  3363 00012C53 833D[C48A0100]00    <1> 	cmp	dword [audio_buffer], 0
  3364                              <1> 	;jna	sound_buff_error
  3365                              <1> 	; 30/07/2022
  3366 00012C5A 761C                <1> 	jna	short snd_update_6 ; jmp sound_buff_error
  3367 00012C5C A0[71900100]        <1> 	mov	al, [u.uno]
  3368 00012C61 3A05[D98A0100]      <1> 	cmp	al, [audio_user]
  3369                              <1> 	;jne	sndc_owner_error
  3370                              <1> 	; 30/07/2022
  3371 00012C67 7405                <1> 	je	short snd_update_5
  3372 00012C69 E9AEFAFFFF          <1> 	jmp	sndc_owner_error
  3373                              <1> snd_update_5:
  3374                              <1> 	; Transfer ring 3 (user's) audio buffer content to dma buffer
  3375 00012C6E 8B3D[D08A0100]      <1> 	mov	edi, [audio_dma_buff] ; dma buffer (ring 0)
  3376 00012C74 09FF                <1> 	or	edi, edi
  3377                              <1> 	;jz	sound_buff_error
  3378                              <1> 	; 30/07/2022
  3379 00012C76 7505                <1> 	jnz	short snd_update_7
  3380                              <1> snd_update_6:
  3381 00012C78 E971F9FFFF          <1> 	jmp	sound_buff_error
  3382                              <1> snd_update_7:
  3383 00012C7D 8B35[C88A0100]      <1> 	mov	esi, [audio_p_buffer] ; physical address (ring 3)
  3384 00012C83 8B0D[CC8A0100]      <1> 	mov	ecx, [audio_buff_size]
  3385                              <1> 	
  3386                              <1> 	;movzx	eax, byte [audio_flag]
  3387 00012C89 A0[D88A0100]        <1> 	mov	al, [audio_flag]
  3388                              <1> 
  3389 00012C8E FEC3                <1> 	inc	bl
  3390 00012C90 7426                <1> 	jz	short snd_update_3 ; bl = 0FFh
  3391 00012C92 FECB                <1> 	dec	bl 
  3392 00012C94 7410                <1> 	jz	short snd_update_0 ; bl = 0
  3393                              <1> 
  3394 00012C96 80FB02              <1> 	cmp	bl, 2
  3395 00012C99 7416                <1> 	je	short snd_update_1 ; dma half buffer 2
  3396 00012C9B 7216                <1> 	jb	short snd_update_2 ; dma half buffer 1
  3397                              <1>  
  3398                              <1> 	; invalid parameter !
  3399                              <1> ; 30/07/2022
  3400                              <1> 	;mov	eax, ERR_INV_PARAMETER ; 23
  3401                              <1> ;	mov	[u.r0], eax
  3402                              <1> ;	mov	[u.error], eax
  3403                              <1> ;	jmp	error
  3404                              <1> 
  3405                              <1> 	; 30/07/2022
  3406 00012C9D 29C0                <1> 	sub	eax, eax
  3407 00012C9F B017                <1> 	mov	al, ERR_INV_PARAMETER ; 23
  3408 00012CA1 E928F9FFFF          <1> 	jmp	sysaudio_err
  3409                              <1> 	
  3410                              <1> snd_update_0:
  3411 00012CA6 8035[D88A0100]01    <1> 	xor	byte [audio_flag], 1 ; update flag !!!
  3412 00012CAD 3C01                <1> 	cmp	al, 1
  3413 00012CAF 7202                <1> 	jb	short snd_update_2 ; dma half buffer 1
  3414                              <1> snd_update_1:
  3415                              <1> 	; dma half buffer 2
  3416 00012CB1 01CF                <1> 	add	edi, ecx
  3417                              <1> snd_update_2:
  3418                              <1> 	;rep	movsb
  3419 00012CB3 C1E902              <1> 	shr	ecx, 2
  3420 00012CB6 F3A5                <1> 	rep	movsd
  3421                              <1> snd_update_3:
  3422 00012CB8 A3[20900100]        <1> 	mov	[u.r0], eax
  3423                              <1> 
  3424 00012CBD C3                  <1> 	retn
  3425                              <1> 
  3426                              <1> set_irq_callback_service:
  3427                              <1> 	; 23/11/2023
  3428                              <1> 	; 20/11/2023 (TRDOS 386 Kernel v2.0.7)
  3429                              <1> 	; 30/07/2022 (TRDOS 386 Kernel v2.0.5)
  3430                              <1> 	; 03/08/2020
  3431                              <1> 	; 10/06/2017
  3432                              <1> 	; 12/05/2017
  3433                              <1> 	; 24/04/2017
  3434                              <1> 	; 22/04/2017
  3435                              <1> 	; caller: 'syscalbac' or 'sysaudio' or ...
  3436                              <1> 	; 13/04/2017, 14/04/2017, 17/04/2017
  3437                              <1> 	; 24/02/2017, 26/02/2017, 28/02/2017
  3438                              <1> 	; 21/02/2017 - TRDOS 386 (TRDOS v2.0)
  3439                              <1> 	;
  3440                              <1> 	; Link or unlink IRQ callback service to/from user (ring 3)	
  3441                              <1> 	;
  3442                              <1> 	; INPUT ->
  3443                              <1> 	;	If AL = 0, the caller is 'syscalbac';
  3444                              <1> 	;	   otherwise, the caller is 'sysaudio' or ...
  3445                              <1> 	;	   (AL = user number) 
  3446                              <1> 	; 	 
  3447                              <1> 	;	BL = IRQ number (Hardware interrupt request number)
  3448                              <1> 	;	     (0 to 15 but IRQ 0,1,2,6,8,14,15 are prohibited)
  3449                              <1> 	;	     IRQ numbers 3,4,5,7,9,10,11,12,13 are valid
  3450                              <1> 	;	     (numbers >15 are invalid)
  3451                              <1> 	;
  3452                              <1> 	;	BH = 0 = Unlink IRQ (in BL) from user (ring 3) service
  3453                              <1> 	;	     1 = Link IRQ by using Signal Response Byte method
  3454                              <1> 	;	     2 = Link IRQ by using Callback service method 		
  3455                              <1> 	;	     3 = Link IRQ by using Auto Increment S.R.B. method 	
  3456                              <1> 	;	    >3 = invalid 
  3457                              <1> 	;		 (syscallback version will return to user) 	
  3458                              <1> 	;	
  3459                              <1> 	;	CL = Signal Return/Response Byte value 
  3460                              <1> 	;
  3461                              <1> 	;	If BH = 3, kernel will put a counter value ; 03/08/2020
  3462                              <1> 	;	          (into the S.R.B. addr)
  3463                              <1> 	;		  between 0 to 255. (start value = CL+1)
  3464                              <1> 	;	
  3465                              <1> 	;	NOTE: counter value, for example: even and odd numbers
  3466                              <1> 	;	      may be used for -audio- DMA buffer switch 
  3467                              <1> 	;	      within double buffer method, etc. 		
  3468                              <1> 	;
  3469                              <1> 	;	EDX = Signal return (Response) byte address
  3470                              <1> 	;	       		  - or -
  3471                              <1> 	;	      Interrupt/Callback service/routine address
  3472                              <1> 	; 	
  3473                              <1> 	;	      (virtual address in user's memory space)
  3474                              <1> 	;
  3475                              <1> 	; OUTPUT ->
  3476                              <1> 	;	CF = 0 & EAX = 0 -> Successful setting
  3477                              <1> 	;	CF = 1 & EAX > 0 -> IRQ is prohibited or locked 
  3478                              <1> 	;			by another process
  3479                              <1> 	;		 eax = ERR_PERM_DENIED -> prohibited or locked
  3480                              <1> 	;		 eax = ERR_INV_PARAMETER -> 
  3481                              <1> 	;		       invalid parameter/option or bad address
  3482                              <1> 	;
  3483                              <1> 	; TRDOS 386 - IRQ CALLBACK structures (parameters):
  3484                              <1> 	;	
  3485                              <1> 	;	   [u.irqlock]	: 1 word, IRQ flags (0-15) that indicates
  3486                              <1> 	;			which IRQs are locked by (that) user.
  3487                              <1> 	;		        Lock and unlock (by user) will change
  3488                              <1> 	;			these flags or 'terminate process' (sysexit)
  3489                              <1> 	;			will clear these flags and unlock those IRQs.
  3490                              <1> 	;			               
  3491                              <1> 	;		   	Bit 0 is for IRQ 0 and Bit 15 is for IRQ 15
  3492                              <1> 	;
  3493                              <1> 	;	   IRQ(x).owner	: 1 byte, user, [u.uno], 0 = free (unlocked)	
  3494                              <1> 	;
  3495                              <1> 	;	   IRQ(x).method : 1 byte for callback method & status
  3496                              <1> 	;			   0 = Signal Response Byte method
  3497                              <1> 	;			   1 = Callback service method
  3498                              <1> 	;			   >1 = invalid for current 'syscalback'.
  3499                              <1> 	;			or(+) 80h = IRQ is in use by system (ring 0)
  3500                              <1> 	;			            function (audio etc.) or
  3501                              <1> 	;			   	    a device driver.	   	
  3502                              <1> 	;			(system function will ignore the lock/owner)
  3503                              <1> 	;
  3504                              <1> 	;	   IRQ(x).srb	: 1 byte, Signal Return/Response byte value
  3505                              <1> 	;			  (a fixed value by user or a counter value
  3506                              <1> 	;			 from 0 to 255, which is increased by every
  3507                              <1> 	;			 interrupt just before putting it into 
  3508                              <1> 	;			 the Signal Response byte address)
  3509                              <1> 	;			 (This is not used in callback serv method)
  3510                              <1> 	;	    	  
  3511                              <1> 	;	   IRQ(x).addr	: 1 dword
  3512                              <1> 	;			  Signal Response Byte address (physical)
  3513                              <1> 	;			  		-or-
  3514                              <1> 	;			  Callback service address (virtual)
  3515                              <1> 	;
  3516                              <1> 	;	   IRQ(x).dev	: 1 byte
  3517                              <1> 	;			  0 = Default device or kernel function
  3518                              <1> 	;			  		-or-
  3519                              <1> 	;			  1-255 = Assigned device driver number
  3520                              <1> 	;
  3521                              <1> 	;	   (x) = 3,4,5,7,9,10,11,12,13
  3522                              <1> 	;
  3523                              <1> 	
  3524 00012CBE 80FB0F              <1> 	cmp	bl, 15
  3525 00012CC1 7727                <1> 	ja	short scbs_2
  3526                              <1> 	
  3527 00012CC3 80FF03              <1> 	cmp	bh, 3
  3528 00012CC6 7722                <1> 	ja	short scbs_2  ; invalid parameter
  3529                              <1> 
  3530 00012CC8 0FB6FB              <1> 	movzx	edi, bl ; save IRQ number
  3531                              <1> 
  3532                              <1> 		; IRQ 0,1,2,6,8,14,15 are prohibited
  3533                              <1> 	;IRQenum: ; 'trdosk9.s'
  3534                              <1> 	;	db  0,0,0,1,2,3,0,4,0,5,6,7,8,9,0,0
  3535                              <1> 
  3536 00012CCB 0FB6B7[E0370100]    <1> 	movzx	esi, byte [edi+IRQenum] ; IRQ availability 
  3537                              <1> 					; enumeration/index
  3538                              <1> 	; 20/11/2023
  3539 00012CD2 4E                  <1> 	dec	esi
  3540                              <1> 	;dec	si
  3541 00012CD3 780F                <1> 	js	short scbs_1 ;  0 -> 0FFFFh  
  3542                              <1> 
  3543                              <1> 	; ESI = IRQ callback parameters index number (0 to 8)
  3544                              <1> 
  3545 00012CD5 08FF                <1> 	or	bh, bh
  3546 00012CD7 7417                <1> 	jz	short scbs_4 ; unlink the IRQ (in BL)
  3547                              <1> 
  3548 00012CD9 FECF                <1> 	dec	bh
  3549                              <1> 	; bh = method (0 = signal response byte, 1 = callback)
  3550                              <1> 	;	      (2 = auto increment of signal response byte) 
  3551                              <1> 
  3552 00012CDB 80BE[608A0100]00    <1> 	cmp	byte [esi+IRQ.owner], 0 ; locked ?
  3553 00012CE2 7635                <1> 	jna	short scbs_6	; no... OK...	
  3554                              <1> 
  3555                              <1> scbs_1:
  3556                              <1> 	; permission denied (prohibited IRQ)
  3557                              <1> 	;mov	eax, ERR_PERM_DENIED
  3558                              <1> 	; 30/07/2022
  3559 00012CE4 29C0                <1> 	sub	eax, eax
  3560 00012CE6 B00B                <1> 	mov	al, ERR_PERM_DENIED
  3561 00012CE8 F9                  <1> 	stc
  3562 00012CE9 C3                  <1> 	retn
  3563                              <1> scbs_2:
  3564                              <1> 	;stc
  3565                              <1> scbs_3:
  3566                              <1> 	;mov	eax, ERR_INV_PARAMETER
  3567                              <1> 	; 30/07/2022
  3568 00012CEA 29C0                <1> 	sub	eax, eax
  3569 00012CEC B017                <1> 	mov	al, ERR_INV_PARAMETER
  3570 00012CEE F9                  <1> 	stc
  3571 00012CEF C3                  <1> 	retn
  3572                              <1> 
  3573                              <1> scbs_4: ; unlink the requested IRQ (if it belongs to current user)
  3574                              <1> 	; 10/06/2017
  3575                              <1> 	; 22/04/2017
  3576                              <1> 	; 14/04/2017
  3577                              <1> 	; If AL = 0 -> The caller is 'syscalbac'
  3578 00012CF0 8AA6[608A0100]      <1> 	mov	ah, [esi+IRQ.owner]
  3579 00012CF6 3A25[71900100]      <1> 	cmp	ah, [u.uno]
  3580 00012CFC 75E6                <1> 	jne	short scbs_1
  3581                              <1> 
  3582 00012CFE FE0D[96900100]      <1> 	dec	byte [u.irqc] ; decrease IRQ count (in use)
  3583                              <1> 
  3584                              <1> 	;sub	ah, ah
  3585                              <1> 	;mov	[esi+IRQ.owner], ah ; 0 ; free !!!
  3586                              <1> 	;and	byte [esi+IRQ.method], 80h
  3587                              <1> 	;mov	[esi+IRQ.srb], ah ; 0
  3588                              <1> 	;mov	[esi+IRQ.dev], ah ; 0
  3589                              <1> 	;mov	dword [esi+IRQ.addr], 0
  3590                              <1> 	;mov	dword [u.r0], 0
  3591                              <1> 
  3592                              <1> 	;mov	byte [esi+IRQ.owner], 0
  3593                              <1> 
  3594                              <1> 	; 22/04/2017
  3595 00012D04 29C0                <1> 	sub	eax, eax
  3596 00012D06 8886[608A0100]      <1> 	mov	[esi+IRQ.owner], al ; 0
  3597                              <1> 	; 10/06/2017
  3598 00012D0C 8686[728A0100]      <1> 	xchg	al, [esi+IRQ.method]
  3599 00012D12 2480                <1> 	and	al, 80h
  3600 00012D14 745D                <1> 	jz	short scbs_12 
  3601                              <1> 	; Audio device must be disabled -later- ! ([IRQ.medhod] = 80h)
  3602                              <1> 
  3603                              <1> ;	cmp	byte [esi+IRQ.method], 80h ; device drv or kernel extension ?
  3604                              <1> ;	jb	short scbs_12 ; bh = 0 reset to default IRQ handler
  3605                              <1> ;
  3606                              <1> ;	and	al, al
  3607                              <1> ;	jz	short scbs_5  ; the caller is 'syscalbac'
  3608                              <1> ;	; The caller is 'sysaudio' or ...
  3609 00012D16 30C0                <1> 	xor	al, al
  3610                              <1> ;	mov	[esi+IRQ.method], al ; 0 ; reset kernel extension flag
  3611                              <1> ;scbs_5:
  3612                              <1> ;	sub	ah, ah
  3613                              <1> 	;mov	[u.r0], eax ; 0
  3614 00012D18 C3                  <1> 	retn	
  3615                              <1> 
  3616                              <1> scbs_6:
  3617                              <1> 	; 14/04/2017
  3618 00012D19 20C0                <1> 	and	al, al
  3619 00012D1B 7405                <1> 	jz	short scbs_7  ; the caller is 'syscalbac'
  3620                              <1> 	; AL = user number ([u.uno] or [audio.user] or ...)
  3621                              <1> 	; The caller is 'sysaudio' or ...
  3622                              <1> 	;	
  3623                              <1> 	; bh = method (0 = signal response byte, 1 = callback)
  3624                              <1> 	;	      (2 = auto increment of signal response byte) 
  3625                              <1> 
  3626 00012D1D 80CF80              <1> 	or	bh, 80h		; Kernel extension flag !
  3627 00012D20 EB0A                <1> 	jmp	short scbs_8
  3628                              <1> scbs_7:	
  3629 00012D22 8A86[728A0100]      <1> 	mov	al, [esi+IRQ.method] ; >= 80h = kernel is using this IRQ
  3630 00012D28 2480                <1> 	and	al, 80h ; use only bit 7 (kernel function flag)
  3631 00012D2A 08C7                <1> 	or	bh, al		 ; method 
  3632                              <1> 				 ; 0 = signal response byte, 1 = callback
  3633                              <1> 				 ; 2 = auto increment of s.r.b.
  3634                              <1> scbs_8:
  3635 00012D2C A0[71900100]        <1> 	mov	al, [u.uno] ; user (process) number (1 to 16)
  3636 00012D31 8886[608A0100]      <1> 	mov	[esi+IRQ.owner], al ; lock the IRQ for user
  3637 00012D37 88BE[728A0100]      <1> 	mov	[esi+IRQ.method], bh
  3638                              <1> 
  3639                              <1> ;	test	bh, 1
  3640                              <1> ;	jnz	short scbs_9 	 ; Callback method, CX will not be used 
  3641                              <1> ;			
  3642                              <1> ;	test	bh, 2		 ; use auto increment (counter) method
  3643                              <1> ;	jz	short scbs_10	 ; (count can be used for buffer switch)
  3644                              <1> ;scbs_9:
  3645                              <1> ;	xor	ecx, ecx ; 0
  3646                              <1> 
  3647                              <1> scbs_10:			      	
  3648                              <1> 	;mov	[esi+IRQ.method], bh
  3649 00012D3D 888E[7B8A0100]      <1> 	mov	[esi+IRQ.srb], cl
  3650 00012D43 C686[698A0100]00    <1> 	mov	byte [esi+IRQ.dev], 0 ; device number is always 0 
  3651                              <1> 				 ; for this system call
  3652                              <1> 	;test	bh, 1
  3653 00012D4A 80E701              <1> 	and	bh, 1 ; 17/04/2017
  3654 00012D4D 7513                <1> 	jnz	short scbs_11	 ; callback method, use virtual address 
  3655                              <1> 
  3656 00012D4F 53                  <1> 	push	ebx ; IRQ number (in BL)
  3657 00012D50 89D3                <1> 	mov	ebx, edx
  3658                              <1> 	; ebx = virtual address
  3659                              <1> 	; [u.pgdir] = page directory's physical address
  3660 00012D52 FE05[1E8A0100]      <1> 	inc	 byte [no_page_swap] ; 1 
  3661                              <1> 			; Do not add this page to swap queue
  3662                              <1> 			; and remove it from swap queue if it is
  3663                              <1> 			; on the queue.
  3664 00012D58 E8392EFFFF          <1> 	call	get_physical_addr
  3665 00012D5D 5B                  <1> 	pop	ebx
  3666 00012D5E 728A                <1> 	jc	short scbs_3 ; invalid address !
  3667                              <1> 	; eax = physical address of the virtual address in user's space
  3668 00012D60 89C2                <1> 	mov	edx, eax
  3669                              <1> scbs_11:
  3670                              <1> 	;shl	si, 2		; byte (index) to dword (offset)
  3671                              <1> 	; 23/11/2023
  3672 00012D62 C1E602              <1> 	shl	esi, 2
  3673 00012D65 8996[848A0100]      <1> 	mov	[esi+IRQ.addr], edx
  3674                              <1> 
  3675 00012D6B FE05[96900100]      <1> 	inc	byte [u.irqc]	; increase IRQ (in use) count
  3676                              <1> 
  3677 00012D71 FEC7                <1> 	inc	bh ; 17/04/2017
  3678                              <1> 	; bh > 0 -> set to requested IRQ handler (IRQ_u_list)
  3679                              <1> scbs_12:
  3680 00012D73 88D8                <1> 	mov	al, bl ; IRQ number
  3681 00012D75 88FC                <1> 	mov	ah, bh ; 0 = reset, >0 = set
  3682 00012D77 E821F5FFFF          <1> 	call	set_hardware_int_vector
  3683                              <1> 
  3684 00012D7C 31C0                <1> 	xor	eax, eax
  3685                              <1> 	;mov 	[u.r0], eax ; 0	
  3686                              <1> 
  3687 00012D7E C3                  <1> 	retn	; return with success (cf=0, eax=0)
  3688                              <1> 
  3689                              <1> sysdma: ; DMA FUNCTIONS
  3690                              <1> 	; 08/08/2022
  3691                              <1> 	; 30/07/2022 - TRDOS 386 Kernel v2.0.5
  3692                              <1> 	; 02/09/2017
  3693                              <1> 	; 28/08/2017
  3694                              <1> 	; 20/08/2017 - TRDOS 386 (TRDOS v2.0)
  3695                              <1> 	;
  3696                              <1> 	; Inputs:
  3697                              <1> 	;	BH = 0 -> Allocate DMA buffer
  3698                              <1> 	;	   BL = 0 -> Use the system's default DMA
  3699                              <1> 	;		     (SB16) Buffer
  3700                              <1> 	;	        Buffer Size (max.) = 65536 bytes
  3701                              <1> 	;	   BL > 0 -> Allocate (a new) DMA buffer
  3702                              <1>  	;	   ECX = DMA Buffer Size in bytes (<=128KB)
  3703                              <1> 	;	   EDX = Virtual Address of DMA buffer 	
  3704                              <1> 	;		
  3705                              <1> 	;	BH = 1 -> Initialize (Start) DMA service
  3706                              <1> 	;	     BL, bit 0 to 3 = Channel Number (0 to 7)	
  3707                              <1> 	;	     BL, bit 7 = Auto Initialized Mode 
  3708                              <1> 	;			(If bit 7 is set)
  3709                              <1> 	;		 bit 6 = Record (read) mode (0= playback)
  3710                              <1> 	;	     ECX = byte count (0 = use dma buffer size)
  3711                              <1> 	;	     EDX = physical buffer address
  3712                              <1> 	;	     	   (0 = use dma buffer -start- address)		
  3713                              <1> 	;
  3714                              <1> 	;	BH = 2 -> Get Current DMA Buffer Offset
  3715                              <1> 	;	     BL = DMA channel number	
  3716                              <1> 	;		
  3717                              <1> 	;	BH = 3 -> Get Current DMA count down value
  3718                              <1> 	;	     BL = DMA channel number (0 tO 7)	
  3719                              <1> 	;
  3720                              <1> 	;	BH = 4 -> Get Current DMA channel (in progress)
  3721                              <1> 	;
  3722                              <1> 	;	BH = 5 -> Get System's Default DMA Buffer Address
  3723                              <1> 	;
  3724                              <1> 	;	BH = 6 -> Get Current DMA Buffer Address	
  3725                              <1> 	;
  3726                              <1> 	;	BH = 7 -> Stop DMA service
  3727                              <1> 	;
  3728                              <1> 	; Outputs:
  3729                              <1> 	;
  3730                              <1> 	;	For BH = 0 ; Allocate DMA buffer
  3731                              <1> 	;	    EAX = Physical address of DMA buffer
  3732                              <1> 	;	    ECX = Allocated buffer size in bytes
  3733                              <1> 	;		  - page count * 4096 -
  3734                              <1> 	;		  (may be bigger than requested)	
  3735                              <1> 	;	    If BL input > 0,
  3736                              <1> 	;	       'sysalloc:' system call will be used with
  3737                              <1>   	;	       EBX (for 'sysalloc') = EDX (for 'sysdma')
  3738                              <1> 	;	       ECX is same, byte count (buffer size)
  3739                              <1> 	;	       EDX = 1024*1024*16 ; 16 MB upper limit	 		        	 
  3740                              <1> 	;	    If BL input = 0,
  3741                              <1> 	;	       Default DMA buffer (SB16 buffer) will be
  3742                              <1> 	;	       checked and if it is free, it's address
  3743                              <1> 	;	       will be returned in EAX and it's size
  3744                              <1> 	;	       will be returned in ECX (as 65536)
  3745                              <1> 	;
  3746                              <1> 	;	    If CF = 1, error code is in EAX
  3747                              <1> 	;	       EAX = -1 ; DMA buffer allocation error! 		
  3748                              <1> 	;	       EAX = 11 ; 'Permission Denied' error !
  3749                              <1> 	;
  3750                              <1> 	;	       Note: 'sysalloc' error return method
  3751                              <1> 	;		      will be applied if BL input > 0 !		
  3752                              <1> 	;
  3753                              <1> 	; 	 For BH = 1 ; Initialize (Start) DMA
  3754                              <1> 	;	     EAX = 0 (Successful)	
  3755                              <1> 	;	     If CF = 1, error code is in EAX
  3756                              <1> 	;
  3757                              <1> 	; 	 For BH = 2 ; Get Current DMA Buffer Offset
  3758                              <1> 	;	     EAX = DMA Buffer Offset (in bytes)
  3759                              <1> 	;	     ;
  3760                              <1> 	;	      AX = DMA buffer offset
  3761                              <1> 	;	     EAX bits 16 to 23 = Page register value
  3762                              <1> 	;		   	
  3763                              <1> 	; 	 For BH = 3 ; Get Current DMA count down value
  3764                              <1> 	;	     EAX = Count down value (remain bytes)
  3765                              <1> 	;	
  3766                              <1> 	;	 For BH = 4 ; Get Current DMA channel (in progress)
  3767                              <1> 	;	     EAX = DMA channel number (0 to 7)
  3768                              <1> 	;		AH = 0 if the owner is the caller process
  3769                              <1> 	;		AH > 0 if the dma channel is in use by
  3770                              <1> 	;		       another user/process
  3771                              <1> 	;	     EAX = -1 (0FFFFFFFFh) 
  3772                              <1> 	;		    if DMA service is not in use	    		
  3773                              <1> 	;	 	    (stopped or not initialized/started)	
  3774                              <1> 	;
  3775                              <1> 	;	 For BH = 5 ; Get System's Default DMA Buff Addr
  3776                              <1> 	;	     EAX = Default DMA Buffer Address (Physical)
  3777                              <1> 	;		 = offset 'sb16_dma_buffer:'	
  3778                              <1> 	;	     ECX = Buffer size
  3779                              <1> 	;		 = 65536 
  3780                              <1> 	;
  3781                              <1> 	;	 For BH = 6 ; Get Current DMA Buffer Address
  3782                              <1> 	;	     EAX = Current DMA buffer address (Physical)
  3783                              <1> 	;	     ECX = Current DMA buffer size (setting value)	   		  	 		
  3784                              <1> 	;	     Note: These values are for current dma channel
  3785                              <1> 	;		   settings for the user/process
  3786                              <1> 	;	     ** For now (for current TRDOS 386 version)
  3787                              <1> 	;		only one user/process can use only one
  3788                              <1> 	;		dma channel & one dma buffer at same time
  3789                              <1> 	;		(no multi tasking on DMA service) !!! **
  3790                              <1> 	;	     (Once, current DMA user must stop it's own DMA
  3791                              <1> 	;	      DMA service, than another user/program 
  3792                              <1> 	;	      can use DMA service with same dma channel 
  3793                              <1> 	;	      or with another DMA channel.)	 			      		
  3794                              <1> 	;
  3795                              <1> 	;	 For BH = 7 ; Stop DMA service (for current user
  3796                              <1> 	;	     and current DMA channel)	
  3797                              <1> 	;	     EAX = 0 ; successful
  3798                              <1> 	;	     CF = 1 & EAX > 0 (= -1) -> Error		
  3799                              <1> 
  3800 00012D7F 80FF07              <1> 	cmp	bh, 7
  3801 00012D82 7612                <1> 	jna	short sysdma_0
  3802                              <1> 
  3803                              <1> sysdma_err:
  3804 00012D84 31C0                <1> 	xor	eax, eax
  3805 00012D86 48                  <1> 	dec	eax ; -1
  3806                              <1> sysdma_perm_err:
  3807 00012D87 A3[20900100]        <1> 	mov	[u.r0], eax
  3808 00012D8C A3[88900100]        <1> 	mov	[u.error], eax ; DMA service error !
  3809 00012D91 E9A1A0FFFF          <1> 	jmp	error
  3810                              <1> 
  3811                              <1> sysdma_0:
  3812 00012D96 08FF                <1> 	or	bh, bh
  3813 00012D98 7537                <1> 	jnz	short sysdma_1 ; 30/07/2022
  3814                              <1> 	
  3815 00012D9A 20DB                <1> 	and	bl, bl
  3816 00012D9C 7416                <1> 	jz	short sysdma_01
  3817                              <1> 
  3818                              <1> 	; redirect system call to 'sysalloc'
  3819 00012D9E 89D3                <1> 	mov	ebx, edx ; virtual address of DMA buffer
  3820                              <1> 	;ecx = Buffer size in bytes
  3821                              <1> 	; DMA buffer address <= 16MB upper limit
  3822 00012DA0 BA00000001          <1> 	mov	edx, 1024*1024*16 ; 16MB limit for DMA buff
  3823                              <1> 
  3824 00012DA5 C705[F48E0100]FFFF- <1> 	mov	dword [dma_addr], 0FFFFFFFFh ; -1
  3824 00012DAD FFFF                <1>
  3825                              <1> 
  3826 00012DAF E98DE8FFFF          <1> 	jmp	sysalloc
  3827                              <1> 
  3828                              <1> sysdma_01:
  3829 00012DB4 B800000500          <1> 	mov	eax, sb16_dma_buffer
  3830                              <1> 
  3831 00012DB9 803D[B18A0100]01    <1> 	cmp	byte [audio_device], 1
  3832 00012DC0 724A                <1> 	jb	short sysdma_03
  3833                              <1> 
  3834 00012DC2 3B05[D08A0100]      <1> 	cmp	eax, [audio_dma_buff]
  3835 00012DC8 7527                <1> 	jne	short sysdma_02
  3836                              <1> 
  3837                              <1> sysdma_0_err:
  3838 00012DCA B80B000000          <1> 	mov	eax, ERR_PERM_DENIED
  3839 00012DCF EBB6                <1> 	jmp	short sysdma_perm_err
  3840                              <1> 
  3841                              <1> 	; 30/07/2022
  3842                              <1> sysdma_1:
  3843 00012DD1 80FF01              <1> 	cmp	bh, 1
  3844                              <1> 	;ja	sysdma_5
  3845                              <1> 	; 30/07/2022
  3846 00012DD4 7605                <1> 	jna	short sysdma_10
  3847 00012DD6 E90C010000          <1> 	jmp	sysdma_5
  3848                              <1> 
  3849                              <1> sysdma_10:
  3850 00012DDB F6C340              <1> 	test	bl, 40h	; record (read) mode -BL, bit 6-
  3851                              <1> 	;jnz	sysdma_err ; not ready yet!
  3852                              <1> 	; 30/07/2022
  3853 00012DDE 757C                <1> 	jnz	short sysdma_06 ; jmp sysdma_err
  3854                              <1> 
  3855 00012DE0 A1[F48E0100]        <1> 	mov	eax, [dma_addr] ; physical address of dma buffer
  3856 00012DE5 21C0                <1> 	and	eax, eax
  3857                              <1> 	;jz	sysdma_err
  3858                              <1> 	; 30/07/2022
  3859 00012DE7 7473                <1> 	jz	short sysdma_06 ; jmp sysdma_err
  3860                              <1> 
  3861 00012DE9 09D2                <1> 	or	edx, edx
  3862 00012DEB 7574                <1> 	jnz	short sysdma_11
  3863                              <1> 
  3864 00012DED 89C2                <1> 	mov	edx, eax
  3865 00012DEF EB74                <1> 	jmp	short sysdma_12	
  3866                              <1> 
  3867                              <1> sysdma_02:
  3868                              <1> 	; Only one user is permitted for audio/dma functions
  3869                              <1> 
  3870 00012DF1 833D[D08A0100]00    <1> 	cmp	dword [audio_dma_buff], 0
  3871 00012DF8 7612                <1> 	jna	short sysdma_03
  3872                              <1> 
  3873 00012DFA 8A1D[D98A0100]      <1> 	mov	bl, [audio_user]
  3874 00012E00 08DB                <1> 	or	bl, bl
  3875 00012E02 7408                <1> 	jz	short sysdma_03
  3876                              <1> 
  3877 00012E04 3A1D[71900100]      <1> 	cmp	bl, [u.uno]
  3878 00012E0A 75BE                <1> 	jne	short sysdma_0_err
  3879                              <1> 
  3880                              <1> sysdma_03: 
  3881 00012E0C 8A1D[F18E0100]      <1> 	mov	bl, [dma_user]
  3882 00012E12 20DB                <1> 	and	bl, bl
  3883 00012E14 750E                <1> 	jnz	short sysdma_04
  3884                              <1> 	
  3885 00012E16 8A1D[71900100]      <1> 	mov	bl, [u.uno]
  3886 00012E1C 881D[F18E0100]      <1> 	mov	[dma_user], bl
  3887                              <1> 
  3888 00012E22 EB15                <1> 	jmp	short sysdma_05
  3889                              <1> 
  3890                              <1> sysdma_04:
  3891 00012E24 8B35[F48E0100]      <1> 	mov	esi, [dma_addr]
  3892 00012E2A 21F6                <1> 	and	esi, esi
  3893 00012E2C 740B                <1> 	jz	short sysdma_05
  3894                              <1> 
  3895 00012E2E 46                  <1> 	inc	esi ; -1 -> 0
  3896 00012E2F 7408                <1> 	jz	short sysdma_05
  3897                              <1> 
  3898 00012E31 3A1D[71900100]      <1> 	cmp	bl, [u.uno]
  3899 00012E37 7591                <1> 	jne	short sysdma_0_err
  3900                              <1> 	
  3901                              <1> sysdma_05:
  3902                              <1> 	; edx = virtual address (user's buffer address)
  3903                              <1> 	; 
  3904 00012E39 81F900000100        <1> 	cmp	ecx, 65536   ; byte count (buffer size)
  3905                              <1> 	;ja	sysdma_err
  3906                              <1> 	; 30/07/2022
  3907 00012E3F 771B                <1> 	ja	short sysdma_06 ; jmp sysdma_err
  3908                              <1> 	;
  3909 00012E41 81C1FF0F0000        <1> 	add	ecx, PAGE_SIZE-1 ; 4095
  3910 00012E47 6681E100F0          <1> 	and	cx, ~PAGE_OFF ; not 4095
  3911                              <1> 	;cmp	ecx, 65536
  3912                              <1> 	;ja	sysdma_err
  3913 00012E4C 51                  <1> 	push	ecx	; buffer size (allocated pages * 4096) 
  3914 00012E4D 50                  <1> 	push	eax	; offset sb16_dma_buffer
  3915 00012E4E 89D3                <1> 	mov	ebx, edx
  3916 00012E50 C1E90C              <1> 	shr	ecx, 12 ; byte count to page count
  3917                              <1> 	; eax = physical address of (audio) dma buffer
  3918                              <1> 	; ebx = virtual address of (audio) dma buffer (user's pgdir) 
  3919                              <1> 	; ecx = page count (>0)
  3920 00012E53 E80331FFFF          <1> 	call	direct_memory_access
  3921 00012E58 58                  <1> 	pop	eax
  3922 00012E59 59                  <1> 	pop	ecx
  3923                              <1> 	;jc	sysdma_err
  3924                              <1> 	; 30/07/2022
  3925 00012E5A 7315                <1> 	jnc	short sysdma_07
  3926                              <1> sysdma_06:
  3927 00012E5C E923FFFFFF          <1> 	jmp	sysdma_err
  3928                              <1> 
  3929                              <1> sysdma_11:
  3930 00012E61 39C2                <1> 	cmp	edx, eax
  3931                              <1> 	;jb	sysdma_err
  3932                              <1> 	; 30/07/2022
  3933 00012E63 72F7                <1> 	jb	short sysdma_06 ; jmp sysdma_err
  3934                              <1> sysdma_12:
  3935 00012E65 21C9                <1> 	and	ecx, ecx
  3936 00012E67 7515                <1> 	jnz	short sysdma_13
  3937                              <1> 
  3938 00012E69 8B0D[F88E0100]      <1> 	mov	ecx, [dma_size]
  3939 00012E6F EB15                <1> 	jmp	short sysdma_14
  3940                              <1> 
  3941                              <1> sysdma_07:
  3942 00012E71 A3[F48E0100]        <1> 	mov	[dma_addr], eax
  3943 00012E76 890D[F88E0100]      <1> 	mov	[dma_size], ecx ; dma buffer size (in bytes)
  3944                              <1> 
  3945                              <1> 	;mov	[u.r0], eax ; DMA Buffer Address (Physical)
  3946                              <1> 
  3947                              <1> 	;mov	ebp, [u.usp]  ; ebp points to user's registers
  3948                              <1> 	;mov	[ebp+24], ecx ; return to user with ecx value
  3949                              <1> 
  3950                              <1> 	;jmp	sysret
  3951                              <1> 
  3952                              <1> 	; 28/08/2017
  3953 00012E7C EB7A                <1> 	jmp	sysdma_51
  3954                              <1> 
  3955                              <1> sysdma_13:
  3956 00012E7E 3B0D[F88E0100]      <1> 	cmp	ecx, [dma_size]
  3957                              <1> 	;ja	sysdma_err
  3958                              <1> 	; 30/07/2022
  3959 00012E84 77D6                <1> 	ja	short sysdma_06 ; jmp sysdma_err
  3960                              <1> sysdma_14:
  3961 00012E86 89C6                <1> 	mov	esi, eax
  3962 00012E88 0335[F88E0100]      <1> 	add	esi, [dma_size]
  3963                              <1> 
  3964 00012E8E 89D0                <1> 	mov	eax, edx
  3965 00012E90 01C8                <1> 	add	eax, ecx
  3966                              <1> 	;jc	sysdma_err ; 02/09/2017
  3967                              <1> 	; 30/07/2022
  3968 00012E92 72C8                <1> 	jc	short sysdma_06 ; jmp sysdma_err	
  3969                              <1> 		
  3970 00012E94 39F0                <1> 	cmp	eax, esi
  3971                              <1> 	;ja	sysdma_err
  3972                              <1> 	; 30/07/2022
  3973 00012E96 77C4                <1> 	ja	short sysdma_06 ; jmp sysdma_err
  3974                              <1> 
  3975 00012E98 8B3D[D08A0100]      <1> 	mov	edi, [audio_dma_buff]
  3976 00012E9E 8B35[F48E0100]      <1> 	mov	esi, [dma_addr]
  3977                              <1> 
  3978 00012EA4 09FF                <1> 	or	edi, edi
  3979 00012EA6 7425                <1> 	jz	short sysdma_16
  3980                              <1> 	
  3981 00012EA8 803D[B18A0100]01    <1> 	cmp	byte [audio_device], 1
  3982 00012EAF 7209                <1> 	jb	short sysdma_15
  3983                              <1> 
  3984                              <1> 	; Sound Blaster 16
  3985 00012EB1 39FE                <1> 	cmp	esi, edi
  3986                              <1> 	;je	sysdma_0_err ; permmission denied !
  3987                              <1> 	; 30/07/2022
  3988 00012EB3 7505                <1> 	jne	short sysdma_15
  3989 00012EB5 E910FFFFFF          <1> 	jmp	sysdma_0_err
  3990                              <1> sysdma_15:
  3991 00012EBA C605[F38E0100]48    <1> 	mov	byte [dma_mode], 48h ; single mode playback	
  3992                              <1> 
  3993 00012EC1 F6C380              <1> 	test	bl, 80h ; DMA mode - BL, bit 7, auto init -
  3994 00012EC4 7407                <1> 	jz	short sysdma_16	
  3995                              <1> 	; Auto initialized playback (write) mode
  3996 00012EC6 8005[F38E0100]10    <1> 	add	byte [dma_mode], 10h ; = 58h
  3997                              <1> sysdma_16:
  3998 00012ECD 80E307              <1> 	and	bl, 07h
  3999 00012ED0 881D[F28E0100]      <1> 	mov	[dma_channel], bl
  4000 00012ED6 8915[FC8E0100]      <1> 	mov	[dma_start], edx
  4001 00012EDC 890D[008F0100]      <1> 	mov	[dma_count], ecx
  4002                              <1> 	 
  4003                              <1> 	; 28/08/2017
  4004                              <1> 	;call	dma_init
  4005                              <1> 	;jmp	sysret
  4006 00012EE2 E945010000          <1> 	jmp	dma_init
  4007                              <1> 
  4008                              <1> sysdma_5:
  4009 00012EE7 80FF05              <1> 	cmp	bh, 5
  4010 00012EEA 726D                <1> 	jb	short sysdma_3
  4011 00012EEC 7759                <1> 	ja	short sysdma_6
  4012                              <1> 
  4013                              <1> 	; Get the system's default dma buffer addr and size
  4014 00012EEE B800000500          <1> 	mov	eax, sb16_dma_buffer
  4015 00012EF3 B900000100          <1> 	mov	ecx, 65536 ; Buffer size in bytes
  4016                              <1> 
  4017                              <1> sysdma_51:
  4018                              <1> 	; 0 = there is not a dma buffer (in use or available)
  4019 00012EF8 A3[20900100]        <1> 	mov	[u.r0], eax
  4020                              <1> 
  4021 00012EFD 8B2D[1C900100]      <1> 	mov	ebp, [u.usp]  ; ebp points to user's registers
  4022 00012F03 894D18              <1> 	mov	[ebp+24], ecx ; return to user with ecx value
  4023                              <1> 
  4024 00012F06 E94C9FFFFF          <1> 	jmp	sysret
  4025                              <1> 
  4026                              <1> sysdma_2:
  4027                              <1> 	; Get current dma buffer offset (& page)
  4028                              <1> 	; 28/08/2017
  4029 00012F0B 0FB635[F28E0100]    <1> 	movzx	esi, byte [dma_channel]
  4030 00012F12 0FB696[18380100]    <1> 	movzx	edx, byte [dma_flip+esi]
  4031 00012F19 EE                  <1> 	out	dx, al			; flip-flop clear
  4032 00012F1A 8A96[F0370100]      <1> 	mov	dl, [dma_adr+esi]
  4033 00012F20 EC                  <1> 	in	al, dx			; get dma position
  4034 00012F21 0FB6D8              <1> 	movzx	ebx, al
  4035 00012F24 EC                  <1> 	in	al, dx			
  4036 00012F25 88C7                <1> 	mov	bh, al
  4037                              <1> 
  4038 00012F27 6683FE04            <1> 	cmp	si, 4	; channel number ?
  4039 00012F2B 7202                <1> 	jb	short sysdma_21 ; 8 bit dma channel
  4040                              <1> 
  4041 00012F2D D1E3                <1> 	shl	ebx, 1	; word offset to byte offset
  4042                              <1> 
  4043                              <1> sysdma_21:
  4044 00012F2F 891D[20900100]      <1> 	mov	[u.r0], ebx
  4045                              <1> 
  4046 00012F35 8A96[00380100]      <1> 	mov	dl, [dma_page+esi]
  4047 00012F3B EC                  <1> 	in	al, dx			; get dma page
  4048                              <1> 
  4049                              <1> 	;add	[u.ro+2], al
  4050 00012F3C 0805[22900100]      <1> 	or	[u.r0+2], al
  4051                              <1> 
  4052 00012F42 E9109FFFFF          <1> 	jmp	sysret
  4053                              <1> 
  4054                              <1> sysdma_6:
  4055 00012F47 80FF06              <1> 	cmp	bh, 6
  4056 00012F4A 775C                <1> 	ja	short sysdma_7
  4057                              <1> 
  4058                              <1> 	; 28/08/2017
  4059                              <1> 	; Get current DMA buffer addr and size
  4060 00012F4C A1[F48E0100]        <1> 	mov	eax, [dma_addr] ; dma buffer address
  4061 00012F51 8B0D[F88E0100]      <1> 	mov	ecx, [dma_size] ; dma buffer size (in bytes)
  4062                              <1> 
  4063 00012F57 EB9F                <1> 	jmp	short sysdma_51
  4064                              <1> 
  4065                              <1> sysdma_3:
  4066 00012F59 80FF03              <1> 	cmp	bh, 3
  4067 00012F5C 72AD                <1> 	jb	short sysdma_2
  4068 00012F5E 772F                <1> 	ja	short sysdma_4
  4069                              <1> 
  4070                              <1> 	; Get current dma count down value (remain bytes)
  4071                              <1> 	; 28/08/2017
  4072 00012F60 0FB635[F28E0100]    <1> 	movzx	esi, byte [dma_channel]
  4073 00012F67 0FB696[18380100]    <1> 	movzx	edx, byte [dma_flip+esi]
  4074 00012F6E EE                  <1> 	out	dx, al			; flip-flop clear
  4075 00012F6F 8A96[F8370100]      <1> 	mov	dl, [dma_cnt+esi] ; dma count register addr
  4076 00012F75 EC                  <1> 	in	al, dx
  4077 00012F76 0FB6D8              <1> 	movzx	ebx, al	
  4078 00012F79 EC                  <1> 	in	al, dx
  4079 00012F7A 88C7                <1> 	mov     bh, al
  4080                              <1> 	
  4081 00012F7C 6683FE04            <1> 	cmp	si, 4	; channel number ?
  4082 00012F80 7202                <1> 	jb	short sysdma_31 ; 8 bit dma channel
  4083                              <1> 
  4084 00012F82 D1E3                <1> 	shl	ebx, 1	; word count to byte count
  4085                              <1> 
  4086                              <1> sysdma_31:
  4087 00012F84 891D[20900100]      <1> 	mov	[u.r0], ebx
  4088                              <1> 
  4089 00012F8A E9C89EFFFF          <1> 	jmp	sysret
  4090                              <1> 
  4091                              <1> sysdma_4:
  4092                              <1> 	; Get current DMA channel number
  4093                              <1> 	; 28/08/2017
  4094 00012F8F 8A25[F18E0100]      <1> 	mov	ah, [dma_user]
  4095 00012F95 20E4                <1> 	and	ah, ah
  4096 00012F97 7539                <1> 	jnz	short sysdma_42
  4097                              <1> 
  4098                              <1> sysdma_41:	
  4099                              <1> 	; Not a valid dma channel (in use)
  4100 00012F99 C705[20900100]FFFF- <1> 	mov	dword [u.r0], -1 ; 0FFFFFFFFh
  4100 00012FA1 FFFF                <1>
  4101 00012FA3 E9AF9EFFFF          <1> 	jmp	sysret
  4102                              <1> 
  4103                              <1> sysdma_7:
  4104                              <1> 	; DMA service STOP
  4105 00012FA8 A0[71900100]        <1> 	mov	al, [u.uno]
  4106 00012FAD 3A05[F18E0100]      <1> 	cmp	al, [dma_user]
  4107 00012FB3 7543                <1> 	jne	short sysdma_72
  4108                              <1> 	
  4109 00012FB5 28C0                <1> 	sub	al, al ; 0
  4110                              <1> 
  4111 00012FB7 A2[F18E0100]        <1> 	mov	[dma_user], al ; clear user
  4112                              <1> 
  4113 00012FBC 8605[F38E0100]      <1> 	xchg	al, [dma_mode]
  4114 00012FC2 20C0                <1> 	and	al, al
  4115                              <1> 	;jz	short sysdma_err
  4116 00012FC4 754E                <1> 	jnz	short sysdma_73	
  4117                              <1> 
  4118                              <1> sysdma_71:
  4119 00012FC6 31C0                <1> 	xor	eax, eax
  4120 00012FC8 A3[20900100]        <1> 	mov	[u.r0], eax; 0
  4121 00012FCD E9859EFFFF          <1> 	jmp	sysret
  4122                              <1> 
  4123                              <1> sysdma_42:
  4124 00012FD2 8B35[F48E0100]      <1> 	mov	esi, [dma_addr]
  4125 00012FD8 21F6                <1> 	and	esi, esi
  4126 00012FDA 74BD                <1> 	jz	short sysdma_41
  4127                              <1> 
  4128 00012FDC 46                  <1> 	inc	esi ; -1 -> 0
  4129 00012FDD 74BA                <1> 	jz	short sysdma_41
  4130                              <1> 
  4131 00012FDF A0[F28E0100]        <1> 	mov	al, [dma_channel]
  4132                              <1> 
  4133 00012FE4 3A25[71900100]      <1> 	cmp	ah, [u.uno]
  4134 00012FEA 7502                <1> 	jne	short sysdma_43
  4135                              <1> 
  4136 00012FEC 30E4                <1> 	xor	ah, ah ; DMA channel in use by current user
  4137                              <1> 
  4138                              <1> sysdma_43:
  4139 00012FEE A3[20900100]        <1> 	mov	[u.r0], eax ; AL = dma channel number
  4140                              <1> 			    ; AH > 0 if the the channel
  4141                              <1> 			    ; in use by another user/process
  4142 00012FF3 E95F9EFFFF          <1> 	jmp	sysret
  4143                              <1> 
  4144                              <1> sysdma_72:
  4145                              <1> 	; 28/08/2017
  4146 00012FF8 803D[F18E0100]00    <1> 	cmp	byte [dma_user], 0
  4147 00012FFF 76C5                <1> 	jna	short sysdma_71 ; Nothing to do !
  4148                              <1> 
  4149 00013001 833D[F48E0100]00    <1> 	cmp	dword [dma_addr], 0
  4150                              <1> 	;ja	sysdma_0_err
  4151                              <1> 	; 30/07/2022
  4152 00013008 7605                <1> 	jna	short sysdma_74
  4153 0001300A E9BBFDFFFF          <1> 	jmp	sysdma_0_err
  4154                              <1> 
  4155                              <1> sysdma_74:	
  4156 0001300F A2[F18E0100]        <1> 	mov	[dma_user], al ; reset to current user
  4157                              <1> 
  4158                              <1> sysdma_73:
  4159                              <1> 	; 28/08/2017
  4160 00013014 0FB635[F28E0100]    <1> 	movzx	esi, byte [dma_channel]
  4161 0001301B 0FB696[08380100]    <1> 	movzx	edx, byte [dma_mask+esi]
  4162 00013022 A0[F28E0100]        <1> 	mov	al, [dma_channel]
  4163 00013027 0C04                <1> 	or	al, 4
  4164 00013029 EE                  <1> 	out	dx, al
  4165                              <1> 
  4166 0001302A EB9A                <1> 	jmp	short sysdma_71
  4167                              <1> 
  4168                              <1> dma_init:
  4169                              <1> 	; 30/07/2022 (TRDOS 386 Kernel v2.0.5)
  4170                              <1> 	; 28/08/2017
  4171                              <1> 	; 20/08/2017
  4172                              <1> 	; DMA initialization
  4173                              <1> 	; 14/08/2017
  4174                              <1> 	; 03/08/2017, 06/08/2017, 08/08/2017
  4175                              <1> 	; 02/07/2017, 13/07/2017, 16/07/2017, 30/07/2017
  4176                              <1> 	; (Derived from 'DMA_INIT' procedure in SB16MOD.ASM)
  4177                              <1> 	; Modified for TRDOS 386 DMA buffer allocation & initialization !
  4178                              <1> 
  4179 0001302C 8B1D[FC8E0100]      <1> 	mov	ebx, [dma_start]
  4180 00013032 8B0D[008F0100]      <1> 	mov	ecx, [dma_count]
  4181                              <1> 
  4182 00013038 0FB635[F28E0100]    <1> 	movzx	esi, byte [dma_channel]
  4183                              <1> 
  4184 0001303F 6683FE04            <1> 	cmp	si, 4
  4185 00013043 7204                <1> 	jb	short gdmi1
  4186                              <1> 	; 08/08/2017
  4187                              <1> 	;shr	cx, 1 ; word count
  4188                              <1> 	; 30/07/2022
  4189 00013045 D1E9                <1> 	shr	ecx, 1
  4190 00013047 D1EB                <1> 	shr	ebx, 1 ; convert byte offset to word offset
  4191                              <1> gdmi1:
  4192                              <1> 	;mov	[dma_poff], bx ; 08/08/2017
  4193                              <1> 	;dec	cx			; dma size = block size - 1
  4194                              <1> 	; 30/07/2022
  4195 00013049 49                  <1> 	dec	ecx	
  4196                              <1> 
  4197 0001304A 0FB696[08380100]    <1> 	movzx	edx, byte [dma_mask+esi] ; 30/07/2017
  4198 00013051 A0[F28E0100]        <1> 	mov	al, [dma_channel]
  4199 00013056 0C04                <1> 	or	al, 4
  4200 00013058 EE                  <1> 	out	dx, al			; dma channel mask
  4201                              <1> 
  4202 00013059 30C0                <1> 	xor	al, al ; 0 ; any value ! 08/08/2017
  4203 0001305B 8A96[18380100]      <1> 	mov	dl, [dma_flip+esi]
  4204 00013061 EE                  <1> 	out	dx, al			; flip-flop clear
  4205                              <1> 	
  4206 00013062 8A96[10380100]      <1> 	mov	dl, [dma_mod+esi]
  4207 00013068 A0[F28E0100]        <1> 	mov	al, [dma_channel]  ; 13/07/2017
  4208 0001306D 2403                <1> 	and	al, 3
  4209                              <1> 	; 08/08/2017
  4210 0001306F 0A05[F38E0100]      <1> 	or	al, [dma_mode] ; 58h    ; dma mode for SB16
  4211 00013075 EE                  <1> 	out	dx, al			
  4212                              <1> 
  4213 00013076 8A96[F0370100]      <1> 	mov	dl, [dma_adr+esi]	
  4214 0001307C 88D8                <1> 	mov	al, bl			
  4215 0001307E EE                  <1> 	out	dx, al			; offset low
  4216                              <1> 
  4217 0001307F 88F8                <1> 	mov	al, bh
  4218 00013081 EE                  <1> 	out	dx, al			; offset high
  4219                              <1> 
  4220 00013082 8A96[F8370100]      <1> 	mov	dl, [dma_cnt+esi]
  4221 00013088 88C8                <1> 	mov	al, cl
  4222 0001308A EE                  <1> 	out	dx, al			; size low
  4223                              <1> 
  4224 0001308B 88E8                <1> 	mov	al, ch
  4225 0001308D EE                  <1> 	out	dx, al			; size high
  4226                              <1> 
  4227 0001308E 8A96[00380100]      <1> 	mov	dl, [dma_page+esi]
  4228                              <1> 	; 14/08/2017 
  4229 00013094 6683FE04            <1> 	cmp	si, 4
  4230 00013098 7305                <1> 	jnb	short gdmi2
  4231 0001309A C1EB10              <1> 	shr	ebx, 16
  4232 0001309D EB06                <1> 	jmp	short gdmi3
  4233                              <1> gdmi2:
  4234                              <1> 	; 09/08/2017
  4235 0001309F C1EB0F              <1> 	shr	ebx, 15	 ; complete 16 bit shift
  4236 000130A2 80E3FE              <1> 	and	bl, 0FEh ; clear bit 0 (not necessary)
  4237                              <1> gdmi3:	
  4238 000130A5 88D8                <1> 	mov	al, bl
  4239 000130A7 EE                  <1> 	out	dx, al			; page			
  4240                              <1> 	
  4241 000130A8 8A96[08380100]      <1> 	mov	dl, [dma_mask+esi]
  4242 000130AE A0[F28E0100]        <1> 	mov	al, [dma_channel]  ; 13/07/2017
  4243 000130B3 2403                <1> 	and	al, 3
  4244 000130B5 EE                  <1> 	out	dx, al			; dma channel unmask
  4245                              <1> 
  4246                              <1> 	;retn
  4247                              <1> 	; 28/08/2017
  4248 000130B6 E99C9DFFFF          <1> 	jmp	sysret
  4249                              <1> 
  4250                              <1> otty:
  4251                              <1> sret:
  4252                              <1> ocvt:
  4253                              <1> ctty:
  4254                              <1> cret:
  4255                              <1> ccvt:
  4256                              <1> rtty:
  4257                              <1> wtty:
  4258                              <1> rmem:
  4259                              <1> wmem:
  4260                              <1> rfd:
  4261                              <1> rhd:
  4262                              <1> wfd:
  4263                              <1> whd:
  4264                              <1> rlpt:
  4265                              <1> wlpt:
  4266                              <1> rcvt:
  4267                              <1> xmtt:
  4268 000130BB C3                  <1> 	retn
  3433                                  %include 'trdosk9.s' ; 04/01/2016
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.8) - INITIALIZED DATA : trdosk9.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 22/05/2024 (Previous: 07/12/2023 - Kernel v2.0.7)
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 04/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; ----------------------------------------------------------------------------
     9                              <1> ; Assembler: NASM version 2.15 (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 000130BC 01                  <1> 		db 1 ; A: = 0 & B: = 1
    22                              <1> 
    23                              <1> Restore_CDIR:	
    24 000130BD FF                  <1> 		db 0FFh ; Initial value -> any number except 0
    25                              <1> 
    26                              <1> msg_CRLF_temp:  
    27 000130BE 070D0A00            <1> 		db 07h, 0Dh, 0Ah, 0
    28                              <1> 
    29                              <1> Magic_Bytes:
    30 000130C2 04                  <1> 		db 4
    31 000130C3 01                  <1> 		db 1
    32                              <1> mainprog_Version:
    33 000130C4 07                  <1> 		db 7
    34 000130C5 5B5452444F535D204D- <1> 		db "[TRDOS] Main Program v2.0.8 (22/05/2024)"
    34 000130CE 61696E2050726F6772- <1>
    34 000130D7 616D2076322E302E38- <1>
    34 000130E0 202832322F30352F32- <1>
    34 000130E9 30323429            <1>
    35 000130ED 0D0A                <1> 		db 0Dh, 0Ah
    36 000130EF 286329204572646F67- <1> 		db "(c) Erdogan Tan 2005-2024"
    36 000130F8 616E2054616E203230- <1>
    36 00013101 30352D32303234      <1>
    37 00013108 0D0A00              <1> 		db 0Dh, 0Ah, 0
    38                              <1> 
    39                              <1> MainProgCfgFile: ; 14/04/2016
    40 0001310B 4D41494E50524F472E- <1> 		db "MAINPROG.CFG", 0
    40 00013114 43464700            <1>
    41                              <1> 
    42                              <1> TRDOSPromptLabel:
    43 00013118 5452444F53          <1> 		db "TRDOS"
    44 0001311D 00                  <1> 		db 0
    45 0001311E 00<rep 5h>          <1>                 times 5 db 0
    46 00013123 00                  <1> 		db 0
    47                              <1> 
    48                              <1> ; INTERNAL COMMANDS
    49                              <1> Command_List:
    50 00013124 44495200            <1> Cmd_Dir:	db "DIR", 0
    51 00013128 434400              <1> Cmd_Cd:		db "CD", 0
    52 0001312B 433A00              <1> Cmd_Drive:	db "C:", 0
    53 0001312E 56455200            <1> Cmd_Ver:	db "VER", 0
    54 00013132 4558495400          <1> Cmd_Exit:	db "EXIT", 0
    55 00013137 50524F4D505400      <1> Cmd_Prompt:	db "PROMPT", 0
    56 0001313E 564F4C554D4500      <1> Cmd_Volume:	db "VOLUME", 0
    57 00013145 4C4F4E474E414D4500  <1> Cmd_LongName:	db "LONGNAME", 0
    58 0001314E 4441544500          <1> Cmd_Date:	db "DATE", 0
    59 00013153 54494D4500          <1> Cmd_Time:	db "TIME", 0
    60 00013158 52554E00            <1> Cmd_Run:	db "RUN", 0
    61 0001315C 53455400            <1> Cmd_Set:	db "SET", 0 
    62 00013160 434C5300            <1> Cmd_Cls:	db "CLS", 0
    63 00013164 53484F5700          <1> Cmd_Show:	db "SHOW", 0
    64 00013169 44454C00            <1> Cmd_Del:	db "DEL", 0
    65 0001316D 41545452494200      <1> Cmd_Attrib:	db "ATTRIB", 0
    66 00013174 52454E414D4500      <1> Cmd_Rename:	db "RENAME", 0
    67 0001317B 524D44495200        <1> Cmd_Rmdir:	db "RMDIR", 0
    68 00013181 4D4B44495200        <1> Cmd_Mkdir:	db "MKDIR", 0
    69 00013187 434F505900          <1> Cmd_Copy:	db "COPY", 0
    70 0001318C 4D4F564500          <1> Cmd_Move:	db "MOVE", 0
    71 00013191 5041544800          <1> Cmd_Path:	db "PATH", 0
    72 00013196 4D454D00            <1> Cmd_Mem:	db "MEM", 0
    73 0001319A 00                  <1> 		db 0
    74 0001319B 46494E4400          <1> Cmd_Find:	db "FIND", 0
    75 000131A0 4543484F00          <1> Cmd_Echo:	db "ECHO", 0
    76 000131A5 2A00                <1> Cmd_Remark:	db "*", 0
    77 000131A7 3F00                <1> Cmd_Help:	db "?", 0
    78 000131A9 44455649434500      <1> Cmd_Device:	db "DEVICE", 0
    79 000131B0 4445564C49535400    <1> Cmd_DevList:	db "DEVLIST", 0
    80 000131B8 434844495200        <1> Cmd_Chdir:	db "CHDIR", 0
    81 000131BE 4245455000          <1> Cmd_Beep:	db "BEEP", 0
    82                              <1> 		
    83 000131C3 00                  <1> 		db 0
    84                              <1> 
    85                              <1> ; 15/02/2016 (FILE.ASM, 09/10/2011)
    86                              <1> invalid_fname_chars:
    87 000131C4 222728292A2B2C2F    <1> 		db 22h, 27h, 28h, 29h, 2Ah, 2Bh, 2Ch, 2Fh
    88 000131CC 3A3B3C3D3E3F40      <1> 		db 3Ah, 3Bh, 3Ch, 3Dh, 3Eh, 3Fh, 40h
    89 000131D3 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 000131D8 456E746572206E6577- <1>                 db 'Enter new date (dd-mm-yy): '
    94 000131E1 206461746520286464- <1>
    94 000131EA 2D6D6D2D7979293A20  <1>
    95 000131F3 00                  <1>                 db 0
    96                              <1> Msg_Show_Date:
    97 000131F4 43757272656E742064- <1>                 db   'Current date is '
    97 000131FD 61746520697320      <1>
    98 00013204 30                  <1> Day:            db   '0'
    99 00013205 30                  <1> 		db   '0'
   100 00013206 2F                  <1>                 db   '/'
   101 00013207 30                  <1> Month:          db   '0'
   102 00013208 30                  <1> 		db   '0'
   103 00013209 2F                  <1>                 db   '/'
   104 0001320A 30                  <1> Century:        db   '0'
   105 0001320B 30                  <1>                 db   '0'
   106 0001320C 30                  <1> Year:           db   '0'
   107 0001320D 30                  <1> 		db   '0'
   108 0001320E 0D0A00              <1>                 db   0Dh, 0Ah, 0
   109                              <1> 
   110                              <1> Msg_Enter_Time:
   111 00013211 456E746572206E6577- <1> 		db 'Enter new time: '
   111 0001321A 2074696D653A20      <1>
   112 00013221 00                  <1> 		db 0
   113                              <1> Msg_Show_Time:
   114 00013222 43757272656E742074- <1> 		db   'Current time is '
   114 0001322B 696D6520697320      <1>
   115 00013232 30                  <1> Hour:           db   '0'
   116 00013233 30                  <1> 		db   '0'
   117 00013234 3A                  <1> 		db   ':'
   118 00013235 30                  <1> Minute:         db   '0'
   119 00013236 30                  <1> 		db   '0'
   120 00013237 3A                  <1> 		db   ':'
   121 00013238 30                  <1> Second:         db   '0'
   122 00013239 30                  <1> 		db   '0'
   123 0001323A 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 0001323D 206B696C6F62797465- <1> 		db " kilobytes", 0Dh, 0Ah, 0
   129 00013246 730D0A00            <1>
   130                              <1> VolSize_Bytes:
   131 0001324A 2062797465730D0A00  <1> 		db " bytes", 0Dh, 0Ah, 0
   132                              <1> Volume_in_drive:
   133 00013253 0D0A                <1> 		db 0Dh, 0Ah
   134                              <1> Vol_FS_Name:
   135 00013255 54522046533120      <1> 		db "TR FS1 "
   136 0001325C 566F6C756D6520696E- <1> 		db "Volume in drive "
   136 00013265 20647269766520      <1>
   137 0001326C 30                  <1> Vol_Drv_Name:   db 30h
   138 0001326D 3A                  <1> 		db ":"
   139 0001326E 20697320            <1> 		db " is "
   140 00013272 0D0A00              <1> 		db 0Dh, 0Ah, 0
   141                              <1> Dir_Drive_Str:
   142 00013275 54522D444F53204472- <1>                 db "TR-DOS Drive "
   142 0001327E 69766520            <1>
   143                              <1> Dir_Drive_Name:
   144 00013282 303A                <1>                 db "0:"
   145 00013284 0D0A                <1>                 db  0Dh, 0Ah
   146                              <1> Vol_Str_Header:
   147 00013286 566F6C756D65204E61- <1>                 db "Volume Name: "
   147 0001328F 6D653A20            <1>
   148                              <1> Vol_Name:
   149 00013293 00<rep 40h>         <1> 		times 64 db 0
   150 000132D3 00                  <1> 		db 0
   151                              <1> Vol_Serial_Header:
   152 000132D4 0D0A                <1> 		db 0Dh, 0Ah
   153 000132D6 566F6C756D65205365- <1> 		db "Volume Serial No: "
   153 000132DF 7269616C204E6F3A20  <1>
   154                              <1> Vol_Serial1:
   155 000132E8 30303030            <1> 		db "0000"
   156 000132EC 2D                  <1> 		db "-"
   157                              <1> Vol_Serial2:
   158 000132ED 30303030            <1> 		db "0000"
   159 000132F1 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 000132F4 0D0A                <1> 		db 0Dh, 0Ah
   165 000132F6 566F6C756D65205369- <1> 		db "Volume Size : ", 0
   165 000132FF 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 00013305 467265652053706163- <1> 		db "Free Space  : ", 0
   173 0001330E 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 00013314 4469726563746F7279- <1>                 db "Directory: "
   180 0001331D 3A20                <1>
   181 0001331F 2F                  <1> Dir_Str_Root:   db "/"
   182 00013320 00<rep 40h>         <1> Dir_Str:        times 64 db 0
   183 00013360 00000000            <1>                 dd 0
   184 00013364 00                  <1>                 db 0
   185                              <1> 
   186                              <1> Msg_Bad_Command:
   187 00013365 42616420636F6D6D61- <1>                 db "Bad command or file name!"
   187 0001336E 6E64206F722066696C- <1>
   187 00013377 65206E616D6521      <1>
   188 0001337E 0D0A00              <1>                 db 0Dh, 0Ah, 0
   189                              <1> 
   190                              <1> msgl_drv_not_ready: 
   191 00013381 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 00013384 4472697665206E6F74- <1>                 db "Drive not ready or read error!"
   196 0001338D 207265616479206F72- <1>
   196 00013396 207265616420657272- <1>
   196 0001339F 6F7221              <1>
   197 000133A2 0D0A00              <1>                 db 0Dh, 0Ah, 0
   198                              <1> 
   199                              <1> Msg_Not_Ready_Write_Err:
   200 000133A5 4472697665206E6F74- <1>                 db "Drive not ready or write error!"
   200 000133AE 207265616479206F72- <1>
   200 000133B7 207772697465206572- <1>
   200 000133C0 726F7221            <1>
   201 000133C4 0D0A00              <1>                 db 0Dh, 0Ah, 0
   202                              <1> 
   203                              <1> Msg_Dir_Not_Found:
   204 000133C7 4469726563746F7279- <1>                 db "Directory not found!"
   204 000133D0 206E6F7420666F756E- <1>
   204 000133D9 6421                <1>
   205 000133DB 0D0A00              <1>                 db 0Dh, 0Ah, 0
   206                              <1> 
   207                              <1> Msg_File_Not_Found:
   208 000133DE 46696C65206E6F7420- <1>                 db "File not found!"
   208 000133E7 666F756E6421        <1>
   209 000133ED 0D0A00              <1>                 db 0Dh, 0Ah, 0
   210                              <1> 
   211                              <1> Msg_File_Directory_Not_Found:
   212 000133F0 46696C65206F722064- <1>                 db "File or directory not found!"
   212 000133F9 69726563746F727920- <1>
   212 00013402 6E6F7420666F756E64- <1>
   212 0001340B 21                  <1>
   213 0001340C 0D0A00              <1>                 db 0Dh, 0Ah, 0
   214                              <1> 
   215                              <1> Msg_LongName_Not_Found:
   216 0001340F 4C6F6E67206E616D65- <1>                 db "Long name not found!"
   216 00013418 206E6F7420666F756E- <1>
   216 00013421 6421                <1>
   217 00013423 0D0A00              <1>                 db 0Dh, 0Ah, 0
   218                              <1> 
   219                              <1> beep_Insufficient_Memory: ; 20/02/2017
   220 00013426 0D0A                <1> 		db 0Dh, 0Ah
   221 00013428 07                  <1> 		db 07h
   222                              <1> Msg_Insufficient_Memory:
   223 00013429 496E73756666696369- <1>                 db "Insufficient memory!"
   223 00013432 656E74206D656D6F72- <1>
   223 0001343B 7921                <1>
   224 0001343D 0D0A00              <1>                 db 0Dh, 0Ah, 0
   225                              <1> 
   226                              <1> Msg_Error_Code:
   227 00013440 436F6D6D616E642066- <1>                 db 'Command failed! Error code : '
   227 00013449 61696C656421204572- <1>
   227 00013452 726F7220636F646520- <1>
   227 0001345B 3A20                <1>
   228 0001345D 303068              <1> error_code_hex: db '00h'
   229 00013460 0A0A00              <1>                 db 0Ah, 0Ah, 0
   230                              <1> 
   231 00013463 90                  <1> align 2
   232                              <1> 
   233                              <1> ; 10/02/2016
   234                              <1> ; DIR.ASM - 09/10/2011
   235                              <1> 
   236 00013464 3C4449523E20202020- <1> Type_Dir:       db '<DIR>     ' ; 10 bytes
   236 0001346D 20                  <1>
   237                              <1> 
   238                              <1> File_Name:
   239 0001346E 20<rep Ch>          <1>                 times 12 db 20h
   240 0001347A 20                  <1> 		db 20h
   241                              <1> Dir_Or_FileSize:
   242 0001347B 20<rep Ah>          <1>                 times 10 db 20h
   243 00013485 20                  <1> 		db 20h
   244                              <1> File_Attribute:
   245 00013486 20202020            <1> 		dd 20202020h
   246 0001348A 20                  <1> 		db 20h
   247                              <1> File_Day:
   248 0001348B 3030                <1>                 db '0','0'
   249 0001348D 2F                  <1> 		db '/'
   250                              <1> File_Month:
   251 0001348E 3030                <1>                 db '0','0'
   252 00013490 2F                  <1> 		db '/'
   253                              <1> File_Year:
   254 00013491 30303030            <1>                 db '0','0','0','0'
   255 00013495 20                  <1> 		db 20h
   256                              <1> File_Hour:
   257 00013496 3030                <1>                 db '0','0'
   258 00013498 3A                  <1> 		db ':'
   259                              <1> File_Minute:
   260 00013499 3030                <1>                 db '0','0'
   261 0001349B 00                  <1> 		db 0
   262                              <1> 
   263                              <1> Decimal_File_Count_Header:
   264 0001349C 0D0A                <1> 		db 0Dh, 0Ah
   265                              <1> Decimal_File_Count:
   266 0001349E 00<rep 6h>          <1> 		times 6 db 0
   267                              <1> 
   268 000134A4 2066696C6528732920- <1> str_files:	db " file(s) & "
   268 000134AD 2620                <1>
   269                              <1> Decimal_Dir_Count: 
   270 000134AF 00<rep 6h>          <1> 		times 6 db 0
   271                              <1> str_dirs:       
   272 000134B5 206469726563746F72- <1> 		db " directory(s) "
   272 000134BE 7928732920          <1>
   273 000134C3 0D0A00              <1> 		db 0Dh, 0Ah, 0
   274                              <1> 
   275 000134C6 206279746528732920- <1> str_bytes:	db " byte(s) in file(s)"
   275 000134CF 696E2066696C652873- <1>
   275 000134D8 29                  <1>
   276 000134D9 0D0A00              <1> 		db 0Dh, 0Ah, 0
   277                              <1> 
   278                              <1> ; CMD_INTR.ASM - 09/11/2011
   279                              <1> ; 07/10/2010
   280                              <1> Msg_invalid_name_chars:
   281 000134DC 496E76616C69642066- <1>                 db "Invalid file or directory name characters!"
   281 000134E5 696C65206F72206469- <1>
   281 000134EE 726563746F7279206E- <1>
   281 000134F7 616D65206368617261- <1>
   281 00013500 637465727321        <1>
   282 00013506 0D0A00              <1>         	db 0Dh, 0Ah, 0
   283                              <1> ; 21/02/2016
   284 00013509 46696C65206F722064- <1> Msg_Name_Exists: db "File or directory name exists!"
   284 00013512 69726563746F727920- <1>
   284 0001351B 6E616D652065786973- <1>
   284 00013524 747321              <1>
   285 00013527 0D0A00              <1>                 db 0Dh, 0Ah, 0
   286                              <1> Msg_DoYouWantMkdir:
   287 0001352A 446F20796F75207761- <1>                 db "Do you want to make directory ", 0
   287 00013533 6E7420746F206D616B- <1>
   287 0001353C 65206469726563746F- <1>
   287 00013545 72792000            <1>
   288 00013549 2028592F4E29203F20- <1> Msg_YesNo:      db " (Y/N) ? ", 0  
   288 00013552 00                  <1>
   289 00013553 000D0A00            <1> Y_N_nextline:	db 0, 0Dh, 0Ah, 0 
   290 00013557 4F4B2E0D0A00        <1> Msg_OK:		db "OK.", 0Dh, 0Ah, 0
   291                              <1> 
   292                              <1> ; 27/02/2016
   293                              <1> Msg_DoYouWantRmDir:
   294 0001355D 446F20796F75207761- <1>                 db "Do you want to delete directory ", 0
   294 00013566 6E7420746F2064656C- <1>
   294 0001356F 657465206469726563- <1>
   294 00013578 746F72792000        <1>
   295                              <1> Msg_Dir_Not_Empty:
   296 0001357E 4469726563746F7279- <1>                 db "Directory not empty!"
   296 00013587 206E6F7420656D7074- <1>
   296 00013590 7921                <1>
   297 00013592 0D0A00              <1>                 db 0Dh, 0Ah, 0
   298                              <1> 
   299                              <1> Msg_DoYouWantDelete:
   300 00013595 446F20796F75207761- <1>                 db "Do you want to delete file ",0
   300 0001359E 6E7420746F2064656C- <1>
   300 000135A7 6574652066696C6520- <1>
   300 000135B0 00                  <1>
   301                              <1> 
   302 000135B1 44656C657465642E2E- <1> Msg_Deleted:    db "Deleted...", 0Dh, 0Ah, 0
   302 000135BA 2E0D0A00            <1>
   303                              <1> 
   304                              <1> Msg_Permission_Denied:
   305 000135BE 07                  <1>                 db 7
   306 000135BF 5065726D697373696F- <1>                 db "Permission denied!", 0Dh, 0Ah, 0
   306 000135C8 6E2064656E69656421- <1>
   306 000135D1 0D0A00              <1>
   307                              <1> 
   308                              <1> ; 04/03/2016
   309 000135D4 4E657720            <1> Msg_New:        db "New "
   310 000135D8 00                  <1>                 db 0
   311                              <1> Str_Attributes:
   312 000135D9 417474726962757465- <1>                 db "Attributes : "
   312 000135E2 73203A20            <1>
   313 000135E6 4E4F524D414C        <1> Attr_Chars:     db "NORMAL"
   314 000135EC 00                  <1>                 db 0
   315                              <1> 
   316                              <1> ; 06/03/2016
   317                              <1> ; CMD_INTR.ASM - 16/11/2010 
   318                              <1> Msg_DoYouWantRename:
   319 000135ED 446F20796F75207761- <1>                 db "Do you want to rename ", 0
   319 000135F6 6E7420746F2072656E- <1>
   319 000135FF 616D652000          <1>
   320 00013604 66696C652000        <1> Rename_File:    db "file ", 0
   321 0001360A 6469726563746F7279- <1> Rename_Directory: db "directory ", 0
   321 00013613 2000                <1>
   322 00013615 00<rep Dh>          <1> Rename_OldName: times 13 db 0
   323 00013622 20617320            <1> Msg_File_rename_as: db " as "
   324 00013626 00<rep Dh>          <1> Rename_NewName: times 13 db 0
   325                              <1> 
   326                              <1> ; 08/03/2016
   327                              <1> ; CMD_INTR.ASM - 01/08/2010 - 23/04/2011
   328                              <1> msg_not_same_drv:
   329 00013633 4E6F742073616D6520- <1>                 db "Not same drive!" 
   329 0001363C 647269766521        <1>
   330 00013642 0D0A00              <1>                 db 0Dh, 0Ah, 0 
   331                              <1> 
   332                              <1> Msg_DoYouWantMoveFile:
   333 00013645 446F20796F75207761- <1>                 db "Do you want to move file", 0
   333 0001364E 6E7420746F206D6F76- <1>
   333 00013657 652066696C6500      <1>
   334                              <1> 
   335                              <1> msg_insufficient_disk_space:
   336 0001365E 496E73756666696369- <1>                 db "Insufficient disk space!" 
   336 00013667 656E74206469736B20- <1>
   336 00013670 737061636521        <1>
   337 00013676 0D0A00              <1>                 db 0Dh, 0Ah, 0
   338                              <1> 
   339                              <1> ; 01/08/2010
   340                              <1> msg_source_file: 
   341 00013679 0D0A536F7572636520- <1> 		db 0Dh, 0Ah, "Source file name      :   "
   341 00013682 66696C65206E616D65- <1>
   341 0001368B 2020202020203A2020- <1>
   341 00013694 20                  <1>
   342                              <1> msg_source_file_drv: 
   343 00013695 203A00              <1> 		db " :", 0
   344                              <1> msg_destination_file: 
   345 00013698 0D0A44657374696E61- <1> 		db 0Dh, 0Ah, "Destination file name :   "
   345 000136A1 74696F6E2066696C65- <1>
   345 000136AA 206E616D65203A2020- <1>
   345 000136B3 20                  <1>
   346                              <1> msg_destination_file_drv: 
   347 000136B4 203A00              <1> 		db " :", 0
   348                              <1> msg_copy_nextline: 
   349 000136B7 0D0A00              <1> 		db 0Dh, 0Ah, 0
   350                              <1> 
   351                              <1> ; 15/03/2016
   352                              <1> ; CMD_INTR.ASM
   353                              <1> 
   354                              <1> Msg_DoYouWantOverWriteFile:
   355 000136BA 446F20796F75207761- <1>                 db "Do you want to overwrite file ",0
   355 000136C3 6E7420746F206F7665- <1>
   355 000136CC 727772697465206669- <1>
   355 000136D5 6C652000            <1>
   356                              <1>   
   357                              <1> Msg_DoYouWantCopyFile:
   358 000136D9 446F20796F75207761- <1>                 db "Do you want to copy file",0
   358 000136E2 6E7420746F20636F70- <1>
   358 000136EB 792066696C6500      <1>
   359                              <1> 
   360                              <1> Msg_read_file_error_before_EOF:
   361 000136F2 46696C652072656164- <1> 		db "File reading error! (before EOF)"
   361 000136FB 696E67206572726F72- <1>
   361 00013704 2120286265666F7265- <1>
   361 0001370D 20454F4629          <1>
   362 00013712 0A0A00              <1> 		db 0Ah, 0Ah, 0
   363                              <1> 
   364                              <1> ; 18/03/2016
   365                              <1> ; TRDOS 386 (v2.0) mainprog copy procedure
   366                              <1> msg_reading:
   367 00013715 52656164696E672E2E- <1> 		db "Reading... ", 0
   367 0001371E 2E2000              <1>
   368                              <1> msg_writing:
   369 00013721 57726974696E672E2E- <1> 		db "Writing... ", 0
   369 0001372A 2E2000              <1>
   370                              <1> percentagestr:
   371 0001372D 2020202500          <1> 		db "   %", 0  ; "  0%" .. "100%"
   372                              <1> ; 11/04/2016
   373                              <1> Msg_No_Set_Space:
   374 00013732 496E73756666696369- <1>                 db "Insufficient environment space!"
   374 0001373B 656E7420656E766972- <1>
   374 00013744 6F6E6D656E74207370- <1>
   374 0001374D 61636521            <1>
   375 00013751 0D0A00              <1>                 db 0Dh, 0Ah, 0
   376                              <1> ; 18/04/2016
   377                              <1> isc_msg:	
   378 00013754 0D0A                <1> 		db 0Dh, 0Ah
   379 00013756 494E56414C49442053- <1> 		db "INVALID SYSTEM CALL", 0
   379 0001375F 595354454D2043414C- <1>
   379 00013768 4C00                <1>
   380                              <1> usi_msg:
   381 0001376A 0D0A                <1> 		db 0Dh, 0Ah
   382 0001376C 554E444546494E4544- <1> 		db "UNDEFINED SOFTWARE INTERRUPT", 0
   382 00013775 20534F465457415245- <1>
   382 0001377E 20494E544552525550- <1>
   382 00013787 5400                <1>
   383                              <1> ifc_msg:
   384 00013789 0D0A                <1> 		db 0Dh, 0Ah
   385 0001378B 494E56414C49442046- <1> 		db "INVALID FUNCTION CALL"
   385 00013794 554E4354494F4E2043- <1>
   385 0001379D 414C4C              <1>
   386                              <1> inv_msg_for_trdos_v2:
   387 000137A0 20                  <1> 		db 20h
   388 000137A1 666F72205452444F53- <1> 		db "for TRDOS v2!"
   388 000137AA 20763221            <1>
   389 000137AE 07                  <1> 		db 07h
   390 000137AF 0D0A                <1> 		db 0Dh, 0Ah
   391 000137B1 0D0A                <1> 		db 0Dh, 0Ah
   392 000137B3 494E5420            <1> 		db "INT "
   393 000137B7 303068              <1> int_num_str:	db "00h"
   394 000137BA 0D0A                <1> 		db 0Dh, 0Ah
   395 000137BC 454158203A20        <1> 		db "EAX : "
   396 000137C2 303030303030303068- <1> eax_str:	db "00000000h", 0Dh, 0Ah
   396 000137CB 0D0A                <1>
   397 000137CD 454950203A20        <1> 		db "EIP : "
   398 000137D3 303030303030303068- <1> eip_str:	db "00000000h", 0Dh, 0Ah, 0
   398 000137DC 0D0A00              <1>
   399                              <1> 
   400                              <1> ; 17/04/2021
   401                              <1> ; ('KDEV' device parameters are disabled as temporary)
   402                              <1> 
   403                              <1> ; 07/10/2016
   404                              <1> ; Device names & parameters (for kernel devices)
   405                              <1> 
   406 000137DF 90                  <1> align 2
   407                              <1> ;KDEV_NAME:
   408                              <1> ;		db 'TTY',0,0,0,0,0 ; 1
   409                              <1> ;		db 'MEM',0,0,0,0,0 ; 2
   410                              <1> ;		db 'FD0',0,0,0,0,0 ; 3
   411                              <1> ;		db 'FD1',0,0,0,0,0 ; 4
   412                              <1> ;		db 'HD0',0,0,0,0,0 ; 5
   413                              <1> ;		db 'HD1',0,0,0,0,0 ; 6
   414                              <1> ;		db 'HD2',0,0,0,0,0 ; 7
   415                              <1> ;		db 'HD3',0,0,0,0,0 ; 8
   416                              <1> ;		db 'LPT',0,0,0,0,0 ; 9
   417                              <1> ;		db 'TTY0',0,0,0,0 ; 10
   418                              <1> ;		db 'TTY1',0,0,0,0 ; 11
   419                              <1> ;		db 'TTY2',0,0,0,0 ; 12
   420                              <1> ;		db 'TTY3',0,0,0,0 ; 13
   421                              <1> ;		db 'TTY4',0,0,0,0 ; 14
   422                              <1> ;		db 'TTY5',0,0,0,0 ; 15
   423                              <1> ;		db 'TTY6',0,0,0,0 ; 16
   424                              <1> ;		db 'TTY7',0,0,0,0 ; 17
   425                              <1> ;		db 'TTY8',0,0,0,0 ; 18
   426                              <1> ;		db 'TTY9',0,0,0,0 ; 19
   427                              <1> ;		db 'COM1',0,0,0,0 ; 18
   428                              <1> ;		db 'COM2',0,0,0,0 ; 19
   429                              <1> ;		;db 'CONSOLE',0	  ; 1
   430                              <1> ;		;db 'PRINTER',0   ; 9
   431                              <1> ;		;db 'CDROM'	  ; 20
   432                              <1> ;		;db 'CDROM0'	  ; 20
   433                              <1> ;		;db 'CDROM1'	  ; 21		
   434                              <1> ;		;db 'DVD'	  ; 22
   435                              <1> ;		;db 'DVD0'	  ; 22
   436                              <1> ;		;db 'DVD1'	  ; 23		
   437                              <1> ;		;db 'USB'	  ; 24
   438                              <1> ;		;db 'USB0'	  ; 24
   439                              <1> ;		;db 'USB1'	  ; 25
   440                              <1> ;		;db 'USB2'	  ; 26
   441                              <1> ;		;db 'USB3'        ; 27
   442                              <1> ;		;db 'KEYBOARD'	  ; 1	
   443                              <1> ;		;db 'MOUSE'	  ; 28
   444                              <1> ;		;db 'SOUND'	  ; 29
   445                              <1> ;		;db 'VGA',0,0,0,0 ; 30
   446                              <1> ;		;db 'CGA',0,0,0,0 ; 31
   447                              <1> ;		;db 'AUDIO',0,0,0 ; 29
   448                              <1> ;		;db 'VIDEO',0,0,0 ; 32
   449                              <1> ;		;db 'MUSIC',0,0,0 ; 33
   450                              <1> ;		;db 'ETHERNET'	  ; 34 		
   451                              <1> ;		;db 'SD0',0,0,0,0,0 ; 35
   452                              <1> ;		;db 'SD1',0,0,0,0,0 ; 36
   453                              <1> ;		;db 'SD2',0,0,0,0,0 ; 37
   454                              <1> ;		;db 'SD3',0,0,0,0,0 ; 38
   455                              <1> ;		;db 'SATA0'	  ; 35
   456                              <1> ;		;db 'SATA1'	  ; 36
   457                              <1> ;		;db 'SATA2'        ; 37
   458                              <1> ;		;db 'SATA3'        ; 38
   459                              <1> ;		;db 'PATA0',0,0,0  ; 5
   460                              <1> ;		;db 'PATA1',0,0,0  ; 6
   461                              <1> ;		;db 'PATA2',0,0,0  ; 7
   462                              <1> ;		;db 'PATA3',0,0,0  ; 8
   463                              <1> ;		;db 'WIRELESS'	  ; 39
   464                              <1> ;		;db 'HDMI',0,0,0,0 ; 40
   465                              <1> ;		db 'NULL',0,0,0,0 ; 0
   466                              <1> 
   467                              <1> ;NumOfKernelDevNames equ ($-KDEV_NAME) / 8 ; 20 (07/10/2016)
   468                              <1> 
   469                              <1> ;KDEV_NUMBER:
   470                              <1> ;		db 1,2,3,4,5,6,7,8,9
   471                              <1> ;		db 10,11,12,13,14,15,16,17,18,19
   472                              <1> ;		db 18,19,0
   473                              <1> 
   474                              <1> ;NumOfKernelDevices equ $ - KDEV_NUMBER
   475                              <1> 
   476                              <1> ;KDEV_OADDR:
   477                              <1> ;		dd otty ;tty  ; 1
   478                              <1> ;		dd sret ;mem  ; 2
   479                              <1> ; 		dd sret ;fd0  ; 3
   480                              <1> ; 		dd sret ;fd1  ; 4
   481                              <1> ;		dd sret ;hd0  ; 5
   482                              <1> ;		dd sret ;hd1  ; 6
   483                              <1> ;		dd sret ;hd2  ; 7
   484                              <1> ;		dd sret ;hd3  ; 8
   485                              <1> ;		dd sret ;lpt  ; 9
   486                              <1> ;		dd ocvt ;tty0 ; 10
   487                              <1> ;		dd ocvt ;tty1 ; 11
   488                              <1> ;		dd ocvt ;tty2 ; 12
   489                              <1> ;		dd ocvt ;tty3 ; 13
   490                              <1> ;		dd ocvt ;tty4 ; 14
   491                              <1> ;		dd ocvt ;tty5 ; 15
   492                              <1> ;		dd ocvt ;tty6 ; 16
   493                              <1> ;		dd ocvt ;tty7 ; 17
   494                              <1> ;		dd ocvt ;tty8 ; 18
   495                              <1> ;		dd ocvt ;tty9 ; 19
   496                              <1> ;		;dd ocvt ;com1 ; 18
   497                              <1> ;		;dd ocvt ;com2 ; 19
   498                              <1> ;		dd sret ;null ; 20  
   499                              <1> ;KDEV_CADDR:
   500                              <1> ;		dd ctty ;tty  ; 1
   501                              <1> ;		dd cret ;mem  ; 2
   502                              <1> ; 		dd cret ;fd0  ; 3
   503                              <1> ; 		dd cret ;fd1  ; 4
   504                              <1> ;		dd cret ;hd0  ; 5
   505                              <1> ;		dd cret ;hd1  ; 6
   506                              <1> ; 		dd cret ;hd2  ; 7
   507                              <1> ;		dd cret ;hd3  ; 8
   508                              <1> ; 		dd cret ;lpt  ; 9
   509                              <1> ;		dd ocvt ;tty0 ; 10
   510                              <1> ;		dd ccvt ;tty1 ; 11
   511                              <1> ;		dd ccvt ;tty2 ; 12
   512                              <1> ; 		dd ccvt ;tty3 ; 13
   513                              <1> ; 		dd ccvt ;tty4 ; 14
   514                              <1> ; 		dd ccvt ;tty5 ; 15
   515                              <1> ; 		dd ccvt ;tty6 ; 16
   516                              <1> ; 		dd ccvt ;tty7 ; 17
   517                              <1> ; 		dd ccvt ;tty8 ; 18
   518                              <1> ; 		dd ccvt ;tty9 ; 19
   519                              <1> ; 		;dd ccvt ;com1 ; 18
   520                              <1> ; 		;dd ccvt ;com2 ; 19
   521                              <1> ;		dd cret ;null ; 20
   522                              <1> ;
   523                              <1> ;KDEV_RADDR:
   524                              <1> ;		dd rtty ;tty  ; 1
   525                              <1> ;		dd rmem ;mem  ; 2
   526                              <1> ;		dd rfd  ;fd0  ; 3
   527                              <1> ; 		dd rfd  ;fd1  ; 4
   528                              <1> ; 		dd rhd  ;hd0  ; 5
   529                              <1> ; 		dd rhd  ;hd1  ; 6
   530                              <1> ; 		dd rhd  ;hd2  ; 7
   531                              <1> ; 		dd rhd  ;hd3  ; 8
   532                              <1> ; 		dd rlpt ;lpt  ; 9
   533                              <1> ; 		dd rcvt ;tty0 ; 10
   534                              <1> ;		dd rcvt ;tty1 ; 11
   535                              <1> ; 		dd rcvt ;tty2 ; 12
   536                              <1> ; 		dd rcvt ;tty3 ; 13
   537                              <1> ; 		dd rcvt ;tty4 ; 14
   538                              <1> ; 		dd rcvt ;tty5 ; 15
   539                              <1> ; 		dd rcvt ;tty6 ; 16
   540                              <1> ; 		dd rcvt ;tty7 ; 17
   541                              <1> ; 		dd rcvt ;tty8 ; 18
   542                              <1> ; 		dd rcvt ;tty9 ; 19
   543                              <1> ; 		;dd rcvt ;com1 ; 18
   544                              <1> ; 		;dd rcvt ;com2 ; 19
   545                              <1> ;		dd rnull ;null ; 20  
   546                              <1> ;KDEV_WADDR:
   547                              <1> ;		dd wtty ;tty  ; 1
   548                              <1> ;		dd wmem ;mem  ; 2
   549                              <1> ;		dd wfd  ;fd0  ; 3
   550                              <1> ; 		dd wfd  ;fd1  ; 4
   551                              <1> ; 		dd whd  ;hd0  ; 5
   552                              <1> ; 		dd whd  ;hd1  ; 6
   553                              <1> ; 		dd whd  ;hd2  ; 7
   554                              <1> ; 		dd whd  ;hd3  ; 8
   555                              <1> ; 		dd wlpt ;lpt  ; 9
   556                              <1> ; 		dd xmtt ;tty0 ; 10
   557                              <1> ;		dd xmtt ;tty1 ; 11
   558                              <1> ; 		dd xmtt ;tty2 ; 12
   559                              <1> ; 		dd xmtt ;tty3 ; 13
   560                              <1> ; 		dd xmtt ;tty4 ; 14
   561                              <1> ; 		dd xmtt ;tty5 ; 15
   562                              <1> ; 		dd xmtt ;tty6 ; 16
   563                              <1> ; 		dd xmtt ;tty7 ; 17
   564                              <1> ; 		dd xmtt ;tty8 ; 18
   565                              <1> ; 		dd xmtt ;tty9 ; 19
   566                              <1> ; 		;dd xmtt ;com1 ; 18
   567                              <1> ; 		;dd xmtt ;com2 ; 19
   568                              <1> ;		dd wnull ;null ; 20  
   569                              <1> 
   570                              <1> ; DEV_ACCESS bits:
   571                              <1> 	; bit 0 = accessable by normal users
   572                              <1> 	; bit 1 = read access permission
   573                              <1> 	; bit 2 = write access permission
   574                              <1> 	; bit 3 = IOCTL permission to users
   575                              <1> 	; bit 4 = block device if it is set
   576                              <1> 	; bit 5 = 16 bit or 1024 byte data
   577                              <1> 	; bit 6 = 32 bit or 2048 byte data
   578                              <1> 	; bit 7 = installable device driver	
   579                              <1> 
   580                              <1> ;KDEV_ACCESS: ; 08/10/2016
   581                              <1> ;		db  00000111b	; tty, 1
   582                              <1> ;		db  00000111b	; mem, 2	
   583                              <1> ;		db  10001111b	; fd0, 3	
   584                              <1> ;		db  10001111b	; fd1, 4
   585                              <1> ;		db  10001111b	; hd0, 5
   586                              <1> ;		db  10001111b	; hd1, 6
   587                              <1> ;		db  10001111b	; hd2, 7
   588                              <1> ;		db  10001111b	; hd3, 8
   589                              <1> ;		db  00000111b   ; lpt, 9
   590                              <1> ;		db  00000111b	; tty0, 10
   591                              <1> ;		db  00000111b	; tty1, 11
   592                              <1> ;		db  00000111b	; tty2, 12
   593                              <1> ;		db  00000111b	; tty3, 13
   594                              <1> ;		db  00000111b	; tty4, 14
   595                              <1> ;		db  00000111b	; tty5, 15
   596                              <1> ;		db  00000111b	; tty6, 16
   597                              <1> ;		db  00000111b	; tty7, 17
   598                              <1> ;		db  00000111b	; tty8, 18
   599                              <1> ;		db  00000111b	; tty9, 19
   600                              <1> ;		;db 00000111b	; com1, 18
   601                              <1> ;		;db 00000111b	; com2, 19
   602                              <1> ;		db  00000000b   ; null, 0
   603                              <1> 
   604                              <1> ; 07/10/2016
   605                              <1> ;NumOfInstallableDevices equ 8
   606                              <1> ;NUMIDEV	equ NumOfInstallableDevices ; 8
   607                              <1> ;NUMOFDEVICES	equ NumOfKernelDevices + NumOfInstallableDevices
   608                              <1> 
   609                              <1> ; 26/02/2017
   610                              <1> ; IRQ Callback (& Signal Response Byte) service availibity
   611                              <1> ; 'syscalbac'
   612                              <1> ; ***************************************************
   613                              <1> ; IRQ 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
   614                              <1> ; --- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
   615                              <1> ; --- 00 00 00 01 02 03 00 04 00 05 06 07 08 09 00 00
   616                              <1> ; ***************************************************
   617                              <1> IRQenum:
   618 000137E0 000000010203000400- <1> 	db  0,0,0,1,2,3,0,4,0,5,6,7,8,9,0,0
   618 000137E9 05060708090000      <1>
   619                              <1> 
   620                              <1> ; 28/08/2017
   621                              <1> ; 20/08/2017
   622                              <1> ; DMA Registers (for 'sysdma')
   623                              <1> ; 02/07/2017 (sb16mod.s)
   624 000137F0 00020406C0C4C8CC    <1> dma_adr:	db 0,2,4,6,0C0h,0C4h,0C8h,0CCh
   625 000137F8 01030507C2C6CACE    <1> dma_cnt:	db 1,3,5,7,0C2h,0C6h,0CAh,0CEh
   626 00013800 878381828F8B898A    <1> dma_page:	db 87h,83h,81h,82h,8Fh,8Bh,89h,8Ah ; 03/08/2017
   627 00013808 0A0A0A0AD4D4D4D4    <1> dma_mask:	db 0Ah,0Ah,0Ah,0Ah,0D4h,0D4h,0D4h,0D4h
   628 00013810 0B0B0B0BD6D6D6D6    <1> dma_mod:	db 0Bh,0Bh,0Bh,0Bh,0D6h,0D6h,0D6h,0D6h
   629 00013818 0C0C0C0CD8D8D8D8    <1> dma_flip:	db 0Ch,0Ch,0Ch,0Ch,0D8h,0D8h,0D8h,0D8h	
  3434                                  
  3435                                  ; 27/08/2014
  3436                                  scr_row:
  3437 00013820 E0810B00                	dd 0B8000h + 0A0h + 0A0h + 0A0h ; Row 3
  3438                                  scr_col:
  3439 00013824 00000000                	dd 0
  3440                                  
  3441                                  Align 4
  3442                                  	; 15/04/2016
  3443                                  	; TRDOS 386 (TRDOS v2.0)
  3444                                  
  3445                                  	; 21/08/2014
  3446                                  ilist:
  3447                                  	;times 	32 dd cpu_except ; INT 0 to INT 1Fh
  3448                                  	;
  3449                                  	; Exception list
  3450                                  	; 25/08/2014	
  3451 00013828 [150C0000]              	dd	exc0	; 0h,  Divide-by-zero Error
  3452 0001382C [1C0C0000]              	dd	exc1	
  3453 00013830 [230C0000]              	dd 	exc2	
  3454 00013834 [2A0C0000]              	dd	exc3	
  3455 00013838 [2E0C0000]              	dd	exc4	
  3456 0001383C [320C0000]              	dd	exc5	
  3457 00013840 [360C0000]              	dd 	exc6	; 06h,  Invalid Opcode
  3458 00013844 [3A0C0000]              	dd	exc7	
  3459 00013848 [3E0C0000]              	dd	exc8	
  3460 0001384C [420C0000]              	dd	exc9	
  3461 00013850 [460C0000]              	dd 	exc10	
  3462 00013854 [4A0C0000]              	dd	exc11
  3463 00013858 [4E0C0000]              	dd	exc12
  3464 0001385C [520C0000]              	dd	exc13	; 0Dh, General Protection Fault
  3465 00013860 [560C0000]              	dd 	exc14	; 0Eh, Page Fault
  3466 00013864 [5A0C0000]              	dd	exc15
  3467 00013868 [5E0C0000]              	dd	exc16
  3468 0001386C [620C0000]              	dd	exc17
  3469 00013870 [660C0000]              	dd 	exc18
  3470 00013874 [6A0C0000]              	dd	exc19
  3471 00013878 [6E0C0000]              	dd 	exc20
  3472 0001387C [720C0000]              	dd	exc21
  3473 00013880 [760C0000]              	dd	exc22
  3474 00013884 [7A0C0000]              	dd	exc23
  3475 00013888 [7E0C0000]              	dd 	exc24
  3476 0001388C [820C0000]              	dd	exc25
  3477 00013890 [860C0000]              	dd	exc26
  3478 00013894 [8A0C0000]              	dd	exc27
  3479 00013898 [8E0C0000]              	dd 	exc28
  3480 0001389C [920C0000]              	dd	exc29
  3481 000138A0 [960C0000]              	dd 	exc30
  3482 000138A4 [9A0C0000]              	dd	exc31
  3483                                  IRQ_list: ; 28/02/2017 ('syscalbac')
  3484                                  	; Interrupt list
  3485 000138A8 [88090000]              	dd	timer_int	; INT 20h
  3486                                  		;dd	irq0	
  3487 000138AC [E4100000]              	dd	kb_int		; 24/01/2016
  3488                                  		;dd	irq1
  3489 000138B0 [6B0B0000]              	dd	irq2
  3490                                  		; COM2 int
  3491 000138B4 [6F0B0000]              	dd	irq3
  3492                                  		; COM1 int
  3493 000138B8 [7A0B0000]              	dd	irq4
  3494 000138BC [850B0000]              	dd	irq5
  3495                                  ;DISKETTE_INT: ;06/02/2015
  3496 000138C0 [514E0000]              	dd	fdc_int		; 16/02/2015, IRQ 6 handler	
  3497                                  		;dd	irq6
  3498                                  ; Default IRQ 7 handler against spurious IRQs (from master PIC)
  3499                                  ; 25/02/2015 (source: http://wiki.osdev.org/8259_PIC)
  3500 000138C4 [F10E0000]              	dd	default_irq7	; 25/02/2015
  3501                                  		;dd	irq7
  3502                                  ; Real Time Clock Interrupt
  3503 000138C8 [F30A0000]              	dd	rtc_int		; 23/02/2015, IRQ 8 handler
  3504                                  		;dd	irq8	; INT 28h
  3505 000138CC [950B0000]              	dd	irq9
  3506 000138D0 [990B0000]              	dd	irq10
  3507 000138D4 [9D0B0000]              	dd	irq11
  3508 000138D8 [A10B0000]              	dd	irq12
  3509 000138DC [A50B0000]              	dd	irq13
  3510                                  ;HDISK_INT1:  ;06/02/2015 	
  3511 000138E0 [71570000]              	dd	hdc1_int 	; 21/02/2015, IRQ 14 handler		
  3512                                  		;dd	irq14
  3513                                  ;HDISK_INT2:  ;06/02/2015
  3514 000138E4 [94570000]              	dd	hdc2_int 	; 21/02/2015, IRQ 15 handler		
  3515                                  		;dd	irq15	; INT 2Fh
  3516                                  		; 14/08/2015
  3517                                  	;dd	sysent		; INT 30h (system calls)
  3518                                  
  3519                                  	; 15/04/2016
  3520                                  	; TRDOS 386(TRDOS v2.0) Software Interrupts
  3521                                  
  3522 000138E8 [45390100]              	dd	int30h		; Reserved for
  3523                                  				; !!! Retro UNIX (RUNIX) !!!
  3524                                  				; !!! SINGLIX !!! System Calls
  3525 000138EC [73170000]              	dd	int31h		; Video BIOS (IBM PC/AT, Int 10h)
  3526 000138F0 [400F0000]              	dd	int32h		; Keyboard Functions (IBM PC/AT, Int 16h)
  3527 000138F4 [F24E0000]              	dd	int33h		; DISK I/O (IBM PC/AT, Int 13h)
  3528 000138F8 [1C200100]              	dd	int34h		; #IOCTL# (I/O port access support for ring 3)
  3529 000138FC [7D620000]              	dd	int35h		; Time/Date Functions (IBM PC/AT, Int 1Ah)
  3530 00013900 [A50D0000]              	dd	ignore_int	; INT 36h : Timer Functions	
  3531 00013904 [A50D0000]              	dd	ignore_int	; INT 37h	
  3532 00013908 [A50D0000]              	dd	ignore_int	; INT 38h
  3533 0001390C [A50D0000]              	dd	ignore_int	; INT 39h
  3534 00013910 [A50D0000]              	dd	ignore_int	; INT 3Ah	
  3535 00013914 [A50D0000]              	dd	ignore_int	; INT 3Bh
  3536 00013918 [A50D0000]              	dd	ignore_int	; INT 3Ch
  3537 0001391C [A50D0000]              	dd	ignore_int	; INT 3Dh	
  3538 00013920 [A50D0000]              	dd	ignore_int	; INT 3Eh
  3539 00013924 [A50D0000]              	dd	ignore_int	; INT 3Fh
  3540 00013928 [A3CC0000]              	dd	sysent		; INT 40h : !!! TRDOS 386 System Calls !!!
  3541                                  	;dd	ignore_int
  3542 0001392C 00000000                	dd	0
  3543                                  
  3544                                  ; 20/08/2014
  3545                                    ; /* This is the default interrupt "handler" :-) */ 
  3546                                    ; Linux v0.12 (head.s)
  3547                                  int_msg:
  3548 00013930 556E6B6E6F776E2069-     	db "Unknown interrupt ! ", 0
  3548 00013939 6E7465727275707420-
  3548 00013942 212000             
  3549                                  
  3550                                  ; 15/04/2016
  3551                                  ; TRDOS 386 (TRDOS v2.0)
  3552                                  
  3553                                  ; 29/04/2016
  3554                                  int30h:
  3555                                  trdos_isc_routine:
  3556                                  	; 02/05/2016
  3557                                  	; 01/05/2016
  3558                                  	; 29/04/2016
  3559                                  	; 18/04/2016
  3560                                  	; 15/04/2016 (TRDOS 386 = TRDOS v2.0)
  3561                                  	; 17/04/2011 (TRDOS v1.0, 'IFC.ASM')
  3562                                  	; 03/02/2011 ('trdos_ifc_routine')
  3563                                  	;
  3564 00013945 8B1C24                  	mov	ebx, [esp] ; EIP (next)
  3565 00013948 83EB02                  	sub	ebx, 2 ; EIP (CD ##h)
  3566                                  
  3567 0001394B 89C1                    	mov	ecx, eax
  3568 0001394D 8A4301                  	mov	al, [ebx+1] ; CDh ##h
  3569                                  
  3570 00013950 66BA1000                	mov	dx, KDATA
  3571 00013954 8EDA                    	mov	ds, dx
  3572 00013956 8EC2                    	mov	es, dx
  3573                                  
  3574 00013958 FC                      	cld
  3575 00013959 8B15[88780100]          	mov	edx, [k_page_dir]
  3576 0001395F 0F22DA                  	mov	cr3, edx
  3577                                  
  3578 00013962 E80508FFFF              	call	bytetohex
  3579 00013967 66A3[B7370100]          	mov	[int_num_str], ax
  3580                                  
  3581 0001396D 89D8                    	mov	eax, ebx ; EIP
  3582 0001396F E83808FFFF              	call	dwordtohex
  3583 00013974 8915[D3370100]          	mov	[eip_str], edx
  3584 0001397A A3[D7370100]            	mov	[eip_str+4], eax
  3585                                  
  3586 0001397F 89C8                    	mov	eax, ecx
  3587 00013981 E82608FFFF              	call	dwordtohex
  3588 00013986 8915[C2370100]          	mov	[eax_str], edx
  3589 0001398C A3[C6370100]            	mov	[eax_str+4], eax 	
  3590                                  
  3591 00013991 43                      	inc	ebx
  3592 00013992 8A03                    	mov	al, [ebx] ; Interrupt number
  3593                                  
  3594                                  trdos_isc_handler:
  3595 00013994 80FE30                  	cmp	dh, 30h ; Retro UNIX, SINGLIX System calls
  3596 00013997 7507                    	jne	short trdos_usi_handler
  3597 00013999 BE[54370100]            	mov	esi, isc_msg
  3598 0001399E EB05                    	jmp	short loc_write_inv_system_call_msg
  3599                                  
  3600                                  trdos_usi_handler:
  3601 000139A0 BE[6A370100]            	mov	esi, usi_msg
  3602                                  
  3603                                  loc_write_inv_system_call_msg:
  3604 000139A5 E8A033FFFF              	call	print_msg
  3605                                  	; 29/04/2016
  3606 000139AA BE[A0370100]            	mov	esi, inv_msg_for_trdos_v2
  3607 000139AF E89633FFFF              	call	print_msg
  3608                                  
  3609                                  loc_ifc_terminate_process:
  3610                                  	; u.uno = process number
  3611                                  	; 29/04/2016
  3612                                  
  3613                                  	; 02/05/2016
  3614 000139B4 FE05[14900100]          	inc	byte [sysflg] ; 0FFh -> 0
  3615                                  
  3616 000139BA B801000000              	mov	eax, 1
  3617 000139BF E9D095FFFF              	jmp	sysexit
  3618                                  
  3619                                  ; 07/03/2015
  3620                                  ; Temporary Code
  3621                                  display_disks:
  3622 000139C4 803D[1C660000]00        	cmp 	byte [fd0_type], 0
  3623 000139CB 7605                    	jna 	short ddsks1
  3624 000139CD E87D000000              	call	pdskm
  3625                                  ddsks1:
  3626 000139D2 803D[1D660000]00        	cmp	byte [fd1_type], 0
  3627 000139D9 760C                    	jna	short ddsks2
  3628 000139DB C605[1F3B0100]31        	mov	byte [dskx], '1'
  3629 000139E2 E868000000              	call	pdskm
  3630                                  ddsks2:
  3631 000139E7 803D[1E660000]00        	cmp	byte [hd0_type], 0
  3632 000139EE 7654                    	jna	short ddsk6
  3633 000139F0 66C705[1D3B0100]68-     	mov	word [dsktype], 'hd'
  3633 000139F8 64                 
  3634 000139F9 C605[1F3B0100]30        	mov	byte [dskx], '0'
  3635 00013A00 E84A000000              	call	pdskm
  3636                                  ddsks3:
  3637 00013A05 803D[1F660000]00        	cmp	byte [hd1_type], 0
  3638 00013A0C 7636                    	jna	short ddsk6
  3639 00013A0E C605[1F3B0100]31        	mov	byte [dskx], '1'
  3640 00013A15 E835000000              	call	pdskm
  3641                                  ddsks4:
  3642 00013A1A 803D[20660000]00        	cmp	byte [hd2_type], 0
  3643 00013A21 7621                    	jna	short ddsk6
  3644 00013A23 C605[1F3B0100]32        	mov	byte [dskx], '2'
  3645 00013A2A E820000000              	call	pdskm
  3646                                  ddsks5:
  3647 00013A2F 803D[21660000]00        	cmp	byte [hd3_type], 0
  3648 00013A36 760C                    	jna	short ddsk6
  3649 00013A38 C605[1F3B0100]33        	mov	byte [dskx], '3'
  3650 00013A3F E80B000000              	call	pdskm
  3651                                  ddsk6:
  3652 00013A44 BE[473B0100]            	mov	esi, nextline
  3653 00013A49 E806000000              	call	pdskml
  3654                                  pdskm_ok:
  3655 00013A4E C3                      	retn
  3656                                  pdskm:
  3657 00013A4F BE[1B3B0100]            	mov	esi, dsk_ready_msg
  3658                                  pdskml:	
  3659 00013A54 AC                      	lodsb
  3660 00013A55 08C0                    	or	al, al
  3661 00013A57 74F5                    	jz	short pdskm_ok
  3662 00013A59 56                      	push	esi
  3663                                  	; 13/05/2016
  3664 00013A5A BB07000000                      mov     ebx, 7  ; Black background, 
  3665                                  			; light gray forecolor
  3666                                  			; Video page 0 (bh=0)
  3667 00013A5F E828E8FEFF              	call	_write_tty
  3668 00013A64 5E                      	pop	esi
  3669 00013A65 EBED                    	jmp	short pdskml
  3670                                  
  3671 00013A67 90                      Align 2
  3672                                  	; 21/08/2014
  3673                                  exc_msg:
  3674 00013A68 435055206578636570-     	db "CPU exception ! "
  3674 00013A71 74696F6E202120     
  3675                                  excnstr: 		; 25/08/2014
  3676 00013A78 3F3F68202045495020-     	db "??h", "  EIP : "
  3676 00013A81 3A20               
  3677                                  EIPstr: ; 29/08/2014
  3678 00013A83 00<rep Ch>              	times 12 db 0
  3679                                  
  3680                                  	; 23/02/2015
  3681                                  	; 25/08/2014
  3682                                  ;scounter:
  3683                                  ;	db 5
  3684                                  ;	db 19
  3685                                  
  3686                                  ; 06/11/2014
  3687                                  ; Memory Information message
  3688                                  ; 14/08/2015
  3689                                  msg_memory_info:
  3690 00013A8F 07                      	db	07h
  3691 00013A90 0D0A                    	db	0Dh, 0Ah
  3692                                  	;db 	"MEMORY ALLOCATION INFO", 0Dh, 0Ah, 0Dh, 0Ah
  3693 00013A92 546F74616C206D656D-     	db	"Total memory : "
  3693 00013A9B 6F7279203A20       
  3694                                  mem_total_b_str: ; 10 digits
  3695 00013AA1 303030303030303030-     	db	"0000000000 bytes", 0Dh, 0Ah
  3695 00013AAA 302062797465730D0A 
  3696 00013AB3 202020202020202020-     	db	"               ", 20h, 20h, 20h
  3696 00013ABC 202020202020202020 
  3697                                  mem_total_p_str: ; 7 digits
  3698 00013AC5 303030303030302070-     	db	"0000000 pages", 0Dh, 0Ah
  3698 00013ACE 616765730D0A       
  3699 00013AD4 0D0A                    	db 	0Dh, 0Ah
  3700 00013AD6 46726565206D656D6F-     	db	"Free memory  : "
  3700 00013ADF 727920203A20       
  3701                                  free_mem_b_str:  ; 10 digits
  3702 00013AE5 3F3F3F3F3F3F3F3F3F-     	db	"?????????? bytes", 0Dh, 0Ah
  3702 00013AEE 3F2062797465730D0A 
  3703 00013AF7 202020202020202020-     	db	"               ", 20h, 20h, 20h
  3703 00013B00 202020202020202020 
  3704                                  free_mem_p_str:  ; 7 digits
  3705 00013B09 3F3F3F3F3F3F3F2070-     	db	"??????? pages", 0Dh, 0Ah
  3705 00013B12 616765730D0A       
  3706 00013B18 0D0A00                  	db	0Dh, 0Ah, 0
  3707                                  
  3708                                  dsk_ready_msg:
  3709 00013B1B 0D0A                    	db 	0Dh, 0Ah
  3710                                  dsktype:
  3711 00013B1D 6664                    	db	'fd'
  3712                                  dskx:
  3713 00013B1F 30                      	db	'0'
  3714 00013B20 20                      	db	20h
  3715 00013B21 697320524541445920-     	db 	'is READY ...'
  3715 00013B2A 2E2E2E             
  3716 00013B2D 00                      	db 	0
  3717                                  
  3718                                  setup_error_msg:
  3719 00013B2E 0D0A                    	db	0Dh, 0Ah
  3720 00013B30 4469736B2053657475-     	db	'Disk Setup Error !' 
  3720 00013B39 70204572726F722021 
  3721 00013B42 0D0A00                  	db	0Dh, 0Ah,0
  3722                                  
  3723                                  next2line: ; 08/02/2016
  3724 00013B45 0D0A                    	db	0Dh, 0Ah
  3725                                  nextline:
  3726 00013B47 0D0A00                  	db 	0Dh, 0Ah, 0
  3727                                  
  3728                                  ; temporary
  3729                                  ; 19/12/2020
  3730                                  msg_lfb_addr:
  3731                                  	;db	0Dh, 0Ah
  3732 00013B4A 4C696E656172206672-     	db	"Linear frame buffer at "
  3732 00013B53 616D65206275666665-
  3732 00013B5C 7220617420         
  3733                                  lfb_addr_str: ; 8 (hex) digits
  3734 00013B61 303030303030303068-     	db	"00000000h", 0Dh, 0Ah
  3734 00013B6A 0D0A               
  3735 00013B6C 0D0A00                  	db	0Dh, 0Ah, 0
  3736                                  
  3737                                  ; KERNEL - SYSINIT Messages
  3738                                  ; 24/08/2015
  3739                                  ; 13/04/2015 - (Retro UNIX 386 v1 Beginning)
  3740                                  ; 14/07/2013
  3741                                  ;kernel_init_err_msg:
  3742                                  ;	db 0Dh, 0Ah
  3743                                  ;	db 07h
  3744                                  ;	db 'Kernel initialization ERROR !'
  3745                                  ;	db 0Dh, 0Ah, 0 
  3746                                  
  3747                                  ;welcome_msg: 
  3748                                  ;	db 0Dh, 0Ah
  3749                                  ;	db 07h
  3750                                  ;	db 'Welcome to TRDOS 386 Operating System !'
  3751                                  ;	db 0Dh, 0Ah
  3752                                  ;	db 'by Erdogan Tan - 31/12/2017 (v2.0.0)'
  3753                                  ;	db 0Dh, 0Ah, 0
  3754                                  
  3755                                  panic_msg:
  3756 00013B6F 0D0A07                  	db 0Dh, 0Ah, 07h
  3757 00013B72 4552524F523A204B65-     	db 'ERROR: Kernel Panic !'
  3757 00013B7B 726E656C2050616E69-
  3757 00013B84 632021             
  3758 00013B87 0D0A00                  	db 0Dh, 0Ah, 0
  3759                                  
  3760                                  ;msgl_drv_not_ready: 
  3761                                  ;	db 07h, 0Dh, 0Ah
  3762                                  ;       db 'Drive not ready or read error !'
  3763                                  ;       db 0Dh, 0Ah, 0
  3764                                  
  3765                                  starting_msg:
  3766                                  	;;;;db "Turkish Rational DOS v2.0 [18/04/2021] ...", 0
  3767                                  	;;;db "Turkish Rational DOS v2.0 [11/08/2022] ...", 0
  3768                                  	;;db "Turkish Rational DOS v2.0 [30/08/2023] ...", 0
  3769                                  	;db "Turkish Rational DOS v2.0 [07/12/2023] ...", 0
  3770 00013B8A 5475726B6973682052-     	db "Turkish Rational DOS v2.0 [22/05/2024] ...", 0
  3770 00013B93 6174696F6E616C2044-
  3770 00013B9C 4F532076322E30205B-
  3770 00013BA5 32322F30352F323032-
  3770 00013BAE 345D202E2E2E00     
  3771                                  
  3772                                  NextLine:
  3773 00013BB5 0D0A00                  	db 0Dh, 0Ah, 0
  3774                                  
  3775                                  %include 'audio.s' ; 03/04/2017
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.8 - audio.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 19/05/2024  (Previous: 02/12/2023 - Kernel v2.0.7)
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 03/04/2017
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.15 (trdos386.s)
     9                              <1> ; ****************************************************************************
    10                              <1> 
    11                              <1> ; AUDIO CONTROLLER & CODEC DEFINITIONS & CODE FOR TRDOS 386
    12                              <1> 
    13                              <1> ;=============================================================================
    14                              <1> ;               EQUATES
    15                              <1> ;=============================================================================
    16                              <1> 
    17                              <1> ; PCI EQUATES
    18                              <1> 
    19                              <1> BIT0  EQU 1
    20                              <1> BIT1  EQU 2
    21                              <1> BIT2  EQU 4
    22                              <1> BIT3  EQU 8
    23                              <1> BIT4  EQU 10h
    24                              <1> BIT5  EQU 20h
    25                              <1> BIT6  EQU 40h
    26                              <1> BIT7  EQU 80h
    27                              <1> BIT8  EQU 100h
    28                              <1> BIT9  EQU 200h
    29                              <1> BIT10 EQU 400h
    30                              <1> BIT11 EQU 800h
    31                              <1> BIT12 EQU 1000h
    32                              <1> BIT13 EQU 2000h
    33                              <1> BIT14 EQU 4000h
    34                              <1> BIT15 EQU 8000h
    35                              <1> BIT16 EQU 10000h
    36                              <1> BIT17 EQU 20000h
    37                              <1> BIT18 EQU 40000h
    38                              <1> BIT19 EQU 80000h
    39                              <1> BIT20 EQU 100000h
    40                              <1> BIT21 EQU 200000h
    41                              <1> BIT22 EQU 400000h
    42                              <1> BIT23 EQU 800000h
    43                              <1> BIT24 EQU 1000000h
    44                              <1> BIT25 EQU 2000000h
    45                              <1> BIT26 EQU 4000000h
    46                              <1> BIT27 EQU 8000000h
    47                              <1> BIT28 EQU 10000000h
    48                              <1> BIT29 EQU 20000000h
    49                              <1> BIT30 EQU 40000000h
    50                              <1> BIT31 EQU 80000000h
    51                              <1> NOT_BIT31 EQU 7FFFFFFFh
    52                              <1> 
    53                              <1> ; PCI equates
    54                              <1> ; PCI function address (PFA)
    55                              <1> ; bit 31 = 1
    56                              <1> ; bit 23:16 = bus number     (0-255)
    57                              <1> ; bit 15:11 = device number  (0-31)
    58                              <1> ; bit 10:8 = function number (0-7)
    59                              <1> ; bit 7:0 = register number  (0-255)
    60                              <1> 
    61                              <1> IO_ADDR_MASK    EQU     0FFFEh	; mask off bit 0 for reading BARs
    62                              <1> PCI_INDEX_PORT  EQU     0CF8h
    63                              <1> PCI_DATA_PORT   EQU     0CFCh
    64                              <1> PCI32           EQU     BIT31	; bitflag to signal 32bit access
    65                              <1> PCI16           EQU     BIT30	; bitflag for 16bit access
    66                              <1> NOT_PCI32_PCI16	EQU	03FFFFFFFh ; NOT BIT31+BIT30 ; 19/03/2017
    67                              <1> 
    68                              <1> PCI_FN0         EQU     0 << 8
    69                              <1> PCI_FN1         EQU     1 << 8
    70                              <1> PCI_FN2         EQU     2 << 8
    71                              <1> PCI_FN3         EQU     3 << 8
    72                              <1> PCI_FN4         EQU     4 << 8
    73                              <1> PCI_FN5         EQU     5 << 8
    74                              <1> PCI_FN6         EQU     6 << 8
    75                              <1> PCI_FN7         EQU     7 << 8
    76                              <1> 
    77                              <1> PCI_CMD_REG	EQU	04h	; reg 04, command reg
    78                              <1> IO_ENA		EQU	BIT0	; i/o decode enable
    79                              <1> MEM_ENA		EQU	BIT1	; memory decode enable
    80                              <1> BM_ENA		EQU     BIT2	; bus master enable
    81                              <1> 
    82                              <1> ; VIA VT8233 EQUATES
    83                              <1> 
    84                              <1> VIA_VID		equ 1106h	; VIA's PCI vendor ID
    85                              <1> VT8233_DID      equ 3059h	; VT8233 (VT8235) device ID
    86                              <1> 		
    87                              <1> PCI_IO_BASE          equ 10h
    88                              <1> AC97_INT_LINE        equ 3Ch
    89                              <1> VIA_ACLINK_CTRL      equ 41h
    90                              <1> VIA_ACLINK_STAT      equ 40h
    91                              <1> VIA_ACLINK_C00_READY equ 01h ; primary codec ready
    92                              <1> 	
    93                              <1> VIA_REG_AC97	     equ 80h ; dword
    94                              <1> 
    95                              <1> VIA_ACLINK_CTRL_ENABLE	equ   80h ; 0: disable, 1: enable
    96                              <1> VIA_ACLINK_CTRL_RESET	equ   40h ; 0: assert, 1: de-assert
    97                              <1> VIA_ACLINK_CTRL_SYNC	equ   20h ; 0: release SYNC, 1: force SYNC hi
    98                              <1> VIA_ACLINK_CTRL_VRA	equ   08h ; 0: disable VRA, 1: enable VRA
    99                              <1> VIA_ACLINK_CTRL_PCM	equ   04h ; 0: disable PCM, 1: enable PCM
   100                              <1> 					; 3D Audio Channel slots 3/4
   101                              <1> VIA_ACLINK_CTRL_INIT	equ  (VIA_ACLINK_CTRL_ENABLE +                               VIA_ACLINK_CTRL_RESET +                               VIA_ACLINK_CTRL_PCM +                               VIA_ACLINK_CTRL_VRA)
   105                              <1> 
   106                              <1> CODEC_AUX_VOL		equ   04h
   107                              <1> VIA_REG_AC97_BUSY	equ   01000000h ;(1<<24) 
   108                              <1> VIA_REG_AC97_CMD_SHIFT	equ   10h ; 16
   109                              <1> VIA_REG_AC97_PRIMARY_VALID equ 02000000h ;(1<<25)
   110                              <1> VIA_REG_AC97_READ	equ   00800000h ;(1<<23)
   111                              <1> VIA_REG_AC97_CODEC_ID_SHIFT   equ  1Eh ; 30
   112                              <1> VIA_REG_AC97_CODEC_ID_PRIMARY equ  0
   113                              <1> VIA_REG_AC97_DATA_SHIFT equ   0
   114                              <1> VIADEV_PLAYBACK         equ   0
   115                              <1> VIA_REG_OFFSET_STATUS   equ   0    ;; byte - channel status
   116                              <1> VIA_REG_OFFSET_CONTROL  equ   01h  ;; byte - channel control
   117                              <1> VIA_REG_CTRL_START	equ   80h  ;; WO
   118                              <1> VIA_REG_CTRL_TERMINATE  equ   40h  ;; WO
   119                              <1> VIA_REG_CTRL_PAUSE      equ   08h  ;; RW
   120                              <1> VIA_REG_CTRL_RESET      equ   01h  ;; RW - probably reset? undocumented
   121                              <1> VIA_REG_OFFSET_STOP_IDX equ   08h  ;; dword - stop index, channel type, sample rate
   122                              <1> VIA8233_REG_TYPE_16BIT  equ   200000h ;; RW
   123                              <1> VIA8233_REG_TYPE_STEREO equ   100000h ;; RW
   124                              <1> VIA_REG_OFFSET_CURR_INDEX equ 0Fh ;; byte - channel current index (for via8233 only)
   125                              <1> VIA_REG_OFFSET_TABLE_PTR equ  04h  ;; dword - channel table pointer
   126                              <1> VIA_REG_OFFSET_CURR_PTR equ   04h  ;; dword - channel current pointer
   127                              <1> VIA_REG_OFS_PLAYBACK_VOLUME_L equ  02h ;; byte
   128                              <1> VIA_REG_OFS_PLAYBACK_VOLUME_R equ  03h ;; byte
   129                              <1> VIA_REG_CTRL_AUTOSTART	equ   20h
   130                              <1> VIA_REG_CTRL_INT_EOL	equ   02h
   131                              <1> VIA_REG_CTRL_INT_FLAG	equ   01h
   132                              <1> VIA_REG_CTRL_INT	equ  (VIA_REG_CTRL_INT_FLAG +                               VIA_REG_CTRL_INT_EOL +                               VIA_REG_CTRL_AUTOSTART)
   135                              <1> 
   136                              <1> VIA_REG_STAT_STOP_IDX	equ   10h    ;; RO ; 27/07/2020
   137                              <1> 				     ; current index = stop index
   138                              <1> VIA_REG_STAT_STOPPED	equ   04h    ;; RWC
   139                              <1> VIA_REG_STAT_EOL	equ   02h    ;; RWC
   140                              <1> VIA_REG_STAT_FLAG	equ   01h    ;; RWC
   141                              <1> VIA_REG_STAT_ACTIVE	equ   80h    ;; RO
   142                              <1> ; 28/11/2016
   143                              <1> VIA_REG_STAT_LAST	equ   40h    ;; RO
   144                              <1> VIA_REG_STAT_TRIGGER_QUEUED equ 08h  ;; RO
   145                              <1> VIA_REG_CTRL_INT_STOP	equ   04h  ; Interrupt on Current Index = Stop Index
   146                              <1> 		   		   ; and End of Block
   147                              <1> 
   148                              <1> VIA_REG_OFFSET_CURR_COUNT equ 0Ch ;; dword - channel current count, index
   149                              <1> 
   150                              <1> PORTB		EQU	061h
   151                              <1> REFRESH_STATUS	EQU	010h	; Refresh signal status
   152                              <1> 
   153                              <1> ; AC97 Codec registers.
   154                              <1> 
   155                              <1> ; 22/07/2020
   156                              <1> ; REALTEK ALC655 and ADI SOUNDMAX AD1980 CODEC MIXER REGISTERS
   157                              <1> 
   158                              <1> ; each codec/mixer register is 16bits
   159                              <1> 
   160                              <1> CODEC_RESET_REG                 equ     00h	; reset codec
   161                              <1> CODEC_MASTER_VOL_REG            equ     02h	; master volume
   162                              <1> CODEC_HP_VOL_REG                equ     04h	; headphone volume ; AD1980
   163                              <1> CODEC_MASTER_MONO_VOL_REG       equ     06h	; master mono volume (mono-out)
   164                              <1> ;CODEC_MASTER_TONE_REG          equ     08h	; master tone (R+L) ; (not used)
   165                              <1> CODEC_PCBEEP_VOL_REG            equ     0Ah	; PC beep volume ; ALC655
   166                              <1> CODEC_PHONE_VOL_REG             equ     0Ch	; phone volume
   167                              <1> CODEC_MIC_VOL_REG               equ     0Eh	; mic volume
   168                              <1> CODEC_LINE_IN_VOL_REG           equ     10h	; line in volume
   169                              <1> CODEC_CD_VOL_REG                equ     12h	; CD volume
   170                              <1> ;CODEC_VID_VOL_REG              equ     14h	; video volume ; (not used)
   171                              <1> CODEC_AUX_VOL_REG               equ     16h	; aux volume
   172                              <1> CODEC_PCM_OUT_REG               equ     18h	; PCM out volume
   173                              <1> CODEC_RECORD_SELECT_REG         equ     1Ah	; record select
   174                              <1> CODEC_RECORD_VOL_REG            equ     1Ch	; record volume (record gain)
   175                              <1> ;CODEC_RECORD_MIC_VOL_REG       equ     1Eh	; record mic volume ; (not used)
   176                              <1> CODEC_GP_REG                    equ     20h	; general purpose
   177                              <1> ;CODEC_3D_CONTROL_REG           equ     22h	; 3D control
   178                              <1> ;;CODEC_AUDIO_INT_PAGING_REG    equ	24h	; audio int & paging ; (not used) 
   179                              <1> CODEC_POWER_CTRL_REG            equ     26h	; power down control
   180                              <1> CODEC_EXT_AUDIO_REG             equ     28h	; extended audio ID
   181                              <1> CODEC_EXT_AUDIO_CTRL_REG        equ     2Ah	; extended audio status/control
   182                              <1> CODEC_PCM_FRONT_DACRATE_REG     equ     2Ch	; PCM front sample rate
   183                              <1> CODEC_PCM_SURND_DACRATE_REG     equ     2Eh	; PCM surround sample rate
   184                              <1> CODEC_PCM_LFE_DACRATE_REG       equ     30h	; PCM Center/LFE sample rate
   185                              <1> CODEC_LR_ADCRATE_REG            equ     32h	; PCM input sample rate
   186                              <1> CODEC_MIC_ADCRATE_REG           equ     34h	; mic in sample rate  ; AD1980
   187                              <1> CODEC_PCM_LFE_VOL_REG           equ     36h	; PCM Center/LFE volume
   188                              <1> CODEC_PCM_SURND_VOL_REG         equ     38h	; PCM surround volume
   189                              <1> ;CODEC_SPDIF_CTRL_REG           equ     3Ah	; S/PDIF control
   190                              <1> ; 22/07/2020
   191                              <1> CODEC_MISC_CRTL_BITS_REG	equ	76h	; misc control bits ; AD1980
   192                              <1> ;	
   193                              <1> CODEC_VENDOR_ID1		equ	7Ch	; REALTEK: 414Ch, ADI: 4144h	
   194                              <1> CODEC_VENDOR_ID2		equ	7Eh	; REALTEK: 4760h, ADI: 5370h	
   195                              <1> 
   196                              <1> ; VT8233 SGD bits (21/04/2017)
   197                              <1> FLAG	EQU BIT30
   198                              <1> EOL	EQU BIT31
   199                              <1> 
   200                              <1> ; INTEL ICH EQUATES
   201                              <1> ; 28/05/2017
   202                              <1> INTEL_VID	equ	8086h	; Intel's PCI vendor ID
   203                              <1> ; 20/11/2023
   204                              <1> ; (playwav2.com, ac97.inc, Erdogan Tan, 11/11/2023)
   205                              <1> ; 03/11/2023 - Erdogan Tan (Ref: MenuetOS AC97 WAV Player source code, 2004)
   206                              <1> SIS_VID		equ	1039h
   207                              <1> NVIDIA_VID	equ	10DEh	 ; Ref: MPXPLAY/SBEMU/KOLIBRIOS AC97 source c.
   208                              <1> AMD_VID		equ	1022h
   209                              <1> ;
   210                              <1> ICH_DID		equ	2415h	; ICH (82801AA) device ID
   211                              <1> ; 20/11/2023
   212                              <1> ; (playwav2.com, ac97.inc, Erdogan Tan, 11/11/2023)
   213                              <1> ; 17/02/2017 (Erdogan Tan, ref: ALSA Device IDs, ALSA project)
   214                              <1> ICH0_DID        equ     2425h	; ICH0
   215                              <1> ICH2_DID        equ     2445h 	; ICH2
   216                              <1> ICH3_DID	equ     2485h	; ICH3
   217                              <1> ICH4_DID        equ     24C5h	; ICH4
   218                              <1> ICH5_DID	equ     24D5h	; ICH5 
   219                              <1> ICH6_DID	equ     266Eh	; ICH6
   220                              <1> ESB6300_DID	equ     25A6h	; 6300ESB
   221                              <1> ESB631X_DID	equ     2698h	; 631XESB
   222                              <1> ICH7_DID	equ	27DEh	; ICH7
   223                              <1> ; 03/11/2023 - Erdogan Tan (Ref: MenuetOS AC97 WAV Player source code, 2004)
   224                              <1> MX82440_DID	equ	7195h
   225                              <1> SI7012_DID	equ	7012h
   226                              <1> NFORCE_DID	equ	01B1h
   227                              <1> NFORCE2_DID	equ	006Ah
   228                              <1> AMD8111_DID	equ	746Dh
   229                              <1> AMD768_DID	equ	7445h
   230                              <1> ; 03/11/2023 - Erdogan Tan - Ref: MPXPLAY/SBEMU/KOLIBRIOS AC97 source code
   231                              <1> CK804_DID	equ	0059h	; NFORCE4
   232                              <1> MCP04_DID	equ	003Ah
   233                              <1> CK8_DID		equ	008Ah
   234                              <1> NFORCE3_DID	equ	00DAh
   235                              <1> CK8S_DID	equ	00EAh
   236                              <1> 
   237                              <1> NAMBAR_REG      equ	10h	; native audio mixer Base Address Register
   238                              <1> NABMBAR_REG     equ	14h	; native audio bus mastering Base Addr Reg
   239                              <1> 
   240                              <1> PI_CR_REG       equ     0Bh     ; PCM in Control Register
   241                              <1> PO_CR_REG	equ     1Bh     ; PCM out Control Register
   242                              <1> MC_CR_REG	equ     2Bh     ; MIC in Control Register
   243                              <1> 
   244                              <1> PI_SR_REG	equ     6       ; PCM in Status register
   245                              <1> PO_SR_REG	equ     16h     ; PCM out Status register
   246                              <1> MC_SR_REG	equ     26h     ; MIC in Status register
   247                              <1> 
   248                              <1> IOCE 		equ     BIT4    ; interrupt on complete enable.
   249                              <1> FEIFE		equ     BIT3    ; set if you want an interrupt to fire
   250                              <1> LVBIE		equ     BIT2    ; last valid buffer interrupt enable.
   251                              <1> RR 		equ     BIT1    ; reset registers. Nukes all regs
   252                              <1>                                 ; except bits 4:2 of this register.
   253                              <1>                                 ; Only set this bit if BIT 0 is 0
   254                              <1> RPBM		equ     BIT0    ; Run/Pause
   255                              <1> 				; set this bit to start the codec!
   256                              <1> 
   257                              <1> PI_BDBAR_REG	equ     0       ; PCM in buffer descriptor BAR
   258                              <1> PO_BDBAR_REG	equ     10h     ; PCM out buffer descriptor BAR
   259                              <1> MC_BDBAR_REG	equ     20h     ; MIC in buffer descriptor BAR
   260                              <1> 
   261                              <1> PI_CIV_REG	equ     4       ; PCM in current Index value (RO)
   262                              <1> PO_CIV_REG	equ     14h     ; PCM out current Index value (RO)
   263                              <1> MC_CIV_REG 	equ     24h     ; MIC in current Index value (RO)
   264                              <1> 
   265                              <1> PI_LVI_REG	equ     5       ; PCM in Last Valid Index
   266                              <1> PO_LVI_REG	equ     15h     ; PCM out Last Valid Index
   267                              <1> MC_LVI_REG	equ     25h     ; MIC in Last Valid Index
   268                              <1> 
   269                              <1> IOC		equ     BIT31	; Fire an interrupt whenever this
   270                              <1>                 		; buffer is complete.
   271                              <1> BUP		equ     BIT30	; Buffer Underrun Policy.
   272                              <1> 
   273                              <1> GLOB_CNT_REG	equ     2Ch     ; Global Control Register
   274                              <1> GLOB_STS_REG	equ     30h     ; Global Status register (RO)
   275                              <1> 
   276                              <1> CTRL_ST_CREADY	equ   BIT8+BIT9+BIT28 ; Primary Codec Ready
   277                              <1> 
   278                              <1> CODEC_REG_POWERDOWN   equ 26h
   279                              <1> CODEC_REG_ST          equ 26h
   280                              <1> 
   281                              <1> ; 22/06/2017
   282                              <1> PO_PICB_REG	equ 18h	; PCM Out Position In Current Buffer Register
   283                              <1> 
   284                              <1> ; 19/11/2023
   285                              <1> AC97_EA_VRA	equ BIT0
   286                              <1> ; 24/11/2023
   287                              <1> BCIS		equ BIT3  ; Buffer Completion Interrupt Status
   288                              <1> 
   289                              <1> ;=============================================================================
   290                              <1> ;               CODE
   291                              <1> ;=============================================================================
   292                              <1> 
   293                              <1> ; CODE for INTEL ICH AC'97 AUDIO CONTROLLER
   294                              <1> 
   295                              <1> DetectICH:
   296                              <1> 	; 22/11/2023
   297                              <1> 	; 19/11/2023
   298                              <1> 	; 01/11/2023 - TRDOS 386 Kernel v2.0.7
   299                              <1> 	;; 10/06/2017
   300                              <1> 	;; 05/06/2017
   301                              <1> 	;; 29/05/2017
   302                              <1> 	;; 28/05/2017
   303                              <1> 	;mov	eax, (ICH_DID << 16) + INTEL_VID
   304                              <1>         ;call	pciFindDevice
   305                              <1>         ;jnc	short d_ac97_1
   306                              <1> 	;
   307                              <1> 	;; 01/11/2023
   308                              <1> 	;mov	eax, (NFORCE_DID << 16) + NFORCE_VID
   309                              <1>         ;call	pciFindDevice
   310                              <1>         ;jnc	short d_ac97_1
   311                              <1> 
   312                              <1> 	; 19/11/2023
   313 00013BB8 BE[85490100]        <1> 	mov	esi, valid_ids	; address of Valid ICH (AC97) Device IDs
   314 00013BBD B915000000          <1> 	mov	ecx, valid_id_count
   315                              <1> pfd_1:
   316 00013BC2 AD                  <1> 	lodsd
   317 00013BC3 E858000000          <1> 	call	pciFindDevice
   318 00013BC8 730F                <1> 	jnc	short d_ac97_1
   319 00013BCA E2F6                <1> 	loop	pfd_1
   320                              <1> 	;stc
   321                              <1> 
   322                              <1> d_ac97_0:
   323                              <1> ; couldn't find the audio device!
   324 00013BCC C3                  <1> 	retn
   325                              <1> 
   326                              <1> ; CODE for VIA VT8233 AUDIO CONTROLLER
   327                              <1> 
   328                              <1> DetectVT8233:
   329                              <1> 	; 22/11/2023
   330                              <1> 	; 02/11/2023
   331                              <1> 	; 01/11/2023 - TRDOS 386 Kernel v2.0.7
   332                              <1> 	; 06/08/2022 - TRDOS 386 Kernel v2.0.5
   333                              <1> 	; 10/06/2017
   334                              <1> 	; 05/06/2017
   335                              <1> 	; 29/05/2017
   336                              <1> 	; 03/04/2017
   337 00013BCD B806115930          <1> 	mov     eax, (VT8233_DID << 16) + VIA_VID
   338 00013BD2 E849000000          <1>         call    pciFindDevice
   339                              <1> ;       jnc     short d_vt8233_0
   340                              <1> ; couldn't find the audio device!
   341                              <1> ;	retn
   342 00013BD7 72F3                <1> 	jc	short d_ac97_0  ; 28/05/2017
   343                              <1> d_vt8233_0:
   344                              <1> 	; 24/03/2017 ('player.asm')
   345                              <1> 	; 12/11/2016 
   346                              <1> 	; Erdogan Tan - 8/11/2016
   347                              <1> 	; References: Kolibrios - vt823x.asm (2016)
   348                              <1> 	;	      VIA VT8235 V-Link South Bridge (VT8235-VIA.PDF)(2002)
   349                              <1> 	;	      lowlevel.eu - AC97 (2016)
   350                              <1> 	;	      .wav player for DOS by Jeff Leyda (2002) -this file-
   351                              <1> 	;	      Linux kernel - via82xx.c (2016)
   352                              <1> d_ac97_1:
   353                              <1> 	; eax = BUS/DEV/FN
   354                              <1> 	;	00000000BBBBBBBBDDDDDFFF00000000
   355                              <1> 	; edx = DEV/VENDOR
   356                              <1> 	;	DDDDDDDDDDDDDDDDVVVVVVVVVVVVVVVV
   357                              <1> 
   358 00013BD9 A3[B88A0100]        <1> 	mov	[audio_dev_id], eax
   359 00013BDE 8915[BC8A0100]      <1> 	mov	[audio_vendor], edx
   360                              <1> 
   361                              <1> 	; 22/11/2023
   362                              <1> 	;; init controller
   363                              <1> 	;mov	al, PCI_CMD_REG ; command register (04h)
   364                              <1> 	;call	pciRegRead32
   365                              <1> 	;
   366                              <1> 	;; eax = BUS/DEV/FN/REG
   367                              <1> 	;; edx = STATUS/COMMAND
   368                              <1> 	;; 	SSSSSSSSSSSSSSSSCCCCCCCCCCCCCCCC
   369                              <1> 	;mov	[audio_stats_cmd], edx
   370                              <1> 
   371 00013BE4 B010                <1> 	mov	al, PCI_IO_BASE ; IO base address register (10h)
   372                              <1> 	;mov	al, NAMBAR_REG	; Native Audio Mixer BAR (10h)
   373 00013BE6 E8C0000000          <1> 	call	pciRegRead32
   374                              <1> 
   375                              <1> 	;cmp	word [audio_vendor], INTEL_VID ; 8086h ; AC'97 ?
   376                              <1> 	;;jne	short d_vt8233_1
   377                              <1> 	;; 01/11/2023
   378                              <1> 	;je	short d_ac97_3
   379                              <1> 	;cmp	word [audio_vendor], NFORCE_VID ; 10DEh ; AC'97
   380                              <1> 	;jne	short d_vt8233_1	
   381                              <1> 	; 02/11/2023
   382 00013BEB 66813D[BC8A0100]06- <1> 	cmp	word [audio_vendor], VIA_VID	; 1106h ; VT8233-VT8237R 
   382 00013BF3 11                  <1>
   383 00013BF4 7411                <1> 	je	short d_vt8233_1
   384                              <1> d_ac97_3:
   385                              <1> 	;and	dx, 0FFFEh ; Audio Codec IO_ADDR_MASK
   386                              <1> 	; 06/08/2022
   387 00013BF6 80E2FE              <1> 	and	dl, 0FEh
   388 00013BF9 668915[B48A0100]    <1> 	mov	[NAMBAR], dx
   389                              <1> 
   390 00013C00 B014                <1> 	mov	al, NABMBAR_REG ; Native Audio Bus Mastering BAR (14h)
   391 00013C02 E8A4000000          <1> 	call	pciRegRead32	
   392                              <1> 
   393                              <1> 	;;and	dx, 0FFC0h ; Audio Controller IO_ADDR_MASK
   394                              <1> 	;; 06/08/2022
   395                              <1> 	;and	dl, 0C0h
   396                              <1> 	;mov	[NABMBAR], dx
   397                              <1>         ;;mov	[audio_io_base], dx
   398                              <1> 	;
   399                              <1> 	;jmp	short d_ac97_2
   400                              <1> 	; 02/11/2023
   401                              <1> 	; NABMBAR = audio_io_base
   402                              <1> 
   403                              <1> d_vt8233_1:
   404                              <1> 	;and	dx, 0FFC0h ; Audio Controller IO_ADDR_MASK 
   405                              <1> 	; 06/08/2022
   406 00013C07 80E2C0              <1> 	and	dl, 0C0h
   407 00013C0A 668915[B68A0100]    <1>         mov     [audio_io_base], dx
   408                              <1> 
   409                              <1> d_ac97_2:
   410                              <1> 	; 10/06/2017
   411 00013C11 B03C                <1> 	mov	al, AC97_INT_LINE ; Interrupt Line Register (3Ch)
   412                              <1> 	;call	pciRegRead32
   413 00013C13 E880000000          <1> 	call	pciRegRead8
   414                              <1> 
   415                              <1> 	;;and 	edx, 0FFh
   416                              <1> 	; 06/08/2022
   417                              <1> 	;and	dx, 0FFh
   418                              <1> 
   419 00013C18 8815[B28A0100]      <1> 	mov     [audio_intr], dl
   420                              <1> 
   421 00013C1E C3                  <1> 	retn
   422                              <1> 
   423                              <1> 	; (Note: Interrupts are already enabled by TRDOS 386 kernel!)
   424                              <1> 	;mov	cx, dx
   425                              <1> 	;
   426                              <1> 	;in	al, 0A1h ; irq 8-15
   427                              <1> 	;mov	ah, al
   428                              <1> 	;in	al, 21h  ; irq 0-7 
   429                              <1> 	;btr	ax, dx	 ; unmask ; 17/03/2017
   430                              <1> 	;;bts	ax, dx   ; MASK interrupt ; 10/06/2017 
   431                              <1> 	;out	21h, al  ; irq <= 7
   432                              <1> 	;mov	al, ah
   433                              <1> 	;out	0A1h, al ; irq > 7
   434                              <1> 	;
   435                              <1> 	
   436                              <1> 	; 10/06/2017
   437                              <1> 	; === Intel ICH I/O Controller Hub Datasheet, Section 8.1.16 ===
   438                              <1> 	; PRQ[n]_ROUT Register (61h, PRQB) Bit 7:
   439                              <1> 	; Interrupt Routing Enable (IRQEN).
   440                              <1> 	; 0 = The corresponding PIRQ is routed to one of the ISA-compatible
   441                              <1> 	;     interrupts specified in bits[3:0].
   442                              <1> 	; 1 = The PIRQ is not routed to the 8259.
   443                              <1> 	; Note: If the PIRQ is intended to cause an interrupt to the ICHs 
   444                              <1> 	;	integrated I/O APIC, then this bit should be set to 0 and 
   445                              <1> 	;	the APIC_EN bit should be set to 1. 
   446                              <1> 	;	The IRQEN must be set to 0 and the PIRQ routed to 
   447                              <1> 	;	an 8259 interrupt via the IRQ Routing filed (bits[3:0).
   448                              <1> 	;	The corresponding 8259 interrupt must be masked via the 
   449                              <1> 	;	appropriated bit in the 8259s OCW1 (Interrupt Mask)
   450                              <1> 	;	register. The IOAPIC must then be enabled by setting 
   451                              <1> 	;	the APIC_EN bit in the GEN_CNTL register.
   452                              <1> 
   453                              <1> 	;mov	eax, 0F861h  ; D31:F0
   454                              <1> 	;	; AL=61h : PIRQ[B] Routing Control Reg, LPC interface
   455                              <1> 	;;mov	dl, [audio_intr]
   456                              <1> 	;call	pciRegWrite8
   457                              <1> 	;;mov	al, 0D0h	; General Control Register (GEN_CTL)
   458                              <1> 	;;call	pciRegRead32
   459                              <1> 	;;or	edx, 100h	; Bit 8, APIC_EN (Enable I/O APIC) 
   460                              <1> 	;;call	pciRegWrite32
   461                              <1> 	;;and	edx, ~100h
   462                              <1> 	;;call	pciRegWrite32	; Bit 8, APIC_EN (Disable I/O APIC) 
   463                              <1> 	;
   464                              <1> 
   465                              <1> 	;mov	dx, 4D1h	; 8259 ELCR2
   466                              <1>     	;in	al, dx
   467                              <1> 	;mov	ah, al
   468                              <1> 	;;mov	dx, 4D0h 	; 8259 ELCR1
   469                              <1> 	;dec	dl
   470                              <1> 	;in	al, dx
   471                              <1> 	;bts	ax, cx
   472                              <1> 	;;mov	dx, 4D0h
   473                              <1> 	;out	dx, al		; set level-triggered mode
   474                              <1> 	;mov	al, ah ; 29/05/2017
   475                              <1> 	;;mov	dx, 4D1h
   476                              <1> 	;inc	dl
   477                              <1> 	;out	dx, al		; set level-triggered mode
   478                              <1> 
   479                              <1> 	;xor	eax, eax ; 0
   480                              <1> 
   481 00013C1F C3                  <1> 	retn
   482                              <1> 
   483                              <1> ; CODE for PCI
   484                              <1> 
   485                              <1> pciFindDevice:
   486                              <1> 	; 19/11/2023
   487                              <1> 	; 03/04/2017 ('pci.asm', 20/03/2017)
   488                              <1> 	;
   489                              <1> 	; scan through PCI space looking for a device+vendor ID
   490                              <1> 	;
   491                              <1> 	; Entry: EAX=Device+Vendor ID
   492                              <1> 	;
   493                              <1> 	; Exit: EAX=PCI address if device found
   494                              <1> 	;	EDX=Device+Vendor ID
   495                              <1> 	;       CY clear if found, set if not found. EAX invalid if CY set.
   496                              <1> 	;
   497                              <1> 	; Destroys: ebx, edi ; 19/11/2023
   498                              <1> 
   499                              <1> 	;push	ecx
   500                              <1> 	;push	eax ; * ; 19/11/2023
   501                              <1> 	;push	esi
   502                              <1> 	;push	edi
   503                              <1> 	;
   504                              <1> 	;mov	esi, eax		; save off vend+device ID
   505                              <1>         ; 19/11/2023
   506 00013C20 89C3                <1> 	mov	ebx, eax
   507                              <1> 	;mov	edi, (80000000h - 100h)	; start with bus 0, dev 0 func 0
   508 00013C22 BF00000080          <1> 	mov	edi, 80000000h
   509                              <1> nextPCIdevice:
   510                              <1> 	;add	edi, 100h
   511                              <1> 	;cmp	edi, 80FFF800h		; scanned all devices?
   512                              <1> 	;stc
   513                              <1> 	;je	short PCIScanExit	; not found
   514                              <1> 
   515 00013C27 89F8                <1> 	mov 	eax, edi		; read PCI registers
   516 00013C29 E87D000000          <1> 	call	pciRegRead32
   517                              <1> 	; 19/11/2023
   518 00013C2E 39DA                <1> 	cmp	edx, ebx
   519                              <1> 	;cmp	edx, esi		; found device?
   520                              <1> 	;jne	short nextPCIdevice
   521                              <1> 	;;clc
   522 00013C30 7412                <1> 	je	short PCIScanExit	; found
   523                              <1> 	; 19/11/2023
   524 00013C32 81FF00F8FF80        <1> 	cmp	edi, 80FFF800h
   525 00013C38 7308                <1> 	jnb	short pfd_nf		; not found
   526 00013C3A 81C700010000        <1> 	add	edi, 100h
   527 00013C40 EBE5                <1> 	jmp	short nextPCIdevice
   528                              <1> pfd_nf:
   529 00013C42 F9                  <1> 	stc
   530 00013C43 C3                  <1> 	retn	
   531                              <1> PCIScanExit:
   532                              <1> 	;pushf
   533 00013C44 B8FFFFFF7F          <1> 	mov	eax, NOT_BIT31 	; 19/03/2017
   534 00013C49 21F8                <1> 	and	eax, edi	; return only bus/dev/fn #
   535                              <1> 	;popf
   536                              <1> 	;
   537                              <1> 	;pop	edi
   538                              <1> 	;pop	esi
   539                              <1> 	;pop	edx ; * ; 19/11/2023
   540                              <1> 	;pop	ecx
   541                              <1> 	;
   542 00013C4B C3                  <1> 	retn
   543                              <1> 
   544                              <1> ; 26/11/2023
   545                              <1> %if 1
   546                              <1> 
   547                              <1> pciRegRead:
   548                              <1> 	; 03/04/2017 ('pci.asm', 20/03/2017)
   549                              <1> 	;
   550                              <1> 	; 8/16/32bit PCI reader
   551                              <1> 	;
   552                              <1> 	; Entry: EAX=PCI Bus/Device/fn/register number
   553                              <1> 	;           BIT30 set if 32 bit access requested
   554                              <1> 	;           BIT29 set if 16 bit access requested
   555                              <1> 	;           otherwise defaults to 8 bit read
   556                              <1> 	;
   557                              <1> 	; Exit:  DL,DX,EDX register data depending on requested read size
   558                              <1> 	;
   559                              <1> 	; Note1: this routine is meant to be called via pciRegRead8,
   560                              <1> 	;	 pciRegread16 or pciRegRead32, listed below.
   561                              <1> 	;
   562                              <1> 	; Note2: don't attempt to read 32 bits of data from a non dword
   563                              <1> 	;	 aligned reg number. Likewise, don't do 16 bit reads from
   564                              <1> 	;	 non word aligned reg #
   565                              <1> 	
   566 00013C4C 53                  <1> 	push	ebx
   567 00013C4D 51                  <1> 	push	ecx
   568 00013C4E 89C3                <1>         mov     ebx, eax		; save eax, dh
   569 00013C50 88F1                <1>         mov     cl, dh
   570                              <1> 
   571 00013C52 25FFFFFF3F          <1>         and     eax, NOT_PCI32_PCI16	; clear out data size request
   572 00013C57 0D00000080          <1>         or      eax, BIT31		; make a PCI access request
   573 00013C5C 24FC                <1>         and     al, ~3 ; NOT 3		; force index to be dword
   574                              <1> 
   575 00013C5E 66BAF80C            <1>         mov     dx, PCI_INDEX_PORT
   576 00013C62 EF                  <1>         out	dx, eax			; write PCI selector
   577                              <1> 	
   578 00013C63 66BAFC0C            <1>         mov     dx, PCI_DATA_PORT
   579 00013C67 88D8                <1>         mov     al, bl
   580 00013C69 2403                <1>         and     al, 3			; figure out which port to
   581 00013C6B 00C2                <1>         add     dl, al			; read to
   582                              <1> 
   583 00013C6D F7C3000000C0        <1> 	test    ebx, PCI32+PCI16
   584 00013C73 7507                <1>         jnz     short _pregr0
   585 00013C75 EC                  <1> 	in	al, dx			; return 8 bits of data
   586 00013C76 88C2                <1>         mov	dl, al
   587 00013C78 88CE                <1> 	mov     dh, cl			; restore dh for 8 bit read
   588 00013C7A EB12                <1> 	jmp	short _pregr2
   589                              <1> _pregr0:	
   590 00013C7C F7C300000080        <1> 	test    ebx, PCI32
   591 00013C82 7507                <1>         jnz	short _pregr1
   592 00013C84 66ED                <1> 	in	ax, dx
   593 00013C86 6689C2              <1>         mov     dx, ax			; return 16 bits of data
   594 00013C89 EB03                <1> 	jmp	short _pregr2
   595                              <1> _pregr1:
   596 00013C8B ED                  <1> 	in	eax, dx			; return 32 bits of data
   597 00013C8C 89C2                <1> 	mov	edx, eax
   598                              <1> _pregr2:
   599 00013C8E 89D8                <1> 	mov     eax, ebx		; restore eax
   600 00013C90 25FFFFFF3F          <1>         and     eax, NOT_PCI32_PCI16	; clear out data size request
   601 00013C95 59                  <1> 	pop	ecx
   602 00013C96 5B                  <1> 	pop	ebx
   603 00013C97 C3                  <1> 	retn
   604                              <1> 
   605                              <1> pciRegRead8:
   606 00013C98 25FFFFFF3F          <1>         and     eax, NOT_PCI32_PCI16	; set up 8 bit read size
   607 00013C9D EBAD                <1>         jmp     short pciRegRead	; call generic PCI access
   608                              <1> 
   609                              <1> pciRegRead16:
   610 00013C9F 25FFFFFF3F          <1>         and     eax, NOT_PCI32_PCI16	; set up 16 bit read size
   611 00013CA4 0D00000040          <1>         or      eax, PCI16		; call generic PCI access
   612 00013CA9 EBA1                <1>         jmp     short pciRegRead
   613                              <1> 
   614                              <1> pciRegRead32:
   615 00013CAB 25FFFFFF3F          <1>         and     eax, NOT_PCI32_PCI16	; set up 32 bit read size
   616 00013CB0 0D00000080          <1>         or      eax, PCI32		; call generic PCI access
   617 00013CB5 EB95                <1>         jmp     pciRegRead
   618                              <1> 
   619                              <1> pciRegWrite:
   620                              <1> 	; 03/04/2017 ('pci.asm', 29/11/2016)
   621                              <1> 	;
   622                              <1> 	; 8/16/32bit PCI writer
   623                              <1> 	;
   624                              <1> 	; Entry: EAX=PCI Bus/Device/fn/register number
   625                              <1> 	;           BIT31 set if 32 bit access requested
   626                              <1> 	;           BIT30 set if 16 bit access requested
   627                              <1> 	;           otherwise defaults to 8bit read
   628                              <1> 	;        DL/DX/EDX data to write depending on size
   629                              <1> 	;
   630                              <1> 	; Note1: this routine is meant to be called via pciRegWrite8, 
   631                              <1> 	;	 pciRegWrite16 or pciRegWrite32 as detailed below.
   632                              <1> 	;
   633                              <1> 	; Note2: don't attempt to write 32bits of data from a non dword
   634                              <1> 	;	 aligned reg number. Likewise, don't do 16 bit writes from
   635                              <1> 	;	 non word aligned reg #
   636                              <1> 
   637 00013CB7 53                  <1> 	push	ebx
   638 00013CB8 51                  <1> 	push	ecx
   639 00013CB9 89C3                <1>         mov     ebx, eax		; save eax, edx
   640 00013CBB 89D1                <1>         mov     ecx, edx
   641 00013CBD 25FFFFFF3F          <1> 	and     eax, NOT_PCI32_PCI16	; clear out data size request
   642 00013CC2 0D00000080          <1>         or      eax, BIT31		; make a PCI access request
   643 00013CC7 24FC                <1>         and     al, ~3 ; NOT 3		; force index to be dword
   644                              <1> 
   645 00013CC9 66BAF80C            <1>         mov     dx, PCI_INDEX_PORT
   646 00013CCD EF                  <1>         out	dx, eax			; write PCI selector
   647                              <1> 	
   648 00013CCE 66BAFC0C            <1>         mov     dx, PCI_DATA_PORT
   649 00013CD2 88D8                <1>         mov     al, bl
   650 00013CD4 2403                <1>         and     al, 3			; figure out which port to
   651 00013CD6 00C2                <1>         add     dl, al			; write to
   652                              <1> 
   653 00013CD8 F7C3000000C0        <1> 	test    ebx, PCI32+PCI16
   654 00013CDE 7505                <1>         jnz     short _pregw0
   655 00013CE0 88C8                <1> 	mov	al, cl 			; put data into al
   656 00013CE2 EE                  <1> 	out	dx, al
   657 00013CE3 EB12                <1> 	jmp	short _pregw2
   658                              <1> _pregw0:
   659 00013CE5 F7C300000080        <1> 	test    ebx, PCI32
   660 00013CEB 7507                <1>         jnz     short _pregw1
   661 00013CED 6689C8              <1> 	mov	ax, cx			; put data into ax
   662 00013CF0 66EF                <1> 	out	dx, ax
   663 00013CF2 EB03                <1> 	jmp	short _pregw2
   664                              <1> _pregw1:
   665 00013CF4 89C8                <1> 	mov	eax, ecx		; put data into eax 		
   666 00013CF6 EF                  <1> 	out	dx, eax
   667                              <1> _pregw2:
   668 00013CF7 89D8                <1>         mov     eax, ebx		; restore eax
   669 00013CF9 25FFFFFF3F          <1>         and     eax, NOT_PCI32_PCI16	; clear out data size request
   670 00013CFE 89CA                <1>         mov     edx, ecx		; restore dx
   671 00013D00 59                  <1> 	pop	ecx
   672 00013D01 5B                  <1> 	pop	ebx
   673 00013D02 C3                  <1> 	retn
   674                              <1> 
   675                              <1> pciRegWrite8:
   676 00013D03 25FFFFFF3F          <1>         and     eax, NOT_PCI32_PCI16	; set up 8 bit write size
   677 00013D08 EBAD                <1>         jmp	short pciRegWrite	; call generic PCI access
   678                              <1> 
   679                              <1> pciRegWrite16:
   680 00013D0A 25FFFFFF3F          <1>         and     eax, NOT_PCI32_PCI16	; set up 16 bit write size
   681 00013D0F 0D00000040          <1>         or      eax, PCI16		; call generic PCI access
   682 00013D14 EBA1                <1>         jmp	short pciRegWrite
   683                              <1> 
   684                              <1> pciRegWrite32:
   685 00013D16 25FFFFFF3F          <1>         and     eax, NOT_PCI32_PCI16	; set up 32 bit write size
   686 00013D1B 0D00000080          <1>         or      eax, PCI32		; call generic PCI access
   687 00013D20 EB95                <1>         jmp	pciRegWrite
   688                              <1> 
   689                              <1> %endif
   690                              <1> 
   691                              <1> ; 26/11/2023 - temporary
   692                              <1> %if 0
   693                              <1> 
   694                              <1> ; PLAYWAV3.COM, ac97_vra.asm, 19/11/2023, Erdogan Tan
   695                              <1> 
   696                              <1> ;===============================================================
   697                              <1> ; 8/16/32bit PCI reader
   698                              <1> ;
   699                              <1> ; Entry: EAX=PCI Bus/Device/fn/register number
   700                              <1> ;           BIT30 set if 32 bit access requested
   701                              <1> ;           BIT29 set if 16 bit access requested
   702                              <1> ;           otherwise defaults to 8 bit read
   703                              <1> ;
   704                              <1> ; Exit:  DL,DX,EDX register data depending on requested read size
   705                              <1> ;
   706                              <1> ; Note: this routine is meant to be called via pciRegRead8, pciRegread16,
   707                              <1> ;	or pciRegRead32, listed below.
   708                              <1> ;
   709                              <1> ; Note2: don't attempt to read 32bits of data from a non dword aligned reg
   710                              <1> ;	 number. Likewise, don't do 16bit reads from non word aligned reg #
   711                              <1> ; 
   712                              <1> pciRegRead:
   713                              <1> 	push	ebx
   714                              <1> 	push	ecx
   715                              <1>         mov     ebx, eax                        ; save eax, dh
   716                              <1>         mov     cl, dh
   717                              <1>         and     eax, (~PCI32)+PCI16             ; clear out data size request
   718                              <1>         or      eax, BIT31                      ; make a PCI access request
   719                              <1>         and     al, ~3 ; NOT 3                  ; force index to be dword
   720                              <1> 
   721                              <1>         mov     dx, PCI_INDEX_PORT
   722                              <1>         out     dx, eax                         ; write PCI selector
   723                              <1> 
   724                              <1>         mov     dx, PCI_DATA_PORT
   725                              <1>         mov     al, bl
   726                              <1>         and     al, 3                           ; figure out which port to
   727                              <1>         add     dl, al                          ; read to
   728                              <1> 
   729                              <1> 	in      eax, dx                         ; do 32bit read
   730                              <1>         test    ebx, PCI32
   731                              <1>         jz      short _pregr1
   732                              <1> 
   733                              <1>         mov     edx, eax                        ; return 32bits of data
   734                              <1> _pregr1:
   735                              <1> 	mov     dx, ax                          ; return 16bits of data
   736                              <1>         test    ebx, PCI32+PCI16
   737                              <1>         jnz     short _pregr2
   738                              <1>         mov     dh, cl                          ; restore dh for 8 bit read
   739                              <1> _pregr2:
   740                              <1>         mov     eax, ebx                        ; restore eax
   741                              <1>         and     eax, (~PCI32)+PCI16             ; clear out data size request
   742                              <1> 	pop	ecx
   743                              <1> 	pop	ebx
   744                              <1> 	retn
   745                              <1> 
   746                              <1> pciRegRead8:
   747                              <1>         and     eax, (~PCI16)+PCI32             ; set up 8 bit read size
   748                              <1>         jmp     short pciRegRead		; call generic PCI access
   749                              <1> 
   750                              <1> pciRegRead16:
   751                              <1>         and     eax, (~PCI16)+PCI32		; set up 16 bit read size
   752                              <1>         or      eax, PCI16			; call generic PCI access
   753                              <1>         jmp     short pciRegRead
   754                              <1> 
   755                              <1> pciRegRead32:
   756                              <1>         and     eax, (~PCI16)+PCI32		; set up 32 bit read size
   757                              <1>         or      eax, PCI32			; call generic PCI access
   758                              <1>         jmp     short pciRegRead
   759                              <1> 
   760                              <1> ;===============================================================
   761                              <1> ; 8/16/32bit PCI writer
   762                              <1> ;
   763                              <1> ; Entry: EAX=PCI Bus/Device/fn/register number
   764                              <1> ;           BIT31 set if 32 bit access requested
   765                              <1> ;           BIT30 set if 16 bit access requested
   766                              <1> ;           otherwise defaults to 8bit read
   767                              <1> ;        DL/DX/EDX data to write depending on size
   768                              <1> ;
   769                              <1> ;
   770                              <1> ; note: this routine is meant to be called via pciRegWrite8, pciRegWrite16,
   771                              <1> ; 	or pciRegWrite32 as detailed below.
   772                              <1> ;
   773                              <1> ; Note2: don't attempt to write 32bits of data from a non dword aligned reg
   774                              <1> ;	 number. Likewise, don't do 16bit writes from non word aligned reg #
   775                              <1> ;
   776                              <1> pciRegWrite:
   777                              <1> 	push	ebx
   778                              <1> 	push	ecx
   779                              <1>         mov     ebx, eax                        ; save eax, dx
   780                              <1>         mov     cx, dx
   781                              <1>         or      eax, BIT31                      ; make a PCI access request
   782                              <1>         and     eax, ~PCI16 ; NOT PCI16         ; clear out data size request
   783                              <1>         and     al, ~3 ; NOT 3                  ; force index to be dword
   784                              <1> 
   785                              <1>         mov     dx, PCI_INDEX_PORT
   786                              <1>         out     dx, eax                         ; write PCI selector
   787                              <1> 
   788                              <1>         mov     dx, PCI_DATA_PORT
   789                              <1>         mov     al, bl
   790                              <1>         and     al, 3                           ; figure out which port to
   791                              <1>         add     dl, al                          ; write to
   792                              <1> 
   793                              <1>         mov     eax, edx                        ; put data into eax
   794                              <1>         mov     ax, cx
   795                              <1> 
   796                              <1>         out     dx, al
   797                              <1>         test    ebx, PCI16+PCI32                ; only 8bit access? bail
   798                              <1>         jz      short _pregw1
   799                              <1> 
   800                              <1>         out     dx, ax                          ; write 16 bit value
   801                              <1>         test    ebx, PCI16                      ; 16bit requested?  bail
   802                              <1>         jnz     short _pregw1
   803                              <1> 
   804                              <1>         out     dx, eax                         ; write full 32bit
   805                              <1> _pregw1:
   806                              <1>         mov     eax, ebx                        ; restore eax
   807                              <1>         and     eax, (~PCI32)+PCI16             ; clear out data size request
   808                              <1>         mov     dx, cx                          ; restore dx
   809                              <1> 	pop	ecx
   810                              <1> 	pop	ebx
   811                              <1> 	ret
   812                              <1> 
   813                              <1> pciRegWrite8:
   814                              <1>         and     eax, (~PCI16)+PCI32		; set up 8 bit write size
   815                              <1>         jmp     short pciRegWrite		; call generic PCI access
   816                              <1> 
   817                              <1> pciRegWrite16:
   818                              <1>         and     eax, (~PCI16)+PCI32		; set up 16 bit write size
   819                              <1>         or      eax, PCI16			; call generic PCI access
   820                              <1>         jmp     short pciRegWrite
   821                              <1> 
   822                              <1> pciRegWrite32:
   823                              <1>         and     eax, (~PCI16)+PCI32		; set up 32 bit write size
   824                              <1>         or      eax, PCI32			; call generic PCI access
   825                              <1>         jmp     short pciRegWrite
   826                              <1> 
   827                              <1> ;===============================================================
   828                              <1> 
   829                              <1> %endif
   830                              <1> 
   831                              <1> init_codec:
   832                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
   833                              <1> 	; 05/06/2017
   834                              <1> 	; 28/05/2017 - Erdogan Tan (Ref: KolibriOS, vt823x.asm)
   835                              <1> 	;
   836 00013D22 A1[B88A0100]        <1> 	mov	eax, [audio_dev_id]	
   837 00013D27 B041                <1> 	mov	al, VIA_ACLINK_CTRL
   838 00013D29 E86AFFFFFF          <1> 	call	pciRegRead8
   839                              <1> 	; ?
   840 00013D2E B040                <1> 	mov	al, VIA_ACLINK_STAT
   841 00013D30 E863FFFFFF          <1> 	call	pciRegRead8
   842 00013D35 F6C201              <1> 	test	dl, VIA_ACLINK_C00_READY
   843 00013D38 7508                <1>         jnz     short _codec_ready_1
   844 00013D3A E80D000000          <1> 	call	reset_codec
   845 00013D3F 7305                <1> 	jnc	short _codec_ready_2 ; eax = 1
   846 00013D41 C3                  <1> 	retn
   847                              <1> _codec_ready_1:
   848                              <1> 	;mov	eax, 1
   849                              <1> 	; 06/08/2022
   850 00013D42 29C0                <1> 	sub	eax, eax
   851 00013D44 FEC0                <1> 	inc	al
   852                              <1> 	; eax = 1
   853                              <1> _codec_ready_2:
   854 00013D46 E880000000          <1> 	call	codec_io_w16
   855                              <1> detect_codec:
   856 00013D4B C3                  <1> 	retn
   857                              <1> 
   858                              <1> reset_codec:
   859                              <1> 	; 16/04/2017
   860                              <1> 	; 23/03/2017 
   861                              <1> 	; ('codec.asm')
   862                              <1> 	; 12/11/2016 - Erdogan Tan (Ref: KolibriOS, vt823x.asm)
   863 00013D4C A1[B88A0100]        <1> 	mov	eax, [audio_dev_id]
   864 00013D51 B041                <1>  	mov	al, VIA_ACLINK_CTRL
   865 00013D53 B2E0                <1>        	mov	dl, VIA_ACLINK_CTRL_ENABLE + VIA_ACLINK_CTRL_RESET + VIA_ACLINK_CTRL_SYNC
   866 00013D55 E8A9FFFFFF          <1> 	call	pciRegWrite8
   867                              <1> 
   868 00013D5A E843000000          <1> 	call	delay_100ms 	; wait 100 ms
   869                              <1> _rc_cold:
   870 00013D5F E811000000          <1>         call    cold_reset
   871 00013D64 7301                <1>         jnc     short _reset_codec_ok
   872                              <1> 	
   873                              <1> 	; 16/04/2017
   874                              <1>         ;xor	eax, eax	; timeout error
   875                              <1>        	;stc
   876 00013D66 C3                  <1> 	retn
   877                              <1> 
   878                              <1> _reset_codec_ok:
   879                              <1> 	; 01/09/2020
   880                              <1> 	; 15/08/2020
   881                              <1> 	; 27/07/2020
   882                              <1> 	; also reset codec by using index control register 0 of AD1980 or ALC655
   883                              <1> 	; (to fix line out -2 channels audio playing- problem on AD1980 codec)  
   884                              <1> 
   885 00013D67 29C0                <1> 	sub	eax, eax
   886                              <1> 	; 02/11/2023
   887                              <1> 	;mov	edx, CODEC_RESET_REG ; 00h ; Reset register
   888 00013D69 31D2                <1> 	xor	edx, edx ; 00h ; Reset register
   889 00013D6B E8BE000000          <1> 	call	codec_write
   890                              <1> 
   891                              <1> 	;sub	eax, eax
   892                              <1> 	; 01/09/2020
   893                              <1> 	; 15/08/2020
   894                              <1> 	; AD1980 BugFix
   895                              <1> 	; (set HPSEL -headphone amp to be driven from mixer- and
   896                              <1> 	;      CLDIS -center and LFE disable- bits)	
   897                              <1> 	;mov	eax, 0C00h ; HPSEL = bit 10, CLDIS = bit 11 ; 01/09/2020
   898                              <1>  	;mov	edx, CODEC_MISC_CRTL_BITS_REG ; 76h ; Misc Ctrl Bits ; AD1980
   899                              <1> 	;call	codec_write
   900                              <1> 
   901 00013D70 31C0                <1>         xor     eax, eax
   902                              <1>         ;mov	al, VIA_ACLINK_C00_READY ; 1
   903 00013D72 FEC0                <1>         inc	al
   904 00013D74 C3                  <1> 	retn
   905                              <1> 
   906                              <1> cold_reset:
   907                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
   908                              <1> 	; 16/04/2017
   909                              <1> 	; 23/03/2017
   910                              <1> 	; ('codec.asm')
   911                              <1> 	; 12/11/2016 - Erdogan Tan (Ref: KolibriOS, vt823x.asm)
   912                              <1> 	;mov	eax, [audio_dev_id]
   913                              <1> 	;mov	al, VIA_ACLINK_CTRL
   914 00013D75 30D2                <1> 	xor	dl, dl ; 0
   915 00013D77 E887FFFFFF          <1> 	call	pciRegWrite8
   916                              <1> 
   917 00013D7C E821000000          <1> 	call	delay_100ms	; wait 100 ms
   918                              <1> 
   919                              <1> 	;; ACLink on, deassert ACLink reset, VSR, SGD data out
   920                              <1>         ;; note - FM data out has trouble with non VRA codecs !!
   921                              <1>         
   922                              <1> 	;mov	eax, [audio_dev_id]
   923                              <1> 	;mov	al, VIA_ACLINK_CTRL
   924 00013D81 B2CC                <1> 	mov	dl, VIA_ACLINK_CTRL_INIT
   925 00013D83 E87BFFFFFF          <1> 	call	pciRegWrite8
   926                              <1> 
   927                              <1> 	;mov	ecx, 16	; total 2s
   928                              <1> 	; 06/08/2022
   929                              <1> 	;sub	ecx, ecx
   930                              <1> 	; 22/11/2023
   931                              <1> 	; ecx = 0 (from 'delay_100ms')
   932 00013D88 B110                <1> 	mov	cl, 16
   933                              <1> _crst_wait:
   934                              <1> 	;mov	eax, [audio_dev_id]
   935 00013D8A B040                <1> 	mov	al, VIA_ACLINK_STAT
   936 00013D8C E807FFFFFF          <1> 	call	pciRegRead8	
   937                              <1> 
   938 00013D91 F6C201              <1>         test    dl, VIA_ACLINK_C00_READY
   939 00013D94 750B                <1>         jnz     short _crst_ok
   940                              <1> 
   941 00013D96 51                  <1> 	push	ecx
   942 00013D97 E806000000          <1> 	call	delay_100ms
   943 00013D9C 59                  <1> 	pop	ecx
   944                              <1> 
   945 00013D9D 49                  <1>         dec     ecx
   946 00013D9E 75EA                <1>         jnz     short _crst_wait
   947                              <1> 
   948                              <1> _crst_fail:
   949 00013DA0 F9                  <1>         stc
   950                              <1> _crst_ok:
   951 00013DA1 C3                  <1> 	retn
   952                              <1> 
   953                              <1> delay_100ms:
   954                              <1> 	; 29/05/2017
   955                              <1> 	; 24/03/2017 ('codec.asm')
   956                              <1> 	; wait 100 ms
   957 00013DA2 B990010000          <1> 	mov	ecx, 400  ; 400*0.25ms
   958                              <1> _delay_x_ms:
   959 00013DA7 E803000000          <1> 	call	delay1_4ms
   960 00013DAC E2F9                <1>         loop	_delay_x_ms
   961 00013DAE C3                  <1> 	retn
   962                              <1> 
   963                              <1> ;       delay1_4ms - Delay for 1/4 millisecond.
   964                              <1> ;	    1ms = 1000us
   965                              <1> ;       Entry:
   966                              <1> ;         None
   967                              <1> ;       Exit:
   968                              <1> ;	  None
   969                              <1> ;
   970                              <1> ;       Modified:
   971                              <1> ;         None
   972                              <1> 
   973                              <1> 	; 29/05/2017
   974                              <1> 	; 23/04/2017
   975                              <1> 	; 05/03/2017 (TRDOS 386)
   976                              <1> 	; ('UTILS.ASM')
   977                              <1> delay1_4ms:
   978 00013DAF 50                  <1>         push    eax 
   979 00013DB0 51                  <1>         push    ecx
   980 00013DB1 B110                <1>         mov	cl, 16		; close enough.
   981                              <1> 
   982 00013DB3 E461                <1> 	in	al, PORTB ; 61h
   983                              <1> 		
   984 00013DB5 2410                <1> 	and	al, REFRESH_STATUS ; 10h
   985 00013DB7 88C5                <1> 	mov	ch, al		; Start toggle state
   986                              <1> _d4ms1:	
   987 00013DB9 E461                <1> 	in	al, PORTB	; Read system control port
   988                              <1> 	
   989 00013DBB 2410                <1> 	and	al, REFRESH_STATUS ; Refresh toggles 15.085 microseconds
   990 00013DBD 38C5                <1> 	cmp	ch, al
   991 00013DBF 74F8                <1> 	je	short _d4ms1	; Wait for state change
   992                              <1> 
   993 00013DC1 88C5                <1> 	mov	ch, al		; Update with new state
   994 00013DC3 FEC9                <1> 	dec	cl
   995 00013DC5 75F2                <1> 	jnz	short _d4ms1
   996                              <1> 
   997 00013DC7 F8                  <1> 	clc	; 29/05/2017
   998                              <1> 
   999 00013DC8 59                  <1>         pop     ecx
  1000 00013DC9 58                  <1>         pop     eax
  1001 00013DCA C3                  <1>         retn
  1002                              <1> 
  1003                              <1> ; 10/04/2017 (TRDOS 386)
  1004                              <1> ; 12/11/2016
  1005                              <1> 
  1006                              <1> codec_io_w16: ;w32
  1007                              <1> 	; ('codec.asm')
  1008 00013DCB 668B15[B68A0100]    <1>         mov	dx, [audio_io_base]
  1009 00013DD2 6681C28000          <1>         add     dx, VIA_REG_AC97
  1010 00013DD7 EF                  <1> 	out	dx, eax
  1011 00013DD8 C3                  <1>         retn
  1012                              <1> 
  1013                              <1> codec_io_r16: ;r32
  1014                              <1> 	; ('codec.asm')
  1015 00013DD9 668B15[B68A0100]    <1>         mov     dx, [audio_io_base]
  1016 00013DE0 6681C28000          <1>         add     dx, VIA_REG_AC97
  1017 00013DE5 ED                  <1>         in	eax, dx
  1018 00013DE6 C3                  <1>         retn
  1019                              <1> 
  1020                              <1> ctrl_io_w8:
  1021                              <1> 	; ('codec.asm')
  1022 00013DE7 660315[B68A0100]    <1>         add     dx, [audio_io_base]
  1023 00013DEE EE                  <1>         out	dx, al
  1024 00013DEF C3                  <1>         retn
  1025                              <1> 
  1026                              <1> ctrl_io_r8:
  1027                              <1> 	; ('codec.asm')
  1028 00013DF0 660315[B68A0100]    <1>         add     dx, [audio_io_base]
  1029 00013DF7 EC                  <1>         in	al, dx
  1030 00013DF8 C3                  <1>         retn
  1031                              <1> 
  1032                              <1> ctrl_io_w32:
  1033                              <1> 	; ('codec.asm')
  1034 00013DF9 660315[B68A0100]    <1>         add     dx, [audio_io_base]
  1035 00013E00 EF                  <1>         out	dx, eax
  1036 00013E01 C3                  <1>         retn
  1037                              <1> 
  1038                              <1> ctrl_io_r32:
  1039                              <1> 	; ('codec.asm')
  1040 00013E02 660315[B68A0100]    <1>         add	dx, [audio_io_base]
  1041 00013E09 ED                  <1> 	in	eax, dx
  1042                              <1> _cr_not_rdy:	; 06/08/2022
  1043 00013E0A C3                  <1>         retn
  1044                              <1> 
  1045                              <1> codec_read:
  1046                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  1047                              <1> 	; 12/11/2016 - Erdogan Tan (Ref: KolibriOS, vt823x.asm)
  1048                              <1>         ; Use only primary codec.
  1049                              <1>         ; eax = register
  1050 00013E0B C1E010              <1>         shl     eax, VIA_REG_AC97_CMD_SHIFT
  1051 00013E0E 0D00008002          <1>         or      eax, VIA_REG_AC97_PRIMARY_VALID + VIA_REG_AC97_READ
  1052                              <1> 
  1053 00013E13 E8B3FFFFFF          <1> 	call    codec_io_w16
  1054                              <1> 
  1055                              <1>       	; codec_valid
  1056 00013E18 E825000000          <1> 	call	codec_check_ready
  1057                              <1> 	;jnc	short _cr_ok
  1058                              <1> 	;retn
  1059                              <1> 	; 06/08/2022
  1060 00013E1D 72EB                <1> 	jc	short _cr_not_rdy
  1061                              <1> 	; ecx <= 20
  1062                              <1> _cr_ok:
  1063                              <1> 	; wait 25 ms
  1064                              <1> 	;mov	ecx, 80 ; (100*0.25 ms)
  1065                              <1> 	; 06/08/2022
  1066                              <1> 	;xor	ecx, ecx
  1067 00013E1F B150                <1> 	mov	cl, 80
  1068                              <1> 	; ecx = 80
  1069                              <1> _cr_wloop:
  1070 00013E21 E889FFFFFF          <1> 	call	delay1_4ms
  1071 00013E26 E2F9                <1> 	loop	_cr_wloop
  1072                              <1> 
  1073 00013E28 E8ACFFFFFF          <1>         call    codec_io_r16
  1074                              <1> 	; 06/08/2022
  1075                              <1> 	;and	eax, 0FFFFh
  1076 00013E2D C3                  <1>         retn
  1077                              <1> 
  1078                              <1> codec_write:
  1079                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  1080                              <1> 	; 12/11/2016 - Erdogan Tan (Ref: KolibriOS, vt823x.asm)
  1081                              <1>         ; Use only primary codec.
  1082                              <1>         
  1083                              <1> 	; eax = data (volume)
  1084                              <1> 	; edx = register (mixer register)
  1085                              <1> 	
  1086 00013E2E C1E210              <1> 	shl     edx, VIA_REG_AC97_CMD_SHIFT
  1087                              <1> 
  1088                              <1> 	; 02/11/2023 (shl eax, 0)
  1089                              <1> 	;shl	eax, VIA_REG_AC97_DATA_SHIFT ; shl eax, 0
  1090 00013E31 09C2                <1>         or      edx, eax
  1091                              <1> 
  1092 00013E33 B800000000          <1>         mov     eax, VIA_REG_AC97_CODEC_ID_PRIMARY
  1093 00013E38 C1E01E              <1>         shl     eax, VIA_REG_AC97_CODEC_ID_SHIFT
  1094 00013E3B 09D0                <1>         or      eax, edx
  1095                              <1> 
  1096 00013E3D E889FFFFFF          <1>         call    codec_io_w16
  1097                              <1>         ;mov    [codec.regs+esi], ax
  1098                              <1> 
  1099                              <1>         ;call	codec_check_ready
  1100                              <1>        	;retn
  1101                              <1> 	;jmp	short _codec_check_ready	
  1102                              <1> 
  1103                              <1> codec_check_ready:
  1104                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  1105                              <1> 	; 12/11/2016 - Erdogan Tan (Ref: KolibriOS, vt823x.asm)
  1106                              <1> 
  1107                              <1> _codec_check_ready:
  1108                              <1> 	;mov	ecx, 20	; total 2s
  1109                              <1> 	; 06/08/2022
  1110 00013E42 29C9                <1> 	sub	ecx, ecx
  1111                              <1> 	;mov	cl, 20
  1112                              <1> 	; 02/11/2023
  1113 00013E44 B10A                <1> 	mov	cl, 10	; wait 1s
  1114                              <1> _ccr_wait:
  1115 00013E46 51                  <1> 	push	ecx
  1116                              <1> 
  1117 00013E47 E88DFFFFFF          <1>         call    codec_io_r16
  1118 00013E4C A900000001          <1>         test    eax, VIA_REG_AC97_BUSY
  1119 00013E51 740B                <1>         jz      short _ccr_ok
  1120                              <1> 
  1121 00013E53 E84AFFFFFF          <1> 	call	delay_100ms
  1122                              <1> 
  1123 00013E58 59                  <1> 	pop	ecx
  1124                              <1> 
  1125 00013E59 49                  <1> 	dec     ecx
  1126 00013E5A 75EA                <1>         jnz     short _ccr_wait
  1127                              <1> 
  1128 00013E5C F9                  <1>         stc
  1129 00013E5D C3                  <1>         retn
  1130                              <1> 
  1131                              <1> _ccr_ok:
  1132 00013E5E 59                  <1> 	pop	ecx
  1133 00013E5F 25FFFF0000          <1> 	and     eax, 0FFFFh
  1134 00013E64 C3                  <1>         retn
  1135                              <1> 
  1136                              <1> codec_config:
  1137                              <1> 	; 02/11/2023 - TRDOS 386 Kernel v2.0.7
  1138                              <1> 	; 06/08/2022 - TRDOS 386 Kernel v2.0.5
  1139                              <1> 	; 10/06/2017
  1140                              <1> 	; 29/05/2017
  1141                              <1> 	; 24/04/2017
  1142                              <1> 	; 21/04/2017
  1143                              <1> 	; 16/04/2017 (TRDOS 386 Kernel) 
  1144                              <1> 	; 15/11/2016 ('codec.asm', 'player.com')
  1145                              <1> 	; 14/11/2016
  1146                              <1> 	; 12/11/2016 - Erdogan Tan
  1147                              <1> 	;	     (Ref: KolibriOS, 'setup_codec', codec.inc)
  1148                              <1> 
  1149 00013E65 B802020000          <1> 	mov     eax, 0202h
  1150 00013E6A 66A3[E88A0100]      <1> 	mov	[audio_master_volume], ax
  1151                              <1> 
  1152                              <1> 	;mov	ax, 1F1Fh ; 31,31
  1153                              <1> 	; 02/11/2023
  1154 00013E70 66B80B0B            <1> 	mov	ax, 0B0Bh
  1155                              <1> 	;mov	edx, CODEC_MASTER_VOL_REG ; 02h ; Line Out
  1156                              <1> 	; 06/08/2022
  1157 00013E74 29D2                <1> 	sub	edx, edx
  1158 00013E76 B202                <1> 	mov	dl, CODEC_MASTER_VOL_REG ; 02h ; Line Out
  1159 00013E78 E8B1FFFFFF          <1> 	call	codec_write
  1160                              <1> 	;jc	short cconfig_error
  1161                              <1> 
  1162                              <1>  	;mov    eax, 0202h
  1163 00013E7D 66B80202            <1> 	mov     ax, 0202h
  1164                              <1> 	;mov	edx, CODEC_PCM_OUT_REG ; 18h ; Wave Output (Stereo)
  1165                              <1> 	; 06/08/2022
  1166 00013E81 29D2                <1> 	sub	edx, edx
  1167 00013E83 B218                <1> 	mov	dl, CODEC_PCM_OUT_REG ; 18h ; Wave Output (Stereo)
  1168 00013E85 E8A4FFFFFF          <1> 	call	codec_write
  1169                              <1> 	;jc	short cconfig_error
  1170                              <1>       
  1171                              <1>  	;mov    eax, 0202h
  1172 00013E8A 66B80202            <1> 	mov	ax, 0202h
  1173                              <1> 	;mov	edx, CODEC_AUX_VOL ; 04h ; CODEC_HP_VOL_REG ; HeadPhone
  1174                              <1> 	; 06/08/2022
  1175 00013E8E 29D2                <1> 	sub	edx, edx
  1176 00013E90 B204                <1> 	mov	dl, CODEC_AUX_VOL ; 04h ; CODEC_HP_VOL_REG ; HeadPhone
  1177 00013E92 E897FFFFFF          <1> 	call	codec_write
  1178                              <1> 	;jc	short cconfig_error
  1179                              <1> 
  1180                              <1>  	;mov    eax, 08h
  1181                              <1>         ;mov    ax, 08h
  1182 00013E97 66B80880            <1> 	mov	ax, 8008h ; Mute
  1183                              <1> 	;mov	edx, 0Ch  ; AC97_PHONE_VOL ; TAD Input (Mono)
  1184                              <1> 	; 06/08/2022
  1185 00013E9B 29D2                <1> 	sub	edx, edx
  1186 00013E9D B20C                <1> 	mov	dl, 0Ch	  ; AC97_PHONE_VOL ; TAD Input (Mono)
  1187 00013E9F E88AFFFFFF          <1> 	call	codec_write
  1188                              <1> 	;jc	short cconfig_error
  1189                              <1> 
  1190                              <1>  	;mov    eax, 0808h
  1191 00013EA4 66B80808            <1> 	mov	ax, 0808h
  1192                              <1> 	;mov	edx, CODEC_LINE_IN_VOL_REG ; 10h ; Line Input (Stereo)	
  1193                              <1> 	; 06/08/2022
  1194 00013EA8 29D2                <1> 	sub	edx, edx
  1195 00013EAA B210                <1> 	mov	dl, CODEC_LINE_IN_VOL_REG ; 10h ; Line Input (Stereo)	
  1196 00013EAC E87DFFFFFF          <1> 	call	codec_write
  1197                              <1> 	;jc	short cconfig_error
  1198                              <1> 
  1199                              <1>  	;mov    eax, 0808h
  1200 00013EB1 66B80808            <1> 	mov	ax, 0808h
  1201                              <1> 	;mov	edx, CODEC_CD_VOL_REG ; 12h ; CR Input (Stereo)
  1202                              <1> 	; 06/08/2022
  1203 00013EB5 29D2                <1> 	sub	edx, edx ; 02/11/2023
  1204 00013EB7 B212                <1> 	mov	dl, CODEC_CD_VOL_REG ; 12h ; CR Input (Stereo)
  1205 00013EB9 E870FFFFFF          <1> 	call	codec_write
  1206                              <1> 	;jc	short cconfig_error
  1207                              <1> 
  1208                              <1>  	;mov    eax, 0808h
  1209 00013EBE 66B80808            <1> 	mov     ax, 0808h
  1210                              <1>         ;mov	edx, CODEC_AUX_VOL_REG ; 16h ; Aux Input (Stereo)
  1211                              <1> 	; 06/08/2022
  1212 00013EC2 29D2                <1> 	sub	edx, edx
  1213 00013EC4 B216                <1> 	mov	dl, CODEC_AUX_VOL_REG ; 16h ; Aux Input (Stereo)
  1214                              <1> 	;call	codec_write
  1215                              <1> 	;;jc	short cconfig_error
  1216 00013EC6 E963FFFFFF          <1> 	jmp	codec_write ; 10/06/2017
  1217                              <1> 
  1218                              <1> ;	; Extended Audio Status (2Ah)
  1219                              <1> ;	mov	eax, CODEC_EXT_AUDIO_CTRL_REG ; 2Ah 
  1220                              <1> ;	call	codec_read
  1221                              <1> ;	and     eax, 0FFFFh - 2		; clear DRA (BIT1)
  1222                              <1> ;	;or     eax, 1			; set VRA (BIT0)
  1223                              <1> ;	or	eax, 5  	; VRA (BIT0) & S/PDIF (BIT2) ; 14/11/2016
  1224                              <1> ;	mov	edx, CODEC_EXT_AUDIO_CTRL_REG
  1225                              <1> ;	call	codec_write
  1226                              <1> ;	;jc	short cconfig_error
  1227                              <1> ;
  1228                              <1> ;set_sample_rate:
  1229                              <1> ;	;movzx	eax, word [audio_freq]
  1230                              <1> ;	mov	ax, [audio_freq]
  1231                              <1> ;	mov	edx, CODEC_PCM_FRONT_DACRATE_REG ; 2Ch ; PCM Front DAC Rate
  1232                              <1> ;	;call	codec_write
  1233                              <1> ;	;retn
  1234                              <1> ;	jmp	codec_write
  1235                              <1> 	
  1236                              <1> ;cconfig_error:
  1237                              <1> ;	retn
  1238                              <1> 
  1239                              <1> vt8233_int_handler:
  1240                              <1> 	; 27/07/2020
  1241                              <1> 	; 22/07/2020
  1242                              <1> 	; Interrupt Handler for VIA VT8237R Audio Controller
  1243                              <1> 	; Note: called by 'dev_IRQ_service'
  1244                              <1> 	; 14/10/2017 
  1245                              <1> 	; 09/10/2017, 10/10/2017, 12/10/2017
  1246                              <1> 	; 13/06/2017
  1247                              <1> 	; 21/04/2017 (TRDOS 386 kernel, 'audio.s')
  1248                              <1> 	; 24/03/2017 - 'PLAYER.COM' ('player.asm') 
  1249                              <1> 
  1250                              <1> 	;push	eax ; * must be saved !
  1251                              <1> 	;push	edx
  1252                              <1> 	;push	ecx
  1253                              <1> 	;push	ebx ; * must be saved !
  1254                              <1> 	;push	esi
  1255                              <1> 	;push	edi
  1256                              <1> 
  1257                              <1> 	;cmp	byte [audio_busy], 1
  1258                              <1> 	;jnb	short _ih0 ; 09/10/2017
  1259                              <1> 
  1260                              <1> 	;mov	byte [audio_flag_eol], 0
  1261                              <1> 
  1262 00013ECB 66BA0000            <1>         mov     dx, VIADEV_PLAYBACK + VIA_REG_OFFSET_STATUS
  1263 00013ECF E81CFFFFFF          <1>         call    ctrl_io_r8
  1264                              <1> 
  1265 00013ED4 A880                <1> 	test    al, VIA_REG_STAT_ACTIVE
  1266 00013ED6 7417                <1>         jz      short _ih0 ; 09/10/2017
  1267                              <1> 
  1268 00013ED8 2407                <1>         and     al, VIA_REG_STAT_EOL + VIA_REG_STAT_FLAG + VIA_REG_STAT_STOPPED
  1269 00013EDA A2[E78A0100]        <1> 	mov	[audio_flag_eol], al
  1270 00013EDF 740E                <1>         jz	short _ih0 ; 09/10/2017
  1271                              <1> 
  1272                              <1> 	; 09/10/2017
  1273                              <1> 	;mov	byte [audio_busy], 1
  1274                              <1> 
  1275 00013EE1 803D[E68A0100]01    <1> 	cmp	byte [audio_play_cmd], 1
  1276 00013EE8 7315                <1> 	jnb	short _ih1 ; 10/10/2017
  1277                              <1> 
  1278 00013EEA E84A000000          <1> 	call	channel_reset
  1279                              <1> _ih0:
  1280                              <1> 	; 09/10/2017
  1281 00013EEF A0[E78A0100]        <1>         mov     al, [audio_flag_eol]   ;; ack ;;
  1282 00013EF4 66BA0000            <1>         mov     dx, VIADEV_PLAYBACK + VIA_REG_OFFSET_STATUS
  1283 00013EF8 E8EAFEFFFF          <1>         call    ctrl_io_w8
  1284 00013EFD EB39                <1> 	jmp	short _ih4
  1285                              <1> _ih1:
  1286                              <1> vt8233_tuneLoop:
  1287 00013EFF A0[E78A0100]        <1>         mov     al, [audio_flag_eol]   ;; ack ;;
  1288 00013F04 66BA0000            <1>         mov     dx, VIADEV_PLAYBACK + VIA_REG_OFFSET_STATUS
  1289 00013F08 E8DAFEFFFF          <1>         call    ctrl_io_w8
  1290                              <1> 
  1291                              <1> 	; 22/07/2020
  1292                              <1> 	;; 12/10/2017
  1293                              <1> 	;mov	byte [audio_flag], 0 ; Reset	
  1294                              <1> 
  1295                              <1> 	; 10/10/2017
  1296                              <1> 	; 09/10/2017
  1297                              <1> 	;test	byte [audio_flag_eol], VIA_REG_STAT_FLAG
  1298                              <1> 	;jz	short _ih2 ; EOL
  1299                              <1> 
  1300                              <1> 	; 22/07/2020
  1301                              <1> 	; 14/10/2017
  1302                              <1> 	;test	byte [audio_flag_eol], VIA_REG_STAT_EOL
  1303                              <1> 	;jnz	short _ih2 ; EOL
  1304                              <1> 	;		   ; (Half Buffer 2 has been completed 
  1305                              <1> 	;		   ; and Half Buffer 1 will be played.)
  1306                              <1> 	
  1307                              <1> 	; FLAG  
  1308                              <1> 	; (Half Buffer 1 has been completed 
  1309                              <1> 	;  and Half Buffer 2 will be played.)
  1310                              <1> 
  1311                              <1> 	; 14/10/2017
  1312                              <1> 	;; (Continue to play.)
  1313                              <1> 	;mov	al, VIA_REG_CTRL_INT
  1314                              <1>        	;or	al, VIA_REG_CTRL_START
  1315                              <1>        	;mov	dx, VIADEV_PLAYBACK + VIA_REG_OFFSET_CONTROL
  1316                              <1>         ;call	ctrl_io_w8
  1317                              <1> 	; 12/10/2017
  1318                              <1> 	;mov	byte [audio_flag], 1 
  1319                              <1> 
  1320                              <1> 	; 22/07/2020
  1321                              <1> 	;inc	byte [audio_flag] ; = 1
  1322                              <1> _ih2: 
  1323                              <1> 	; 10/10/2017
  1324 00013F0D 8B3D[D08A0100]      <1> 	mov	edi, [audio_dma_buff]
  1325 00013F13 8B0D[D48A0100]      <1> 	mov	ecx, [audio_dmabuff_size]
  1326 00013F19 D1E9                <1> 	shr	ecx, 1 ; dma buff size / 2 = half buffer size
  1327                              <1> 	
  1328                              <1> 	; 22/07/2020
  1329                              <1> 	; 12/10/2017
  1330                              <1> 	;cmp	byte [audio_flag], 0
  1331                              <1> 	;ja	short _ih3 ; Playing Half Buffer 2 (Current: FLAG)
  1332                              <1> 	
  1333                              <1> 	; 27/07/2020
  1334                              <1> 	; 22/07/2020
  1335 00013F1B F605[D88A0100]01    <1> 	test	byte [audio_flag], 1  ; Current flag value
  1336 00013F22 7402                <1> 	jz	short _ih3 ; Half Buffer 1 must be filled
  1337                              <1> 
  1338                              <1> 	; Half Buffer 2 must be filled
  1339 00013F24 01CF                <1> 	add	edi, ecx
  1340                              <1> _ih3:
  1341                              <1> 	; Update half buffer 2 while playing half buffer 1
  1342                              <1> 	; Update half buffer 1 while playing half buffer 2
  1343                              <1> 
  1344 00013F26 8B35[C88A0100]      <1> 	mov	esi, [audio_p_buffer] ; phy addr of audio buff
  1345 00013F2C C1E902              <1> 	shr	ecx, 2 ; half buff size / 4
  1346 00013F2F F3A5                <1> 	rep	movsd
  1347                              <1> 
  1348                              <1> 	; switch flag value ;
  1349 00013F31 8035[D88A0100]01    <1> 	xor	byte [audio_flag], 1
  1350                              <1> 	; 12/10/2017
  1351                              <1> 	; [audio_flag] = 0 : Playing dma half buffer 2
  1352                              <1> 			   ; Next buffer (to update) is dma half buff 1
  1353                              <1> 	; 	       = 1 : Playing dma half buffer 1
  1354                              <1> 			   ; Next buffer (to update) is dma half buff 2
  1355                              <1> _ih4:	
  1356                              <1> 	; 28/05/2017
  1357                              <1> 	;mov	byte [audio_busy], 0 ; 09/10/2017
  1358                              <1> 	;
  1359                              <1> 	;pop	edi
  1360                              <1> 	;pop	esi
  1361                              <1> 	;pop	ebx ; * must be restored !
  1362                              <1> 	;pop	ecx
  1363                              <1> 	;pop	edx
  1364                              <1> 	;pop	eax ; * must be restored !
  1365                              <1> 
  1366 00013F38 C3                  <1> 	retn
  1367                              <1> 
  1368                              <1> channel_reset:
  1369                              <1> 	; 06/08/2022 - TRDOS 386 Kernel v2.0.5
  1370                              <1> 	; 24/06/2017
  1371                              <1> 	; 29/05/2017
  1372                              <1> 	; 23/03/2017
  1373                              <1> 	; 14/11/2016 - Erdogan Tan
  1374                              <1> 	; 12/11/2016 - Erdogan Tan (Ref: KolibriOS, vt823x.asm)
  1375                              <1>         ;mov	edx, VIA_REG_OFFSET_CONTROL
  1376                              <1> 	; 06/08/2022
  1377 00013F39 29D2                <1> 	sub	edx, edx
  1378 00013F3B B201                <1> 	mov	dl, VIA_REG_OFFSET_CONTROL 
  1379                              <1> 	;mov	eax, VIA_REG_CTRL_PAUSE + VIA_REG_CTRL_TERMINATE + VIA_REG_CTRL_RESET
  1380 00013F3D B848000000          <1>         mov	eax, VIA_REG_CTRL_PAUSE + VIA_REG_CTRL_TERMINATE ; 24/06/2017       
  1381 00013F42 E8A0FEFFFF          <1> 	call    ctrl_io_w8
  1382                              <1> 
  1383                              <1>         ;mov	edx, VIA_REG_OFFSET_CONTROL
  1384                              <1>         ;call   ctrl_io_r8
  1385                              <1> 
  1386                              <1> 	; wait for 50 ms
  1387                              <1> 	;mov	ecx, 160 ; (200*0.25 ms) ; 29/05/2017	
  1388                              <1> 	; 06/08/2022
  1389 00013F47 31C9                <1> 	xor	ecx, ecx
  1390 00013F49 B1A0                <1> 	mov	cl, 160
  1391                              <1> _ch_rst_wait:
  1392 00013F4B E85FFEFFFF          <1> 	call	delay1_4ms
  1393 00013F50 49                  <1> 	dec	ecx
  1394 00013F51 75F8                <1> 	jnz	short _ch_rst_wait     
  1395                              <1> 
  1396                              <1>         ; disable interrupts
  1397                              <1> 	;mov	edx, VIA_REG_OFFSET_CONTROL
  1398                              <1>         ; 06/08/2022
  1399 00013F53 29D2                <1> 	sub	edx, edx
  1400 00013F55 B201                <1> 	mov	dl, VIA_REG_OFFSET_CONTROL
  1401 00013F57 31C0                <1>  	xor     eax, eax
  1402 00013F59 E889FEFFFF          <1>         call    ctrl_io_w8
  1403                              <1> 
  1404                              <1>         ; clear interrupts
  1405                              <1>         ;mov	edx, VIA_REG_OFFSET_STATUS
  1406                              <1> 	; 06/08/2022
  1407 00013F5E 29D2                <1> 	sub	edx, edx
  1408                              <1> 	;mov	dl, VIA_REG_OFFSET_STATUS ; 0
  1409                              <1> 	; edx = 0
  1410                              <1> 	;mov	eax, 3
  1411                              <1>         ; 06/08/2022
  1412 00013F60 29C0                <1> 	sub	eax, eax
  1413 00013F62 B003                <1> 	mov	al, 3
  1414                              <1> 	; eax = 3
  1415 00013F64 E87EFEFFFF          <1> 	call	ctrl_io_w8
  1416                              <1> 
  1417                              <1> 	;mov	edx, VIA_REG_OFFSET_CURR_PTR
  1418                              <1> 	;xor	eax, eax
  1419                              <1> 	;call	ctrl_io_w32
  1420                              <1> 
  1421 00013F69 C3                  <1>         retn	
  1422                              <1> 
  1423                              <1> vt8233_stop: ; 22/04/2017
  1424 00013F6A C605[E68A0100]00    <1> 	mov	byte [audio_play_cmd], 0 ; stop !
  1425                              <1> _tlp2:
  1426                              <1> 	; 24/06/2017
  1427                              <1>         ; finished with song, stop everything
  1428                              <1> 	;mov	al, VIA_REG_CTRL_INT
  1429                              <1>         ;or	al, VIA_REG_CTRL_TERMINATE
  1430                              <1> 	;mov	dx, VIADEV_PLAYBACK + VIA_REG_OFFSET_CONTROL
  1431                              <1>         ;call	ctrl_io_w8
  1432                              <1> 
  1433                              <1>         ;call	channel_reset
  1434                              <1> 	;retn
  1435                              <1> 
  1436 00013F71 EBC6                <1> 	jmp	short channel_reset
  1437                              <1> 
  1438                              <1> set_vt8233_bdl: ; Set VT8237R Buffer Descriptor List
  1439                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  1440                              <1> 	; 22/07/2020 - TRDOS 386 v2.0.2
  1441                              <1> 	; 28/05/2017
  1442                              <1> 	; 21/04/2017 (TRDOS 386 kernel, 'audio.s')
  1443                              <1> 	; 24/03/2017 - 'PLAYER.COM' ('via_wav.asm' - 29/11/2016) 
  1444                              <1> 	
  1445                              <1> 	; eax = dma buffer address = [audio_DMA_buff]
  1446                              <1> 	; ecx = dma buffer buffer size = [audio_dmabuff_size]
  1447                              <1> 
  1448 00013F73 D1E9                <1> 	shr	ecx, 1 ; dma half buffer size
  1449 00013F75 89CE                <1> 	mov	esi, ecx
  1450                              <1> 
  1451 00013F77 BF[EC8A0100]        <1>         mov     edi, audio_bdl_buff	; get BDL address
  1452                              <1> 	;mov	ecx, 32 / 2		; make 32 entries in BDL
  1453                              <1> 	; 06/08/2022
  1454 00013F7C 29C9                <1> 	sub	ecx, ecx
  1455 00013F7E B110                <1> 	mov	cl, 16
  1456                              <1> 
  1457 00013F80 EB05                <1> 	jmp	short s_vt8233_bdl1 
  1458                              <1> 
  1459                              <1> s_vt8233_bdl0:
  1460                              <1> 	; set buffer descriptor 0 to start of data file in memory
  1461                              <1> 
  1462 00013F82 A1[D08A0100]        <1>  	mov	eax, [audio_dma_buff]	; Physical address of DMA buffer
  1463                              <1>  
  1464                              <1> s_vt8233_bdl1:
  1465 00013F87 AB                  <1> 	stosd				; store dmabuffer1 address
  1466                              <1> 
  1467 00013F88 89C2                <1> 	mov	edx, eax
  1468                              <1> 
  1469                              <1> ; VIA VT8235.PDF: (Page 110) (Erdogan Tan, 29/11/2016)
  1470                              <1> 	;
  1471                              <1> 	; 	Audio SGD Table Format
  1472                              <1> 	;	-------------------------------
  1473                              <1> 	;	63   62    61-56    55-32  31-0
  1474                              <1> 	;	--   --   --------  -----  ----
  1475                              <1> 	;	EOL FLAG -reserved- Base   Base
  1476                              <1> 	;		    	    Count  Address
  1477                              <1> 	;		            [23:0] [31:0]
  1478                              <1> 	;	EOL: End Of Link. 
  1479                              <1> 	;	     1 indicates this block is the last of the link.
  1480                              <1> 	;	     If the channel Interrupt on EOL bit is set, then
  1481                              <1> 	;	     an interrupt is generated at the end of the transfer.
  1482                              <1> 	;
  1483                              <1> 	;	FLAG: Block Flag. If set, transfer pauses at the end of this
  1484                              <1> 	;	      block. If the channel Interrupt on FLAG bit is set,
  1485                              <1> 	;	      then an interrupt is generated at the end of this block.
  1486                              <1> 
  1487 00013F8A 89F0                <1> 	mov	eax, esi ; DMA half buffer size
  1488 00013F8C 01C2                <1> 	add	edx, eax
  1489 00013F8E 0D00000040          <1> 	or	eax, FLAG
  1490                              <1> 	;or	eax, EOL
  1491 00013F93 AB                  <1> 	stosd
  1492                              <1> 
  1493                              <1> ; 2nd buffer:
  1494                              <1> 
  1495 00013F94 89D0                <1>         mov	eax, edx ; Physical address of the 2nd half of DMA buffer	
  1496 00013F96 AB                  <1> 	stosd		 ; store dmabuffer2 address
  1497                              <1> 
  1498                              <1> ; set length to [audio_dmabuff_size]/2
  1499                              <1> ; Set control (bits 31:16) to BUP, bits 15:0=number of samples
  1500                              <1> ; 
  1501 00013F97 89F0                <1> 	mov	eax, esi ; DMA half buffer size
  1502                              <1> 	; 22/07/2020
  1503                              <1> 	;or	eax, EOL
  1504 00013F99 0D00000040          <1> 	or	eax, FLAG
  1505 00013F9E AB                  <1> 	stosd
  1506                              <1> 
  1507 00013F9F E2E1                <1> 	loop    s_vt8233_bdl0
  1508                              <1> 
  1509                              <1> 	; 22/07/2020
  1510 00013FA1 814FFC00000080      <1> 	or	dword [edi-4], EOL
  1511                              <1> 	
  1512 00013FA8 C3                  <1> 	retn
  1513                              <1> 
  1514                              <1> vt8233_start_play:
  1515                              <1> 	; 06/08/2022 - TRDOS 386 Kernel v2.0.5
  1516                              <1> 	; 01/09/2020 
  1517                              <1> 	; 22/07/2020 
  1518                              <1> 	; start to play audio data via VT8233 audio controller
  1519                              <1> 	; 13/06/2017
  1520                              <1> 	; 10/06/2017
  1521                              <1> 	; 24/04/2017 
  1522                              <1> 	; 21/04/2017 (TRDOS 386 kernel, 'audio.s')
  1523                              <1> 	; 24/03/2017 - 'PLAYER.COM' ('via_wav.asm' - 29/11/2016) 
  1524                              <1> 	; write buffer descriptor list address
  1525                              <1> 
  1526                              <1> 	; Extended Audio Status (2Ah)
  1527 00013FA9 B82A000000          <1> 	mov	eax, CODEC_EXT_AUDIO_CTRL_REG ; 2Ah 
  1528 00013FAE E858FEFFFF          <1> 	call	codec_read
  1529 00013FB3 25FDFF0000          <1> 	and     eax, 0FFFFh - 2		; clear DRA (BIT1)
  1530                              <1> 	;or     eax, 1			; set VRA (BIT0)
  1531                              <1> 	;or	eax, 5  	; VRA (BIT0) & S/PDIF (BIT2) ; 14/11/2016
  1532 00013FB8 0C05                <1> 	or	al, 5
  1533                              <1> 	; 01/09/2020	
  1534                              <1> 	;or	eax, 3805h ; AD1980 (PRK, PRJ, PRI = 1 .. only front DAC)
  1535                              <1> 	; 01/09/2020
  1536                              <1> 	;mov	edx, CODEC_EXT_AUDIO_CTRL_REG
  1537                              <1> 	;cmp	word [audio_freq], 0BB80h ; 48 kHz
  1538                              <1> 	;jne	short set_extd_audio_status_1
  1539                              <1> 	;and	al, 0FEh ; disable VRA bit (set sample rate to 48000 Hz)
  1540                              <1> 	;jmp	short set_extd_audio_status_2
  1541                              <1> ;set_extd_audio_status_1:
  1542 00013FBA BA2A000000          <1> 	mov	edx, CODEC_EXT_AUDIO_CTRL_REG
  1543 00013FBF E86AFEFFFF          <1> 	call	codec_write
  1544                              <1> 	;jc	short cconfig_error
  1545                              <1> 
  1546                              <1> set_sample_rate:
  1547                              <1> 	;movzx	eax, word [audio_freq]
  1548 00013FC4 66A1[E28A0100]      <1> 	mov	ax, [audio_freq]
  1549 00013FCA BA2C000000          <1> 	mov	edx, CODEC_PCM_FRONT_DACRATE_REG ; 2Ch ; PCM Front DAC Rate
  1550                              <1> ;set_extd_audio_status_2:
  1551 00013FCF E85AFEFFFF          <1> 	call	codec_write
  1552                              <1> 
  1553                              <1> 	; 01/09/2020
  1554                              <1> 	; set AD1980 MCB register (Index 76h) to 0C00h
  1555                              <1> 	; (CLDIS, HPSEL)
  1556                              <1> 	;mov	ax, 0C00h
  1557                              <1> 	;mov	edx, CODEC_MISC_CRTL_BITS_REG ; 76h 
  1558                              <1> 	;			; Miscellaneous Control Bit Register
  1559                              <1> 	;call	codec_write
  1560                              <1> 	;
  1561                              <1> 
  1562 00013FD4 B8[EC8A0100]        <1>         mov	eax, audio_bdl_buff
  1563                              <1>   
  1564                              <1> 	; 12/11/2016 - Erdogan Tan 
  1565                              <1> 	; (Ref: KolibriOS, vt823x.asm, 'create_primary_buff')
  1566                              <1> 	;mov	edx, VIADEV_PLAYBACK + VIA_REG_OFFSET_TABLE_PTR
  1567                              <1>         ; 06/08/2022
  1568 00013FD9 29D2                <1> 	sub	edx, edx
  1569                              <1> 	;mov	dl, VIADEV_PLAYBACK + VIA_REG_OFFSET_TABLE_PTR
  1570                              <1> 	; edx = 0
  1571 00013FDB E819FEFFFF          <1> 	call	ctrl_io_w32
  1572                              <1> 
  1573                              <1> 	;call	codec_check_ready
  1574                              <1> 
  1575 00013FE0 66BA0200            <1>   	mov	dx, VIADEV_PLAYBACK + VIA_REG_OFS_PLAYBACK_VOLUME_L
  1576                              <1>         ;mov	eax, 2	; 31
  1577 00013FE4 B01F                <1> 	mov	al, 31
  1578 00013FE6 2A05[E88A0100]      <1>         sub	al, [audio_master_volume_l]
  1579 00013FEC E8F6FDFFFF          <1> 	call	ctrl_io_w8
  1580                              <1> 
  1581                              <1> 	;call	codec_check_ready
  1582                              <1> 
  1583 00013FF1 66BA0300            <1>         mov     dx, VIADEV_PLAYBACK + VIA_REG_OFS_PLAYBACK_VOLUME_R
  1584                              <1>         ;mov	ax, 2	; 31
  1585 00013FF5 B01F                <1> 	mov	al, 31
  1586 00013FF7 2A05[E98A0100]      <1>         sub	al, [audio_master_volume_r]
  1587 00013FFD E8E5FDFFFF          <1> 	call    ctrl_io_w8
  1588                              <1> 
  1589                              <1> 	;call	codec_check_ready
  1590                              <1> ;
  1591                              <1> ;
  1592                              <1> ; All set. Let's play some music.
  1593                              <1> ;
  1594                              <1> ;
  1595                              <1>        	;mov    dx, VIADEV_PLAYBACK + VIA_REG_OFFSET_STOP_IDX
  1596                              <1>         ;mov    ax, VIA8233_REG_TYPE_16BIT or VIA8233_REG_TYPE_STEREO or 0xfffff or 0xff000000
  1597                              <1>         ;call   ctrl_io_w32
  1598                              <1> 
  1599                              <1> 	;call	codec_check_ready
  1600                              <1> 
  1601                              <1> 	; 08/12/2016
  1602                              <1> 	; 07/10/2016
  1603                              <1>         ;;mov    al, 1
  1604                              <1>         ;mov	al, 31
  1605                              <1> 	; 22/07/2020
  1606 00014002 B0FF                <1> 	mov	al, 0FFh
  1607 00014004 E813000000          <1> 	call    set_VT8233_LastValidIndex
  1608                              <1> 
  1609 00014009 C605[E68A0100]01    <1> 	mov	byte [audio_play_cmd], 1 ; play command (do not stop) !
  1610                              <1> 
  1611                              <1> 	; 22/07/2020
  1612                              <1> 	;mov	byte [audio_flag], 0  ; clear half buffer flag
  1613                              <1> 
  1614                              <1> vt8233_play: ; continue to play
  1615                              <1> 	; 22/04/2017
  1616                              <1> 	;mov	al, VIA_REG_CTRL_INT
  1617                              <1>        	;or	al, VIA_REG_CTRL_START
  1618                              <1>         ;;mov	al, VIA_REG_CTRL_AUTOSTART + VIA_REG_CTRL_START
  1619                              <1> 	; 22/07/2020	
  1620 00014010 B0A1                <1> 	mov	al, VIA_REG_CTRL_AUTOSTART + VIA_REG_CTRL_START + VIA_REG_CTRL_INT_FLAG
  1621                              <1> 
  1622 00014012 66BA0100            <1> 	mov     dx, VIADEV_PLAYBACK + VIA_REG_OFFSET_CONTROL
  1623 00014016 E8CCFDFFFF          <1>         call    ctrl_io_w8
  1624                              <1> 	;call	codec_check_ready
  1625                              <1> 	;retn
  1626                              <1> 	;jmp	codec_check_ready
  1627 0001401B C3                  <1> 	retn
  1628                              <1> 
  1629                              <1> ;input AL = index # to stop on
  1630                              <1> set_VT8233_LastValidIndex:
  1631                              <1> 	; 06/08/2022 - TRDOS 386 Kernel v2.0.5
  1632                              <1> 	; 23/07/2020
  1633                              <1> 	; 10/06/2017
  1634                              <1> 	; 21/04/2017 (TRDOS 386 kernel, 'audio.s')
  1635                              <1> 	; 24/03/2017 - 'PLAYER.COM' ('via_wav.asm' - 29/11/2016) 
  1636                              <1> 	; 19/11/2016
  1637                              <1> 	; 14/11/2016 - Erdogan Tan (Ref: VIA VT8235.PDF, Page 110)
  1638                              <1> 	; 12/11/2016 - Erdogan Tan
  1639                              <1> 	; (Ref: KolibriOS, vt823x.asm, 'create_primary_buff')
  1640                              <1> 	;push	edx
  1641                              <1> 	;push	ax
  1642 0001401C 50                  <1> 	push	eax ; 23/07/2020
  1643                              <1> 	;push	ecx
  1644 0001401D 0FB705[E28A0100]    <1> 	movzx	eax, word [audio_freq] ; Hertz
  1645 00014024 BA00001000          <1> 	mov	edx, 100000h ; 2^20 = 1048576
  1646 00014029 F7E2                <1> 	mul	edx
  1647 0001402B B980BB0000          <1> 	mov	ecx, 48000	
  1648 00014030 F7F1                <1> 	div	ecx
  1649                              <1> 	;and	eax, 0FFFFFh
  1650                              <1> 	;pop	ecx
  1651                              <1> 	;pop	dx 
  1652 00014032 5A                  <1> 	pop	edx ; 23/07/2020
  1653 00014033 C1E218              <1> 	shl	edx, 24  ; STOP Index Setting: Bit 24 to 31
  1654 00014036 09D0                <1> 	or	eax, edx
  1655                              <1> 	; 19/11/2016
  1656 00014038 803D[E08A0100]10    <1> 	cmp	byte [audio_bps], 16
  1657 0001403F 7505                <1> 	jne	short sLVI_1
  1658 00014041 0D00002000          <1> 	or	eax, VIA8233_REG_TYPE_16BIT
  1659                              <1> sLVI_1:
  1660 00014046 803D[E18A0100]02    <1> 	cmp	byte [audio_stmo], 2
  1661 0001404D 7505                <1> 	jne	short sLVI_2
  1662 0001404F 0D00001000          <1> 	or	eax, VIA8233_REG_TYPE_STEREO
  1663                              <1> sLVI_2:
  1664                              <1> 	;mov	edx, VIADEV_PLAYBACK + VIA_REG_OFFSET_STOP_IDX
  1665                              <1> 	; 06/08/2022
  1666 00014054 29D2                <1> 	sub	edx, edx
  1667 00014056 B208                <1> 	mov	dl, VIADEV_PLAYBACK + VIA_REG_OFFSET_STOP_IDX
  1668 00014058 E89CFDFFFF          <1> 	call    ctrl_io_w32
  1669                              <1> 	;call	codec_check_ready
  1670                              <1> 	;pop	edx
  1671 0001405D C3                  <1> 	retn
  1672                              <1> 
  1673                              <1> vt8233_pause: ; pause
  1674                              <1> 	; 10/06/2017
  1675                              <1> 	; 22/04/2017
  1676                              <1> 	;mov	al, VIA_REG_CTRL_INT
  1677                              <1>         ;or	al, VIA_REG_CTRL_PAUSE
  1678                              <1> 	; 23/07/2020
  1679 0001405E B029                <1> 	mov	al, VIA_REG_CTRL_PAUSE+VIA_REG_CTRL_INT_FLAG+VIA_REG_CTRL_AUTOSTART
  1680                              <1> 	
  1681 00014060 66BA0100            <1> 	mov     dx, VIADEV_PLAYBACK + VIA_REG_OFFSET_CONTROL
  1682 00014064 E87EFDFFFF          <1>         call    ctrl_io_w8
  1683                              <1> 	;call	codec_check_ready
  1684                              <1> 	;retn
  1685                              <1> 	;jmp	codec_check_ready
  1686 00014069 C3                  <1> 	retn
  1687                              <1> 
  1688                              <1> vt8233_reset: 
  1689                              <1> 	; 22/04/2017
  1690                              <1> 	; reset VT8237R (vt8233) Audio Controller
  1691                              <1> 	;cmp	byte [audio_play_cmd], 1
  1692                              <1> 	;jna	short vt8233_rst_0
  1693 0001406A C605[E68A0100]00    <1> 	mov	byte [audio_play_cmd], 0 ; stop !
  1694                              <1> vt8233_rst_0:
  1695 00014071 E8D6FCFFFF          <1> 	call	reset_codec
  1696 00014076 720A                <1> 	jc	short vt8233_rst_1 ; codec error !
  1697                              <1> 	; eax = 1
  1698 00014078 E84EFDFFFF          <1> 	call	codec_io_w16 ; w32
  1699 0001407D E8B7FEFFFF          <1> 	call	channel_reset
  1700                              <1> vt8233_rst_1:
  1701                              <1> vt8233_vol_1:	; 06/08/2022
  1702 00014082 C3                  <1> 	retn
  1703                              <1> 
  1704                              <1> vt8233_volume:
  1705                              <1> 	; set VT8237R (vt8233) sound volume level
  1706                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  1707                              <1> 	; 24/04/2017
  1708                              <1> 	; 22/04/2017
  1709                              <1> 	; bl = component (0 = master/playback/lineout volume)
  1710                              <1> 	; cl = left channel volume level (0 to 31)
  1711                              <1> 	; ch = right channel volume level (0 to 31)
  1712                              <1> 
  1713 00014083 08DB                <1> 	or	bl, bl
  1714 00014085 75FB                <1> 	jnz	short vt8233_vol_1 ; temporary !
  1715 00014087 66B81F1F            <1> 	mov	ax, 1F1Fh ; 31,31
  1716 0001408B 38C1                <1> 	cmp	cl, al
  1717 0001408D 77F3                <1> 	ja	short vt8233_vol_1 ; temporary !
  1718 0001408F 38E5                <1> 	cmp	ch, ah
  1719 00014091 77EF                <1> 	ja	short vt8233_vol_1 ; temporary !
  1720 00014093 66890D[E88A0100]    <1> 	mov	[audio_master_volume], cx
  1721 0001409A 6629C8              <1> 	sub	ax, cx
  1722                              <1> 	;mov	edx, CODEC_MASTER_VOL_REG ; 02h ; Line Out
  1723                              <1> 	; 06/08/2022
  1724 0001409D 29D2                <1> 	sub	edx, edx
  1725 0001409F B202                <1> 	mov	dl, CODEC_MASTER_VOL_REG ; 02h ; Line Out
  1726                              <1> 	; 06/08/2022
  1727 000140A1 E988FDFFFF          <1> 	jmp	codec_write
  1728                              <1> 	;call	codec_write
  1729                              <1> ;vt8233_vol_1:
  1730                              <1> 	;retn
  1731                              <1> 
  1732                              <1> ; CODE for SOUND BLASTER 16
  1733                              <1> 
  1734                              <1> DetectSB:
  1735                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  1736                              <1> 	; 24/04/2017
  1737                              <1> 	;pushad
  1738                              <1> ScanPort:
  1739                              <1> 	; 06/08/2022
  1740 000140A6 66BB1002            <1> 	mov	bx, 0210h	; start scanning ports
  1741                              <1> 				; 210h, 220h, .. 260h
  1742                              <1> 	; 06/08/2022
  1743 000140AA 31C9                <1> 	xor	ecx, ecx
  1744 000140AC 88FE                <1> 	mov	dh, bh
  1745                              <1> ResetDSP:       
  1746                              <1> 	;mov	dx, bx		; try to reset the DSP.
  1747                              <1> 	;add	dx, 06h
  1748                              <1> 	; 06/08/2022
  1749 000140AE 88DA                <1> 	mov	dl, bl
  1750 000140B0 80C206              <1> 	add	dl, 06h
  1751                              <1> 
  1752 000140B3 B001                <1> 	mov	al, 1
  1753 000140B5 EE                  <1> 	out	dx, al
  1754                              <1> 
  1755 000140B6 EC                  <1> 	in	al, dx
  1756 000140B7 EC                  <1> 	in	al, dx
  1757 000140B8 EC                  <1> 	in	al, dx
  1758 000140B9 EC                  <1> 	in	al, dx
  1759                              <1> 
  1760 000140BA 30C0                <1> 	xor     al, al
  1761 000140BC EE                  <1> 	out	dx, al
  1762                              <1> 
  1763                              <1> 	;add	dx, 08h
  1764                              <1> 	; 06/08/2022
  1765 000140BD 80C208              <1> 	add	dl, 08h
  1766                              <1> 	;mov	cx, 100
  1767 000140C0 B164                <1> 	mov	cl, 100
  1768                              <1> WaitID:
  1769 000140C2 EC                  <1> 	in	al, dx
  1770 000140C3 08C0                <1> 	or      al, al
  1771 000140C5 7804                <1> 	js      short GetID
  1772 000140C7 E2F9                <1> 	loop    WaitID
  1773 000140C9 EB0D                <1> 	jmp     short NextPort
  1774                              <1> GetID:          
  1775                              <1> 	;sub	dx, 04h
  1776                              <1> 	; 06/08/2022
  1777 000140CB 80EA04              <1> 	sub	dl, 04h
  1778 000140CE EC                  <1> 	in	al, dx
  1779 000140CF 3CAA                <1> 	cmp     al, 0AAh
  1780 000140D1 740F                <1> 	je      short Found
  1781                              <1> 	;add	dx, 04h
  1782                              <1> 	; 06/08/2022
  1783 000140D3 80C204              <1> 	add	dl, 04h
  1784 000140D6 E2EA                <1> 	loop    WaitID
  1785                              <1> NextPort:
  1786                              <1> 	;add	bx, 10h		; if not response,
  1787                              <1> 	; 06/08/2022
  1788 000140D8 80C310              <1> 	add	bl, 10h
  1789                              <1> 	;cmp	bx, 260h	; try the next port.
  1790 000140DB 80FB60              <1> 	cmp	bl, 60h
  1791 000140DE 76CE                <1> 	jbe     short ResetDSP
  1792 000140E0 F9                  <1> 	stc
  1793 000140E1 C3                  <1> 	retn
  1794                              <1> Found:
  1795 000140E2 66891D[B68A0100]    <1> 	mov     [audio_io_base], bx	; SB Port Address Found!
  1796                              <1> ScanIRQ:
  1797                              <1> SetIrqs:
  1798 000140E9 28C0                <1> 	sub 	al, al ; 0
  1799 000140EB A2[AC8A0100]        <1> 	mov 	[IRQnum], al ; reset
  1800 000140F0 A2[B28A0100]        <1> 	mov	[audio_intr], al ; reset
  1801                              <1> 
  1802                              <1> 	; ah > 0 -> set IRQ vector
  1803                              <1> 	; al = IRQ number
  1804                              <1> 	;mov	ax, 103h ; IRQ 3
  1805                              <1> 	;call	set_hardware_int_vector
  1806                              <1> 	;mov	ax, 104h ; IRQ 4
  1807                              <1> 	;call	set_hardware_int_vector
  1808 000140F5 66B80501            <1> 	mov	ax, 105h ; IRQ 5
  1809 000140F9 E89FE1FFFF          <1> 	call	set_hardware_int_vector
  1810 000140FE 66B80701            <1> 	mov	ax, 107h ; IRQ 7
  1811 00014102 E896E1FFFF          <1> 	call	set_hardware_int_vector
  1812                              <1> 
  1813 00014107 668B15[B68A0100]    <1> 	mov     dx, [audio_io_base] ; tells to the SB to
  1814                              <1> 	;add	dx, 0Ch		    ; generate a IRQ!
  1815                              <1> 	; 06/08/2022
  1816 0001410E 80C20C              <1> 	add	dl, 0Ch
  1817                              <1> WaitSb:
  1818 00014111 EC                  <1> 	in	al, dx
  1819 00014112 08C0                <1> 	or      al, al
  1820 00014114 78FB                <1> 	js      short WaitSb
  1821 00014116 B0F2                <1> 	mov     al, 0F2h
  1822 00014118 EE                  <1> 	out	dx, al
  1823                              <1> 
  1824 00014119 31C9                <1> 	xor     ecx, ecx	; wait until IRQ level
  1825                              <1> WaitIRQ: 
  1826 0001411B A0[AC8A0100]        <1> 	mov	al, [IRQnum]
  1827 00014120 3C00                <1> 	cmp     al, 0 ; is changed or timeout.
  1828 00014122 7706                <1> 	ja	short IrqOk
  1829 00014124 6649                <1> 	dec	cx
  1830 00014126 75F3                <1> 	jnz	short WaitIRQ
  1831 00014128 EB14                <1> 	jmp	short RestoreIrqs
  1832                              <1> IrqOk:
  1833 0001412A A2[B28A0100]        <1> 	mov	[audio_intr], al ; set   
  1834 0001412F 668B15[B68A0100]    <1> 	mov     dx, [audio_io_base]
  1835                              <1> 	;add	dx, 0Eh
  1836                              <1> 	; 06/08/2022
  1837 00014136 80C20E              <1> 	add	dl, 0Eh
  1838 00014139 EC                  <1> 	in	al, dx	; SB acknowledge.
  1839 0001413A B020                <1> 	mov	al, 20h
  1840 0001413C E620                <1> 	out	20h, al	; Hardware acknowledge.
  1841                              <1> 
  1842                              <1> RestoreIrqs:
  1843                              <1> 	; ah = 0 -> reset IRQ vector
  1844                              <1> 	; al = IRQ number
  1845                              <1> 	;mov	ax, 3 ; IRQ 3
  1846                              <1> 	;call	set_hardware_int_vector
  1847                              <1> 	;mov	ax, 4 ; IRQ 4
  1848                              <1> 	;call	set_hardware_int_vector
  1849 0001413E 66B80500            <1> 	mov	ax, 5 ; IRQ 5
  1850 00014142 E856E1FFFF          <1> 	call	set_hardware_int_vector
  1851 00014147 66B80700            <1> 	mov	ax, 7 ; IRQ 7
  1852 0001414B E84DE1FFFF          <1> 	call	set_hardware_int_vector
  1853                              <1> 
  1854 00014150 31D2                <1> 	xor	edx, edx
  1855 00014152 8915[B88A0100]      <1> 	mov	[audio_dev_id], edx ; 0
  1856 00014158 8915[BC8A0100]      <1> 	mov	[audio_vendor], edx ; 0
  1857                              <1> 	; 22/11/2023
  1858                              <1> 	;mov	[audio_stats_cmd], edx ; 0
  1859                              <1> 
  1860                              <1> 	;popad
  1861                              <1> 
  1862 0001415E 803D[B28A0100]01    <1> 	cmp     byte [audio_intr], 1 ; IRQ level was changed?
  1863                              <1> 	
  1864 00014165 C3                  <1> 	retn
  1865                              <1> 
  1866                              <1> %macro	SbOut	1
  1867                              <1> %%Wait:
  1868                              <1> 	in	al, dx
  1869                              <1> 	or	al, al
  1870                              <1> 	js	short %%Wait
  1871                              <1> 	mov	al, %1
  1872                              <1> 	out	dx, al
  1873                              <1> %endmacro
  1874                              <1> 
  1875                              <1> SbInit_play:
  1876                              <1> 	; 06/08/2022 - TRDOS 386 Kernel v2.0.5 
  1877                              <1> 	; 22/10/2017
  1878                              <1> 	; 20/10/2017
  1879                              <1> 	; 06/10/2017
  1880                              <1> 	; 13/07/2017 - 09/08/2017
  1881                              <1> 	; 24/04/2017 - 15/05/2017 - 24/06/2017
  1882                              <1> 	;pushad
  1883                              <1> SetBuffer:
  1884                              <1> 	;mov	byte [DmaFlag], 0
  1885                              <1> 
  1886 00014166 8B1D[D08A0100]      <1> 	mov	ebx, [audio_dma_buff] ; physical addr of DMA buff
  1887 0001416C 89DF                <1> 	mov	edi, ebx
  1888 0001416E 8B0D[D48A0100]      <1> 	mov     ecx, [audio_dmabuff_size]
  1889                              <1> 
  1890 00014174 803D[E08A0100]10    <1> 	cmp	byte [audio_bps], 16
  1891 0001417B 7531                <1> 	jne	short sbInit_0 ; set 8 bit DMA buffer
  1892                              <1> 	
  1893                              <1> 	; 09/08/2017
  1894                              <1> 	; convert byte count to word count
  1895 0001417D D1E9                <1> 	shr	ecx, 1
  1896 0001417F 49                  <1> 	dec	ecx ; word count - 1
  1897                              <1> 	; convert byte offset to word offset
  1898 00014180 D1EB                <1> 	shr	ebx, 1
  1899                              <1> 
  1900                              <1> 	; 16 bit DMA buffer setting (DMA channel 5)
  1901 00014182 B005                <1> 	mov     al, 05h  ; set mask bit for channel 5  (4+1)
  1902 00014184 E6D4                <1> 	out	0D4h, al
  1903                              <1> 	
  1904 00014186 30C0                <1> 	xor     al, al   ; stops all DMA processes on selected channel
  1905 00014188 E6D8                <1> 	out	0D8h, al ; clear selected channel register
  1906                              <1> 
  1907 0001418A 88D8                <1> 	mov     al, bl	 ; byte 0 of DMA buffer offset in words (physical) 
  1908 0001418C E6C4                <1> 	out	0C4h, al ; DMA channel 5 port number
  1909                              <1> 
  1910 0001418E 88F8                <1> 	mov     al, bh   ; byte 1 of DMA buffer offset in words (physical)   
  1911 00014190 E6C4                <1> 	out	0C4h, al
  1912                              <1> 	
  1913                              <1> 	; 09/08/2017
  1914 00014192 C1EB0F              <1> 	shr	ebx, 15	 ; complete 16 bit shift
  1915 00014195 80E3FE              <1> 	and	bl, 0FEh ; clear bit 0 (not necessary, it will be ignored)
  1916                              <1> 
  1917 00014198 88D8                <1> 	mov     al, bl   ; byte 2 of DMA buffer address (physical) 
  1918 0001419A E68B                <1> 	out	8Bh, al  ; page register port addr for channel 5 ; 13/07/2017
  1919                              <1> 
  1920 0001419C 88C8                <1> 	mov     al, cl   ; low byte of DMA count - 1
  1921 0001419E E6C6                <1> 	out	0C6h, al ; count register port addr for channel 1
  1922                              <1> 
  1923 000141A0 88E8                <1> 	mov     al, ch   ; high byte of DMA count - 1
  1924 000141A2 E6C6                <1> 	out	0C6h, al
  1925                              <1> 
  1926                              <1> 	; channel 5, read, autoinitialized, single mode
  1927                              <1> 	;mov	al, 49h
  1928 000141A4 B059                <1> 	mov	al, 59h  ; 06/10/2017 
  1929 000141A6 E6D6                <1> 	out	0D6h, al ; DMA mode register port address
  1930                              <1> 
  1931 000141A8 B001                <1> 	mov     al, 01h  ; clear mask bit for channel 1
  1932 000141AA E6D4                <1> 	out	0D4h, al ; DMA mask register port address
  1933                              <1> 
  1934 000141AC EB28                <1> 	jmp	short ClearBuffer
  1935                              <1> 
  1936                              <1> sbInit_0:    
  1937 000141AE 49                  <1> 	dec     ecx	; 09/08/2017
  1938                              <1> 
  1939                              <1> 	; 8 bit DMA buffer setting (DMA channel 1)
  1940 000141AF B005                <1> 	mov     al, 05h ; set mask bit for channel 1  (4+1)
  1941 000141B1 E60A                <1> 	out	0Ah, al ; DMA mask register
  1942                              <1> 
  1943 000141B3 30C0                <1> 	xor     al, al  ; stops all DMA processes on selected channel
  1944 000141B5 E60C                <1> 	out	0Ch, al ; clear selected channel register
  1945                              <1> 
  1946 000141B7 88D8                <1> 	mov     al, bl	; byte 0 of DMA buffer address (physical)   
  1947 000141B9 E602                <1> 	out	02h, al ; DMA channel 1 port number
  1948                              <1> 
  1949 000141BB 88F8                <1> 	mov     al, bh  ; byte 1 of DMA buffer address (physical)   
  1950 000141BD E602                <1> 	out	02h, al
  1951                              <1> 
  1952 000141BF C1EB10              <1> 	shr	ebx, 16
  1953                              <1> 
  1954 000141C2 88D8                <1> 	mov     al, bl  ; byte 2 of DMA buffer address (physical)   
  1955 000141C4 E683                <1> 	out	83h, al ; page register port addr for channel 1
  1956                              <1> 
  1957 000141C6 88C8                <1> 	mov     al, cl  ; low byte of DMA count - 1
  1958 000141C8 E603                <1> 	out	03h, al ; count register port addr for channel 1
  1959                              <1> 
  1960 000141CA 88E8                <1> 	mov     al, ch  ; high byte of DMA count - 1
  1961 000141CC E603                <1> 	out	03h, al
  1962                              <1> 
  1963                              <1> 	; channel 1, read, autoinitialized, single mode
  1964                              <1> 	;mov	al, 49h
  1965 000141CE B059                <1> 	mov	al, 59h ; 06/10/2017 
  1966 000141D0 E60B                <1> 	out	0Bh, al ; DMA mode register port address
  1967                              <1> 
  1968 000141D2 B001                <1> 	mov     al, 01h ; clear mask bit for channel 1
  1969 000141D4 E60A                <1> 	out	0Ah, al ; DMA mask register port address
  1970                              <1> 
  1971                              <1> ClearBuffer:
  1972                              <1> 	;;mov	edi, [audio_dma_buff]
  1973                              <1> 	;;mov	ecx, [audio_dmabuff_size]
  1974                              <1> 	;inc	ecx
  1975                              <1> 	;mov	al, 80h
  1976                              <1> 	;;cld
  1977                              <1> 	;rep	stosb
  1978                              <1> SetIrq:
  1979                              <1> 	;mov	ebx, SbIrqhandler
  1980                              <1> 	;mov	al, [audio_intr] ; IRQ number	
  1981                              <1> 	;call	set_dev_IRQ_service
  1982                              <1> 	;; SETUP (audio) INTERRUPT CALLBACK SERVICE
  1983                              <1> 	;mov	bl, [audio_intr] ; IRQ number
  1984                              <1> 	;mov	bh, [audio_cb_mode]
  1985                              <1> 	;inc	bh  ; 1 = Signal Response Byte method (fixed value)
  1986                              <1> 	;	    ; 2 = Callback service method
  1987                              <1> 	;	    ; 3 = Auto Increment S.R.B. method 	
  1988                              <1> 	;mov	cl, [audio_srb]
  1989                              <1> 	;mov	edx, [audio_cb_addr]
  1990                              <1> 	;mov	al, [audio_user]
  1991                              <1>  	;call	set_irq_callback_service
  1992                              <1> ResetDsp:
  1993 000141D6 668B15[B68A0100]    <1> 	mov     dx, [audio_io_base]
  1994                              <1> 	;add	dx, 06h
  1995                              <1> 	; 06/08/2022
  1996 000141DD 80C206              <1> 	add	dl, 06h
  1997 000141E0 B001                <1> 	mov     al, 1
  1998 000141E2 EE                  <1> 	out	dx, al
  1999                              <1> 
  2000 000141E3 EC                  <1> 	in	al, dx
  2001 000141E4 EC                  <1> 	in	al, dx
  2002 000141E5 EC                  <1> 	in	al, dx
  2003 000141E6 EC                  <1> 	in	al, dx
  2004                              <1> 
  2005 000141E7 30C0                <1> 	xor     al, al
  2006 000141E9 EE                  <1> 	out	dx, al
  2007                              <1> 
  2008                              <1> 	;mov	cx, 100
  2009                              <1> 	; 06/08/2022
  2010 000141EA 29C9                <1> 	sub	ecx, ecx
  2011 000141EC B164                <1> 	mov	cl, 100
  2012 000141EE 28E4                <1> 	sub	ah, ah ; 0
  2013                              <1> WaitId:         
  2014 000141F0 668B15[B68A0100]    <1> 	mov     dx, [audio_io_base]
  2015                              <1> 	;add	dx, 0Eh
  2016                              <1> 	; 06/08/2022
  2017 000141F7 80C20E              <1> 	add	dl, 0Eh
  2018 000141FA EC                  <1> 	in	al, dx
  2019 000141FB 08C0                <1> 	or      al, al
  2020 000141FD 7807                <1> 	js      short sb_GetId
  2021 000141FF E2EF                <1> 	loop    WaitId
  2022 00014201 E9B1000000          <1> 	jmp     sb_Exit
  2023                              <1> sb_GetId:
  2024 00014206 668B15[B68A0100]    <1> 	mov     dx, [audio_io_base]
  2025                              <1> 	;add	dx, 0Ah
  2026                              <1> 	; 06/08/2022
  2027 0001420D 80C20A              <1> 	add	dl, 0Ah
  2028 00014210 EC                  <1> 	in	al, dx
  2029 00014211 3CAA                <1> 	cmp     al, 0AAh
  2030 00014213 7407                <1> 	je      short SbOk
  2031 00014215 E2D9                <1> 	loop    WaitId
  2032 00014217 E99B000000          <1> 	jmp	sb_Exit
  2033                              <1> SbOk:
  2034 0001421C 668B15[B68A0100]    <1> 	mov     dx, [audio_io_base]
  2035                              <1> 	;add	dx, 0Ch
  2036                              <1> 	; 06/08/2022
  2037 00014223 80C20C              <1> 	add	dl, 0Ch
  2038                              <1> 	SbOut   0D1h ; Turn on speaker
  1867                              <2> %%Wait:
  1868 00014226 EC                  <2>  in al, dx
  1869 00014227 08C0                <2>  or al, al
  1870 00014229 78FB                <2>  js short %%Wait
  1871 0001422B B0D1                <2>  mov al, %1
  1872 0001422D EE                  <2>  out dx, al
  2039                              <1> 	SbOut   41h ; 8h bit or 16 bit transfer
  1867                              <2> %%Wait:
  1868 0001422E EC                  <2>  in al, dx
  1869 0001422F 08C0                <2>  or al, al
  1870 00014231 78FB                <2>  js short %%Wait
  1871 00014233 B041                <2>  mov al, %1
  1872 00014235 EE                  <2>  out dx, al
  2040 00014236 668B1D[E28A0100]    <1> 	mov	bx, [audio_freq] ; sampling rate (Hz)
  2041                              <1> 	SbOut	bh ; sampling rate high byte
  1867                              <2> %%Wait:
  1868 0001423D EC                  <2>  in al, dx
  1869 0001423E 08C0                <2>  or al, al
  1870 00014240 78FB                <2>  js short %%Wait
  1871 00014242 88F8                <2>  mov al, %1
  1872 00014244 EE                  <2>  out dx, al
  2042                              <1> 	SbOut	bl ; sampling rate low byte
  1867                              <2> %%Wait:
  1868 00014245 EC                  <2>  in al, dx
  1869 00014246 08C0                <2>  or al, al
  1870 00014248 78FB                <2>  js short %%Wait
  1871 0001424A 88D8                <2>  mov al, %1
  1872 0001424C EE                  <2>  out dx, al
  2043                              <1> 
  2044                              <1> 	; 22/05/2017
  2045 0001424D E8BF000000          <1> 	call	sb16_volume_initial ; 15/05/2017
  2046                              <1> 	; 20/05/2017
  2047                              <1> 	;call	sb16_volume
  2048                              <1> 
  2049                              <1> StartDma: 
  2050                              <1> 	; autoinitialized mode
  2051 00014252 803D[E08A0100]10    <1> 	cmp	byte [audio_bps], 16 ; 16 bit samples
  2052 00014259 7411                <1> 	je	short sb_play_1
  2053                              <1> 	; 8 bit samples
  2054 0001425B 66BBC600            <1> 	mov	bx, 0C6h ; 8 bit output (0C6h)
  2055 0001425F 803D[E18A0100]02    <1> 	cmp	byte [audio_stmo], 2 ; 1 = mono, 2 = stereo
  2056 00014266 7214                <1> 	jb	short sb_play_2
  2057 00014268 B720                <1> 	mov	bh, 20h	; 8 bit stereo (20h)
  2058 0001426A EB10                <1> 	jmp	short sb_play_2
  2059                              <1> sb_play_1:
  2060                              <1> 	; 16 bit samples
  2061 0001426C 66BBB610            <1> 	mov	bx, 10B6h ; 16 bit output (0B6h)
  2062 00014270 803D[E18A0100]02    <1> 	cmp	byte [audio_stmo], 2 ; 1 = mono, 2 = stereo
  2063 00014277 7203                <1> 	jb	short sb_play_2
  2064 00014279 80C720              <1> 	add	bh, 20h	; 16 bit stereo (30h)
  2065                              <1> sb_play_2:     
  2066                              <1> 	; PCM output (8/16 bit mono autoinitialized transfer)
  2067                              <1> 	SbOut   bl ; bCommand
  1867                              <2> %%Wait:
  1868 0001427C EC                  <2>  in al, dx
  1869 0001427D 08C0                <2>  or al, al
  1870 0001427F 78FB                <2>  js short %%Wait
  1871 00014281 88D8                <2>  mov al, %1
  1872 00014283 EE                  <2>  out dx, al
  2068                              <1> 	SbOut	bh ; bMode
  1867                              <2> %%Wait:
  1868 00014284 EC                  <2>  in al, dx
  1869 00014285 08C0                <2>  or al, al
  1870 00014287 78FB                <2>  js short %%Wait
  1871 00014289 88F8                <2>  mov al, %1
  1872 0001428B EE                  <2>  out dx, al
  2069 0001428C 8B1D[D48A0100]      <1> 	mov	ebx, [audio_dmabuff_size]  ; 15/05/2017
  2070 00014292 D1EB                <1> 	shr	ebx, 1 ; half buffer size
  2071                              <1> 	; 20/10/2017	
  2072 00014294 803D[E08A0100]10    <1> 	cmp	byte [audio_bps], 16 ; 16 bit DMA
  2073 0001429B 7502                <1> 	jne	short sb_play_3
  2074 0001429D D1EB                <1> 	shr	ebx, 1 ; byte count to word count
  2075                              <1> sb_play_3: 
  2076                              <1> 	;dec	bx  ; wBlkSize is one less than the actual size 
  2077                              <1> 	; 06/08/2022
  2078 0001429F 4B                  <1> 	dec	ebx
  2079                              <1> 	SbOut   bl
  1867                              <2> %%Wait:
  1868 000142A0 EC                  <2>  in al, dx
  1869 000142A1 08C0                <2>  or al, al
  1870 000142A3 78FB                <2>  js short %%Wait
  1871 000142A5 88D8                <2>  mov al, %1
  1872 000142A7 EE                  <2>  out dx, al
  2080                              <1> 	SbOut   bh
  1867                              <2> %%Wait:
  1868 000142A8 EC                  <2>  in al, dx
  1869 000142A9 08C0                <2>  or al, al
  1870 000142AB 78FB                <2>  js short %%Wait
  1871 000142AD 88F8                <2>  mov al, %1
  1872 000142AF EE                  <2>  out dx, al
  2081                              <1> 
  2082 000142B0 C605[E68A0100]01    <1> 	mov	byte [audio_play_cmd], 1 ; playing !
  2083                              <1> 
  2084                              <1> 	;; Set Voice and master volumes
  2085                              <1> 	;mov	dx, [audio_io_base]
  2086                              <1> 	;add	dl, 4 ; Mixer chip Register Address Port
  2087                              <1> 	;SbOut	30h   ; select Master Volume Register (L)
  2088                              <1> 	;inc	dl    ; Mixer chip Register Data Port
  2089                              <1> 	;SbOut	0F8h  ; Max. volume value is 31 (31*8)
  2090                              <1> 	;dec	dl
  2091                              <1> 	;SbOut	31h   ; select Master Volume Register (R)
  2092                              <1> 	;inc	dl
  2093                              <1> 	;SbOut	0F8h  ; Max. volume value is 31 (31*8)
  2094                              <1> 	;dec	dl
  2095                              <1> 	;SbOut	32h   ; select Voice Volume Register (L)
  2096                              <1> 	;inc	dl
  2097                              <1> 	;SbOut	0F8h  ; Max. volume value is 31 (31*8)
  2098                              <1> 	;dec	dl
  2099                              <1> 	;SbOut	33h   ; select Voice Volume Register (R)
  2100                              <1> 	;inc	dl
  2101                              <1> 	;SbOut	0F8h  ; Max. volume value is 31 (31*8)	
  2102                              <1> 	;;
  2103                              <1> 	;dec	dl
  2104                              <1> 	;SbOut	44h   ; select Treble Register (L)
  2105                              <1> 	;inc	dl
  2106                              <1> 	;SbOut	0F0h  ; Max. Treble value is 15 (15*16)
  2107                              <1> 	;dec	dl
  2108                              <1> 	;SbOut	45h   ; select Treble Register (R)
  2109                              <1> 	;inc	dl
  2110                              <1> 	;SbOut	0F0h  ; Max. Treble value is 15 (15*16)
  2111                              <1> 	;dec	dl
  2112                              <1> 	;SbOut	46h   ; select Bass Register (L)
  2113                              <1> 	;inc	dl
  2114                              <1> 	;SbOut	0F0h  ; Max. Bass value is 15 (15*16)
  2115                              <1> 	;dec	dl
  2116                              <1> 	;SbOut	47h   ; select Bass Register (R)
  2117                              <1> 	;inc	dl
  2118                              <1> 	;SbOut	0F0h  ; Max. Bass value is 15 (15*16)	
  2119                              <1> 
  2120                              <1> sb_Exit:           
  2121                              <1> 	;popad
  2122 000142B7 C3                  <1> 	retn
  2123                              <1> 
  2124                              <1> sb16_int_handler:
  2125                              <1> 	; Interrupt Handler for Sound Blaster 16 Audio Card
  2126                              <1> 	; Note: called by 'dev_IRQ_service'
  2127                              <1> 	; 20/10/2017
  2128                              <1> 	; 12/10/2017
  2129                              <1> 	; 10/10/2017 
  2130                              <1> 	; 12/05/2017, 09/10/2017
  2131                              <1> 	; 24/04/2017 (TRDOS 386 kernel, 'audio.s')
  2132                              <1> 	; 10/03/2017 - 'PLAYWAV.PRG' ('playwav.s') 
  2133                              <1> 
  2134                              <1> 	;push	eax ; * must be saved !
  2135                              <1> 	;push	ebx ; * must be saved !
  2136                              <1> 	;push	ecx
  2137                              <1> 	;push	edx
  2138                              <1> 	;push	esi
  2139                              <1> 	;push	edi
  2140                              <1> 
  2141 000142B8 668B15[B68A0100]    <1> 	mov     dx, [audio_io_base]
  2142                              <1> 	; 20/10/2017
  2143 000142BF 80C20F              <1> 	add     dl, 0Fh ; 2xFh (DSP 16 bit intr ack)
  2144 000142C2 803D[E08A0100]10    <1> 	cmp	byte [audio_bps], 16
  2145 000142C9 7402                <1> 	je	short sb_irq_16bit_ack
  2146                              <1> sb_irq_8bit_ack:
  2147 000142CB FECA                <1> 	dec	dl  ; 2xEh (DSP 8 bit intr ack)
  2148                              <1> sb_irq_16bit_ack:
  2149 000142CD EC                  <1> 	in	al, dx
  2150                              <1> 
  2151                              <1> 	;cmp	byte [audio_busy], 0
  2152                              <1> 	;ja	short sb_irq_h3
  2153                              <1> 
  2154                              <1> 	;mov	byte [audio_busy], 1
  2155                              <1> 
  2156 000142CE 803D[E68A0100]01    <1> 	cmp	byte [audio_play_cmd], 1
  2157 000142D5 7307                <1> 	jnb	short sb_irq_h1
  2158                              <1> sb_irq_h0:
  2159 000142D7 E8A3000000          <1> 	call	sb16_stop
  2160 000142DC EB2B                <1> 	jmp	short sb_irq_h3
  2161                              <1> sb_irq_h1:
  2162                              <1> 	;call	sb16_tuneloop
  2163                              <1> 	; 09/10/2017
  2164                              <1> sb16_tuneloop:
  2165 000142DE 8B3D[D08A0100]      <1> 	mov	edi, [audio_dma_buff]
  2166 000142E4 8B0D[D48A0100]      <1> 	mov	ecx, [audio_dmabuff_size]
  2167 000142EA D1E9                <1> 	shr	ecx, 1 ; dma buff size / 2 = half buffer size
  2168                              <1> 
  2169                              <1> 	; 22/05/2017
  2170 000142EC F605[D88A0100]01    <1> 	test	byte [audio_flag], 1  ; Current flag value
  2171 000142F3 7402                <1> 	jz	short sb_tlp1 ; EOL (Half Buffer 1 must be filled)
  2172                              <1> 	; FLAG (Half Buffer 2 must be filled)
  2173 000142F5 01CF                <1> 	add	edi, ecx
  2174                              <1> 	; 15/05/2017
  2175                              <1> sb_tlp1: 
  2176 000142F7 8B35[C88A0100]      <1> 	mov	esi, [audio_p_buffer] ; phy addr of audio buff
  2177                              <1> 	;rep	movsb
  2178 000142FD C1E902              <1> 	shr	ecx, 2 ; half buff size / 4
  2179 00014300 F3A5                <1> 	rep	movsd 
  2180                              <1> 	;retn
  2181                              <1> 
  2182                              <1> 	; 10/10/2017
  2183                              <1> 	; switch flag value
  2184 00014302 8035[D88A0100]01    <1> 	xor	byte [audio_flag], 1
  2185                              <1> 
  2186                              <1> 	; 12/10/2017
  2187                              <1> 	; [audio_flag] = 0 : Playing dma half buffer 2 (odd intr count)
  2188                              <1> 			   ; Next buffer (to update) is dma half buff 1
  2189                              <1> 	; 	       = 1 : Playing dma half buffer 1 (even intr count)
  2190                              <1> 			   ; Next buffer (to update) is dma half buff 2
  2191                              <1> 
  2192                              <1> sb_irq_h3:
  2193                              <1> 	;mov	byte [audio_busy], 0
  2194                              <1> 
  2195                              <1> 	;pop	edi
  2196                              <1> 	;pop	esi
  2197                              <1> 	;pop	edx
  2198                              <1> 	;pop	ecx
  2199                              <1> 	;pop	ebx ; * must be restored !
  2200                              <1> 	;pop	eax ; * must be restored !
  2201                              <1> 	
  2202 00014309 C3                  <1> 	retn
  2203                              <1> 
  2204                              <1> sb16_volume:
  2205                              <1> 	; 06/08/2022 (TRDOS 386 v2.0.5)
  2206                              <1> 	; 22/10/2017
  2207                              <1> 	; mov [audio_master_volume_l], cl 
  2208                              <1> 	; mov [audio_master_volume_h], ch 
  2209 0001430A 66890D[E88A0100]    <1> 	mov	[audio_master_volume], cx
  2210                              <1> sb16_volume_initial:
  2211                              <1> 	;push	dx ; DX (port address) must be saved
  2212                              <1> 	; 06/08/2022
  2213 00014311 52                  <1> 	push	edx
  2214 00014312 668B15[B68A0100]    <1> 	mov	dx, [audio_io_base]
  2215                              <1> 	;add	dx, 4 ; Mixer chip address port
  2216                              <1> 	; 06/08/2022
  2217 00014319 80C204              <1> 	add	dl, 4
  2218 0001431C B022                <1> 	mov	al, 22h ; master volume
  2219 0001431E EE                  <1> 	out	dx, al
  2220                              <1> 	;inc	dx
  2221                              <1> 	; 06/08/2022
  2222 0001431F 42                  <1> 	inc	edx
  2223 00014320 8A25[E88A0100]      <1> 	mov	ah, [audio_master_volume_l]
  2224 00014326 C0EC02              <1> 	shr	ah, 2 ; 32 -> 8 level
  2225 00014329 C0E405              <1> 	shl	ah, 5 ; bit 5 to 7
  2226 0001432C A0[E98A0100]        <1> 	mov	al, [audio_master_volume_r]	
  2227 00014331 C0E802              <1> 	shr	al, 2 ; 32 -> 8 level
  2228                              <1> 	;and	al, 0Fh
  2229 00014334 D0E0                <1> 	shl	al, 1 ; bit 1 to 3
  2230 00014336 08E0                <1> 	or	al, ah
  2231 00014338 EE                  <1> 	out	dx, al
  2232                              <1> 	;pop	dx ; DX (port address) must be restored
  2233                              <1> 	; 06/08/2022
  2234 00014339 5A                  <1> 	pop	edx
  2235 0001433A C3                  <1> 	retn
  2236                              <1> 
  2237                              <1> sb16_pause:
  2238                              <1> 	; 06/08/2022 (TRDOS 386 v2.0.5)
  2239 0001433B 668B15[B68A0100]    <1> 	mov	dx, [audio_io_base]
  2240                              <1> 	;add	dx, 0Ch ; Command & Data Port
  2241                              <1> 	; 06/08/2022
  2242 00014342 80C20C              <1> 	add	dl, 0Ch
  2243 00014345 803D[E08A0100]10    <1> 	cmp	byte [audio_bps], 16 ; 16 bit samples
  2244 0001434C 7404                <1> 	je	short sb_pause_1
  2245                              <1> 	; 8 bit samples
  2246 0001434E B3D0                <1> 	mov	bl, 0D0h ; 8 bit DMA mode
  2247 00014350 EB02                <1> 	jmp	short sb_pause_2
  2248                              <1> sb_pause_1:
  2249                              <1> 	; 16 bit samples
  2250 00014352 B3D5                <1> 	mov	bl, 0D5h ; 16 bit DMA mode
  2251                              <1> sb_pause_2:     
  2252                              <1> 	SbOut   bl ; bCommand
  1867                              <2> %%Wait:
  1868 00014354 EC                  <2>  in al, dx
  1869 00014355 08C0                <2>  or al, al
  1870 00014357 78FB                <2>  js short %%Wait
  1871 00014359 88D8                <2>  mov al, %1
  1872 0001435B EE                  <2>  out dx, al
  2253                              <1> sb_pause_3:
  2254 0001435C C3                  <1> 	retn
  2255                              <1> 
  2256                              <1> sb16_continue:
  2257                              <1> 	; 06/08/2022 (TRDOS 386 v2.0.5)
  2258 0001435D 668B15[B68A0100]    <1> 	mov	dx, [audio_io_base]
  2259                              <1> 	;add	dx, 0Ch ; Command & Data Port
  2260                              <1> 	; 06/08/2022
  2261 00014364 80C20C              <1> 	add	dl, 0Ch
  2262 00014367 803D[E08A0100]10    <1> 	cmp	byte [audio_bps], 16 ; 16 bit samples
  2263 0001436E 7404                <1> 	je	short sb_cont_1
  2264                              <1> 	; 8 bit samples
  2265 00014370 B3D4                <1> 	mov	bl, 0D4h ; 8 bit DMA mode
  2266 00014372 EB02                <1> 	jmp	short sb_cont_2
  2267                              <1> sb_cont_1:
  2268                              <1> 	; 16 bit samples
  2269 00014374 B3D6                <1> 	mov	bl, 0D6h ; 16 bit DMA mode
  2270                              <1> sb_cont_2:     
  2271                              <1> 	SbOut   bl ; bCommand
  1867                              <2> %%Wait:
  1868 00014376 EC                  <2>  in al, dx
  1869 00014377 08C0                <2>  or al, al
  1870 00014379 78FB                <2>  js short %%Wait
  1871 0001437B 88D8                <2>  mov al, %1
  1872 0001437D EE                  <2>  out dx, al
  2272                              <1> sb_cont_3:
  2273 0001437E C3                  <1> 	retn
  2274                              <1> 
  2275                              <1> sb16_stop:
  2276                              <1> 	; 06/08/2022 (TRDOS 386 v2.0.5)
  2277                              <1> 	; 24/04/2017
  2278 0001437F 803D[E68A0100]00    <1> 	cmp	byte [audio_play_cmd], 0
  2279 00014386 7647                <1> 	jna	short sb16_stop_4
  2280                              <1> 
  2281                              <1> 	; 22/05/2017
  2282 00014388 668B15[B68A0100]    <1> 	mov	dx, [audio_io_base]
  2283                              <1> 	;add	dx, 0Ch
  2284                              <1> 	; 06/08/2022
  2285 0001438F 80C20C              <1> 	add	dl, 0Ch
  2286                              <1> 
  2287 00014392 B3D9                <1> 	mov	bl, 0D9h ; exit auto-initialize 16 bit transfer
  2288                              <1> 	; stop  autoinitialized DMA transfer mode 
  2289 00014394 803D[E08A0100]10    <1> 	cmp	byte [audio_bps], 16 ; 16 bit samples
  2290 0001439B 7402                <1> 	je	short sb16_stop_1
  2291                              <1> 	;mov	bl, 0DAh ; exit auto-initialize 8 bit transfer
  2292 0001439D FEC3                <1> 	inc	bl
  2293                              <1> sb16_stop_1:
  2294                              <1> 	SbOut	bl ; exit auto-initialize transfer command
  1867                              <2> %%Wait:
  1868 0001439F EC                  <2>  in al, dx
  1869 000143A0 08C0                <2>  or al, al
  1870 000143A2 78FB                <2>  js short %%Wait
  1871 000143A4 88D8                <2>  mov al, %1
  1872 000143A6 EE                  <2>  out dx, al
  2295                              <1> 
  2296 000143A7 30C0                <1> 	xor     al, al ; stops all DMA processes on selected channel
  2297                              <1> 
  2298 000143A9 803D[E08A0100]10    <1> 	cmp	byte [audio_bps], 16 ; 16 bit samples
  2299 000143B0 7404                <1> 	je	short sb16_stop_2
  2300 000143B2 E60C                <1> 	out	0Ch, al ; clear selected channel register
  2301 000143B4 EB02                <1> 	jmp	short sb16_stop_3
  2302                              <1> 
  2303                              <1> sb16_stop_2:
  2304 000143B6 E6D8                <1> 	out	0D8h, al ; clear selected channel register
  2305                              <1> 
  2306                              <1> sb16_stop_3:
  2307 000143B8 C605[E68A0100]00    <1> 	mov	byte [audio_play_cmd], 0 ; stop !
  2308                              <1> SbDone:
  2309                              <1> 	;mov	dx, [audio_io_base]
  2310                              <1> 	;add	dx, 0Ch
  2311                              <1> 	SbOut   0D0h
  1867                              <2> %%Wait:
  1868 000143BF EC                  <2>  in al, dx
  1869 000143C0 08C0                <2>  or al, al
  1870 000143C2 78FB                <2>  js short %%Wait
  1871 000143C4 B0D0                <2>  mov al, %1
  1872 000143C6 EE                  <2>  out dx, al
  2312                              <1> 	SbOut   0D3h
  1867                              <2> %%Wait:
  1868 000143C7 EC                  <2>  in al, dx
  1869 000143C8 08C0                <2>  or al, al
  1870 000143CA 78FB                <2>  js short %%Wait
  1871 000143CC B0D3                <2>  mov al, %1
  1872 000143CE EE                  <2>  out dx, al
  2313                              <1> sb16_stop_4:
  2314 000143CF C3                  <1> 	retn
  2315                              <1> 
  2316                              <1> sb16_reset:
  2317                              <1> 	; 06/08/2022 (TRDOS 386 v2.0.5)
  2318                              <1> 	; 24/04/2017
  2319 000143D0 668B15[B68A0100]    <1> 	mov     dx, [audio_io_base] ; try to reset the DSP.
  2320                              <1> 	;add	dx, 06h
  2321                              <1> 	; 06/08/2022
  2322 000143D7 80C206              <1> 	add	dl, 06h
  2323 000143DA B001                <1> 	mov	al, 1
  2324 000143DC EE                  <1> 	out	dx, al
  2325                              <1> 
  2326 000143DD EC                  <1> 	in	al, dx
  2327 000143DE EC                  <1> 	in	al, dx
  2328 000143DF EC                  <1> 	in	al, dx
  2329 000143E0 EC                  <1> 	in	al, dx
  2330                              <1> 
  2331 000143E1 30C0                <1> 	xor     al, al
  2332 000143E3 EE                  <1> 	out	dx, al
  2333                              <1> 
  2334                              <1> 	;add	dx, 08h
  2335                              <1> 	; 06/08/2022
  2336 000143E4 80C208              <1> 	add	dl, 08h
  2337                              <1> 	;mov	cx, 100
  2338 000143E7 29C9                <1> 	sub	ecx, ecx
  2339 000143E9 B164                <1> 	mov	cl, 100
  2340                              <1> sbrstWaitID:
  2341 000143EB EC                  <1> 	in	al, dx
  2342 000143EC 08C0                <1> 	or      al, al
  2343 000143EE 7804                <1> 	js      short sbrstGetID
  2344 000143F0 E2F9                <1> 	loop    sbrstWaitID
  2345 000143F2 F9                  <1> 	stc
  2346 000143F3 C3                  <1> 	retn
  2347                              <1> sbrstGetID:          
  2348                              <1> 	;sub	dx, 04h
  2349                              <1> 	; 06/08/2022
  2350 000143F4 80EA04              <1> 	sub	dl, 04h
  2351 000143F7 EC                  <1> 	in	al, dx
  2352 000143F8 3CAA                <1> 	cmp     al, 0AAh
  2353 000143FA 7405                <1> 	je      short sb_rst_retn
  2354                              <1> 	;add	dx, 04h
  2355                              <1> 	; 06/08/2022
  2356 000143FC 80C204              <1> 	add	dl, 04h
  2357 000143FF E2EA                <1> 	loop    sbrstWaitID
  2358                              <1> sb_rst_retn:
  2359 00014401 C3                  <1> 	retn
  2360                              <1> 
  2361                              <1> ac97_codec_config:
  2362                              <1> 	; 26/11/2023
  2363                              <1> 	; 21/11/2023
  2364                              <1> 	; 20/11/2023
  2365                              <1> 	; 19/11/2023 (TRDOS 386 v2.0.7)
  2366                              <1> 	; 10/06/2017
  2367                              <1> 	; 05/06/2017
  2368                              <1> 	; 29/05/2017
  2369                              <1> 	; 28/05/2017 (TRDOS 386, 'audio.s')
  2370                              <1> 	; 07/11/2016 (Erdogan Tan)
  2371                              <1> 	; Derived from 'codecConfig' procedure in 'CODEC.ASM'
  2372                              <1> 	; .wav player for DOS by Jeff Leyda (02/09/2002)
  2373                              <1> 
  2374                              <1> 	;; 'PLAYER.ASM'
  2375                              <1> 	;; get ICH base address regs for mixer and bus master
  2376                              <1> 
  2377                              <1> init_ac97_controller: ; 10/06/2017
  2378 00014402 A1[B88A0100]        <1> 	mov	eax, [audio_dev_id]
  2379                              <1>         ;mov	al, NAMBAR_REG
  2380                              <1>         ;;call  pciRegRead16			; read PCI registers 10-11
  2381                              <1>         ;call	pciRegRead32
  2382                              <1> 	;and	dx, IO_ADDR_MASK 		; mask off BIT0
  2383                              <1> 	;;and	edx, IO_ADDR_MASK 
  2384                              <1> 
  2385                              <1>         ;mov	[NAMBAR], dx			; save audio mixer base addr
  2386                              <1> 
  2387                              <1>         ;mov    al, NABMBAR_REG
  2388                              <1>         ;;call	pciRegRead16
  2389                              <1>         ;call	pciRegRead32
  2390                              <1> 	;and	dx, 0FFC0h ; IO_ADDR_MASK
  2391                              <1> 	;;and	edx, 0FFC0h
  2392                              <1> 
  2393                              <1>         ;mov    [NABMBAR], dx			; save bus master base addr
  2394                              <1> 
  2395                              <1> 	;mov	eax, [audio_dev_id]
  2396 00014407 B004                <1>         mov     al, PCI_CMD_REG
  2397                              <1>         ;call	pciRegRead8			; read PCI command register
  2398 00014409 E891F8FFFF          <1>         call	pciRegRead16
  2399 0001440E 80CA05              <1> 	or      dl, IO_ENA+BM_ENA               ; enable IO and bus master
  2400                              <1>         ;call 	pciRegWrite8
  2401 00014411 E8F4F8FFFF          <1> 	call	pciRegWrite16
  2402                              <1> 
  2403                              <1> 	; 'CODEC.ASM'
  2404                              <1> 
  2405                              <1> 	; enable codec, unmute stuff, set output rate
  2406                              <1> ;	; entry: [audio_freq] = desired sample rate
  2407                              <1> 		
  2408                              <1> ;	mov    	dx, [NAMBAR]
  2409                              <1> ;	add    	dx, CODEC_EXT_AUDIO_CTRL_REG  	; 2Ah
  2410                              <1> ;	in     	ax, dx
  2411                              <1> ;	or	ax, 1
  2412                              <1> ;	out	dx, ax 				; Enable variable rate audio
  2413                              <1> 
  2414                              <1> ;       ;call	delay1_4ms
  2415                              <1> ;       ;call	delay1_4ms
  2416                              <1> ;       ;call	delay1_4ms
  2417                              <1> ;       ;call	delay1_4ms
  2418                              <1> 
  2419                              <1> ;	mov	ax, [audio_freq]		; sample rate
  2420                              <1> 
  2421                              <1> ;	mov    	dx, [NAMBAR]               	
  2422                              <1> ;	add    	dx, CODEC_PCM_FRONT_DACRATE_REG	; 2Ch
  2423                              <1> ;	out	dx, ax 				; out sample rate
  2424                              <1> 		
  2425                              <1> ;       ;call	delay1_4ms
  2426                              <1> ;       ;call	delay1_4ms
  2427                              <1> ;       ;call	delay1_4ms
  2428                              <1> ;       ;call	delay1_4ms
  2429                              <1> 
  2430                              <1> 	;mov	dx, [NAMBAR]			; mixer base address
  2431                              <1>         ;add	dx, CODEC_RESET_REG  		; reset register
  2432                              <1>         ;mov	ax, 42
  2433                              <1> 	;out	dx, ax                          ; reset
  2434                              <1> 
  2435                              <1> 	;mov    dx, [NABMBAR]			; bus master base address
  2436                              <1>         ;add	dx, GLOB_STS_REG
  2437                              <1>         ;mov	ax, 2
  2438                              <1> 	;out	dx, ax
  2439                              <1> 
  2440                              <1> 	; 16/05/2024
  2441                              <1> 	; 02/12/2023
  2442 00014416 E887F9FFFF          <1> 	call	delay_100ms ; 29/05/2017
  2443                              <1> 
  2444                              <1> 	; 02/12/2023
  2445                              <1> 	;call	delay1_4ms
  2446                              <1> 	;call	delay1_4ms
  2447                              <1> 	;call	delay1_4ms
  2448                              <1> 	;call	delay1_4ms
  2449                              <1> 
  2450                              <1> init_ac97_codec:
  2451                              <1> 	; 26/11/2023
  2452                              <1> 	; 19/11/2023
  2453                              <1> 	;   (playwav3.com, ac97_vra.asm, Erdogan Tan, 19/11/2023)
  2454                              <1> 	; 10/06/2017
  2455                              <1> 	; 29/05/2017
  2456                              <1> 	; 28/05/2017 - Erdogan Tan (Ref: KolibriOS, intelac97.asm)
  2457                              <1> 
  2458                              <1> 	;; 23/11/2023 - temporary
  2459                              <1> 	;push	ebx
  2460                              <1> 	;mov	ebx, 0B8000h
  2461                              <1> 	;mov	al, '?'
  2462                              <1> 	;mov	ah, 4Eh
  2463                              <1> 	;mov	[ebx], ax
  2464                              <1> 	;pop	ebx
  2465                              <1> 
  2466                              <1> 	; 19/11/2023
  2467 0001441B BD28000000          <1> 	mov	ebp, 40	; 21/11/2023
  2468                              <1> _initc_1:
  2469                              <1> 	; 26/11/2023
  2470 00014420 66BA2C00            <1> 	mov	dx, GLOB_CNT_REG ; 2Ch
  2471 00014424 660315[B68A0100]    <1> 	add	dx, [NABMBAR]
  2472 0001442B ED                  <1> 	in	eax, dx
  2473                              <1> 	; ?
  2474                              <1> 
  2475                              <1> 	; 02/12/2023
  2476 0001442C E87EF9FFFF          <1> 	call	delay1_4ms
  2477                              <1> 
  2478 00014431 66BA3000            <1> 	mov	dx, GLOB_STS_REG ; 30h
  2479 00014435 660315[B68A0100]    <1> 	add	dx, [NABMBAR]
  2480 0001443C ED                  <1> 	in	eax, dx
  2481                              <1> 
  2482                              <1> 	; 02/12/2023
  2483 0001443D E86DF9FFFF          <1> 	call	delay1_4ms
  2484                              <1> 
  2485 00014442 83F8FF              <1> 	cmp	eax, 0FFFFFFFFh ; -1
  2486 00014445 750A                <1> 	jne	short _initc_3
  2487                              <1> _initc_2:
  2488 00014447 4D                  <1> 	dec	ebp	; 21/11/2023
  2489 00014448 7415                <1> 	jz	short _ac97_codec_ready
  2490                              <1> 
  2491 0001444A E853F9FFFF          <1> 	call	delay_100ms
  2492 0001444F EBCF                <1> 	jmp	short _initc_1
  2493                              <1> _initc_3:
  2494 00014451 A900030010          <1> 	test	eax, CTRL_ST_CREADY
  2495 00014456 7507                <1> 	jnz	short _ac97_codec_ready
  2496                              <1> 
  2497 00014458 E8EE020000          <1> 	call	reset_ac97_codec
  2498                              <1> 	;jc	short _initc_2
  2499                              <1> 	; 26/11/2023
  2500 0001445D EBE8                <1> 	jmp	short _initc_2
  2501                              <1> 
  2502                              <1> _ac97_codec_ready:
  2503 0001445F 668B15[B48A0100]    <1> 	mov	dx, [NAMBAR]
  2504                              <1> 	;add	dx, 0 ; ac_reg_0 ; reset register
  2505 00014466 66EF                <1> 	out	dx, ax
  2506                              <1> 
  2507                              <1> 	; 19/11/2023
  2508 00014468 E835F9FFFF          <1> 	call	delay_100ms
  2509                              <1> 	; 24/11/2023 - temporary
  2510                              <1> 	;call	delay_100ms
  2511                              <1> 	;call	delay_100ms
  2512                              <1> 	;call	delay_100ms
  2513                              <1> 
  2514 0001446D 09ED                <1> 	or	ebp, ebp  ; 21/11/2023	
  2515 0001446F 752D                <1> 	jnz	short _ac97_codec_init_ok
  2516                              <1> 
  2517 00014471 31C0                <1> 	xor	eax, eax ; 0
  2518 00014473 668B15[B48A0100]    <1> 	mov	dx, [NAMBAR]
  2519 0001447A 6683C226            <1> 	add	dx, CODEC_REG_POWERDOWN
  2520 0001447E 66EF                <1> 	out	dx, ax
  2521                              <1> 
  2522                              <1> 	; 10/06/2017
  2523                              <1> 	; 29/05/2017
  2524                              <1> 	; wait for 1 second
  2525                              <1> 	; 16/05/2024
  2526 00014480 B9E8030000          <1> 	mov	ecx, 1000 ; 1000*0.25ms = 1s
  2527                              <1> 	; 20/11/2023
  2528                              <1> 	;mov	ecx, 10
  2529 00014485 B10A                <1> 	mov	cl, 10
  2530                              <1> 	; 24/11/2023 - temporary
  2531                              <1> 	;mov	cl, 40
  2532                              <1> _ac97_codec_rloop:
  2533                              <1> 	;call	delay1_4ms
  2534                              <1> 	;call	delay1_4ms
  2535                              <1> 	;call	delay1_4ms
  2536                              <1> 	;call	delay1_4ms
  2537                              <1> 	; 19/11/2023
  2538                              <1> 	; 22/11/2023
  2539 00014487 51                  <1> 	push	ecx
  2540 00014488 E815F9FFFF          <1> 	call	delay_100ms
  2541 0001448D 59                  <1> 	pop	ecx
  2542                              <1> 	;mov	dx, [NAMBAR]
  2543                              <1> 	;add	dx, CODEC_REG_POWERDOWN
  2544 0001448E 66ED                <1> 	in	ax, dx
  2545                              <1> 
  2546                              <1> 	; 02/12/2023
  2547 00014490 E81AF9FFFF          <1> 	call	delay1_4ms
  2548                              <1> 	
  2549                              <1> 	;and	ax, 0Fh
  2550                              <1> 	; 21/11/2023
  2551 00014495 240F                <1> 	and	al, 0Fh
  2552 00014497 3C0F                <1> 	cmp	al, 0Fh
  2553 00014499 7403                <1> 	je	short _ac97_codec_init_ok
  2554                              <1> 	; 24/11/2023 - temporary
  2555                              <1> 	;je	short _ac97_codec_init_ok_
  2556                              <1> 	
  2557 0001449B E2EA                <1> 	loop	_ac97_codec_rloop 
  2558                              <1> 	; 22/11/2023
  2559                              <1> 	; cf = 1
  2560                              <1> init_ac97_codec_err1:
  2561                              <1> 	;stc
  2562                              <1> init_ac97_codec_err2:
  2563 0001449D C3                  <1> 	retn
  2564                              <1> 
  2565                              <1> ;_ac97_codec_init_ok_:
  2566                              <1> 	;mov	dx, GLOB_STS_REG ; 30h
  2567                              <1> 	;add	dx, [NABMBAR]
  2568                              <1> 	;in	eax, dx
  2569                              <1> 	;test	eax, CTRL_ST_CREADY
  2570                              <1> 	;jnz	short _ac97_codec_init_ok
  2571                              <1> 	;stc 
  2572                              <1> 	;retn
  2573                              <1> 
  2574                              <1> _ac97_codec_init_ok:
  2575                              <1> 	; 26/11/2023
  2576                              <1> 	; 23/11/2023
  2577                              <1> 	;xor	eax, eax
  2578                              <1> 	; 21/11/2023 - temporary
  2579                              <1> 	; 19/11/2023
  2580                              <1> 	;mov	al, 2 ; force set 16-bit 2-channel PCM
  2581                              <1> 	;mov	dx, GLOB_CNT_REG ; 2Ch
  2582                              <1> 	;add	dx, [NABMBAR]
  2583                              <1> 	;out	dx, eax
  2584                              <1> 
  2585                              <1> 	;call	delay1_4ms
  2586                              <1> 	; 23/11/2023 - temporary
  2587                              <1> 	;call	delay_100ms
  2588                              <1> 
  2589                              <1> 	; 10/06/2017
  2590 0001449E E838020000          <1> 	call 	reset_ac97_controller
  2591                              <1> 
  2592                              <1> 	; 21/11/2023
  2593                              <1> 	;call	delay1_4ms
  2594                              <1> 	; 21/11/2023 - temporary
  2595 000144A3 E8FAF8FFFF          <1> 	call	delay_100ms
  2596                              <1> 
  2597                              <1> ;	call 	setup_ac97_codec
  2598                              <1> ;
  2599                              <1> ;detect_ac97_codec:
  2600                              <1> ;	retn
  2601                              <1> 
  2602                              <1> setup_ac97_codec:
  2603                              <1> 	; 24/11/2023
  2604                              <1> 	; 19/11/2023 - TRDOS 386 v2.0.7
  2605 000144A8 C605[E48A0100]01    <1> 	mov	byte [VRA], 1
  2606                              <1> 
  2607                              <1> 	; 25/11/2023 - temporary
  2608                              <1> 	;jmp	short vra_not_supported
  2609                              <1> 
  2610                              <1> 	; 18/05/2024
  2611                              <1> 	;call	delay1_4ms
  2612 000144AF E8EEF8FFFF          <1> 	call	delay_100ms
  2613                              <1> 
  2614 000144B4 668B15[B48A0100]    <1> 	mov	dx, [NAMBAR]
  2615 000144BB 6683C228            <1> 	add	dx, CODEC_EXT_AUDIO_REG	; 28h
  2616 000144BF 66ED                <1> 	in	ax, dx
  2617                              <1> 
  2618                              <1> 	; 18/05/2024
  2619                              <1> 	; 02/12/2023
  2620                              <1> 	;call	delay1_4ms
  2621                              <1> 	; 17/05/2024
  2622 000144C1 E8DCF8FFFF          <1> 	call	delay_100ms 
  2623                              <1> 
  2624 000144C6 A801                <1> 	test	al, 1 ; BIT0 ; Variable Rate Audio bit
  2625 000144C8 7429                <1> 	jz	short vra_not_supported
  2626                              <1> 
  2627 000144CA 668B15[B48A0100]    <1> 	mov    	dx, [NAMBAR]
  2628 000144D1 6683C22A            <1> 	add    	dx, CODEC_EXT_AUDIO_CTRL_REG ; 2Ah
  2629 000144D5 66ED                <1> 	in     	ax, dx
  2630                              <1> 
  2631                              <1> 	; 02/12/2023
  2632                              <1> 	;call	delay1_4ms
  2633 000144D7 E8C6F8FFFF          <1> 	call	delay_100ms ; 18/05/2024
  2634                              <1> 
  2635 000144DC 24FD                <1> 	and	al, ~BIT1 ; Clear DRA
  2636 000144DE 0C01                <1> 	or	al, AC97_EA_VRA ; 1 ; 04/11/2023
  2637 000144E0 66EF                <1> 	out	dx, ax			; Enable variable rate audio
  2638                              <1> 
  2639                              <1> 	;mov	ecx, 10
  2640                              <1> 	; 21/11/2023
  2641 000144E2 B10A                <1> 	mov	cl, 10
  2642                              <1> check_vra:
  2643 000144E4 51                  <1> 	push	ecx
  2644 000144E5 E8B8F8FFFF          <1> 	call	delay_100ms
  2645 000144EA 59                  <1> 	pop	ecx
  2646                              <1> 
  2647 000144EB 66ED                <1> 	in	ax, dx
  2648                              <1> 
  2649                              <1> 	; 18/05/2024
  2650                              <1> 	; 02/12/2023
  2651                              <1> 	;call	delay1_4ms
  2652                              <1> 
  2653 000144ED A801                <1> 	test	al, AC97_EA_VRA ; 1
  2654 000144EF 7508                <1> 	jnz	short vra_ok
  2655                              <1> 
  2656 000144F1 E2F1                <1> 	loop	check_vra
  2657                              <1> 
  2658                              <1> vra_not_supported:	; 24/11/2023
  2659                              <1> 	; VRA is not usable
  2660                              <1> 	;mov	byte [VRA], 0
  2661 000144F3 FE0D[E48A0100]      <1> 	dec	byte [VRA]
  2662                              <1> vra_ok:
  2663                              <1> 	; 18/05/2024 - TRDOS 386 v2.0.8
  2664                              <1> 	; 20/11/2023
  2665                              <1> 	; 19/11/2023 - TRDOS 386 v2.0.7
  2666                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  2667                              <1> 	; 22/07/2020
  2668                              <1> 	; 10/06/2017
  2669                              <1> 	; 29/05/2017
  2670                              <1> 
  2671                              <1> 	; 18/05/2024
  2672                              <1> 	;call	delay1_4ms
  2673 000144F9 E8A4F8FFFF          <1> 	call	delay_100ms
  2674                              <1> 
  2675                              <1> 	;mov     eax, 0202h
  2676                              <1> 	; 21/11/2023
  2677                              <1> 	;mov	eax, 0B0Bh
  2678                              <1> 	; 23/11/2023
  2679 000144FE B81D1D0000          <1> 	mov	eax, 1D1Dh
  2680 00014503 66A3[E88A0100]      <1> 	mov	[audio_master_volume], ax
  2681                              <1> 	;mov	ax, 1F1Fh ; 31, 31
  2682                              <1> 
  2683                              <1> 	; 21/11/2023
  2684                              <1> 	;push	eax
  2685                              <1> 	
  2686                              <1> 	; 20/11/2023
  2687                              <1> 	;mov	ax, 0B0Bh
  2688                              <1> 	; 23/11/2023
  2689 00014509 66B80202            <1> 	mov	ax, 0202h
  2690                              <1> 
  2691 0001450D 668B15[B48A0100]    <1>   	mov     dx, [NAMBAR]
  2692 00014514 6683C202            <1>   	add     dx, CODEC_MASTER_VOL_REG	;02h
  2693                              <1> 	;xor	ax, ax 	; volume attenuation = 0 (max. volume)
  2694                              <1> 	; 06/08/2022
  2695                              <1> 	;xor	eax, eax
  2696                              <1> 	; 19/11/2023
  2697 00014518 66EF                <1> 	out     dx, ax
  2698                              <1> 
  2699                              <1> 	; 16/05/2024
  2700                              <1> 	; 20/11/2023
  2701                              <1>         ;call	delay1_4ms
  2702                              <1>         ;call	delay1_4ms
  2703                              <1>         ;call	delay1_4ms
  2704                              <1>         ;call	delay1_4ms
  2705                              <1> 	; 21/11/2023 temporary
  2706 0001451A E883F8FFFF          <1> 	call	delay_100ms ; 18/05/2024
  2707                              <1> 
  2708                              <1> 	; 21/11/2023
  2709                              <1> 	;pop	eax
  2710                              <1> 	
  2711                              <1> 	; 23/11/2023
  2712                              <1> 	; 21/11/2023
  2713                              <1> 	;mov	ax, 0202h
  2714                              <1> 
  2715 0001451F 668B15[B48A0100]    <1>   	mov     dx, [NAMBAR]
  2716 00014526 6683C218            <1>   	add     dx, CODEC_PCM_OUT_REG		;18h
  2717                              <1>   	;xor    ax, ax
  2718 0001452A 66EF                <1>   	out     dx, ax
  2719                              <1> 
  2720                              <1> 	; 16/05/2024
  2721                              <1> 	; 20/11/2023
  2722                              <1>         ;call	delay1_4ms
  2723                              <1>         ;call	delay1_4ms
  2724                              <1>         ;call	delay1_4ms
  2725                              <1>         ;call	delay1_4ms
  2726                              <1> 	; 21/11/2023 - temporary
  2727 0001452C E871F8FFFF          <1> 	call	delay_100ms ; 18/05/2024
  2728                              <1> 
  2729                              <1> ; 23/11/2023
  2730                              <1> %if 0
  2731                              <1>   	mov     dx, [NAMBAR]
  2732                              <1>   	add     dx, CODEC_MASTER_MONO_VOL_REG	;06h
  2733                              <1> 	;xor	ax, ax
  2734                              <1>   	out     dx, ax
  2735                              <1> 
  2736                              <1>         ;call	delay1_4ms
  2737                              <1>         ;call	delay1_4ms
  2738                              <1>         ;call	delay1_4ms
  2739                              <1> 	;call	delay1_4ms
  2740                              <1> 
  2741                              <1>   	mov     dx, [NAMBAR]
  2742                              <1>   	add     dx, CODEC_PCBEEP_VOL_REG	;0Ah
  2743                              <1>   	;xor    ax, ax
  2744                              <1>   	out     dx, ax
  2745                              <1> 
  2746                              <1>         ;call	delay1_4ms
  2747                              <1>         ;call	delay1_4ms
  2748                              <1>         ;call	delay1_4ms
  2749                              <1> 	;call	delay1_4ms
  2750                              <1> 
  2751                              <1> 	mov     ax, 8008h ; Mute
  2752                              <1>   	mov     dx, [NAMBAR]
  2753                              <1> 	; 22/07/2020
  2754                              <1> 	add	dx, CODEC_PHONE_VOL_REG		;0Ch
  2755                              <1> 				 ; AC97_PHONE_VOL ; TAD Input (Mono)
  2756                              <1>   	out     dx, ax
  2757                              <1> 
  2758                              <1>         ;call	delay1_4ms
  2759                              <1>         ;call	delay1_4ms
  2760                              <1>         ;call	delay1_4ms
  2761                              <1> 	;call	delay1_4ms
  2762                              <1> 
  2763                              <1>         mov	ax, 0808h
  2764                              <1>   	mov     dx, [NAMBAR]
  2765                              <1>         add	dx, CODEC_LINE_IN_VOL_REG ;10h ; Line Input (Stereo)
  2766                              <1>   	out     dx, ax
  2767                              <1> 
  2768                              <1>         ;call	delay1_4ms
  2769                              <1>         ;call	delay1_4ms
  2770                              <1>         ;call	delay1_4ms
  2771                              <1> 	;call	delay1_4ms
  2772                              <1> 
  2773                              <1> 	;mov	ax, 0808h
  2774                              <1>   	mov     dx, [NAMBAR]
  2775                              <1>         add	dx, CODEC_CD_VOL_REG ;12h ; CR Input (Stereo)
  2776                              <1>   	out     dx, ax
  2777                              <1> 
  2778                              <1>         ;call	delay1_4ms
  2779                              <1>         ;call	delay1_4ms
  2780                              <1>         ;call	delay1_4ms
  2781                              <1> 	;call	delay1_4ms
  2782                              <1> 
  2783                              <1> 	;mov	ax, 0808h
  2784                              <1>   	mov     dx, [NAMBAR]
  2785                              <1>         add	dx, CODEC_AUX_VOL_REG ;16h ; Aux Input (Stereo)
  2786                              <1>   	out     dx, ax
  2787                              <1> 
  2788                              <1>         ;call    delay1_4ms
  2789                              <1>         ;call    delay1_4ms
  2790                              <1>         ;call    delay1_4ms
  2791                              <1>         ;call    delay1_4ms
  2792                              <1> 
  2793                              <1> 	; 21/11/2023 - temporary
  2794                              <1> 	;call	delay_100ms
  2795                              <1> %endif
  2796                              <1> 	; 16/05/2024
  2797                              <1> 	;clc
  2798                              <1> 
  2799                              <1> set_volume_ok:
  2800                              <1> 
  2801                              <1> ;detect_ac97_codec:
  2802 00014531 C3                  <1> 	retn
  2803                              <1> 
  2804                              <1> set_ac97_bdl: ; Set AC97 (ICH) Buffer Descriptor List
  2805                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  2806                              <1> 	; 17/06/2017
  2807                              <1> 	; 11/06/2017
  2808                              <1> 	; 28/05/2017
  2809                              <1> 	; eax = dma buffer address = [audio_DMA_buff]
  2810                              <1> 	; ecx = dma buffer buffer size = [audio_dmabuff_size]
  2811                              <1> 
  2812 00014532 D1E9                <1> 	shr	ecx, 1 ; dma half buffer size
  2813 00014534 89CE                <1> 	mov	esi, ecx
  2814                              <1> 
  2815 00014536 BF[EC8A0100]        <1>         mov     edi, audio_bdl_buff	; get BDL address
  2816                              <1> 	;mov	ecx, 32 / 2		; make 32 entries in BDL
  2817                              <1> 	; 06/08/2022
  2818 0001453B 29C9                <1> 	sub	ecx, ecx
  2819 0001453D B110                <1> 	mov	cl, 16
  2820                              <1> 
  2821 0001453F EB05                <1> 	jmp	short s_ac97_bdl1 
  2822                              <1> 
  2823                              <1> s_ac97_bdl0:
  2824                              <1> 	; set buffer descriptor 0 to start of data file in memory
  2825                              <1> 
  2826 00014541 A1[D08A0100]        <1>  	mov	eax, [audio_dma_buff]	; Physical address of DMA buffer
  2827                              <1>  
  2828                              <1> s_ac97_bdl1:
  2829 00014546 AB                  <1> 	stosd				; store dmabuffer1 address
  2830                              <1> 
  2831 00014547 89C2                <1> 	mov	edx, eax
  2832                              <1> 
  2833                              <1> ;
  2834                              <1> ; Buffer Descriptors List
  2835                              <1> ; As stated earlier, each buffer descriptor list is a set of (up to) 32 
  2836                              <1> ; descriptors, each 8 bytes in length. Bytes 0-3 of a descriptor entry point
  2837                              <1> ; to a chunk of memory to either play from or record to. Bytes 4-7 of an
  2838                              <1> ; entry describe various control things detailed below.
  2839                              <1> ; 
  2840                              <1> ; Buffer pointers must always be aligned on a Dword boundry.
  2841                              <1> ;
  2842                              <1> 
  2843                              <1> ;IOC	equ     BIT31			; Fire an interrupt whenever this
  2844                              <1> 					; buffer is complete.
  2845                              <1> 
  2846                              <1> ;BUP	equ     BIT30			; Buffer Underrun Policy.
  2847                              <1> 					; if this buffer is the last buffer
  2848                              <1> 					; in a playback, fill the remaining
  2849                              <1> 					; samples with 0 (silence) or not.
  2850                              <1>   					; It's a good idea to set this to 1
  2851                              <1> 					; for the last buffer in playback,
  2852                              <1> 					; otherwise you're likely to get a lot
  2853                              <1> 					; of noise at the end of the sound.
  2854                              <1> 
  2855                              <1> ;
  2856                              <1> ; Bits 15:0 contain the length of the buffer, in number of samples, which
  2857                              <1> ; are 16 bits each, coupled in left and right pairs, or 32bits each.
  2858                              <1> ; Luckily for us, that's the same format as .wav files.
  2859                              <1> ;
  2860                              <1> ; A value of FFFF is 65536 samples. Running at 44.1Khz, that's just about
  2861                              <1> ; 1.5 seconds of sample time. FFFF * 32bits is 1FFFFh bytes or 128k of data.
  2862                              <1> ;
  2863                              <1> ; A value of 0 in these bits means play no samples.
  2864                              <1> ;
  2865                              <1> 
  2866 00014549 89F0                <1> 	mov	eax, esi ; DMA half buffer size
  2867 0001454B 01C2                <1> 	add	edx, eax
  2868 0001454D D1E8                <1> 	shr	eax, 1	; count of 16 bit samples
  2869                              <1> 	; 19/11/2023
  2870 0001454F 0D000000C0          <1> 	or	eax, IOC+BUP
  2871                              <1> 	;or	eax, IOC ; 11/06/2017
  2872 00014554 AB                  <1> 	stosd
  2873                              <1> 
  2874                              <1> ; 2nd buffer:
  2875                              <1> 
  2876 00014555 89D0                <1>         mov	eax, edx ; Physical address of the 2nd half of DMA buffer	
  2877 00014557 AB                  <1> 	stosd		 ; store dmabuffer2 address
  2878                              <1> 
  2879                              <1> ; set length to [audio_dmabuff_size]/2
  2880                              <1> ; Set control (bits 31:16) to BUP, bits 15:0=number of samples
  2881                              <1> ; 
  2882 00014558 89F0                <1> 	mov	eax, esi ; DMA half buffer size
  2883 0001455A D1E8                <1> 	shr	eax, 1 ; count of 16 bit samples
  2884                              <1> 	; 19/11/2023
  2885 0001455C 0D000000C0          <1> 	or	eax, IOC+BUP
  2886                              <1> 	;or	eax, IOC ; 11/06/2017
  2887 00014561 AB                  <1> 	stosd
  2888                              <1> 
  2889 00014562 E2DD                <1> 	loop    s_ac97_bdl0
  2890                              <1> 	
  2891 00014564 C3                  <1> 	retn
  2892                              <1> 
  2893                              <1> ac97_start_play:
  2894                              <1> 	; 26/11/2023
  2895                              <1> 	; 20/11/2023  
  2896                              <1> 	; 19/11/2023 - TRDOS 386 v2.0.7
  2897                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  2898                              <1> 	; 28/05/2017
  2899                              <1> 	; Derived from 'playWav' procedure in 'ICHWAV.ASM'
  2900                              <1> 	; .wav player for DOS by Jeff Leyda (02/09/2002)
  2901                              <1> 
  2902                              <1> 	; set output rate
  2903                              <1> 	; entry: [audio_freq] = desired sample rate
  2904                              <1> 
  2905                              <1> 	; 21/11/2023 - temporary
  2906                              <1> 	;call	ac97_codec_config
  2907                              <1> 
  2908                              <1> ; 20/11/2023
  2909                              <1> %if 0
  2910                              <1> 	AC97_EA_VRA equ 0001h ; 04/11/2023
  2911                              <1> 		
  2912                              <1> 	mov    	dx, [NAMBAR]               	
  2913                              <1> 	add    	dx, CODEC_EXT_AUDIO_CTRL_REG  	; 2Ah
  2914                              <1> 	in     	ax, dx
  2915                              <1> 	and	al, ~BIT1 ; Clear DRA
  2916                              <1> 	or	al, AC97_EA_VRA ; 1 ; 04/11/2023
  2917                              <1> 	out	dx, ax			; Enable variable rate audio
  2918                              <1> 
  2919                              <1>        ;call    delay1_4ms
  2920                              <1>        ;call    delay1_4ms
  2921                              <1>        ;call    delay1_4ms
  2922                              <1>        ;call    delay1_4ms
  2923                              <1> %endif
  2924                              <1> 
  2925                              <1> 	; 26/11/2023
  2926                              <1> 	; 24/11/2023 - temporary
  2927                              <1> 	;mov	ax, 48000
  2928                              <1> 
  2929                              <1> 	; 20/11/2023
  2930 00014565 803D[E48A0100]01    <1> 	cmp	byte [VRA], 1
  2931 0001456C 7218                <1> 	jb	short skip_set_rate
  2932                              <1> 
  2933 0001456E 66A1[E28A0100]      <1> 	mov	ax, [audio_freq]		; sample rate
  2934                              <1> 
  2935                              <1> ;skip_set_rate:	; 24/11/2023
  2936 00014574 668B15[B48A0100]    <1> 	mov    	dx, [NAMBAR]               	
  2937 0001457B 6683C22C            <1> 	add    	dx, CODEC_PCM_FRONT_DACRATE_REG	; 2Ch  	  
  2938 0001457F 66EF                <1> 	out	dx, ax 				; out sample rate
  2939                              <1> 	
  2940                              <1> 	; 27/11/2023	
  2941                              <1> 	;call	delay1_4ms
  2942                              <1> 	;call	delay1_4ms
  2943                              <1> 	;call	delay1_4ms
  2944                              <1> 	;call	delay1_4ms
  2945                              <1> 	; 27/11/2023 - temporary
  2946 00014581 E81CF8FFFF          <1> 	call	delay_100ms
  2947                              <1> 
  2948                              <1> 	; 26/11/2023
  2949                              <1> skip_set_rate:	; 20/11/2023
  2950                              <1> 
  2951                              <1> 	;; 23/11/2023 - temporary
  2952                              <1> 	;push	ebx
  2953                              <1> 	;mov	ebx, 0B8000h
  2954                              <1> 	;mov	al, 'x'
  2955                              <1> 	;mov	ah, 4Eh
  2956                              <1> 	;mov	[ebx], ax
  2957                              <1> 	;pop	ebx
  2958                              <1> ;
  2959                              <1> ; register reset the DMA engine. This may cause a pop noise on the output
  2960                              <1> ; lines when the device is reset. Prolly a better idea to mute output, then
  2961                              <1> ; reset.
  2962                              <1> ;
  2963                              <1> 	;; 21/11/2023 - temporary
  2964                              <1> 	;; 20/11/2023
  2965                              <1> 	;mov	dx, [NABMBAR]
  2966                              <1> 	;add	dx, PO_CR_REG			; set pointer to Cntl reg
  2967                              <1> 	;mov	al, RR				; set reset
  2968                              <1> 	;out	dx, al				; self clearing bit
  2969                              <1> 
  2970                              <1> 	; 23/11/2023 - temporary
  2971                              <1> 	;call	delay_100ms
  2972                              <1> 
  2973                              <1> ;	mov	edi, audio_bdl_buff
  2974                              <1> ;	mov	edx, [audio_dmabuff_size]
  2975                              <1> ;	shr	edx, 1
  2976                              <1> ;	mov	ecx, 32/2
  2977                              <1> ;ac97_set_bdl_buffer:
  2978                              <1> ;	; 1st half of DMA buffer
  2979                              <1> ;	mov	eax, [audio_dma_buff]
  2980                              <1> ;	push	eax
  2981                              <1> ;	stosd
  2982                              <1> ;	mov	eax, edx ; dma buffer size / 2
  2983                              <1> ;	or	eax, IOC+BUP
  2984                              <1> ;	stosd
  2985                              <1> ;	pop	eax
  2986                              <1> ;	; 2nd half of DMA buffer
  2987                              <1> ;	add	eax, edx
  2988                              <1> ;	stosd
  2989                              <1> ;	mov	eax, edx ; dma buffer size / 2
  2990                              <1> ;	or	eax, IOC+BUP
  2991                              <1> ;	stosd
  2992                              <1> ;	loop	ac97_set_bdl_buffer
  2993                              <1>  	
  2994                              <1> ; tell the DMA engine where to find our list of Buffer Descriptors.
  2995                              <1> ; this 32bit value is a flat mode memory offset (ie no segment:offset)
  2996                              <1> ;
  2997                              <1> ; write NABMBAR+10h with offset of buffer descriptor list
  2998                              <1> ;
  2999 00014586 B8[EC8A0100]        <1>         mov	eax, audio_bdl_buff
  3000 0001458B 668B15[B68A0100]    <1> 	mov	dx, [NABMBAR]
  3001 00014592 6683C210            <1> 	add	dx, PO_BDBAR_REG
  3002 00014596 EF                  <1> 	out	dx, eax
  3003                              <1> 
  3004                              <1> 	; 23/11/2023 - temporary
  3005 00014597 E806F8FFFF          <1> 	call	delay_100ms
  3006                              <1> ;
  3007                              <1> ; All set. Let's play some music.
  3008                              <1> ;
  3009                              <1> 	;mov	eax, 31
  3010                              <1> 	; 06/08/2022
  3011 0001459C 29C0                <1> 	sub	eax, eax
  3012 0001459E B01F                <1> 	mov	al, 31
  3013 000145A0 E842000000          <1> 	call    set_ac97_LastValidIndex
  3014                              <1> 
  3015                              <1> 	; 23/11/2023 - temporary
  3016 000145A5 E8F8F7FFFF          <1> 	call	delay_100ms
  3017                              <1> 
  3018 000145AA C605[E68A0100]01    <1> 	mov	byte [audio_play_cmd], 1 ; play command (do not stop) !
  3019                              <1> 
  3020                              <1> ac97_play: ; continue to play (after pause)
  3021                              <1> 	; 11/06/2017
  3022                              <1> 	; 29/05/2017
  3023                              <1> 	; 28/05/2017
  3024 000145B1 668B15[B68A0100]    <1>         mov     dx, [NABMBAR]
  3025 000145B8 6683C21B            <1>         add     dx, PO_CR_REG		; PCM out control register
  3026                              <1> 	; 26/11/2023
  3027 000145BC B011                <1> 	mov	al, IOCE+RPBM ; 29/05/2017
  3028                              <1> 	; 24/11/2023
  3029                              <1> 	;mov	al, 1Dh ; (Ref: KolibriOS, intelac97.asm, 'play:')
  3030 000145BE EE                  <1> 	out     dx, al			; set start!
  3031                              <1> 
  3032                              <1> 	;mov	byte [audio_play_cmd], 1 ; play command (do not stop) !
  3033                              <1> 
  3034                              <1> 	; 19/05/2024 - temporary
  3035                              <1> 	; 24/11/2023 - temporary
  3036 000145BF 66B80202            <1> 	mov	ax, 0202h	
  3037 000145C3 668B15[B48A0100]    <1> 	mov	dx, [NAMBAR]
  3038 000145CA 6683C202            <1>   	add	dx, CODEC_MASTER_VOL_REG  ; 02h ; Line Out 
  3039 000145CE 66EF                <1>   	out	dx, ax
  3040                              <1> 	; 19/05/2024 - temporary
  3041 000145D0 E8CDF7FFFF          <1> 	call	delay_100ms
  3042 000145D5 66B80202            <1> 	mov	ax, 0202h	
  3043 000145D9 668B15[B48A0100]    <1> 	mov	dx, [NAMBAR]
  3044 000145E0 6683C218            <1>   	add	dx, CODEC_PCM_OUT_REG ; 18h ; PCM Out 
  3045 000145E4 66EF                <1>   	out	dx, ax
  3046                              <1> 
  3047 000145E6 C3                  <1> 	retn
  3048                              <1> 
  3049                              <1> ;input AL = index # to stop on
  3050                              <1> set_ac97_LastValidIndex:
  3051                              <1> 	; 28/05/2017
  3052                              <1> 	; Derived from 'setLastValidIndex' procedure in 'ICHWAV.ASM'
  3053                              <1> 	; .wav player for DOS by Jeff Leyda (02/09/2002)
  3054 000145E7 668B15[B68A0100]    <1> 	mov	dx, [NABMBAR]
  3055 000145EE 6683C215            <1> 	add	dx, PO_LVI_REG
  3056 000145F2 EE                  <1>         out     dx, al
  3057                              <1> 	;mov	[audio_lvi], al ; for ac97_int_handler
  3058 000145F3 C3                  <1> 	retn
  3059                              <1> 
  3060                              <1> ac97_volume:
  3061                              <1> 	; 28/05/2017
  3062                              <1> 	; bl = component (0 = master/playback/lineout volume)
  3063                              <1> 	; cl = left channel volume level (0 to 31)
  3064                              <1> 	; ch = right channel volume level (0 to 31)
  3065                              <1> 
  3066 000145F4 08DB                <1> 	or	bl, bl
  3067 000145F6 7523                <1> 	jnz	short ac97_vol_1 ; temporary !
  3068 000145F8 66B81F1F            <1> 	mov	ax, 1F1Fh ; 31,31
  3069 000145FC 38C1                <1> 	cmp	cl, al
  3070 000145FE 771B                <1> 	ja	short ac97_vol_1 ; temporary !
  3071 00014600 38E5                <1> 	cmp	ch, ah
  3072 00014602 7717                <1> 	ja	short ac97_vol_1 ; temporary !
  3073 00014604 66890D[E88A0100]    <1> 	mov	[audio_master_volume], cx
  3074 0001460B 6629C8              <1> 	sub	ax, cx
  3075 0001460E 668B15[B48A0100]    <1>   	mov     dx, [NAMBAR]
  3076 00014615 6683C202            <1>   	add     dx, CODEC_MASTER_VOL_REG  ; 02h ; Line Out 
  3077 00014619 66EF                <1>   	out     dx, ax
  3078                              <1> ac97_vol_1:
  3079                              <1> 	; 21/11/2023
  3080                              <1> _ac97_ih5:	; 06/08/2022
  3081 0001461B C3                  <1> 	retn
  3082                              <1> 
  3083                              <1> ac97_int_handler:
  3084                              <1> 	; 16/05/2024 - TRDOS 386 v2.0.8
  3085                              <1> 	; 27/11/2023
  3086                              <1> 	; 24/11/2023
  3087                              <1> 	; 21/11/2023
  3088                              <1> 	; 20/11/2023 - TRDOS 386 v2.0.7
  3089                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  3090                              <1> 	; 12/10/2017
  3091                              <1> 	; 10/10/2017
  3092                              <1> 	; 09/10/2017
  3093                              <1> 	; 13/06/2017, 13/06/2017
  3094                              <1> 	; 10/06/2017, 11/06/2017
  3095                              <1> 	; Interrupt Handler for AC97 (ICH) Audio Controller
  3096                              <1> 	; Note: called by 'dev_IRQ_service' 
  3097                              <1> 	; 28/05/2017
  3098                              <1> 
  3099                              <1> 	;push	eax ; * must be saved !
  3100                              <1> 	;push	edx
  3101                              <1> 	;push	ecx
  3102                              <1> 	;push	ebx ; * must be saved !
  3103                              <1> 	;push	esi
  3104                              <1> 	;push	edi
  3105                              <1> 
  3106                              <1> 	;cmp	byte [audio_busy], 1
  3107                              <1> 	;jnb	_ac97_ih2 ; busy !
  3108                              <1> 
  3109                              <1> 	; 24/11/2023
  3110                              <1>         ;mov	dx, [NABMBAR]
  3111                              <1> 	;add	dx, PO_SR_REG ; 16/05/2024
  3112                              <1> 	;in	ax, dx
  3113                              <1> 	;test	al, BCIS ; bit 3, 8
  3114                              <1> 	;jz	short _ac97_ih5
  3115                              <1> 
  3116                              <1> ; 16/05/2024
  3117                              <1> %if 0
  3118                              <1> 	; 24/11/2023
  3119                              <1> 	mov	dx, GLOB_STS_REG
  3120                              <1>         add	dx, [NABMBAR]
  3121                              <1> 	in	eax, dx
  3122                              <1> 
  3123                              <1> 	cmp	eax, 0FFFFFFFFh ; -1
  3124                              <1> 	;je	_ac97_ih3 ; exit
  3125                              <1> 	; 06/08/2022
  3126                              <1> 	je	short _ac97_ih5
  3127                              <1> 
  3128                              <1> 	;test	eax, 40h ; PCM Out Interrupt
  3129                              <1> 	; 06/08/2022
  3130                              <1> 	test	al, 40h
  3131                              <1> 	jnz	short _ac97_ih0
  3132                              <1> 
  3133                              <1> 	; 24/11/2023
  3134                              <1> 	test	eax, eax
  3135                              <1> 	;jz	_ac97_ih3 ; exit
  3136                              <1> 	; 06/08/2022
  3137                              <1> 	jz	short _ac97_ih5
  3138                              <1> 
  3139                              <1>  	;mov	dx, GLOB_STS_REG
  3140                              <1>         ;add	dx, [NABMBAR]
  3141                              <1> 	out	dx, eax
  3142                              <1> 	
  3143                              <1> 	;jmp	_ac97_ih3 ; exit
  3144                              <1> 	
  3145                              <1> 	; 06/08/2022
  3146                              <1> 	retn
  3147                              <1> 	; 21/11/2023
  3148                              <1> 	;jmp	short _ac97_ih5
  3149                              <1> 
  3150                              <1> _ac97_ih0:
  3151                              <1> 	; 24/11/2023
  3152                              <1> 	;push	eax
  3153                              <1> 	; 09/10/2017
  3154                              <1> 	cmp	byte [audio_play_cmd], 1
  3155                              <1> 	;jb	short _ac97_ih4 ; stop command !
  3156                              <1> 	; 24/11/2023
  3157                              <1> 	jnb	short _ac97_ih4
  3158                              <1> 
  3159                              <1> 	;mov	dx, GLOB_STS_REG
  3160                              <1>         ;add	dx, [NABMBAR]
  3161                              <1> 	out	dx, eax
  3162                              <1> 	;jmp	short _ac97_stop
  3163                              <1> 
  3164                              <1> %endif
  3165                              <1> 
  3166                              <1> ; 16/05/2024
  3167                              <1> %if 1
  3168                              <1> 	; 16/05/2024
  3169                              <1> 	; (Ref: 'PLAYMOD3.ASM', 16/05/2024, Erdogan Tan)
  3170                              <1> 	; 24/11/2023 (TRDOS386 'audio.s')
  3171                              <1> 	
  3172 0001461C 668B15[B68A0100]    <1> 	mov	dx, [NABMBAR]
  3173 00014623 6683C216            <1> 	add	dx, PO_SR_REG
  3174 00014627 66ED                <1> 	in	ax, dx
  3175                              <1> 
  3176 00014629 803D[E68A0100]01    <1> 	cmp	byte [audio_play_cmd], 1
  3177 00014630 7219                <1> 	jb	short _ac97_stop ; stop command !
  3178                              <1> 
  3179 00014632 A808                <1> 	test	al, BCIS ; bit 3, 8
  3180 00014634 7540                <1> 	jnz	short _ac97_ih4	; Buffer Completion Interrupt
  3181                              <1> 
  3182 00014636 66BA1600            <1> 	mov	dx, PO_SR_REG
  3183 0001463A 660315[B68A0100]    <1>         add	dx, [NABMBAR]
  3184 00014641 66EF                <1> 	out	dx, ax
  3185 00014643 C3                  <1> 	retn	
  3186                              <1> 
  3187                              <1> %endif
  3188                              <1> 
  3189                              <1> 	; 24/11/2023
  3190                              <1> ac97_stop: 
  3191                              <1> 	; 28/05/2017
  3192 00014644 C605[E68A0100]00    <1> 	mov	byte [audio_play_cmd], 0 ; stop !
  3193                              <1> _ac97_stop: ; 09/10/2017
  3194                              <1> 	; 29/05/2017
  3195                              <1> 	;mov	dx, [NABMBAR]
  3196                              <1> 	;add	dx, PO_CR_REG
  3197                              <1> 	;mov	al, 0
  3198                              <1> 	;out	dx, al
  3199                              <1> 
  3200                              <1> 	; 11/06/2017
  3201 0001464B 30C0                <1> 	xor	al, al ; 0
  3202 0001464D E813000000          <1> 	call	ac97_po_cmd
  3203                              <1> 
  3204                              <1> 	; (Ref: KolibriOS, intelac97.asm, 'stop:')
  3205                              <1> 	; Clear FIFOE, BCIS, LVBCI (Ref: Intel ICH hub manual)
  3206 00014652 66B81C00            <1> 	mov     ax, 1Ch
  3207 00014656 668B15[B68A0100]    <1> 	mov     dx, [NABMBAR]
  3208 0001465D 6683C216            <1> 	add     dx, PO_SR_REG
  3209 00014661 66EF                <1> 	out     dx, ax
  3210                              <1> 
  3211                              <1> 	;retn
  3212                              <1> 
  3213                              <1> 	; 11/06/2017
  3214 00014663 B002                <1> 	mov     al, RR
  3215                              <1> ac97_po_cmd:
  3216                              <1> 	 ;11/06/2017
  3217                              <1> 	; 29/05/2017
  3218 00014665 668B15[B68A0100]    <1> 	mov     dx, [NABMBAR]
  3219 0001466C 6683C21B            <1>         add     dx, PO_CR_REG		; PCM out control register
  3220 00014670 EE                  <1> 	out	dx, al
  3221 00014671 C3                  <1> 	retn
  3222                              <1> 
  3223                              <1> ac97_pause:
  3224                              <1> 	; 11/06/2017
  3225                              <1> 	; 29/05/2017
  3226 00014672 B010                <1> 	mov 	al, IOCE
  3227 00014674 EBEF                <1> 	jmp	short ac97_po_cmd
  3228                              <1> 
  3229                              <1> _ac97_ih4:
  3230                              <1> 	;mov	byte [audio_busy], 1
  3231                              <1> 
  3232                              <1> ; 16/05/2024
  3233                              <1> %if 0
  3234                              <1> 	; 24/11/2023
  3235                              <1> 	push	eax
  3236                              <1> 
  3237                              <1> 	mov	ax, 1Ch ; FIFOE(=16)+BCIS(=8)+LVBCI(=4)
  3238                              <1> 	mov	dx, PO_SR_REG
  3239                              <1>         add	dx, [NABMBAR]
  3240                              <1> 	out	dx, ax
  3241                              <1> 
  3242                              <1> 	mov	dx, PO_CIV_REG
  3243                              <1>         add	dx, [NABMBAR]
  3244                              <1> 	in	al, dx
  3245                              <1> 
  3246                              <1> 	;cmp	al, [audio_civ] ; [audio_flag]
  3247                              <1> 	;je	short _ac97_ih2
  3248                              <1> 
  3249                              <1> 	; 21/11/2023
  3250                              <1> 	;mov	[audio_civ], al
  3251                              <1> 	; 20/11/2023
  3252                              <1> 	mov	ah, al
  3253                              <1> 	dec	al
  3254                              <1> 	;inc	al ; 11/06/2017
  3255                              <1> 	and	al, 1Fh
  3256                              <1> 
  3257                              <1>         mov     dx, PO_LVI_REG
  3258                              <1>         add	dx, [NABMBAR]
  3259                              <1>         out	dx, al
  3260                              <1> 
  3261                              <1> 	; 12/10/2017
  3262                              <1> 	;mov	al, [audio_civ]
  3263                              <1> 	;inc	al
  3264                              <1> 	;and	al, 1
  3265                              <1> 	;mov	[audio_flag], al 
  3266                              <1> 	; 27/11/2023
  3267                              <1> 	; 20/11/2023
  3268                              <1> 	;inc	ah
  3269                              <1> 	and	ah, 1
  3270                              <1> 	mov	[audio_flag], ah
  3271                              <1> %endif
  3272                              <1> 
  3273                              <1> ; 16/05/2024
  3274                              <1> %if 1
  3275                              <1> 	; 16/05/2024
  3276                              <1> 	; (Ref: 'PLAYMOD3.ASM', 16/05/2024, Erdogan Tan)
  3277                              <1> 
  3278 00014676 50                  <1> 	push	eax ; *
  3279                              <1> 
  3280                              <1> 	; 13/05/2024
  3281 00014677 66BA1400            <1> 	mov	dx, PO_CIV_REG
  3282 0001467B 660315[B68A0100]    <1>         add	dx, [NABMBAR]
  3283 00014682 EC                  <1> 	in	al, dx
  3284 00014683 88C4                <1> 	mov	ah, al
  3285 00014685 FEC8                <1> 	dec	al
  3286 00014687 241F                <1> 	and	al, 1Fh
  3287 00014689 66BA1500            <1>         mov     dx, PO_LVI_REG
  3288 0001468D 660315[B68A0100]    <1>         add	dx, [NABMBAR]
  3289 00014694 EE                  <1>         out	dx, al
  3290 00014695 80E401              <1> 	and	ah, 1
  3291 00014698 80E401              <1> 	and	ah, 1
  3292 0001469B 8825[D88A0100]      <1> 	mov	[audio_flag], ah ; 0 = Buffer 1, 1 = Buffer 2
  3293                              <1> %endif
  3294                              <1> 	;; [audio_flag] : 0 = Buffer 1, 1 = Buffer 2
  3295                              <1> 	;
  3296                              <1> 	; 21/11/2023
  3297                              <1> 	;call	ac97_tuneloop
  3298                              <1> 
  3299                              <1> 	; 24/11/2023
  3300                              <1> ac97_tuneloop:
  3301                              <1> 	; 09/10/2017
  3302 000146A1 8B3D[D08A0100]      <1> 	mov	edi, [audio_dma_buff]
  3303 000146A7 8B0D[D48A0100]      <1> 	mov	ecx, [audio_dmabuff_size]
  3304 000146AD D1E9                <1> 	shr	ecx, 1 ; dma buff size / 2 = half buffer size
  3305                              <1> 
  3306                              <1> 	; 12/10/2017
  3307 000146AF 803D[D88A0100]00    <1> 	cmp 	byte [audio_flag], 0
  3308 000146B6 7702                <1> 	ja	short _ac97_ih1  ; Playing Half Buffer 2 (Current: FLAG)
  3309                              <1> 	; Playing Half Buffer 1 (Current: EOL)	
  3310 000146B8 01CF                <1> 	add	edi, ecx
  3311                              <1> _ac97_ih1: 
  3312                              <1> 	; Update half buffer 2 while playing half buffer 1 (next: FLAG)
  3313                              <1> 	; Update half buffer 1 while playing half buffer 2 (next: EOL)
  3314                              <1> 
  3315 000146BA 8B35[C88A0100]      <1> 	mov	esi, [audio_p_buffer] ; phy addr of audio buff
  3316 000146C0 C1E902              <1> 	shr	ecx, 2 ; half buff size / 4
  3317 000146C3 F3A5                <1> 	rep	movsd 
  3318                              <1> 
  3319                              <1> 	; 10/10/2017
  3320                              <1> 	; switch flag value
  3321 000146C5 8035[D88A0100]01    <1> 	xor	byte [audio_flag], 1
  3322                              <1> 
  3323                              <1> 	; 27/11/2023
  3324                              <1> 	; 21/11/2023 - temporary
  3325                              <1> 	;push	ebx
  3326                              <1> 	;mov	ebx, 0B8002h
  3327                              <1> 	;mov	al, [audio_flag]
  3328                              <1> 	;add	al, '1'
  3329                              <1> 	;mov	ah, 0Fh
  3330                              <1> 	;mov	[ebx], ax
  3331                              <1> 	;pop	ebx
  3332                              <1> 	
  3333                              <1> 	; 12/10/2017
  3334                              <1> 	; [audio_flag] = 0 : Playing dma half buffer 2 (even index value)
  3335                              <1> 			   ; Next buffer (to update) is dma half buff 1
  3336                              <1> 	; 	       = 1 : Playing dma half buffer 1 (odd index value)
  3337                              <1> 			   ; Next buffer (to update) is dma half buff 2
  3338                              <1> 	; 24/11/2023
  3339                              <1> 	;retn
  3340                              <1> 
  3341                              <1> 	;
  3342                              <1> 	; 24/11/2023
  3343 000146CC 58                  <1> 	pop	eax ; *
  3344                              <1> 	
  3345                              <1> 	; 16/05/2024
  3346                              <1> 	;; 24/11/2023
  3347                              <1> 	;; 20/11/2023
  3348                              <1> 	;;and	eax, 40h
  3349                              <1>         ;mov	dx, [NABMBAR]
  3350                              <1> 	;add	dx, GLOB_STS_REG
  3351                              <1> 	;out	dx, eax
  3352                              <1> 
  3353                              <1> 	;; 13/06/2017
  3354                              <1> 	;mov	al, 11h ; IOCE + RPBM
  3355                              <1> 	;mov	dx, PO_CR_REG
  3356                              <1>         ;add	dx, [NABMBAR]
  3357                              <1> 	;out	dx, al
  3358                              <1> 
  3359                              <1> 	; 16/05/2024
  3360                              <1> 	; 24/11/2023
  3361 000146CD 668B15[B68A0100]    <1> 	mov	dx, [NABMBAR]
  3362 000146D4 6683C216            <1> 	add	dx, PO_SR_REG	; set pointer to Status reg
  3363                              <1> 	;mov	ax, 1Ch
  3364 000146D8 66EF                <1> 	out	dx, ax
  3365                              <1> 
  3366                              <1> 	; 24/11/2023	
  3367                              <1> _ac97_ih2:
  3368                              <1> 	;mov	byte [audio_busy], 0
  3369                              <1> _ac97_ih3:
  3370                              <1> 	;pop	edi
  3371                              <1> 	;pop	esi
  3372                              <1> 	;pop	ebx ; * must be restored !
  3373                              <1> 	;pop	ecx
  3374                              <1> 	;pop	edx
  3375                              <1> 	;pop	eax ; * must be restored !
  3376                              <1> 
  3377 000146DA C3                  <1> 	retn
  3378                              <1> 
  3379                              <1> reset_ac97_controller:
  3380                              <1> 	; 16/05/2024
  3381                              <1> 	; 10/06/2017
  3382                              <1> 	; 29/05/2017
  3383                              <1> 	; 28/05/2017
  3384                              <1> 	; reset AC97 audio controller registers
  3385 000146DB 31C0                <1> 	xor     eax, eax
  3386 000146DD 66BA0B00            <1>         mov	dx, PI_CR_REG
  3387 000146E1 660315[B68A0100]    <1> 	add	dx, [NABMBAR]
  3388 000146E8 EE                  <1> 	out     dx, al
  3389                              <1> 
  3390                              <1> 	; 16/05/2024
  3391 000146E9 E8C1F6FFFF          <1> 	call	delay1_4ms
  3392                              <1> 
  3393 000146EE 66BA1B00            <1>         mov     dx, PO_CR_REG
  3394 000146F2 660315[B68A0100]    <1> 	add	dx, [NABMBAR]
  3395 000146F9 EE                  <1> 	out     dx, al
  3396                              <1> 
  3397                              <1> 	; 16/05/2024
  3398 000146FA E8B0F6FFFF          <1> 	call	delay1_4ms
  3399                              <1> 
  3400 000146FF 66BA2B00            <1>         mov     dx, MC_CR_REG
  3401 00014703 660315[B68A0100]    <1> 	add	dx, [NABMBAR]
  3402 0001470A EE                  <1> 	out     dx, al
  3403                              <1> 
  3404                              <1> 	; 16/05/2024
  3405 0001470B E89FF6FFFF          <1> 	call	delay1_4ms
  3406                              <1> 
  3407 00014710 B002                <1>         mov     al, RR
  3408 00014712 66BA0B00            <1>         mov     dx, PI_CR_REG
  3409 00014716 660315[B68A0100]    <1> 	add	dx, [NABMBAR]
  3410 0001471D EE                  <1> 	out     dx, al
  3411                              <1> 
  3412                              <1> 	; 16/05/2024
  3413 0001471E E88CF6FFFF          <1> 	call	delay1_4ms
  3414                              <1> 
  3415 00014723 66BA1B00            <1>         mov     dx, PO_CR_REG
  3416 00014727 660315[B68A0100]    <1> 	add	dx, [NABMBAR]
  3417 0001472E EE                  <1> 	out     dx, al
  3418                              <1> 
  3419                              <1> 	; 16/05/2024
  3420 0001472F E87BF6FFFF          <1> 	call	delay1_4ms
  3421                              <1> 
  3422 00014734 66BA2B00            <1>         mov     dx, MC_CR_REG
  3423 00014738 660315[B68A0100]    <1> 	add	dx, [NABMBAR]
  3424 0001473F EE                  <1> 	out     dx, al
  3425                              <1> 
  3426                              <1> 	; 16/05/2024
  3427 00014740 E86AF6FFFF          <1> 	call	delay1_4ms
  3428                              <1> 
  3429 00014745 C3                  <1> 	retn
  3430                              <1> 
  3431                              <1> ac97_reset:
  3432                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  3433                              <1> 	; 10/06/2017
  3434                              <1> 	; 29/05/2017
  3435                              <1> 	; 28/05/2017
  3436 00014746 E890FFFFFF          <1> 	call	reset_ac97_controller
  3437                              <1> 	; 29/05/2017
  3438                              <1> 	;jmp	reset_ac97_codec
  3439                              <1> reset_ac97_codec:
  3440                              <1> 	; 28/05/2017 - Erdogan Tan (Ref: KolibriOS, intelac97.asm)
  3441 0001474B 66BA2C00            <1> 	mov	dx, GLOB_CNT_REG ; 2Ch
  3442 0001474F 660315[B68A0100]    <1> 	add	dx, [NABMBAR]
  3443 00014756 ED                  <1> 	in	eax, dx
  3444                              <1> 
  3445                              <1> 	;test	eax, 2
  3446                              <1> 	; 06/08/2022
  3447 00014757 A802                <1> 	test	al, 2
  3448 00014759 7407                <1> 	jz	short _r_ac97codec_cold	
  3449                              <1> 
  3450 0001475B E80F000000          <1> 	call	warm_ac97codec_reset
  3451 00014760 7308                <1> 	jnc	short _r_ac97codec_ok
  3452                              <1> _r_ac97codec_cold:
  3453 00014762 E83B000000          <1>         call    cold_ac97codec_reset
  3454 00014767 7301                <1>         jnc     short _r_ac97codec_ok
  3455                              <1> 	
  3456                              <1> 	; 16/04/2017
  3457                              <1>         ;xor	eax, eax	; timeout error
  3458                              <1>        	;stc
  3459 00014769 C3                  <1> 	retn
  3460                              <1> 
  3461                              <1> _r_ac97codec_ok:
  3462 0001476A 31C0                <1>         xor     eax, eax
  3463                              <1>         ;mov	al, VIA_ACLINK_C00_READY ; 1
  3464 0001476C FEC0                <1>         inc	al
  3465 0001476E C3                  <1> 	retn
  3466                              <1> 
  3467                              <1> warm_ac97codec_reset:
  3468                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  3469                              <1> 	; 28/05/2017 - Erdogan Tan (Ref: KolibriOS, intelac97.asm)
  3470                              <1>         ;mov	eax, 6
  3471                              <1> 	; 06/08/2022
  3472 0001476F 29C0                <1> 	sub	eax, eax
  3473 00014771 B006                <1> 	mov	al, 6
  3474 00014773 66BA2C00            <1> 	mov	dx, GLOB_CNT_REG ; 2Ch
  3475 00014777 660315[B68A0100]    <1> 	add	dx, [NABMBAR]
  3476 0001477E EF                  <1> 	out	dx, eax
  3477                              <1> 
  3478                              <1> 	;mov	ecx, 10	; total 1s
  3479                              <1> 	; 06/08/2022
  3480 0001477F 31C9                <1> 	xor	ecx, ecx
  3481 00014781 B10A                <1> 	mov	cl, 10
  3482                              <1> _warm_ac97c_rst_wait:
  3483 00014783 51                  <1> 	push	ecx
  3484 00014784 E819F6FFFF          <1> 	call	delay_100ms
  3485 00014789 59                  <1> 	pop	ecx
  3486                              <1> 
  3487 0001478A 66BA3000            <1> 	mov	dx, GLOB_STS_REG ; 30h
  3488 0001478E 660315[B68A0100]    <1> 	add	dx, [NABMBAR]
  3489 00014795 ED                  <1> 	in	eax, dx
  3490                              <1> 
  3491 00014796 A900030010          <1> 	test	eax, CTRL_ST_CREADY
  3492 0001479B 7504                <1> 	jnz	short _warm_ac97c_rst_ok
  3493                              <1> 
  3494 0001479D 49                  <1>         dec     ecx
  3495 0001479E 75E3                <1>         jnz     short _warm_ac97c_rst_wait
  3496                              <1> 
  3497                              <1> _warm_ac97c_rst_fail:
  3498 000147A0 F9                  <1>         stc
  3499                              <1> _warm_ac97c_rst_ok:
  3500 000147A1 C3                  <1> 	retn
  3501                              <1> 
  3502                              <1> cold_ac97codec_reset:
  3503                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  3504                              <1> 	; 28/05/2017 - Erdogan Tan (Ref: KolibriOS, intelac97.asm)
  3505                              <1>         ;mov	eax, 2
  3506                              <1> 	; 06/08/2022
  3507 000147A2 31C0                <1> 	xor	eax, eax
  3508 000147A4 B002                <1> 	mov	al, 2
  3509 000147A6 66BA2C00            <1> 	mov	dx, GLOB_CNT_REG ; 2Ch
  3510 000147AA 660315[B68A0100]    <1> 	add	dx, [NABMBAR]
  3511 000147B1 EF                  <1> 	out	dx, eax
  3512                              <1> 
  3513 000147B2 E8EBF5FFFF          <1> 	call	delay_100ms 	; wait 100 ms
  3514 000147B7 E8E6F5FFFF          <1> 	call	delay_100ms 	; wait 100 ms
  3515 000147BC E8E1F5FFFF          <1> 	call	delay_100ms 	; wait 100 ms
  3516 000147C1 E8DCF5FFFF          <1> 	call	delay_100ms 	; wait 100 ms
  3517                              <1> 
  3518                              <1> 	;mov	ecx, 16	; total 20*100 ms = 2s
  3519                              <1> 	; 06/08/2022
  3520 000147C6 31C9                <1> 	xor	ecx, ecx
  3521 000147C8 B110                <1> 	mov	cl, 16
  3522                              <1> _cold_ac97c_rst_wait:
  3523 000147CA 66BA3000            <1> 	mov	dx, GLOB_STS_REG ; 30h
  3524 000147CE 660315[B68A0100]    <1> 	add	dx, [NABMBAR]
  3525 000147D5 ED                  <1> 	in	eax, dx
  3526                              <1> 
  3527 000147D6 A900030010          <1> 	test	eax, CTRL_ST_CREADY
  3528 000147DB 750B                <1> 	jnz	short _cold_ac97c_rst_ok
  3529                              <1> 
  3530 000147DD 51                  <1> 	push	ecx
  3531 000147DE E8BFF5FFFF          <1> 	call	delay_100ms
  3532 000147E3 59                  <1> 	pop	ecx
  3533                              <1> 
  3534 000147E4 49                  <1>         dec     ecx
  3535 000147E5 75E3                <1>         jnz     short _cold_ac97c_rst_wait
  3536                              <1> 
  3537                              <1> _cold_ac97c_rst_fail:
  3538 000147E7 F9                  <1>         stc
  3539                              <1> _cold_ac97c_rst_ok:
  3540 000147E8 C3                  <1> 	retn
  3541                              <1> 
  3542                              <1> sb16_current_sound_data:
  3543                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  3544                              <1> 	; 20/08/2017
  3545                              <1> 	; 24/06/2017
  3546                              <1> 	; 22/06/2017
  3547                              <1> 	; get current sound (PCM out) data for graphics
  3548                              <1> 	; (for Sound Blaster 16)
  3549                              <1> 	; ebx = Physical address (on page boundary)
  3550                              <1> 	; ecx = Byte count
  3551                              <1> 	; [audio_buff_size]
  3552                              <1> 
  3553                              <1> 	;;mov	edi, [audio_buff_size]
  3554                              <1> 	;mov	edi, [audio_dmabuff_size]
  3555                              <1> 	;mov	esi, [audio_dma_buff]
  3556 000147E9 39CF                <1> 	cmp	edi, ecx
  3557 000147EB 7302                <1> 	jnb	short sb16_gcd_0
  3558 000147ED 89F9                <1> 	mov	ecx, edi
  3559                              <1> sb16_gcd_0:
  3560                              <1> 	; 06/08/2022
  3561 000147EF 31C0                <1> 	xor	eax, eax
  3562                              <1> 	; 20/08/2017
  3563 000147F1 803D[E08A0100]10    <1> 	cmp	byte [audio_bps], 16
  3564 000147F8 750C                <1> 	jne	short sb16_gcd_1 ; 8 bit DMA channel
  3565 000147FA E4C6                <1> 	in	al, 0C6h ; DMA channel 5 count register
  3566                              <1> 	;mov	dl, al
  3567                              <1> 	; 06/08/2022
  3568 000147FC 88C4                <1> 	mov	ah, al
  3569 000147FE E4C6                <1> 	in	al, 0C6h
  3570                              <1> 	;mov	dh, al
  3571                              <1> 	;movzx	eax, dx
  3572                              <1> 	; 06/08/2022
  3573 00014800 86E0                <1> 	xchg	ah, al
  3574 00014802 D1E0                <1> 	shl	eax, 1 ; word count -> byte count
  3575 00014804 EB4A                <1> 	jmp	short sb16_gcd_2	
  3576                              <1> sb16_gcd_1:
  3577 00014806 E403                <1> 	in	al, 03h ; DMA channel 1 count register
  3578                              <1> 	;mov	dl, al
  3579                              <1> 	; 06/08/2022
  3580 00014808 88C4                <1> 	mov	ah, al
  3581 0001480A E403                <1> 	in	al, 03h
  3582                              <1> 	;mov	dh, al
  3583                              <1> 	;movzx	eax, dx
  3584                              <1> 	; 06/08/2022
  3585 0001480C 86E0                <1> 	xchg	ah, al
  3586 0001480E EB40                <1> 	jmp	short sb16_gcd_2
  3587                              <1> ;sb16_gcd_2:	
  3588                              <1> ;	cmp	eax, ecx
  3589                              <1> ;	jnb	short sb16_gcd_3 
  3590                              <1> ;	; remain count < graphics bytes
  3591                              <1> ;	mov	eax, ecx ; fix remain count to data size
  3592                              <1> ;sb16_gcd_3:	
  3593                              <1> ;	sub	edi, eax
  3594                              <1> ;	jna	short sb16_gcd_4
  3595                              <1> ;	add	esi, edi ; dma buffer offset
  3596                              <1> ;sb16_gcd_4:
  3597                              <1> ;	mov	edi, ebx ; buffer address (for graphics) 
  3598                              <1> ;	mov	[u.r0], ecx
  3599                              <1> ;	rep	movsb
  3600                              <1> ;	retn
  3601                              <1> 
  3602                              <1> get_current_sound_data:
  3603                              <1> 	; 24/06/2017
  3604                              <1> 	; 22/06/2017
  3605                              <1> 	; get current sound (PCM out) data for graphics
  3606                              <1> 	;
  3607                              <1> 	; ebx = Physical address (on page boundary)
  3608                              <1> 	; ecx = Byte count
  3609                              <1> 	; [audio_buff_size]
  3610                              <1> 
  3611                              <1> 	;mov	edi, [audio_buff_size]
  3612 00014810 8B3D[D48A0100]      <1> 	mov	edi, [audio_dmabuff_size]
  3613 00014816 8B35[D08A0100]      <1> 	mov	esi, [audio_dma_buff]
  3614 0001481C 803D[B18A0100]02    <1> 	cmp	byte [audio_device], 2
  3615 00014823 72C4                <1> 	jb	short sb16_current_sound_data ; = 1
  3616 00014825 D1EF                <1> 	shr	edi, 1
  3617 00014827 39CF                <1> 	cmp	edi, ecx
  3618 00014829 7302                <1> 	jnb	short gcd_0
  3619 0001482B 89F9                <1> 	mov	ecx, edi
  3620                              <1> gcd_0:
  3621 0001482D 803D[B18A0100]03    <1> 	cmp	byte [audio_device], 3
  3622 00014834 7231                <1> 	jb	short ac97_current_sound_data ; = 2
  3623                              <1> 	; = 3
  3624                              <1> vt8233_current_sound_data:
  3625                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  3626                              <1> 	; 22/06/2017
  3627                              <1> 	; 21/06/2017
  3628                              <1> 	; get current sound (PCM out) data for graphics
  3629                              <1> 	; (for VT 8233, VT 8237R)
  3630                              <1> 	; ebx = Physical address (on page boundary)
  3631                              <1> 	; ecx = Byte count
  3632                              <1> 	; [audio_buff_size]
  3633                              <1> 	
  3634                              <1> 	;;mov	edi, [audio_buff_size]
  3635                              <1> 	;mov	edi, [audio_dmabuff_size]
  3636                              <1> 	;mov	esi, [audio_dma_buff]
  3637                              <1> 	;shr	edi, 1
  3638                              <1> 	;cmp	edi, ecx
  3639                              <1> 	;jnb	short vt8233_gcd_1
  3640                              <1> 	;mov	ecx, edi
  3641                              <1> vt8233_gcd_1:
  3642                              <1> 	;mov	edx, VIA_REG_OFFSET_CURR_COUNT
  3643                              <1> 	; 06/08/2022
  3644 00014836 31D2                <1> 	xor	edx, edx
  3645 00014838 B20C                <1> 	mov	dl, VIA_REG_OFFSET_CURR_COUNT
  3646 0001483A E8C3F5FFFF          <1> 	call	ctrl_io_r32
  3647 0001483F 89C2                <1> 	mov	edx, eax ; remain count (bits 23-0),
  3648                              <1> 			 ; SGD index (bits 31-24) 
  3649 00014841 81E200000001        <1> 	and	edx, 1000000h ; SGD index (0 = 1st half)
  3650 00014847 7402                <1> 	jz	short vt8233_gcd_2
  3651                              <1> 	; the second half of DMA buffer
  3652 00014849 01FE                <1> 	add	esi, edi 
  3653                              <1> vt8233_gcd_2:	
  3654 0001484B 25FFFFFF00          <1> 	and	eax, 0FFFFFFh ; bits 23-0
  3655                              <1> ac97_gcd_2:
  3656                              <1> sb16_gcd_2:
  3657 00014850 39C8                <1> 	cmp	eax, ecx
  3658 00014852 7302                <1> 	jnb	short vt8233_gcd_3 
  3659                              <1> 	; remain count < graphics bytes
  3660 00014854 89C8                <1> 	mov	eax, ecx ; fix remain count to data size
  3661                              <1> vt8233_gcd_3:
  3662 00014856 29C7                <1> 	sub	edi, eax
  3663 00014858 7602                <1> 	jna	short vt8233_gcd_4
  3664 0001485A 01FE                <1> 	add	esi, edi ; dma buffer offset
  3665                              <1> vt8233_gcd_4:
  3666 0001485C 89DF                <1> 	mov	edi, ebx ; buffer address (for graphics) 
  3667 0001485E 890D[20900100]      <1> 	mov	[u.r0], ecx
  3668 00014864 F3A4                <1> 	rep	movsb
  3669                              <1> vt8233_gcd_5:
  3670 00014866 C3                  <1> 	retn
  3671                              <1> 
  3672                              <1> ac97_current_sound_data:
  3673                              <1> 	; 23/06/2017
  3674                              <1> 	; 22/06/2017
  3675                              <1> 	; get current sound (PCM out) data for graphics
  3676                              <1> 	; (for AC'97, ICH)
  3677                              <1> 	; ebx = Physical address (on page boundary)
  3678                              <1> 	; ecx = Byte count
  3679                              <1> 	; [audio_buff_size]
  3680                              <1> 	
  3681                              <1> 	;;mov	edi, [audio_buff_size]
  3682                              <1> 	;mov	edi, [audio_dmabuff_size]
  3683                              <1> 	;mov	esi, [audio_dma_buff]
  3684                              <1> 	;shr	edi, 1
  3685                              <1> 	;cmp	edi, ecx
  3686                              <1> 	;jnb	short ac97_gcd_0
  3687                              <1> 	;mov	ecx, edi
  3688                              <1> ac97_gcd_0:
  3689 00014867 66BA1400            <1> 	mov	dx, PO_CIV_REG ; Position In Current Buff Reg
  3690 0001486B 660315[B68A0100]    <1> 	add	dx, [NABMBAR]
  3691 00014872 EC                  <1> 	in	al, dx ; current index value
  3692 00014873 A801                <1> 	test	al, 1
  3693 00014875 7402                <1> 	jz	short ac97_gcd_1
  3694 00014877 01FE                <1> 	add	esi, edi
  3695                              <1> ac97_gcd_1:
  3696 00014879 31C0                <1> 	xor	eax, eax
  3697 0001487B 66BA1800            <1> 	mov	dx, PO_PICB_REG ; Position In Current Buff Reg
  3698 0001487F 660315[B68A0100]    <1> 	add	dx, [NABMBAR]
  3699 00014886 66ED                <1> 	in	ax, dx ; remain dwords
  3700 00014888 C1E002              <1> 	shl	eax, 2 ; remain bytes ; 23/06/2017 
  3701 0001488B EBC3                <1> 	jmp	short ac97_gcd_2
  3702                              <1> ;	cmp	eax, ecx
  3703                              <1> ;	jnb	short ac97_gcd_2 
  3704                              <1> ;	; remain count < graphics bytes
  3705                              <1> ;	mov	eax, ecx ; fix remain count to data size
  3706                              <1> ;ac97_gcd_2:	
  3707                              <1> ;	sub	edi, eax
  3708                              <1> ;	jna	short ac97_gcd_3
  3709                              <1> ;	add	esi, edi ; dma buffer offset
  3710                              <1> ;ac97_gcd_3:
  3711                              <1> ;	mov	edi, ebx ; buffer address (for graphics) 
  3712                              <1> ;	mov	[u.r0], ecx
  3713                              <1> ;	rep	movsb
  3714                              <1> ;	retn
  3715                              <1> 
  3716                              <1> sb16_get_dma_buff_off:
  3717                              <1> 	; 28/10/2017
  3718                              <1> 	; 24/06/2017
  3719                              <1> 	; 22/06/2017
  3720                              <1> 	; get current (PCM OUT DMA buffer) pointer
  3721                              <1> 	; (for Sound Blaster 16)
  3722                              <1> 
  3723                              <1> 	;mov	ecx, [audio_dmabuff_size]
  3724                              <1> 	;xor	ebx, ebx
  3725                              <1> 	;shr	ecx, 1
  3726                              <1> sb16_gdmabo_0:
  3727                              <1> 	; 28/10/2017
  3728 0001488D 803D[E08A0100]10    <1> 	cmp	byte [audio_bps], 16
  3729 00014894 750F                <1> 	jne	short sb16_gdmabo_1 ; 8 bit DMA channel
  3730                              <1> 	; 16 bit DMA channel
  3731 00014896 E4C6                <1> 	in	al, 0C6h ; DMA channel 5 count register
  3732 00014898 88C2                <1> 	mov	dl, al	
  3733 0001489A E4C6                <1> 	in	al, 0C6h
  3734 0001489C 88C6                <1> 	mov     dh, al
  3735 0001489E 0FB7C2              <1> 	movzx	eax, dx
  3736 000148A1 D1E0                <1> 	shl	eax, 1 ; word count -> byte count
  3737 000148A3 EB3C                <1> 	jmp	short sb16_gdmabo_2	
  3738                              <1> sb16_gdmabo_1:
  3739 000148A5 E403                <1> 	in	al, 03h ; DMA channel 1 count register
  3740 000148A7 88C2                <1> 	mov	dl, al	
  3741 000148A9 E403                <1> 	in	al, 03h
  3742 000148AB 88C6                <1> 	mov     dh, al
  3743 000148AD 0FB7C2              <1> 	movzx	eax, dx
  3744 000148B0 EB2F                <1> 	jmp	short sb16_gdmabo_2
  3745                              <1> 
  3746                              <1> get_dma_buffer_offset:
  3747                              <1> 	; 24/06/2017
  3748                              <1> 	; 22/06/2017
  3749                              <1> 	; get current sound (PCM out) data for graphics
  3750                              <1> 	;
  3751                              <1> 	; ebx = Physical address (on page boundary)
  3752                              <1> 	; ecx = Byte count
  3753                              <1> 	; [audio_buff_size]
  3754                              <1> 
  3755 000148B2 8B0D[D48A0100]      <1> 	mov	ecx, [audio_dmabuff_size]
  3756 000148B8 31DB                <1> 	xor	ebx, ebx
  3757                              <1> gdmabo_0:
  3758 000148BA 803D[B18A0100]02    <1> 	cmp	byte [audio_device], 2
  3759 000148C1 72CA                <1> 	jb	short sb16_get_dma_buff_off
  3760 000148C3 7429                <1> 	je	short ac97_get_dma_buff_off
  3761                              <1> 
  3762                              <1> vt8233_get_dma_buff_off:
  3763                              <1> 	; 06/08/2022 - TRDOS 386 v2.0.5
  3764                              <1> 	; 24/06/2017
  3765                              <1> 	; 22/06/2017
  3766                              <1> 	; get current (PCM OUT DMA buffer) pointer
  3767                              <1> 	; (for VT 8233, VT 8237R)
  3768                              <1> 	
  3769                              <1> 	;mov	ecx, [audio_dmabuff_size]
  3770                              <1> 	;xor	ebx, ebx
  3771 000148C5 D1E9                <1> 	shr	ecx, 1
  3772                              <1> vt8233_gdmabo_0:
  3773                              <1> 	;mov	edx, VIA_REG_OFFSET_CURR_COUNT
  3774                              <1> 	; 06/08/2022
  3775 000148C7 31D2                <1> 	xor	edx, edx
  3776 000148C9 B20C                <1> 	mov	dl, VIA_REG_OFFSET_CURR_COUNT
  3777 000148CB E832F5FFFF          <1> 	call	ctrl_io_r32
  3778 000148D0 89C2                <1> 	mov	edx, eax ; remain count (bits 23-0),
  3779                              <1> 			 ; SGD index (bits 31-24) 
  3780 000148D2 81E200000001        <1> 	and	edx, 1000000h ; SGD index (0 = 1st half)
  3781 000148D8 7402                <1> 	jz	short vt8233_gdmabo_1
  3782                              <1> 	; the second half of DMA buffer
  3783 000148DA 89CB                <1> 	mov	ebx, ecx 
  3784                              <1> vt8233_gdmabo_1:	
  3785 000148DC 25FFFFFF00          <1> 	and	eax, 0FFFFFFh ; bits 23-0
  3786                              <1> sb16_gdmabo_2:
  3787                              <1> ac97_gdmabo_2:
  3788 000148E1 29C1                <1> 	sub	ecx, eax
  3789 000148E3 7602                <1> 	jna	short vt8233_gdmabo_2
  3790 000148E5 01CB                <1> 	add	ebx, ecx ; dma buffer offset
  3791                              <1> vt8233_gdmabo_2:
  3792 000148E7 891D[20900100]      <1> 	mov	[u.r0], ebx
  3793 000148ED C3                  <1> 	retn
  3794                              <1> 
  3795                              <1> ac97_get_dma_buff_off:
  3796                              <1> 	; 24/06/2017
  3797                              <1> 	; 22/06/2017
  3798                              <1> 	; get current (PCM OUT DMA buffer) pointer
  3799                              <1> 	; (for AC'97, ICH)
  3800                              <1> 	; ebx = Physical address (on page boundary)
  3801                              <1> 	; ecx = Byte count
  3802                              <1> 	; [audio_buff_size]
  3803                              <1> 	
  3804                              <1> 	;mov	ecx, [audio_dmabuff_size]
  3805                              <1> 	;xor	ebx, ebx
  3806 000148EE D1E9                <1> 	shr	ecx, 1
  3807                              <1> ac97_gdmabo_0:
  3808 000148F0 66BA1400            <1> 	mov	dx, PO_CIV_REG ; Position In Current Buff Reg
  3809 000148F4 660315[B68A0100]    <1> 	add	dx, [NABMBAR]
  3810 000148FB EC                  <1> 	in	al, dx ; current index value
  3811 000148FC A801                <1> 	test	al, 1
  3812 000148FE 7402                <1> 	jz	short ac97_gdmabo_1
  3813 00014900 89CB                <1> 	mov	ebx, ecx
  3814                              <1> ac97_gdmabo_1:
  3815 00014902 31C0                <1> 	xor	eax, eax
  3816 00014904 66BA1800            <1> 	mov	dx, PO_PICB_REG ; Position In Current Buff Reg
  3817 00014908 660315[B68A0100]    <1> 	add	dx, [NABMBAR]
  3818 0001490F 66ED                <1> 	in	ax, dx ; remain dwords
  3819 00014911 EBCE                <1> 	jmp	short ac97_gdmabo_2
  3820                              <1> 
  3821                              <1> ac97_codec_info:
  3822                              <1> 	; 19/11/2023
  3823                              <1> 	; ENTRY: none
  3824                              <1> 	; RETURN: 
  3825                              <1> 	;	eax = Extended Audio ID (MX28) in ax
  3826                              <1> 	;	 ax bit 0 - VRA bit
  3827                              <1> 	;	 hw of eax = PCM output sample rate (48000)
  3828                              <1> 	;	ebx = VENDOR ID 1, VENDOR ID 2 (bx)
  3829                              <1> 	;	cf = 1 -> error
  3830                              <1> 
  3831 00014913 668B15[B48A0100]    <1> 	mov	dx, [NAMBAR]
  3832 0001491A 6683C226            <1> 	add	dx, CODEC_POWER_CTRL_REG ; 26h
  3833 0001491E 66ED                <1> 	in	ax, dx
  3834 00014920 240F                <1> 	and	al, 0Fh
  3835 00014922 7518                <1> 	jnz	short ac97_c_inf_1
  3836 00014924 E879F4FFFF          <1> 	call	delay_100ms
  3837 00014929 66ED                <1> 	in	ax, dx
  3838 0001492B 240F                <1> 	and	al, 0Fh
  3839 0001492D 750D                <1> 	jnz	short ac97_c_inf_1
  3840 0001492F E86EF4FFFF          <1> 	call	delay_100ms
  3841 00014934 66ED                <1> 	in	ax, dx
  3842 00014936 240F                <1> 	and	al, 0Fh
  3843 00014938 7502                <1> 	jnz	short ac97_c_inf_1
  3844 0001493A F9                  <1> 	stc
  3845 0001493B C3                  <1> 	retn
  3846                              <1> ac97_c_inf_1:
  3847 0001493C 668B15[B48A0100]    <1> 	mov	dx, [NAMBAR]
  3848 00014943 6683C22C            <1> 	add	dx, CODEC_PCM_FRONT_DACRATE_REG 
  3849 00014947 66ED                <1> 	in	ax, dx	; PCM Output Sample Rate
  3850                              <1> 			; 48000 Hz
  3851 00014949 C1E010              <1> 	shl	eax, 16
  3852 0001494C E851F4FFFF          <1> 	call	delay_100ms
  3853 00014951 668B15[B48A0100]    <1> 	mov	dx, [NAMBAR]
  3854 00014958 6683C228            <1> 	add	dx, CODEC_EXT_AUDIO_REG ; 28h
  3855 0001495C 66ED                <1> 	in	ax, dx
  3856 0001495E 50                  <1> 	push	eax
  3857 0001495F E83EF4FFFF          <1> 	call	delay_100ms
  3858 00014964 668B15[B48A0100]    <1> 	mov	dx, [NAMBAR]
  3859 0001496B 6683C27C            <1> 	add	dx, CODEC_VENDOR_ID1
  3860 0001496F 66ED                <1> 	in	ax, dx
  3861 00014971 C1E010              <1> 	shl	eax, 16
  3862 00014974 668B15[B48A0100]    <1> 	mov	dx, [NAMBAR]
  3863 0001497B 6683C27E            <1> 	add	dx, CODEC_VENDOR_ID2
  3864 0001497F 66ED                <1> 	in	ax, dx
  3865 00014981 89C3                <1> 	mov	ebx, eax
  3866 00014983 58                  <1> 	pop	eax
  3867 00014984 C3                  <1> 	retn
  3868                              <1> 
  3869                              <1> ; 19/11/2023
  3870                              <1> ; Valid ICH device IDs
  3871                              <1> 
  3872                              <1> valid_ids:
  3873 00014985 86801524            <1> dd	(ICH_DID << 16) + INTEL_VID  	 ; 8086h:2415h 
  3874 00014989 86802524            <1> dd	(ICH0_DID << 16) + INTEL_VID 	 ; 8086h:2425h 
  3875 0001498D 86804524            <1> dd	(ICH2_DID << 16) + INTEL_VID 	 ; 8086h:2445h 
  3876 00014991 86808524            <1> dd	(ICH3_DID << 16) + INTEL_VID 	 ; 8086h:2485h 
  3877 00014995 8680C524            <1> dd	(ICH4_DID << 16) + INTEL_VID 	 ; 8086h:24C5h
  3878 00014999 8680D524            <1> dd	(ICH5_DID << 16) + INTEL_VID 	 ; 8086h:24D5h
  3879 0001499D 86806E26            <1> dd	(ICH6_DID << 16) + INTEL_VID 	 ; 8086h:266Eh
  3880 000149A1 8680A625            <1> dd	(ESB6300_DID << 16) + INTEL_VID  ; 8086h:25A6h
  3881 000149A5 86809826            <1> dd	(ESB631X_DID << 16) + INTEL_VID  ; 8086h:2698h
  3882 000149A9 8680DE27            <1> dd	(ICH7_DID << 16) + INTEL_VID 	 ; 8086h:27DEh
  3883 000149AD 86809571            <1> dd	(MX82440_DID << 16) + INTEL_VID  ; 8086h:7195h
  3884 000149B1 39101270            <1> dd	(SI7012_DID << 16)  + SIS_VID	 ; 1039h:7012h
  3885 000149B5 DE10B101            <1> dd 	(NFORCE_DID << 16)  + NVIDIA_VID ; 10DEh:01B1h
  3886 000149B9 DE106A00            <1> dd 	(NFORCE2_DID << 16) + NVIDIA_VID ; 10DEh:006Ah
  3887 000149BD 22106D74            <1> dd 	(AMD8111_DID << 16) + AMD_VID 	 ; 1022h:746Dh
  3888 000149C1 22104574            <1> dd 	(AMD768_DID << 16)  + AMD_VID 	 ; 1022h:7445h
  3889 000149C5 DE105900            <1> dd 	(CK804_DID << 16) + NVIDIA_VID	 ; 10DEh:0059h
  3890 000149C9 DE103A00            <1> dd 	(MCP04_DID << 16) + NVIDIA_VID	 ; 10DEh:003Ah
  3891 000149CD DE108A00            <1> dd 	(CK8_DID << 16) + NVIDIA_VID	 ; 1022h:008Ah
  3892 000149D1 DE10DA00            <1> dd 	(NFORCE3_DID << 16) + NVIDIA_VID ; 10DEh:00DAh
  3893 000149D5 DE10EA00            <1> dd 	(CK8S_DID << 16) + NVIDIA_VID	 ; 10DEh:00EAh
  3894                              <1> 
  3895                              <1> valid_id_count:	equ ($ - valid_ids)>>2 ; 19/11/2023
  3776                                  
  3777 000149D9 90<rep 3h>              align 4
  3778                                  
  3779                                  %include 'vgadata.s' ; 04/07/2016
     1                              <1> ; ****************************************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.3 - vgadata.s  (palette and font data)
     3                              <1> ; -----------------------------------------------------------------------------
     4                              <1> ; Last Update: 01/01/2021
     5                              <1> ; -----------------------------------------------------------------------------
     6                              <1> ; Beginning: 16/01/2016
     7                              <1> ; -----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.15 (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> ; 25/11/2020 (TRDOS 386 v2.0.3)
    25                              <1> ; ('vgatables.h' - 30/12/2019 - vruppert)
    26                              <1>  
    27                              <1> ; 04/07/2016
    28                              <1> ; COLOR DATA
    29                              <1> 
    30                              <1> palette0: ; (63+1)*3
    31 000149DC 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    31 000149E5 00000000000000      <1>
    32 000149EC 00000000000000002A- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah
    32 000149F5 2A2A2A2A2A2A2A      <1>
    33 000149FC 2A2A2A2A2A2A2A2A2A- <1>     db  02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah
    33 00014A05 2A2A2A2A2A2A2A      <1>
    34 00014A0C 2A2A2A2A2A2A2A2A2A- <1>     db  02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah
    34 00014A15 2A2A2A2A2A2A2A      <1>
    35 00014A1C 2A2A2A2A2A2A2A2A3F- <1>     db  02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh
    35 00014A25 3F3F3F3F3F3F3F      <1>
    36 00014A2C 3F3F3F3F3F3F3F3F3F- <1>     db  03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh
    36 00014A35 3F3F3F3F3F3F3F      <1>
    37 00014A3C 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    37 00014A45 00000000000000      <1>
    38 00014A4C 00000000000000002A- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah
    38 00014A55 2A2A2A2A2A2A2A      <1>
    39 00014A5C 2A2A2A2A2A2A2A2A2A- <1>     db  02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah
    39 00014A65 2A2A2A2A2A2A2A      <1>
    40 00014A6C 2A2A2A2A2A2A2A2A2A- <1>     db  02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah
    40 00014A75 2A2A2A2A2A2A2A      <1>
    41 00014A7C 2A2A2A2A2A2A2A2A3F- <1>     db  02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 02ah, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh
    41 00014A85 3F3F3F3F3F3F3F      <1>
    42 00014A8C 3F3F3F3F3F3F3F3F3F- <1>     db  03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh, 03fh
    42 00014A95 3F3F3F3F3F3F3F      <1>
    43                              <1> palette1: ; (63+1)*3	
    44 00014A9C 00000000002A002A00- <1>     db  000h, 000h, 000h, 000h, 000h, 02ah, 000h, 02ah, 000h, 000h, 02ah, 02ah, 02ah, 000h, 000h, 02ah
    44 00014AA5 002A2A2A00002A      <1>
    45 00014AAC 002A2A15002A2A2A00- <1>     db  000h, 02ah, 02ah, 015h, 000h, 02ah, 02ah, 02ah, 000h, 000h, 000h, 000h, 000h, 02ah, 000h, 02ah
    45 00014AB5 000000002A002A      <1>
    46 00014ABC 00002A2A2A00002A00- <1>     db  000h, 000h, 02ah, 02ah, 02ah, 000h, 000h, 02ah, 000h, 02ah, 02ah, 015h, 000h, 02ah, 02ah, 02ah
    46 00014AC5 2A2A15002A2A2A      <1>
    47 00014ACC 15151515153F153F15- <1>     db  015h, 015h, 015h, 015h, 015h, 03fh, 015h, 03fh, 015h, 015h, 03fh, 03fh, 03fh, 015h, 015h, 03fh
    47 00014AD5 153F3F3F15153F      <1>
    48 00014ADC 153F3F3F153F3F3F15- <1>     db  015h, 03fh, 03fh, 03fh, 015h, 03fh, 03fh, 03fh, 015h, 015h, 015h, 015h, 015h, 03fh, 015h, 03fh
    48 00014AE5 151515153F153F      <1>
    49 00014AEC 15153F3F3F15153F15- <1>     db  015h, 015h, 03fh, 03fh, 03fh, 015h, 015h, 03fh, 015h, 03fh, 03fh, 03fh, 015h, 03fh, 03fh, 03fh
    49 00014AF5 3F3F3F153F3F3F      <1>
    50 00014AFC 00000000002A002A00- <1>     db  000h, 000h, 000h, 000h, 000h, 02ah, 000h, 02ah, 000h, 000h, 02ah, 02ah, 02ah, 000h, 000h, 02ah
    50 00014B05 002A2A2A00002A      <1>
    51 00014B0C 002A2A15002A2A2A00- <1>     db  000h, 02ah, 02ah, 015h, 000h, 02ah, 02ah, 02ah, 000h, 000h, 000h, 000h, 000h, 02ah, 000h, 02ah
    51 00014B15 000000002A002A      <1>
    52 00014B1C 00002A2A2A00002A00- <1>     db  000h, 000h, 02ah, 02ah, 02ah, 000h, 000h, 02ah, 000h, 02ah, 02ah, 015h, 000h, 02ah, 02ah, 02ah
    52 00014B25 2A2A15002A2A2A      <1>
    53 00014B2C 15151515153F153F15- <1>     db  015h, 015h, 015h, 015h, 015h, 03fh, 015h, 03fh, 015h, 015h, 03fh, 03fh, 03fh, 015h, 015h, 03fh
    53 00014B35 153F3F3F15153F      <1>
    54 00014B3C 153F3F3F153F3F3F15- <1>     db  015h, 03fh, 03fh, 03fh, 015h, 03fh, 03fh, 03fh, 015h, 015h, 015h, 015h, 015h, 03fh, 015h, 03fh
    54 00014B45 151515153F153F      <1>
    55 00014B4C 15153F3F3F15153F15- <1>     db  015h, 015h, 03fh, 03fh, 03fh, 015h, 015h, 03fh, 015h, 03fh, 03fh, 03fh, 015h, 03fh, 03fh, 03fh
    55 00014B55 3F3F3F153F3F3F      <1>
    56                              <1> palette2: ; (63+1)*3
    57 00014B5C 00000000002A002A00- <1>     db  000h, 000h, 000h, 000h, 000h, 02ah, 000h, 02ah, 000h, 000h, 02ah, 02ah, 02ah, 000h, 000h, 02ah
    57 00014B65 002A2A2A00002A      <1>
    58 00014B6C 002A2A2A002A2A2A00- <1>     db  000h, 02ah, 02ah, 02ah, 000h, 02ah, 02ah, 02ah, 000h, 000h, 015h, 000h, 000h, 03fh, 000h, 02ah
    58 00014B75 001500003F002A      <1>
    59 00014B7C 15002A3F2A00152A00- <1>     db  015h, 000h, 02ah, 03fh, 02ah, 000h, 015h, 02ah, 000h, 03fh, 02ah, 02ah, 015h, 02ah, 02ah, 03fh
    59 00014B85 3F2A2A152A2A3F      <1>
    60 00014B8C 00150000152A003F00- <1>     db  000h, 015h, 000h, 000h, 015h, 02ah, 000h, 03fh, 000h, 000h, 03fh, 02ah, 02ah, 015h, 000h, 02ah
    60 00014B95 003F2A2A15002A      <1>
    61 00014B9C 152A2A3F002A3F2A00- <1>     db  015h, 02ah, 02ah, 03fh, 000h, 02ah, 03fh, 02ah, 000h, 015h, 015h, 000h, 015h, 03fh, 000h, 03fh
    61 00014BA5 151500153F003F      <1>
    62 00014BAC 15003F3F2A15152A15- <1>     db  015h, 000h, 03fh, 03fh, 02ah, 015h, 015h, 02ah, 015h, 03fh, 02ah, 03fh, 015h, 02ah, 03fh, 03fh
    62 00014BB5 3F2A3F152A3F3F      <1>
    63 00014BBC 15000015002A152A00- <1>     db  015h, 000h, 000h, 015h, 000h, 02ah, 015h, 02ah, 000h, 015h, 02ah, 02ah, 03fh, 000h, 000h, 03fh
    63 00014BC5 152A2A3F00003F      <1>
    64 00014BCC 002A3F2A003F2A2A15- <1>     db  000h, 02ah, 03fh, 02ah, 000h, 03fh, 02ah, 02ah, 015h, 000h, 015h, 015h, 000h, 03fh, 015h, 02ah
    64 00014BD5 001515003F152A      <1>
    65 00014BDC 15152A3F3F00153F00- <1>     db  015h, 015h, 02ah, 03fh, 03fh, 000h, 015h, 03fh, 000h, 03fh, 03fh, 02ah, 015h, 03fh, 02ah, 03fh
    65 00014BE5 3F3F2A153F2A3F      <1>
    66 00014BEC 15150015152A153F00- <1>     db  015h, 015h, 000h, 015h, 015h, 02ah, 015h, 03fh, 000h, 015h, 03fh, 02ah, 03fh, 015h, 000h, 03fh
    66 00014BF5 153F2A3F15003F      <1>
    67 00014BFC 152A3F3F003F3F2A15- <1>     db  015h, 02ah, 03fh, 03fh, 000h, 03fh, 03fh, 02ah, 015h, 015h, 015h, 015h, 015h, 03fh, 015h, 03fh
    67 00014C05 151515153F153F      <1>
    68 00014C0C 15153F3F3F15153F15- <1>     db  015h, 015h, 03fh, 03fh, 03fh, 015h, 015h, 03fh, 015h, 03fh, 03fh, 03fh, 015h, 03fh, 03fh, 03fh
    68 00014C15 3F3F3F153F3F3F      <1>
    69                              <1> palette3: ; 256*3
    70 00014C1C 00000000002A002A00- <1>     db  000h, 000h, 000h, 000h, 000h, 02ah, 000h, 02ah, 000h, 000h, 02ah, 02ah, 02ah, 000h, 000h, 02ah
    70 00014C25 002A2A2A00002A      <1>
    71 00014C2C 002A2A15002A2A2A15- <1>     db  000h, 02ah, 02ah, 015h, 000h, 02ah, 02ah, 02ah, 015h, 015h, 015h, 015h, 015h, 03fh, 015h, 03fh
    71 00014C35 151515153F153F      <1>
    72 00014C3C 15153F3F3F15153F15- <1>     db  015h, 015h, 03fh, 03fh, 03fh, 015h, 015h, 03fh, 015h, 03fh, 03fh, 03fh, 015h, 03fh, 03fh, 03fh
    72 00014C45 3F3F3F153F3F3F      <1>
    73 00014C4C 000000050505080808- <1>     db  000h, 000h, 000h, 005h, 005h, 005h, 008h, 008h, 008h, 00bh, 00bh, 00bh, 00eh, 00eh, 00eh, 011h
    73 00014C55 0B0B0B0E0E0E11      <1>
    74 00014C5C 11111414141818181C- <1>     db  011h, 011h, 014h, 014h, 014h, 018h, 018h, 018h, 01ch, 01ch, 01ch, 020h, 020h, 020h, 024h, 024h
    74 00014C65 1C1C2020202424      <1>
    75 00014C6C 242828282D2D2D3232- <1>     db  024h, 028h, 028h, 028h, 02dh, 02dh, 02dh, 032h, 032h, 032h, 038h, 038h, 038h, 03fh, 03fh, 03fh
    75 00014C75 323838383F3F3F      <1>
    76 00014C7C 00003F10003F1F003F- <1>     db  000h, 000h, 03fh, 010h, 000h, 03fh, 01fh, 000h, 03fh, 02fh, 000h, 03fh, 03fh, 000h, 03fh, 03fh
    76 00014C85 2F003F3F003F3F      <1>
    77 00014C8C 002F3F001F3F00103F- <1>     db  000h, 02fh, 03fh, 000h, 01fh, 03fh, 000h, 010h, 03fh, 000h, 000h, 03fh, 010h, 000h, 03fh, 01fh
    77 00014C95 00003F10003F1F      <1>
    78 00014C9C 003F2F003F3F002F3F- <1>     db  000h, 03fh, 02fh, 000h, 03fh, 03fh, 000h, 02fh, 03fh, 000h, 01fh, 03fh, 000h, 010h, 03fh, 000h
    78 00014CA5 001F3F00103F00      <1>
    79 00014CAC 003F00003F10003F1F- <1>     db  000h, 03fh, 000h, 000h, 03fh, 010h, 000h, 03fh, 01fh, 000h, 03fh, 02fh, 000h, 03fh, 03fh, 000h
    79 00014CB5 003F2F003F3F00      <1>
    80 00014CBC 2F3F001F3F00103F1F- <1>     db  02fh, 03fh, 000h, 01fh, 03fh, 000h, 010h, 03fh, 01fh, 01fh, 03fh, 027h, 01fh, 03fh, 02fh, 01fh
    80 00014CC5 1F3F271F3F2F1F      <1>
    81 00014CCC 3F371F3F3F1F3F3F1F- <1>     db  03fh, 037h, 01fh, 03fh, 03fh, 01fh, 03fh, 03fh, 01fh, 037h, 03fh, 01fh, 02fh, 03fh, 01fh, 027h
    81 00014CD5 373F1F2F3F1F27      <1>
    82 00014CDC 3F1F1F3F271F3F2F1F- <1>     db  03fh, 01fh, 01fh, 03fh, 027h, 01fh, 03fh, 02fh, 01fh, 03fh, 037h, 01fh, 03fh, 03fh, 01fh, 037h
    82 00014CE5 3F371F3F3F1F37      <1>
    83 00014CEC 3F1F2F3F1F273F1F1F- <1>     db  03fh, 01fh, 02fh, 03fh, 01fh, 027h, 03fh, 01fh, 01fh, 03fh, 01fh, 01fh, 03fh, 027h, 01fh, 03fh
    83 00014CF5 3F1F1F3F271F3F      <1>
    84 00014CFC 2F1F3F371F3F3F1F37- <1>     db  02fh, 01fh, 03fh, 037h, 01fh, 03fh, 03fh, 01fh, 037h, 03fh, 01fh, 02fh, 03fh, 01fh, 027h, 03fh
    84 00014D05 3F1F2F3F1F273F      <1>
    85 00014D0C 2D2D3F312D3F362D3F- <1>     db  02dh, 02dh, 03fh, 031h, 02dh, 03fh, 036h, 02dh, 03fh, 03ah, 02dh, 03fh, 03fh, 02dh, 03fh, 03fh
    85 00014D15 3A2D3F3F2D3F3F      <1>
    86 00014D1C 2D3A3F2D363F2D313F- <1>     db  02dh, 03ah, 03fh, 02dh, 036h, 03fh, 02dh, 031h, 03fh, 02dh, 02dh, 03fh, 031h, 02dh, 03fh, 036h
    86 00014D25 2D2D3F312D3F36      <1>
    87 00014D2C 2D3F3A2D3F3F2D3A3F- <1>     db  02dh, 03fh, 03ah, 02dh, 03fh, 03fh, 02dh, 03ah, 03fh, 02dh, 036h, 03fh, 02dh, 031h, 03fh, 02dh
    87 00014D35 2D363F2D313F2D      <1>
    88 00014D3C 2D3F2D2D3F312D3F36- <1>     db  02dh, 03fh, 02dh, 02dh, 03fh, 031h, 02dh, 03fh, 036h, 02dh, 03fh, 03ah, 02dh, 03fh, 03fh, 02dh
    88 00014D45 2D3F3A2D3F3F2D      <1>
    89 00014D4C 3A3F2D363F2D313F00- <1>     db  03ah, 03fh, 02dh, 036h, 03fh, 02dh, 031h, 03fh, 000h, 000h, 01ch, 007h, 000h, 01ch, 00eh, 000h
    89 00014D55 001C07001C0E00      <1>
    90 00014D5C 1C15001C1C001C1C00- <1>     db  01ch, 015h, 000h, 01ch, 01ch, 000h, 01ch, 01ch, 000h, 015h, 01ch, 000h, 00eh, 01ch, 000h, 007h
    90 00014D65 151C000E1C0007      <1>
    91 00014D6C 1C00001C07001C0E00- <1>     db  01ch, 000h, 000h, 01ch, 007h, 000h, 01ch, 00eh, 000h, 01ch, 015h, 000h, 01ch, 01ch, 000h, 015h
    91 00014D75 1C15001C1C0015      <1>
    92 00014D7C 1C000E1C00071C0000- <1>     db  01ch, 000h, 00eh, 01ch, 000h, 007h, 01ch, 000h, 000h, 01ch, 000h, 000h, 01ch, 007h, 000h, 01ch
    92 00014D85 1C00001C07001C      <1>
    93 00014D8C 0E001C15001C1C0015- <1>     db  00eh, 000h, 01ch, 015h, 000h, 01ch, 01ch, 000h, 015h, 01ch, 000h, 00eh, 01ch, 000h, 007h, 01ch
    93 00014D95 1C000E1C00071C      <1>
    94 00014D9C 0E0E1C110E1C150E1C- <1>     db  00eh, 00eh, 01ch, 011h, 00eh, 01ch, 015h, 00eh, 01ch, 018h, 00eh, 01ch, 01ch, 00eh, 01ch, 01ch
    94 00014DA5 180E1C1C0E1C1C      <1>
    95 00014DAC 0E181C0E151C0E111C- <1>     db  00eh, 018h, 01ch, 00eh, 015h, 01ch, 00eh, 011h, 01ch, 00eh, 00eh, 01ch, 011h, 00eh, 01ch, 015h
    95 00014DB5 0E0E1C110E1C15      <1>
    96 00014DBC 0E1C180E1C1C0E181C- <1>     db  00eh, 01ch, 018h, 00eh, 01ch, 01ch, 00eh, 018h, 01ch, 00eh, 015h, 01ch, 00eh, 011h, 01ch, 00eh
    96 00014DC5 0E151C0E111C0E      <1>
    97 00014DCC 0E1C0E0E1C110E1C15- <1>     db  00eh, 01ch, 00eh, 00eh, 01ch, 011h, 00eh, 01ch, 015h, 00eh, 01ch, 018h, 00eh, 01ch, 01ch, 00eh
    97 00014DD5 0E1C180E1C1C0E      <1>
    98 00014DDC 181C0E151C0E111C14- <1>     db  018h, 01ch, 00eh, 015h, 01ch, 00eh, 011h, 01ch, 014h, 014h, 01ch, 016h, 014h, 01ch, 018h, 014h
    98 00014DE5 141C16141C1814      <1>
    99 00014DEC 1C1A141C1C141C1C14- <1>     db  01ch, 01ah, 014h, 01ch, 01ch, 014h, 01ch, 01ch, 014h, 01ah, 01ch, 014h, 018h, 01ch, 014h, 016h
    99 00014DF5 1A1C14181C1416      <1>
   100 00014DFC 1C14141C16141C1814- <1>     db  01ch, 014h, 014h, 01ch, 016h, 014h, 01ch, 018h, 014h, 01ch, 01ah, 014h, 01ch, 01ch, 014h, 01ah
   100 00014E05 1C1A141C1C141A      <1>
   101 00014E0C 1C14181C14161C1414- <1>     db  01ch, 014h, 018h, 01ch, 014h, 016h, 01ch, 014h, 014h, 01ch, 014h, 014h, 01ch, 016h, 014h, 01ch
   101 00014E15 1C14141C16141C      <1>
   102 00014E1C 18141C1A141C1C141A- <1>     db  018h, 014h, 01ch, 01ah, 014h, 01ch, 01ch, 014h, 01ah, 01ch, 014h, 018h, 01ch, 014h, 016h, 01ch
   102 00014E25 1C14181C14161C      <1>
   103 00014E2C 000010040010080010- <1>     db  000h, 000h, 010h, 004h, 000h, 010h, 008h, 000h, 010h, 00ch, 000h, 010h, 010h, 000h, 010h, 010h
   103 00014E35 0C001010001010      <1>
   104 00014E3C 000C10000810000410- <1>     db  000h, 00ch, 010h, 000h, 008h, 010h, 000h, 004h, 010h, 000h, 000h, 010h, 004h, 000h, 010h, 008h
   104 00014E45 00001004001008      <1>
   105 00014E4C 00100C001010000C10- <1>     db  000h, 010h, 00ch, 000h, 010h, 010h, 000h, 00ch, 010h, 000h, 008h, 010h, 000h, 004h, 010h, 000h
   105 00014E55 00081000041000      <1>
   106 00014E5C 001000001004001008- <1>     db  000h, 010h, 000h, 000h, 010h, 004h, 000h, 010h, 008h, 000h, 010h, 00ch, 000h, 010h, 010h, 000h
   106 00014E65 00100C00101000      <1>
   107 00014E6C 0C1000081000041008- <1>     db  00ch, 010h, 000h, 008h, 010h, 000h, 004h, 010h, 008h, 008h, 010h, 00ah, 008h, 010h, 00ch, 008h
   107 00014E75 08100A08100C08      <1>
   108 00014E7C 100E08101008101008- <1>     db  010h, 00eh, 008h, 010h, 010h, 008h, 010h, 010h, 008h, 00eh, 010h, 008h, 00ch, 010h, 008h, 00ah
   108 00014E85 0E10080C10080A      <1>
   109 00014E8C 100808100A08100C08- <1>     db  010h, 008h, 008h, 010h, 00ah, 008h, 010h, 00ch, 008h, 010h, 00eh, 008h, 010h, 010h, 008h, 00eh
   109 00014E95 100E081010080E      <1>
   110 00014E9C 10080C10080A100808- <1>     db  010h, 008h, 00ch, 010h, 008h, 00ah, 010h, 008h, 008h, 010h, 008h, 008h, 010h, 00ah, 008h, 010h
   110 00014EA5 100808100A0810      <1>
   111 00014EAC 0C08100E081010080E- <1>     db  00ch, 008h, 010h, 00eh, 008h, 010h, 010h, 008h, 00eh, 010h, 008h, 00ch, 010h, 008h, 00ah, 010h
   111 00014EB5 10080C10080A10      <1>
   112 00014EBC 0B0B100C0B100D0B10- <1>     db  00bh, 00bh, 010h, 00ch, 00bh, 010h, 00dh, 00bh, 010h, 00fh, 00bh, 010h, 010h, 00bh, 010h, 010h
   112 00014EC5 0F0B10100B1010      <1>
   113 00014ECC 0B0F100B0D100B0C10- <1>     db  00bh, 00fh, 010h, 00bh, 00dh, 010h, 00bh, 00ch, 010h, 00bh, 00bh, 010h, 00ch, 00bh, 010h, 00dh
   113 00014ED5 0B0B100C0B100D      <1>
   114 00014EDC 0B100F0B10100B0F10- <1>     db  00bh, 010h, 00fh, 00bh, 010h, 010h, 00bh, 00fh, 010h, 00bh, 00dh, 010h, 00bh, 00ch, 010h, 00bh
   114 00014EE5 0B0D100B0C100B      <1>
   115 00014EEC 0B100B0B100C0B100D- <1>     db  00bh, 010h, 00bh, 00bh, 010h, 00ch, 00bh, 010h, 00dh, 00bh, 010h, 00fh, 00bh, 010h, 010h, 00bh
   115 00014EF5 0B100F0B10100B      <1>
   116 00014EFC 0F100B0D100B0C1000- <1>     db  00fh, 010h, 00bh, 00dh, 010h, 00bh, 00ch, 010h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   116 00014F05 00000000000000      <1>
   117 00014F0C 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   117 00014F15 00000000000000      <1>
   118                              <1> 
   119                              <1> 
   120                              <1> ; 04/07/2016
   121                              <1> ; FONT DATA
   122                              <1> 
   123                              <1> CRT_CHAR_GEN:
   124                              <1> vgafont8: 
   125 00014F1C 00000000000000007E- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 07eh, 081h, 0a5h, 081h, 0bdh, 099h, 081h, 07eh
   125 00014F25 81A581BD99817E      <1>
   126 00014F2C 7EFFDBFFC3E7FF7E6C- <1>     db  07eh, 0ffh, 0dbh, 0ffh, 0c3h, 0e7h, 0ffh, 07eh, 06ch, 0feh, 0feh, 0feh, 07ch, 038h, 010h, 000h
   126 00014F35 FEFEFE7C381000      <1>
   127 00014F3C 10387CFE7C38100038- <1>     db  010h, 038h, 07ch, 0feh, 07ch, 038h, 010h, 000h, 038h, 07ch, 038h, 0feh, 0feh, 07ch, 038h, 07ch
   127 00014F45 7C38FEFE7C387C      <1>
   128 00014F4C 1010387CFE7C387C00- <1>     db  010h, 010h, 038h, 07ch, 0feh, 07ch, 038h, 07ch, 000h, 000h, 018h, 03ch, 03ch, 018h, 000h, 000h
   128 00014F55 00183C3C180000      <1>
   129 00014F5C FFFFE7C3C3E7FFFF00- <1>     db  0ffh, 0ffh, 0e7h, 0c3h, 0c3h, 0e7h, 0ffh, 0ffh, 000h, 03ch, 066h, 042h, 042h, 066h, 03ch, 000h
   129 00014F65 3C664242663C00      <1>
   130 00014F6C FFC399BDBD99C3FF0F- <1>     db  0ffh, 0c3h, 099h, 0bdh, 0bdh, 099h, 0c3h, 0ffh, 00fh, 007h, 00fh, 07dh, 0cch, 0cch, 0cch, 078h
   130 00014F75 070F7DCCCCCC78      <1>
   131 00014F7C 3C6666663C187E183F- <1>     db  03ch, 066h, 066h, 066h, 03ch, 018h, 07eh, 018h, 03fh, 033h, 03fh, 030h, 030h, 070h, 0f0h, 0e0h
   131 00014F85 333F303070F0E0      <1>
   132 00014F8C 7F637F636367E6C099- <1>     db  07fh, 063h, 07fh, 063h, 063h, 067h, 0e6h, 0c0h, 099h, 05ah, 03ch, 0e7h, 0e7h, 03ch, 05ah, 099h
   132 00014F95 5A3CE7E73C5A99      <1>
   133 00014F9C 80E0F8FEF8E0800002- <1>     db  080h, 0e0h, 0f8h, 0feh, 0f8h, 0e0h, 080h, 000h, 002h, 00eh, 03eh, 0feh, 03eh, 00eh, 002h, 000h
   133 00014FA5 0E3EFE3E0E0200      <1>
   134 00014FAC 183C7E18187E3C1866- <1>     db  018h, 03ch, 07eh, 018h, 018h, 07eh, 03ch, 018h, 066h, 066h, 066h, 066h, 066h, 000h, 066h, 000h
   134 00014FB5 66666666006600      <1>
   135 00014FBC 7FDBDB7B1B1B1B003E- <1>     db  07fh, 0dbh, 0dbh, 07bh, 01bh, 01bh, 01bh, 000h, 03eh, 063h, 038h, 06ch, 06ch, 038h, 0cch, 078h
   135 00014FC5 63386C6C38CC78      <1>
   136 00014FCC 000000007E7E7E0018- <1>     db  000h, 000h, 000h, 000h, 07eh, 07eh, 07eh, 000h, 018h, 03ch, 07eh, 018h, 07eh, 03ch, 018h, 0ffh
   136 00014FD5 3C7E187E3C18FF      <1>
   137 00014FDC 183C7E181818180018- <1>     db  018h, 03ch, 07eh, 018h, 018h, 018h, 018h, 000h, 018h, 018h, 018h, 018h, 07eh, 03ch, 018h, 000h
   137 00014FE5 1818187E3C1800      <1>
   138 00014FEC 00180CFE0C18000000- <1>     db  000h, 018h, 00ch, 0feh, 00ch, 018h, 000h, 000h, 000h, 030h, 060h, 0feh, 060h, 030h, 000h, 000h
   138 00014FF5 3060FE60300000      <1>
   139 00014FFC 0000C0C0C0FE000000- <1>     db  000h, 000h, 0c0h, 0c0h, 0c0h, 0feh, 000h, 000h, 000h, 024h, 066h, 0ffh, 066h, 024h, 000h, 000h
   139 00015005 2466FF66240000      <1>
   140 0001500C 00183C7EFFFF000000- <1>     db  000h, 018h, 03ch, 07eh, 0ffh, 0ffh, 000h, 000h, 000h, 0ffh, 0ffh, 07eh, 03ch, 018h, 000h, 000h
   140 00015015 FFFF7E3C180000      <1>
   141 0001501C 000000000000000030- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 030h, 078h, 078h, 030h, 030h, 000h, 030h, 000h
   141 00015025 78783030003000      <1>
   142 0001502C 6C6C6C00000000006C- <1>     db  06ch, 06ch, 06ch, 000h, 000h, 000h, 000h, 000h, 06ch, 06ch, 0feh, 06ch, 0feh, 06ch, 06ch, 000h
   142 00015035 6CFE6CFE6C6C00      <1>
   143 0001503C 307CC0780CF8300000- <1>     db  030h, 07ch, 0c0h, 078h, 00ch, 0f8h, 030h, 000h, 000h, 0c6h, 0cch, 018h, 030h, 066h, 0c6h, 000h
   143 00015045 C6CC183066C600      <1>
   144 0001504C 386C3876DCCC760060- <1>     db  038h, 06ch, 038h, 076h, 0dch, 0cch, 076h, 000h, 060h, 060h, 0c0h, 000h, 000h, 000h, 000h, 000h
   144 00015055 60C00000000000      <1>
   145 0001505C 183060606030180060- <1>     db  018h, 030h, 060h, 060h, 060h, 030h, 018h, 000h, 060h, 030h, 018h, 018h, 018h, 030h, 060h, 000h
   145 00015065 30181818306000      <1>
   146 0001506C 00663CFF3C66000000- <1>     db  000h, 066h, 03ch, 0ffh, 03ch, 066h, 000h, 000h, 000h, 030h, 030h, 0fch, 030h, 030h, 000h, 000h
   146 00015075 3030FC30300000      <1>
   147 0001507C 000000000030306000- <1>     db  000h, 000h, 000h, 000h, 000h, 030h, 030h, 060h, 000h, 000h, 000h, 0fch, 000h, 000h, 000h, 000h
   147 00015085 0000FC00000000      <1>
   148 0001508C 000000000030300006- <1>     db  000h, 000h, 000h, 000h, 000h, 030h, 030h, 000h, 006h, 00ch, 018h, 030h, 060h, 0c0h, 080h, 000h
   148 00015095 0C183060C08000      <1>
   149 0001509C 7CC6CEDEF6E67C0030- <1>     db  07ch, 0c6h, 0ceh, 0deh, 0f6h, 0e6h, 07ch, 000h, 030h, 070h, 030h, 030h, 030h, 030h, 0fch, 000h
   149 000150A5 7030303030FC00      <1>
   150 000150AC 78CC0C3860CCFC0078- <1>     db  078h, 0cch, 00ch, 038h, 060h, 0cch, 0fch, 000h, 078h, 0cch, 00ch, 038h, 00ch, 0cch, 078h, 000h
   150 000150B5 CC0C380CCC7800      <1>
   151 000150BC 1C3C6CCCFE0C1E00FC- <1>     db  01ch, 03ch, 06ch, 0cch, 0feh, 00ch, 01eh, 000h, 0fch, 0c0h, 0f8h, 00ch, 00ch, 0cch, 078h, 000h
   151 000150C5 C0F80C0CCC7800      <1>
   152 000150CC 3860C0F8CCCC7800FC- <1>     db  038h, 060h, 0c0h, 0f8h, 0cch, 0cch, 078h, 000h, 0fch, 0cch, 00ch, 018h, 030h, 030h, 030h, 000h
   152 000150D5 CC0C1830303000      <1>
   153 000150DC 78CCCC78CCCC780078- <1>     db  078h, 0cch, 0cch, 078h, 0cch, 0cch, 078h, 000h, 078h, 0cch, 0cch, 07ch, 00ch, 018h, 070h, 000h
   153 000150E5 CCCC7C0C187000      <1>
   154 000150EC 003030000030300000- <1>     db  000h, 030h, 030h, 000h, 000h, 030h, 030h, 000h, 000h, 030h, 030h, 000h, 000h, 030h, 030h, 060h
   154 000150F5 30300000303060      <1>
   155 000150FC 183060C06030180000- <1>     db  018h, 030h, 060h, 0c0h, 060h, 030h, 018h, 000h, 000h, 000h, 0fch, 000h, 000h, 0fch, 000h, 000h
   155 00015105 00FC0000FC0000      <1>
   156 0001510C 6030180C1830600078- <1>     db  060h, 030h, 018h, 00ch, 018h, 030h, 060h, 000h, 078h, 0cch, 00ch, 018h, 030h, 000h, 030h, 000h
   156 00015115 CC0C1830003000      <1>
   157 0001511C 7CC6DEDEDEC0780030- <1>     db  07ch, 0c6h, 0deh, 0deh, 0deh, 0c0h, 078h, 000h, 030h, 078h, 0cch, 0cch, 0fch, 0cch, 0cch, 000h
   157 00015125 78CCCCFCCCCC00      <1>
   158 0001512C FC66667C6666FC003C- <1>     db  0fch, 066h, 066h, 07ch, 066h, 066h, 0fch, 000h, 03ch, 066h, 0c0h, 0c0h, 0c0h, 066h, 03ch, 000h
   158 00015135 66C0C0C0663C00      <1>
   159 0001513C F86C6666666CF800FE- <1>     db  0f8h, 06ch, 066h, 066h, 066h, 06ch, 0f8h, 000h, 0feh, 062h, 068h, 078h, 068h, 062h, 0feh, 000h
   159 00015145 6268786862FE00      <1>
   160 0001514C FE6268786860F0003C- <1>     db  0feh, 062h, 068h, 078h, 068h, 060h, 0f0h, 000h, 03ch, 066h, 0c0h, 0c0h, 0ceh, 066h, 03eh, 000h
   160 00015155 66C0C0CE663E00      <1>
   161 0001515C CCCCCCFCCCCCCC0078- <1>     db  0cch, 0cch, 0cch, 0fch, 0cch, 0cch, 0cch, 000h, 078h, 030h, 030h, 030h, 030h, 030h, 078h, 000h
   161 00015165 30303030307800      <1>
   162 0001516C 1E0C0C0CCCCC7800E6- <1>     db  01eh, 00ch, 00ch, 00ch, 0cch, 0cch, 078h, 000h, 0e6h, 066h, 06ch, 078h, 06ch, 066h, 0e6h, 000h
   162 00015175 666C786C66E600      <1>
   163 0001517C F06060606266FE00C6- <1>     db  0f0h, 060h, 060h, 060h, 062h, 066h, 0feh, 000h, 0c6h, 0eeh, 0feh, 0feh, 0d6h, 0c6h, 0c6h, 000h
   163 00015185 EEFEFED6C6C600      <1>
   164 0001518C C6E6F6DECEC6C60038- <1>     db  0c6h, 0e6h, 0f6h, 0deh, 0ceh, 0c6h, 0c6h, 000h, 038h, 06ch, 0c6h, 0c6h, 0c6h, 06ch, 038h, 000h
   164 00015195 6CC6C6C66C3800      <1>
   165 0001519C FC66667C6060F00078- <1>     db  0fch, 066h, 066h, 07ch, 060h, 060h, 0f0h, 000h, 078h, 0cch, 0cch, 0cch, 0dch, 078h, 01ch, 000h
   165 000151A5 CCCCCCDC781C00      <1>
   166 000151AC FC66667C6C66E60078- <1>     db  0fch, 066h, 066h, 07ch, 06ch, 066h, 0e6h, 000h, 078h, 0cch, 0e0h, 070h, 01ch, 0cch, 078h, 000h
   166 000151B5 CCE0701CCC7800      <1>
   167 000151BC FCB4303030307800CC- <1>     db  0fch, 0b4h, 030h, 030h, 030h, 030h, 078h, 000h, 0cch, 0cch, 0cch, 0cch, 0cch, 0cch, 0fch, 000h
   167 000151C5 CCCCCCCCCCFC00      <1>
   168 000151CC CCCCCCCCCC783000C6- <1>     db  0cch, 0cch, 0cch, 0cch, 0cch, 078h, 030h, 000h, 0c6h, 0c6h, 0c6h, 0d6h, 0feh, 0eeh, 0c6h, 000h
   168 000151D5 C6C6D6FEEEC600      <1>
   169 000151DC C6C66C38386CC600CC- <1>     db  0c6h, 0c6h, 06ch, 038h, 038h, 06ch, 0c6h, 000h, 0cch, 0cch, 0cch, 078h, 030h, 030h, 078h, 000h
   169 000151E5 CCCC7830307800      <1>
   170 000151EC FEC68C183266FE0078- <1>     db  0feh, 0c6h, 08ch, 018h, 032h, 066h, 0feh, 000h, 078h, 060h, 060h, 060h, 060h, 060h, 078h, 000h
   170 000151F5 60606060607800      <1>
   171 000151FC C06030180C06020078- <1>     db  0c0h, 060h, 030h, 018h, 00ch, 006h, 002h, 000h, 078h, 018h, 018h, 018h, 018h, 018h, 078h, 000h
   171 00015205 18181818187800      <1>
   172 0001520C 10386CC60000000000- <1>     db  010h, 038h, 06ch, 0c6h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0ffh
   172 00015215 000000000000FF      <1>
   173 0001521C 303018000000000000- <1>     db  030h, 030h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 078h, 00ch, 07ch, 0cch, 076h, 000h
   173 00015225 00780C7CCC7600      <1>
   174 0001522C E060607C6666DC0000- <1>     db  0e0h, 060h, 060h, 07ch, 066h, 066h, 0dch, 000h, 000h, 000h, 078h, 0cch, 0c0h, 0cch, 078h, 000h
   174 00015235 0078CCC0CC7800      <1>
   175 0001523C 1C0C0C7CCCCC760000- <1>     db  01ch, 00ch, 00ch, 07ch, 0cch, 0cch, 076h, 000h, 000h, 000h, 078h, 0cch, 0fch, 0c0h, 078h, 000h
   175 00015245 0078CCFCC07800      <1>
   176 0001524C 386C60F06060F00000- <1>     db  038h, 06ch, 060h, 0f0h, 060h, 060h, 0f0h, 000h, 000h, 000h, 076h, 0cch, 0cch, 07ch, 00ch, 0f8h
   176 00015255 0076CCCC7C0CF8      <1>
   177 0001525C E0606C766666E60030- <1>     db  0e0h, 060h, 06ch, 076h, 066h, 066h, 0e6h, 000h, 030h, 000h, 070h, 030h, 030h, 030h, 078h, 000h
   177 00015265 00703030307800      <1>
   178 0001526C 0C000C0C0CCCCC78E0- <1>     db  00ch, 000h, 00ch, 00ch, 00ch, 0cch, 0cch, 078h, 0e0h, 060h, 066h, 06ch, 078h, 06ch, 0e6h, 000h
   178 00015275 60666C786CE600      <1>
   179 0001527C 703030303030780000- <1>     db  070h, 030h, 030h, 030h, 030h, 030h, 078h, 000h, 000h, 000h, 0cch, 0feh, 0feh, 0d6h, 0c6h, 000h
   179 00015285 00CCFEFED6C600      <1>
   180 0001528C 0000F8CCCCCCCC0000- <1>     db  000h, 000h, 0f8h, 0cch, 0cch, 0cch, 0cch, 000h, 000h, 000h, 078h, 0cch, 0cch, 0cch, 078h, 000h
   180 00015295 0078CCCCCC7800      <1>
   181 0001529C 0000DC66667C60F000- <1>     db  000h, 000h, 0dch, 066h, 066h, 07ch, 060h, 0f0h, 000h, 000h, 076h, 0cch, 0cch, 07ch, 00ch, 01eh
   181 000152A5 0076CCCC7C0C1E      <1>
   182 000152AC 0000DC766660F00000- <1>     db  000h, 000h, 0dch, 076h, 066h, 060h, 0f0h, 000h, 000h, 000h, 07ch, 0c0h, 078h, 00ch, 0f8h, 000h
   182 000152B5 007CC0780CF800      <1>
   183 000152BC 10307C303034180000- <1>     db  010h, 030h, 07ch, 030h, 030h, 034h, 018h, 000h, 000h, 000h, 0cch, 0cch, 0cch, 0cch, 076h, 000h
   183 000152C5 00CCCCCCCC7600      <1>
   184 000152CC 0000CCCCCC78300000- <1>     db  000h, 000h, 0cch, 0cch, 0cch, 078h, 030h, 000h, 000h, 000h, 0c6h, 0d6h, 0feh, 0feh, 06ch, 000h
   184 000152D5 00C6D6FEFE6C00      <1>
   185 000152DC 0000C66C386CC60000- <1>     db  000h, 000h, 0c6h, 06ch, 038h, 06ch, 0c6h, 000h, 000h, 000h, 0cch, 0cch, 0cch, 07ch, 00ch, 0f8h
   185 000152E5 00CCCCCC7C0CF8      <1>
   186 000152EC 0000FC983064FC001C- <1>     db  000h, 000h, 0fch, 098h, 030h, 064h, 0fch, 000h, 01ch, 030h, 030h, 0e0h, 030h, 030h, 01ch, 000h
   186 000152F5 3030E030301C00      <1>
   187 000152FC 1818180018181800E0- <1>     db  018h, 018h, 018h, 000h, 018h, 018h, 018h, 000h, 0e0h, 030h, 030h, 01ch, 030h, 030h, 0e0h, 000h
   187 00015305 30301C3030E000      <1>
   188 0001530C 76DC00000000000000- <1>     db  076h, 0dch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 010h, 038h, 06ch, 0c6h, 0c6h, 0feh, 000h
   188 00015315 10386CC6C6FE00      <1>
   189 0001531C 78CCC0CC78180C7800- <1>     db  078h, 0cch, 0c0h, 0cch, 078h, 018h, 00ch, 078h, 000h, 0cch, 000h, 0cch, 0cch, 0cch, 07eh, 000h
   189 00015325 CC00CCCCCC7E00      <1>
   190 0001532C 1C0078CCFCC078007E- <1>     db  01ch, 000h, 078h, 0cch, 0fch, 0c0h, 078h, 000h, 07eh, 0c3h, 03ch, 006h, 03eh, 066h, 03fh, 000h
   190 00015335 C33C063E663F00      <1>
   191 0001533C CC00780C7CCC7E00E0- <1>     db  0cch, 000h, 078h, 00ch, 07ch, 0cch, 07eh, 000h, 0e0h, 000h, 078h, 00ch, 07ch, 0cch, 07eh, 000h
   191 00015345 00780C7CCC7E00      <1>
   192 0001534C 3030780C7CCC7E0000- <1>     db  030h, 030h, 078h, 00ch, 07ch, 0cch, 07eh, 000h, 000h, 000h, 078h, 0c0h, 0c0h, 078h, 00ch, 038h
   192 00015355 0078C0C0780C38      <1>
   193 0001535C 7EC33C667E603C00CC- <1>     db  07eh, 0c3h, 03ch, 066h, 07eh, 060h, 03ch, 000h, 0cch, 000h, 078h, 0cch, 0fch, 0c0h, 078h, 000h
   193 00015365 0078CCFCC07800      <1>
   194 0001536C E00078CCFCC07800CC- <1>     db  0e0h, 000h, 078h, 0cch, 0fch, 0c0h, 078h, 000h, 0cch, 000h, 070h, 030h, 030h, 030h, 078h, 000h
   194 00015375 00703030307800      <1>
   195 0001537C 7CC6381818183C00E0- <1>     db  07ch, 0c6h, 038h, 018h, 018h, 018h, 03ch, 000h, 0e0h, 000h, 070h, 030h, 030h, 030h, 078h, 000h
   195 00015385 00703030307800      <1>
   196 0001538C C6386CC6FEC6C60030- <1>     db  0c6h, 038h, 06ch, 0c6h, 0feh, 0c6h, 0c6h, 000h, 030h, 030h, 000h, 078h, 0cch, 0fch, 0cch, 000h
   196 00015395 300078CCFCCC00      <1>
   197 0001539C 1C00FC607860FC0000- <1>     db  01ch, 000h, 0fch, 060h, 078h, 060h, 0fch, 000h, 000h, 000h, 07fh, 00ch, 07fh, 0cch, 07fh, 000h
   197 000153A5 007F0C7FCC7F00      <1>
   198 000153AC 3E6CCCFECCCCCE0078- <1>     db  03eh, 06ch, 0cch, 0feh, 0cch, 0cch, 0ceh, 000h, 078h, 0cch, 000h, 078h, 0cch, 0cch, 078h, 000h
   198 000153B5 CC0078CCCC7800      <1>
   199 000153BC 00CC0078CCCC780000- <1>     db  000h, 0cch, 000h, 078h, 0cch, 0cch, 078h, 000h, 000h, 0e0h, 000h, 078h, 0cch, 0cch, 078h, 000h
   199 000153C5 E00078CCCC7800      <1>
   200 000153CC 78CC00CCCCCC7E0000- <1>     db  078h, 0cch, 000h, 0cch, 0cch, 0cch, 07eh, 000h, 000h, 0e0h, 000h, 0cch, 0cch, 0cch, 07eh, 000h
   200 000153D5 E000CCCCCC7E00      <1>
   201 000153DC 00CC00CCCC7C0CF8C3- <1>     db  000h, 0cch, 000h, 0cch, 0cch, 07ch, 00ch, 0f8h, 0c3h, 018h, 03ch, 066h, 066h, 03ch, 018h, 000h
   201 000153E5 183C66663C1800      <1>
   202 000153EC CC00CCCCCCCC780018- <1>     db  0cch, 000h, 0cch, 0cch, 0cch, 0cch, 078h, 000h, 018h, 018h, 07eh, 0c0h, 0c0h, 07eh, 018h, 018h
   202 000153F5 187EC0C07E1818      <1>
   203 000153FC 386C64F060E6FC00CC- <1>     db  038h, 06ch, 064h, 0f0h, 060h, 0e6h, 0fch, 000h, 0cch, 0cch, 078h, 0fch, 030h, 0fch, 030h, 030h
   203 00015405 CC78FC30FC3030      <1>
   204 0001540C F8CCCCFAC6CFC6C70E- <1>     db  0f8h, 0cch, 0cch, 0fah, 0c6h, 0cfh, 0c6h, 0c7h, 00eh, 01bh, 018h, 03ch, 018h, 018h, 0d8h, 070h
   204 00015415 1B183C1818D870      <1>
   205 0001541C 1C00780C7CCC7E0038- <1>     db  01ch, 000h, 078h, 00ch, 07ch, 0cch, 07eh, 000h, 038h, 000h, 070h, 030h, 030h, 030h, 078h, 000h
   205 00015425 00703030307800      <1>
   206 0001542C 001C0078CCCC780000- <1>     db  000h, 01ch, 000h, 078h, 0cch, 0cch, 078h, 000h, 000h, 01ch, 000h, 0cch, 0cch, 0cch, 07eh, 000h
   206 00015435 1C00CCCCCC7E00      <1>
   207 0001543C 00F800F8CCCCCC00FC- <1>     db  000h, 0f8h, 000h, 0f8h, 0cch, 0cch, 0cch, 000h, 0fch, 000h, 0cch, 0ech, 0fch, 0dch, 0cch, 000h
   207 00015445 00CCECFCDCCC00      <1>
   208 0001544C 3C6C6C3E007E000038- <1>     db  03ch, 06ch, 06ch, 03eh, 000h, 07eh, 000h, 000h, 038h, 06ch, 06ch, 038h, 000h, 07ch, 000h, 000h
   208 00015455 6C6C38007C0000      <1>
   209 0001545C 30003060C0CC780000- <1>     db  030h, 000h, 030h, 060h, 0c0h, 0cch, 078h, 000h, 000h, 000h, 000h, 0fch, 0c0h, 0c0h, 000h, 000h
   209 00015465 0000FCC0C00000      <1>
   210 0001546C 000000FC0C0C0000C3- <1>     db  000h, 000h, 000h, 0fch, 00ch, 00ch, 000h, 000h, 0c3h, 0c6h, 0cch, 0deh, 033h, 066h, 0cch, 00fh
   210 00015475 C6CCDE3366CC0F      <1>
   211 0001547C C3C6CCDB376FCF0318- <1>     db  0c3h, 0c6h, 0cch, 0dbh, 037h, 06fh, 0cfh, 003h, 018h, 018h, 000h, 018h, 018h, 018h, 018h, 000h
   211 00015485 18001818181800      <1>
   212 0001548C 003366CC6633000000- <1>     db  000h, 033h, 066h, 0cch, 066h, 033h, 000h, 000h, 000h, 0cch, 066h, 033h, 066h, 0cch, 000h, 000h
   212 00015495 CC663366CC0000      <1>
   213 0001549C 228822882288228855- <1>     db  022h, 088h, 022h, 088h, 022h, 088h, 022h, 088h, 055h, 0aah, 055h, 0aah, 055h, 0aah, 055h, 0aah
   213 000154A5 AA55AA55AA55AA      <1>
   214 000154AC DB77DBEEDB77DBEE18- <1>     db  0dbh, 077h, 0dbh, 0eeh, 0dbh, 077h, 0dbh, 0eeh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   214 000154B5 18181818181818      <1>
   215 000154BC 18181818F818181818- <1>     db  018h, 018h, 018h, 018h, 0f8h, 018h, 018h, 018h, 018h, 018h, 0f8h, 018h, 0f8h, 018h, 018h, 018h
   215 000154C5 18F818F8181818      <1>
   216 000154CC 36363636F636363600- <1>     db  036h, 036h, 036h, 036h, 0f6h, 036h, 036h, 036h, 000h, 000h, 000h, 000h, 0feh, 036h, 036h, 036h
   216 000154D5 000000FE363636      <1>
   217 000154DC 0000F818F818181836- <1>     db  000h, 000h, 0f8h, 018h, 0f8h, 018h, 018h, 018h, 036h, 036h, 0f6h, 006h, 0f6h, 036h, 036h, 036h
   217 000154E5 36F606F6363636      <1>
   218 000154EC 363636363636363600- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h, 0feh, 006h, 0f6h, 036h, 036h, 036h
   218 000154F5 00FE06F6363636      <1>
   219 000154FC 3636F606FE00000036- <1>     db  036h, 036h, 0f6h, 006h, 0feh, 000h, 000h, 000h, 036h, 036h, 036h, 036h, 0feh, 000h, 000h, 000h
   219 00015505 363636FE000000      <1>
   220 0001550C 1818F818F800000000- <1>     db  018h, 018h, 0f8h, 018h, 0f8h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0f8h, 018h, 018h, 018h
   220 00015515 000000F8181818      <1>
   221 0001551C 181818181F00000018- <1>     db  018h, 018h, 018h, 018h, 01fh, 000h, 000h, 000h, 018h, 018h, 018h, 018h, 0ffh, 000h, 000h, 000h
   221 00015525 181818FF000000      <1>
   222 0001552C 00000000FF18181818- <1>     db  000h, 000h, 000h, 000h, 0ffh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 01fh, 018h, 018h, 018h
   222 00015535 1818181F181818      <1>
   223 0001553C 00000000FF00000018- <1>     db  000h, 000h, 000h, 000h, 0ffh, 000h, 000h, 000h, 018h, 018h, 018h, 018h, 0ffh, 018h, 018h, 018h
   223 00015545 181818FF181818      <1>
   224 0001554C 18181F181F18181836- <1>     db  018h, 018h, 01fh, 018h, 01fh, 018h, 018h, 018h, 036h, 036h, 036h, 036h, 037h, 036h, 036h, 036h
   224 00015555 36363637363636      <1>
   225 0001555C 363637303F00000000- <1>     db  036h, 036h, 037h, 030h, 03fh, 000h, 000h, 000h, 000h, 000h, 03fh, 030h, 037h, 036h, 036h, 036h
   225 00015565 003F3037363636      <1>
   226 0001556C 3636F700FF00000000- <1>     db  036h, 036h, 0f7h, 000h, 0ffh, 000h, 000h, 000h, 000h, 000h, 0ffh, 000h, 0f7h, 036h, 036h, 036h
   226 00015575 00FF00F7363636      <1>
   227 0001557C 363637303736363600- <1>     db  036h, 036h, 037h, 030h, 037h, 036h, 036h, 036h, 000h, 000h, 0ffh, 000h, 0ffh, 000h, 000h, 000h
   227 00015585 00FF00FF000000      <1>
   228 0001558C 3636F700F736363618- <1>     db  036h, 036h, 0f7h, 000h, 0f7h, 036h, 036h, 036h, 018h, 018h, 0ffh, 000h, 0ffh, 000h, 000h, 000h
   228 00015595 18FF00FF000000      <1>
   229 0001559C 36363636FF00000000- <1>     db  036h, 036h, 036h, 036h, 0ffh, 000h, 000h, 000h, 000h, 000h, 0ffh, 000h, 0ffh, 018h, 018h, 018h
   229 000155A5 00FF00FF181818      <1>
   230 000155AC 00000000FF36363636- <1>     db  000h, 000h, 000h, 000h, 0ffh, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 03fh, 000h, 000h, 000h
   230 000155B5 3636363F000000      <1>
   231 000155BC 18181F181F00000000- <1>     db  018h, 018h, 01fh, 018h, 01fh, 000h, 000h, 000h, 000h, 000h, 01fh, 018h, 01fh, 018h, 018h, 018h
   231 000155C5 001F181F181818      <1>
   232 000155CC 000000003F36363636- <1>     db  000h, 000h, 000h, 000h, 03fh, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 0ffh, 036h, 036h, 036h
   232 000155D5 363636FF363636      <1>
   233 000155DC 1818FF18FF18181818- <1>     db  018h, 018h, 0ffh, 018h, 0ffh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 0f8h, 000h, 000h, 000h
   233 000155E5 181818F8000000      <1>
   234 000155EC 000000001F181818FF- <1>     db  000h, 000h, 000h, 000h, 01fh, 018h, 018h, 018h, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh
   234 000155F5 FFFFFFFFFFFFFF      <1>
   235 000155FC 00000000FFFFFFFFF0- <1>     db  000h, 000h, 000h, 000h, 0ffh, 0ffh, 0ffh, 0ffh, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h
   235 00015605 F0F0F0F0F0F0F0      <1>
   236 0001560C 0F0F0F0F0F0F0F0FFF- <1>     db  00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 0ffh, 0ffh, 0ffh, 0ffh, 000h, 000h, 000h, 000h
   236 00015615 FFFFFF00000000      <1>
   237 0001561C 000076DCC8DC760000- <1>     db  000h, 000h, 076h, 0dch, 0c8h, 0dch, 076h, 000h, 000h, 078h, 0cch, 0f8h, 0cch, 0f8h, 0c0h, 0c0h
   237 00015625 78CCF8CCF8C0C0      <1>
   238 0001562C 00FCCCC0C0C0C00000- <1>     db  000h, 0fch, 0cch, 0c0h, 0c0h, 0c0h, 0c0h, 000h, 000h, 0feh, 06ch, 06ch, 06ch, 06ch, 06ch, 000h
   238 00015635 FE6C6C6C6C6C00      <1>
   239 0001563C FCCC603060CCFC0000- <1>     db  0fch, 0cch, 060h, 030h, 060h, 0cch, 0fch, 000h, 000h, 000h, 07eh, 0d8h, 0d8h, 0d8h, 070h, 000h
   239 00015645 007ED8D8D87000      <1>
   240 0001564C 00666666667C60C000- <1>     db  000h, 066h, 066h, 066h, 066h, 07ch, 060h, 0c0h, 000h, 076h, 0dch, 018h, 018h, 018h, 018h, 000h
   240 00015655 76DC1818181800      <1>
   241 0001565C FC3078CCCC7830FC38- <1>     db  0fch, 030h, 078h, 0cch, 0cch, 078h, 030h, 0fch, 038h, 06ch, 0c6h, 0feh, 0c6h, 06ch, 038h, 000h
   241 00015665 6CC6FEC66C3800      <1>
   242 0001566C 386CC6C66C6CEE001C- <1>     db  038h, 06ch, 0c6h, 0c6h, 06ch, 06ch, 0eeh, 000h, 01ch, 030h, 018h, 07ch, 0cch, 0cch, 078h, 000h
   242 00015675 30187CCCCC7800      <1>
   243 0001567C 00007EDBDB7E000006- <1>     db  000h, 000h, 07eh, 0dbh, 0dbh, 07eh, 000h, 000h, 006h, 00ch, 07eh, 0dbh, 0dbh, 07eh, 060h, 0c0h
   243 00015685 0C7EDBDB7E60C0      <1>
   244 0001568C 3860C0F8C060380078- <1>     db  038h, 060h, 0c0h, 0f8h, 0c0h, 060h, 038h, 000h, 078h, 0cch, 0cch, 0cch, 0cch, 0cch, 0cch, 000h
   244 00015695 CCCCCCCCCCCC00      <1>
   245 0001569C 00FC00FC00FC000030- <1>     db  000h, 0fch, 000h, 0fch, 000h, 0fch, 000h, 000h, 030h, 030h, 0fch, 030h, 030h, 000h, 0fch, 000h
   245 000156A5 30FC303000FC00      <1>
   246 000156AC 603018306000FC0018- <1>     db  060h, 030h, 018h, 030h, 060h, 000h, 0fch, 000h, 018h, 030h, 060h, 030h, 018h, 000h, 0fch, 000h
   246 000156B5 3060301800FC00      <1>
   247 000156BC 0E1B1B181818181818- <1>     db  00eh, 01bh, 01bh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 0d8h, 0d8h, 070h
   247 000156C5 18181818D8D870      <1>
   248 000156CC 303000FC0030300000- <1>     db  030h, 030h, 000h, 0fch, 000h, 030h, 030h, 000h, 000h, 076h, 0dch, 000h, 076h, 0dch, 000h, 000h
   248 000156D5 76DC0076DC0000      <1>
   249 000156DC 386C6C380000000000- <1>     db  038h, 06ch, 06ch, 038h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h
   249 000156E5 00001818000000      <1>
   250 000156EC 00000000180000000F- <1>     db  000h, 000h, 000h, 000h, 018h, 000h, 000h, 000h, 00fh, 00ch, 00ch, 00ch, 0ech, 06ch, 03ch, 01ch
   250 000156F5 0C0C0CEC6C3C1C      <1>
   251 000156FC 786C6C6C6C00000070- <1>     db  078h, 06ch, 06ch, 06ch, 06ch, 000h, 000h, 000h, 070h, 018h, 030h, 060h, 078h, 000h, 000h, 000h
   251 00015705 18306078000000      <1>
   252 0001570C 00003C3C3C3C000000- <1>     db  000h, 000h, 03ch, 03ch, 03ch, 03ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   252 00015715 00000000000000      <1>
   253                              <1> vgafont14:
   254 0001571C 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   254 00015725 00000000000000      <1>
   255 0001572C 7E81A58181BD99817E- <1>     db  07eh, 081h, 0a5h, 081h, 081h, 0bdh, 099h, 081h, 07eh, 000h, 000h, 000h, 000h, 000h, 07eh, 0ffh
   255 00015735 00000000007EFF      <1>
   256 0001573C DBFFFFC3E7FF7E0000- <1>     db  0dbh, 0ffh, 0ffh, 0c3h, 0e7h, 0ffh, 07eh, 000h, 000h, 000h, 000h, 000h, 000h, 06ch, 0feh, 0feh
   256 00015745 000000006CFEFE      <1>
   257 0001574C FEFE7C381000000000- <1>     db  0feh, 0feh, 07ch, 038h, 010h, 000h, 000h, 000h, 000h, 000h, 000h, 010h, 038h, 07ch, 0feh, 07ch
   257 00015755 000010387CFE7C      <1>
   258 0001575C 381000000000000018- <1>     db  038h, 010h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 03ch, 03ch, 0e7h, 0e7h, 0e7h, 018h, 018h
   258 00015765 3C3CE7E7E71818      <1>
   259 0001576C 3C0000000000183C7E- <1>     db  03ch, 000h, 000h, 000h, 000h, 000h, 018h, 03ch, 07eh, 0ffh, 0ffh, 07eh, 018h, 018h, 03ch, 000h
   259 00015775 FFFF7E18183C00      <1>
   260 0001577C 00000000000000183C- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 03ch, 03ch, 018h, 000h, 000h, 000h, 000h, 000h
   260 00015785 3C180000000000      <1>
   261 0001578C FFFFFFFFFFE7C3C3E7- <1>     db  0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0e7h, 0c3h, 0c3h, 0e7h, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 000h, 000h
   261 00015795 FFFFFFFFFF0000      <1>
   262 0001579C 00003C664242663C00- <1>     db  000h, 000h, 03ch, 066h, 042h, 042h, 066h, 03ch, 000h, 000h, 000h, 000h, 0ffh, 0ffh, 0ffh, 0ffh
   262 000157A5 000000FFFFFFFF      <1>
   263 000157AC C399BDBD99C3FFFFFF- <1>     db  0c3h, 099h, 0bdh, 0bdh, 099h, 0c3h, 0ffh, 0ffh, 0ffh, 0ffh, 000h, 000h, 01eh, 00eh, 01ah, 032h
   263 000157B5 FF00001E0E1A32      <1>
   264 000157BC 78CCCCCC7800000000- <1>     db  078h, 0cch, 0cch, 0cch, 078h, 000h, 000h, 000h, 000h, 000h, 03ch, 066h, 066h, 066h, 03ch, 018h
   264 000157C5 003C6666663C18      <1>
   265 000157CC 7E181800000000003F- <1>     db  07eh, 018h, 018h, 000h, 000h, 000h, 000h, 000h, 03fh, 033h, 03fh, 030h, 030h, 030h, 070h, 0f0h
   265 000157D5 333F30303070F0      <1>
   266 000157DC E000000000007F637F- <1>     db  0e0h, 000h, 000h, 000h, 000h, 000h, 07fh, 063h, 07fh, 063h, 063h, 063h, 067h, 0e7h, 0e6h, 0c0h
   266 000157E5 63636367E7E6C0      <1>
   267 000157EC 000000001818DB3CE7- <1>     db  000h, 000h, 000h, 000h, 018h, 018h, 0dbh, 03ch, 0e7h, 03ch, 0dbh, 018h, 018h, 000h, 000h, 000h
   267 000157F5 3CDB1818000000      <1>
   268 000157FC 000080C0E0F8FEF8E0- <1>     db  000h, 000h, 080h, 0c0h, 0e0h, 0f8h, 0feh, 0f8h, 0e0h, 0c0h, 080h, 000h, 000h, 000h, 000h, 000h
   268 00015805 C0800000000000      <1>
   269 0001580C 02060E3EFE3E0E0602- <1>     db  002h, 006h, 00eh, 03eh, 0feh, 03eh, 00eh, 006h, 002h, 000h, 000h, 000h, 000h, 000h, 018h, 03ch
   269 00015815 0000000000183C      <1>
   270 0001581C 7E1818187E3C180000- <1>     db  07eh, 018h, 018h, 018h, 07eh, 03ch, 018h, 000h, 000h, 000h, 000h, 000h, 066h, 066h, 066h, 066h
   270 00015825 00000066666666      <1>
   271 0001582C 666600666600000000- <1>     db  066h, 066h, 000h, 066h, 066h, 000h, 000h, 000h, 000h, 000h, 07fh, 0dbh, 0dbh, 0dbh, 07bh, 01bh
   271 00015835 007FDBDBDB7B1B      <1>
   272 0001583C 1B1B1B000000007CC6- <1>     db  01bh, 01bh, 01bh, 000h, 000h, 000h, 000h, 07ch, 0c6h, 060h, 038h, 06ch, 0c6h, 0c6h, 06ch, 038h
   272 00015845 60386CC6C66C38      <1>
   273 0001584C 0CC67C000000000000- <1>     db  00ch, 0c6h, 07ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0feh, 0feh, 0feh, 000h
   273 00015855 000000FEFEFE00      <1>
   274 0001585C 00000000183C7E1818- <1>     db  000h, 000h, 000h, 000h, 018h, 03ch, 07eh, 018h, 018h, 018h, 07eh, 03ch, 018h, 07eh, 000h, 000h
   274 00015865 187E3C187E0000      <1>
   275 0001586C 0000183C7E18181818- <1>     db  000h, 000h, 018h, 03ch, 07eh, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h, 000h, 000h, 000h
   275 00015875 18180000000000      <1>
   276 0001587C 1818181818187E3C18- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 07eh, 03ch, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   276 00015885 00000000000000      <1>
   277 0001588C 180CFE0C1800000000- <1>     db  018h, 00ch, 0feh, 00ch, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 030h, 060h
   277 00015895 00000000003060      <1>
   278 0001589C FE6030000000000000- <1>     db  0feh, 060h, 030h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0c0h, 0c0h, 0c0h
   278 000158A5 00000000C0C0C0      <1>
   279 000158AC FE0000000000000000- <1>     db  0feh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 028h, 06ch, 0feh, 06ch, 028h, 000h
   279 000158B5 00286CFE6C2800      <1>
   280 000158BC 000000000000001038- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 010h, 038h, 038h, 07ch, 07ch, 0feh, 0feh, 000h, 000h
   280 000158C5 387C7CFEFE0000      <1>
   281 000158CC 0000000000FEFE7C7C- <1>     db  000h, 000h, 000h, 000h, 000h, 0feh, 0feh, 07ch, 07ch, 038h, 038h, 010h, 000h, 000h, 000h, 000h
   281 000158D5 38381000000000      <1>
   282 000158DC 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   282 000158E5 00000000000000      <1>
   283 000158EC 183C3C3C1818001818- <1>     db  018h, 03ch, 03ch, 03ch, 018h, 018h, 000h, 018h, 018h, 000h, 000h, 000h, 000h, 066h, 066h, 066h
   283 000158F5 00000000666666      <1>
   284 000158FC 240000000000000000- <1>     db  024h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 06ch, 06ch, 0feh, 06ch
   284 00015905 0000006C6CFE6C      <1>
   285 0001590C 6C6CFE6C6C00000018- <1>     db  06ch, 06ch, 0feh, 06ch, 06ch, 000h, 000h, 000h, 018h, 018h, 07ch, 0c6h, 0c2h, 0c0h, 07ch, 006h
   285 00015915 187CC6C2C07C06      <1>
   286 0001591C 86C67C181800000000- <1>     db  086h, 0c6h, 07ch, 018h, 018h, 000h, 000h, 000h, 000h, 000h, 0c2h, 0c6h, 00ch, 018h, 030h, 066h
   286 00015925 00C2C60C183066      <1>
   287 0001592C C60000000000386C6C- <1>     db  0c6h, 000h, 000h, 000h, 000h, 000h, 038h, 06ch, 06ch, 038h, 076h, 0dch, 0cch, 0cch, 076h, 000h
   287 00015935 3876DCCCCC7600      <1>
   288 0001593C 000000303030600000- <1>     db  000h, 000h, 000h, 030h, 030h, 030h, 060h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   288 00015945 00000000000000      <1>
   289 0001594C 00000C183030303030- <1>     db  000h, 000h, 00ch, 018h, 030h, 030h, 030h, 030h, 030h, 018h, 00ch, 000h, 000h, 000h, 000h, 000h
   289 00015955 180C0000000000      <1>
   290 0001595C 30180C0C0C0C0C1830- <1>     db  030h, 018h, 00ch, 00ch, 00ch, 00ch, 00ch, 018h, 030h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   290 00015965 00000000000000      <1>
   291 0001596C 663CFF3C6600000000- <1>     db  066h, 03ch, 0ffh, 03ch, 066h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h
   291 00015975 00000000001818      <1>
   292 0001597C 7E1818000000000000- <1>     db  07eh, 018h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   292 00015985 00000000000000      <1>
   293 0001598C 181818300000000000- <1>     db  018h, 018h, 018h, 030h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0feh, 000h, 000h, 000h
   293 00015995 000000FE000000      <1>
   294 0001599C 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 000h
   294 000159A5 00000000181800      <1>
   295 000159AC 0000000002060C1830- <1>     db  000h, 000h, 000h, 000h, 002h, 006h, 00ch, 018h, 030h, 060h, 0c0h, 080h, 000h, 000h, 000h, 000h
   295 000159B5 60C08000000000      <1>
   296 000159BC 00007CC6CEDEF6E6C6- <1>     db  000h, 000h, 07ch, 0c6h, 0ceh, 0deh, 0f6h, 0e6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 000h
   296 000159C5 C67C0000000000      <1>
   297 000159CC 18387818181818187E- <1>     db  018h, 038h, 078h, 018h, 018h, 018h, 018h, 018h, 07eh, 000h, 000h, 000h, 000h, 000h, 07ch, 0c6h
   297 000159D5 00000000007CC6      <1>
   298 000159DC 060C183060C6FE0000- <1>     db  006h, 00ch, 018h, 030h, 060h, 0c6h, 0feh, 000h, 000h, 000h, 000h, 000h, 07ch, 0c6h, 006h, 006h
   298 000159E5 0000007CC60606      <1>
   299 000159EC 3C0606C67C00000000- <1>     db  03ch, 006h, 006h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 000h, 00ch, 01ch, 03ch, 06ch, 0cch, 0feh
   299 000159F5 000C1C3C6CCCFE      <1>
   300 000159FC 0C0C1E0000000000FE- <1>     db  00ch, 00ch, 01eh, 000h, 000h, 000h, 000h, 000h, 0feh, 0c0h, 0c0h, 0c0h, 0fch, 006h, 006h, 0c6h
   300 00015A05 C0C0C0FC0606C6      <1>
   301 00015A0C 7C00000000003860C0- <1>     db  07ch, 000h, 000h, 000h, 000h, 000h, 038h, 060h, 0c0h, 0c0h, 0fch, 0c6h, 0c6h, 0c6h, 07ch, 000h
   301 00015A15 C0FCC6C6C67C00      <1>
   302 00015A1C 00000000FEC6060C18- <1>     db  000h, 000h, 000h, 000h, 0feh, 0c6h, 006h, 00ch, 018h, 030h, 030h, 030h, 030h, 000h, 000h, 000h
   302 00015A25 30303030000000      <1>
   303 00015A2C 00007CC6C6C67CC6C6- <1>     db  000h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 07ch, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 000h
   303 00015A35 C67C0000000000      <1>
   304 00015A3C 7CC6C6C67E06060C78- <1>     db  07ch, 0c6h, 0c6h, 0c6h, 07eh, 006h, 006h, 00ch, 078h, 000h, 000h, 000h, 000h, 000h, 000h, 018h
   304 00015A45 00000000000018      <1>
   305 00015A4C 180000001818000000- <1>     db  018h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 000h
   305 00015A55 00000000181800      <1>
   306 00015A5C 000018183000000000- <1>     db  000h, 000h, 018h, 018h, 030h, 000h, 000h, 000h, 000h, 000h, 006h, 00ch, 018h, 030h, 060h, 030h
   306 00015A65 00060C18306030      <1>
   307 00015A6C 180C06000000000000- <1>     db  018h, 00ch, 006h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 07eh, 000h, 000h, 07eh, 000h
   307 00015A75 00007E00007E00      <1>
   308 00015A7C 000000000000603018- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 060h, 030h, 018h, 00ch, 006h, 00ch, 018h, 030h, 060h, 000h
   308 00015A85 0C060C18306000      <1>
   309 00015A8C 000000007CC6C60C18- <1>     db  000h, 000h, 000h, 000h, 07ch, 0c6h, 0c6h, 00ch, 018h, 018h, 000h, 018h, 018h, 000h, 000h, 000h
   309 00015A95 18001818000000      <1>
   310 00015A9C 00007CC6C6DEDEDEDC- <1>     db  000h, 000h, 07ch, 0c6h, 0c6h, 0deh, 0deh, 0deh, 0dch, 0c0h, 07ch, 000h, 000h, 000h, 000h, 000h
   310 00015AA5 C07C0000000000      <1>
   311 00015AAC 10386CC6C6FEC6C6C6- <1>     db  010h, 038h, 06ch, 0c6h, 0c6h, 0feh, 0c6h, 0c6h, 0c6h, 000h, 000h, 000h, 000h, 000h, 0fch, 066h
   311 00015AB5 0000000000FC66      <1>
   312 00015ABC 66667C666666FC0000- <1>     db  066h, 066h, 07ch, 066h, 066h, 066h, 0fch, 000h, 000h, 000h, 000h, 000h, 03ch, 066h, 0c2h, 0c0h
   312 00015AC5 0000003C66C2C0      <1>
   313 00015ACC C0C0C2663C00000000- <1>     db  0c0h, 0c0h, 0c2h, 066h, 03ch, 000h, 000h, 000h, 000h, 000h, 0f8h, 06ch, 066h, 066h, 066h, 066h
   313 00015AD5 00F86C66666666      <1>
   314 00015ADC 666CF80000000000FE- <1>     db  066h, 06ch, 0f8h, 000h, 000h, 000h, 000h, 000h, 0feh, 066h, 062h, 068h, 078h, 068h, 062h, 066h
   314 00015AE5 66626878686266      <1>
   315 00015AEC FE0000000000FE6662- <1>     db  0feh, 000h, 000h, 000h, 000h, 000h, 0feh, 066h, 062h, 068h, 078h, 068h, 060h, 060h, 0f0h, 000h
   315 00015AF5 6878686060F000      <1>
   316 00015AFC 000000003C66C2C0C0- <1>     db  000h, 000h, 000h, 000h, 03ch, 066h, 0c2h, 0c0h, 0c0h, 0deh, 0c6h, 066h, 03ah, 000h, 000h, 000h
   316 00015B05 DEC6663A000000      <1>
   317 00015B0C 0000C6C6C6C6FEC6C6- <1>     db  000h, 000h, 0c6h, 0c6h, 0c6h, 0c6h, 0feh, 0c6h, 0c6h, 0c6h, 0c6h, 000h, 000h, 000h, 000h, 000h
   317 00015B15 C6C60000000000      <1>
   318 00015B1C 3C181818181818183C- <1>     db  03ch, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h, 000h, 01eh, 00ch
   318 00015B25 00000000001E0C      <1>
   319 00015B2C 0C0C0C0CCCCC780000- <1>     db  00ch, 00ch, 00ch, 00ch, 0cch, 0cch, 078h, 000h, 000h, 000h, 000h, 000h, 0e6h, 066h, 06ch, 06ch
   319 00015B35 000000E6666C6C      <1>
   320 00015B3C 786C6C66E600000000- <1>     db  078h, 06ch, 06ch, 066h, 0e6h, 000h, 000h, 000h, 000h, 000h, 0f0h, 060h, 060h, 060h, 060h, 060h
   320 00015B45 00F06060606060      <1>
   321 00015B4C 6266FE0000000000C6- <1>     db  062h, 066h, 0feh, 000h, 000h, 000h, 000h, 000h, 0c6h, 0eeh, 0feh, 0feh, 0d6h, 0c6h, 0c6h, 0c6h
   321 00015B55 EEFEFED6C6C6C6      <1>
   322 00015B5C C60000000000C6E6F6- <1>     db  0c6h, 000h, 000h, 000h, 000h, 000h, 0c6h, 0e6h, 0f6h, 0feh, 0deh, 0ceh, 0c6h, 0c6h, 0c6h, 000h
   322 00015B65 FEDECEC6C6C600      <1>
   323 00015B6C 00000000386CC6C6C6- <1>     db  000h, 000h, 000h, 000h, 038h, 06ch, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 06ch, 038h, 000h, 000h, 000h
   323 00015B75 C6C66C38000000      <1>
   324 00015B7C 0000FC6666667C6060- <1>     db  000h, 000h, 0fch, 066h, 066h, 066h, 07ch, 060h, 060h, 060h, 0f0h, 000h, 000h, 000h, 000h, 000h
   324 00015B85 60F00000000000      <1>
   325 00015B8C 7CC6C6C6C6D6DE7C0C- <1>     db  07ch, 0c6h, 0c6h, 0c6h, 0c6h, 0d6h, 0deh, 07ch, 00ch, 00eh, 000h, 000h, 000h, 000h, 0fch, 066h
   325 00015B95 0E00000000FC66      <1>
   326 00015B9C 66667C6C6666E60000- <1>     db  066h, 066h, 07ch, 06ch, 066h, 066h, 0e6h, 000h, 000h, 000h, 000h, 000h, 07ch, 0c6h, 0c6h, 060h
   326 00015BA5 0000007CC6C660      <1>
   327 00015BAC 380CC6C67C00000000- <1>     db  038h, 00ch, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 000h, 07eh, 07eh, 05ah, 018h, 018h, 018h
   327 00015BB5 007E7E5A181818      <1>
   328 00015BBC 18183C0000000000C6- <1>     db  018h, 018h, 03ch, 000h, 000h, 000h, 000h, 000h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h
   328 00015BC5 C6C6C6C6C6C6C6      <1>
   329 00015BCC 7C0000000000C6C6C6- <1>     db  07ch, 000h, 000h, 000h, 000h, 000h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 06ch, 038h, 010h, 000h
   329 00015BD5 C6C6C66C381000      <1>
   330 00015BDC 00000000C6C6C6C6D6- <1>     db  000h, 000h, 000h, 000h, 0c6h, 0c6h, 0c6h, 0c6h, 0d6h, 0d6h, 0feh, 07ch, 06ch, 000h, 000h, 000h
   330 00015BE5 D6FE7C6C000000      <1>
   331 00015BEC 0000C6C66C3838386C- <1>     db  000h, 000h, 0c6h, 0c6h, 06ch, 038h, 038h, 038h, 06ch, 0c6h, 0c6h, 000h, 000h, 000h, 000h, 000h
   331 00015BF5 C6C60000000000      <1>
   332 00015BFC 666666663C1818183C- <1>     db  066h, 066h, 066h, 066h, 03ch, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h, 000h, 0feh, 0c6h
   332 00015C05 0000000000FEC6      <1>
   333 00015C0C 8C183060C2C6FE0000- <1>     db  08ch, 018h, 030h, 060h, 0c2h, 0c6h, 0feh, 000h, 000h, 000h, 000h, 000h, 03ch, 030h, 030h, 030h
   333 00015C15 0000003C303030      <1>
   334 00015C1C 303030303C00000000- <1>     db  030h, 030h, 030h, 030h, 03ch, 000h, 000h, 000h, 000h, 000h, 080h, 0c0h, 0e0h, 070h, 038h, 01ch
   334 00015C25 0080C0E070381C      <1>
   335 00015C2C 0E060200000000003C- <1>     db  00eh, 006h, 002h, 000h, 000h, 000h, 000h, 000h, 03ch, 00ch, 00ch, 00ch, 00ch, 00ch, 00ch, 00ch
   335 00015C35 0C0C0C0C0C0C0C      <1>
   336 00015C3C 3C00000010386CC600- <1>     db  03ch, 000h, 000h, 000h, 010h, 038h, 06ch, 0c6h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   336 00015C45 00000000000000      <1>
   337 00015C4C 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0ffh, 000h
   337 00015C55 0000000000FF00      <1>
   338 00015C5C 303018000000000000- <1>     db  030h, 030h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   338 00015C65 00000000000000      <1>
   339 00015C6C 000000780C7CCCCC76- <1>     db  000h, 000h, 000h, 078h, 00ch, 07ch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h, 000h, 0e0h, 060h
   339 00015C75 0000000000E060      <1>
   340 00015C7C 60786C6666667C0000- <1>     db  060h, 078h, 06ch, 066h, 066h, 066h, 07ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 07ch
   340 00015C85 0000000000007C      <1>
   341 00015C8C C6C0C0C67C00000000- <1>     db  0c6h, 0c0h, 0c0h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 000h, 01ch, 00ch, 00ch, 03ch, 06ch, 0cch
   341 00015C95 001C0C0C3C6CCC      <1>
   342 00015C9C CCCC76000000000000- <1>     db  0cch, 0cch, 076h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 07ch, 0c6h, 0feh, 0c0h, 0c6h
   342 00015CA5 00007CC6FEC0C6      <1>
   343 00015CAC 7C0000000000386C64- <1>     db  07ch, 000h, 000h, 000h, 000h, 000h, 038h, 06ch, 064h, 060h, 0f0h, 060h, 060h, 060h, 0f0h, 000h
   343 00015CB5 60F0606060F000      <1>
   344 00015CBC 0000000000000076CC- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 076h, 0cch, 0cch, 0cch, 07ch, 00ch, 0cch, 078h, 000h
   344 00015CC5 CCCC7C0CCC7800      <1>
   345 00015CCC 0000E060606C766666- <1>     db  000h, 000h, 0e0h, 060h, 060h, 06ch, 076h, 066h, 066h, 066h, 0e6h, 000h, 000h, 000h, 000h, 000h
   345 00015CD5 66E60000000000      <1>
   346 00015CDC 18180038181818183C- <1>     db  018h, 018h, 000h, 038h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h, 000h, 006h, 006h
   346 00015CE5 00000000000606      <1>
   347 00015CEC 000E0606060666663C- <1>     db  000h, 00eh, 006h, 006h, 006h, 006h, 066h, 066h, 03ch, 000h, 000h, 000h, 0e0h, 060h, 060h, 066h
   347 00015CF5 000000E0606066      <1>
   348 00015CFC 6C786C66E600000000- <1>     db  06ch, 078h, 06ch, 066h, 0e6h, 000h, 000h, 000h, 000h, 000h, 038h, 018h, 018h, 018h, 018h, 018h
   348 00015D05 00381818181818      <1>
   349 00015D0C 18183C000000000000- <1>     db  018h, 018h, 03ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0ech, 0feh, 0d6h, 0d6h, 0d6h
   349 00015D15 0000ECFED6D6D6      <1>
   350 00015D1C C60000000000000000- <1>     db  0c6h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0dch, 066h, 066h, 066h, 066h, 066h, 000h
   350 00015D25 DC666666666600      <1>
   351 00015D2C 000000000000007CC6- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h
   351 00015D35 C6C6C67C000000      <1>
   352 00015D3C 0000000000DC666666- <1>     db  000h, 000h, 000h, 000h, 000h, 0dch, 066h, 066h, 066h, 07ch, 060h, 060h, 0f0h, 000h, 000h, 000h
   352 00015D45 7C6060F0000000      <1>
   353 00015D4C 00000076CCCCCC7C0C- <1>     db  000h, 000h, 000h, 076h, 0cch, 0cch, 0cch, 07ch, 00ch, 00ch, 01eh, 000h, 000h, 000h, 000h, 000h
   353 00015D55 0C1E0000000000      <1>
   354 00015D5C 00DC76666060F00000- <1>     db  000h, 0dch, 076h, 066h, 060h, 060h, 0f0h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 07ch
   354 00015D65 0000000000007C      <1>
   355 00015D6C C6701CC67C00000000- <1>     db  0c6h, 070h, 01ch, 0c6h, 07ch, 000h, 000h, 000h, 000h, 000h, 010h, 030h, 030h, 0fch, 030h, 030h
   355 00015D75 00103030FC3030      <1>
   356 00015D7C 30361C000000000000- <1>     db  030h, 036h, 01ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0cch, 0cch, 0cch, 0cch, 0cch
   356 00015D85 0000CCCCCCCCCC      <1>
   357 00015D8C 760000000000000000- <1>     db  076h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 066h, 066h, 066h, 066h, 03ch, 018h, 000h
   357 00015D95 666666663C1800      <1>
   358 00015D9C 00000000000000C6C6- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 0c6h, 0c6h, 0d6h, 0d6h, 0feh, 06ch, 000h, 000h, 000h
   358 00015DA5 D6D6FE6C000000      <1>
   359 00015DAC 0000000000C66C3838- <1>     db  000h, 000h, 000h, 000h, 000h, 0c6h, 06ch, 038h, 038h, 06ch, 0c6h, 000h, 000h, 000h, 000h, 000h
   359 00015DB5 6CC60000000000      <1>
   360 00015DBC 000000C6C6C6C67E06- <1>     db  000h, 000h, 000h, 0c6h, 0c6h, 0c6h, 0c6h, 07eh, 006h, 00ch, 0f8h, 000h, 000h, 000h, 000h, 000h
   360 00015DC5 0CF80000000000      <1>
   361 00015DCC 00FECC183066FE0000- <1>     db  000h, 0feh, 0cch, 018h, 030h, 066h, 0feh, 000h, 000h, 000h, 000h, 000h, 00eh, 018h, 018h, 018h
   361 00015DD5 0000000E181818      <1>
   362 00015DDC 701818180E00000000- <1>     db  070h, 018h, 018h, 018h, 00eh, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 018h, 018h, 000h, 018h
   362 00015DE5 00181818180018      <1>
   363 00015DEC 181818000000000070- <1>     db  018h, 018h, 018h, 000h, 000h, 000h, 000h, 000h, 070h, 018h, 018h, 018h, 00eh, 018h, 018h, 018h
   363 00015DF5 1818180E181818      <1>
   364 00015DFC 70000000000076DC00- <1>     db  070h, 000h, 000h, 000h, 000h, 000h, 076h, 0dch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   364 00015E05 00000000000000      <1>
   365 00015E0C 00000000000010386C- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 010h, 038h, 06ch, 0c6h, 0c6h, 0feh, 000h, 000h, 000h, 000h
   365 00015E15 C6C6FE00000000      <1>
   366 00015E1C 00003C66C2C0C0C266- <1>     db  000h, 000h, 03ch, 066h, 0c2h, 0c0h, 0c0h, 0c2h, 066h, 03ch, 00ch, 006h, 07ch, 000h, 000h, 000h
   366 00015E25 3C0C067C000000      <1>
   367 00015E2C CCCC00CCCCCCCCCC76- <1>     db  0cch, 0cch, 000h, 0cch, 0cch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h, 00ch, 018h, 030h
   367 00015E35 000000000C1830      <1>
   368 00015E3C 007CC6FEC0C67C0000- <1>     db  000h, 07ch, 0c6h, 0feh, 0c0h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 010h, 038h, 06ch, 000h, 078h
   368 00015E45 000010386C0078      <1>
   369 00015E4C 0C7CCCCC7600000000- <1>     db  00ch, 07ch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h, 000h, 0cch, 0cch, 000h, 078h, 00ch, 07ch
   369 00015E55 00CCCC00780C7C      <1>
   370 00015E5C CCCC76000000006030- <1>     db  0cch, 0cch, 076h, 000h, 000h, 000h, 000h, 060h, 030h, 018h, 000h, 078h, 00ch, 07ch, 0cch, 0cch
   370 00015E65 1800780C7CCCCC      <1>
   371 00015E6C 7600000000386C3800- <1>     db  076h, 000h, 000h, 000h, 000h, 038h, 06ch, 038h, 000h, 078h, 00ch, 07ch, 0cch, 0cch, 076h, 000h
   371 00015E75 780C7CCCCC7600      <1>
   372 00015E7C 0000000000003C6660- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 03ch, 066h, 060h, 066h, 03ch, 00ch, 006h, 03ch, 000h, 000h
   372 00015E85 663C0C063C0000      <1>
   373 00015E8C 0010386C007CC6FEC0- <1>     db  000h, 010h, 038h, 06ch, 000h, 07ch, 0c6h, 0feh, 0c0h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 000h
   373 00015E95 C67C0000000000      <1>
   374 00015E9C CCCC007CC6FEC0C67C- <1>     db  0cch, 0cch, 000h, 07ch, 0c6h, 0feh, 0c0h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 060h, 030h, 018h
   374 00015EA5 00000000603018      <1>
   375 00015EAC 007CC6FEC0C67C0000- <1>     db  000h, 07ch, 0c6h, 0feh, 0c0h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 000h, 066h, 066h, 000h, 038h
   375 00015EB5 00000066660038      <1>
   376 00015EBC 181818183C00000000- <1>     db  018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h, 018h, 03ch, 066h, 000h, 038h, 018h, 018h
   376 00015EC5 183C6600381818      <1>
   377 00015ECC 18183C000000006030- <1>     db  018h, 018h, 03ch, 000h, 000h, 000h, 000h, 060h, 030h, 018h, 000h, 038h, 018h, 018h, 018h, 018h
   377 00015ED5 18003818181818      <1>
   378 00015EDC 3C00000000C6C61038- <1>     db  03ch, 000h, 000h, 000h, 000h, 0c6h, 0c6h, 010h, 038h, 06ch, 0c6h, 0c6h, 0feh, 0c6h, 0c6h, 000h
   378 00015EE5 6CC6C6FEC6C600      <1>
   379 00015EEC 0000386C3800386CC6- <1>     db  000h, 000h, 038h, 06ch, 038h, 000h, 038h, 06ch, 0c6h, 0c6h, 0feh, 0c6h, 0c6h, 000h, 000h, 000h
   379 00015EF5 C6FEC6C6000000      <1>
   380 00015EFC 18306000FE66607C60- <1>     db  018h, 030h, 060h, 000h, 0feh, 066h, 060h, 07ch, 060h, 066h, 0feh, 000h, 000h, 000h, 000h, 000h
   380 00015F05 66FE0000000000      <1>
   381 00015F0C 0000CC76367ED8D86E- <1>     db  000h, 000h, 0cch, 076h, 036h, 07eh, 0d8h, 0d8h, 06eh, 000h, 000h, 000h, 000h, 000h, 03eh, 06ch
   381 00015F15 00000000003E6C      <1>
   382 00015F1C CCCCFECCCCCCCE0000- <1>     db  0cch, 0cch, 0feh, 0cch, 0cch, 0cch, 0ceh, 000h, 000h, 000h, 000h, 010h, 038h, 06ch, 000h, 07ch
   382 00015F25 000010386C007C      <1>
   383 00015F2C C6C6C6C67C00000000- <1>     db  0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 000h, 0c6h, 0c6h, 000h, 07ch, 0c6h, 0c6h
   383 00015F35 00C6C6007CC6C6      <1>
   384 00015F3C C6C67C000000006030- <1>     db  0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 060h, 030h, 018h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h
   384 00015F45 18007CC6C6C6C6      <1>
   385 00015F4C 7C000000003078CC00- <1>     db  07ch, 000h, 000h, 000h, 000h, 030h, 078h, 0cch, 000h, 0cch, 0cch, 0cch, 0cch, 0cch, 076h, 000h
   385 00015F55 CCCCCCCCCC7600      <1>
   386 00015F5C 00000060301800CCCC- <1>     db  000h, 000h, 000h, 060h, 030h, 018h, 000h, 0cch, 0cch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h
   386 00015F65 CCCCCC76000000      <1>
   387 00015F6C 0000C6C600C6C6C6C6- <1>     db  000h, 000h, 0c6h, 0c6h, 000h, 0c6h, 0c6h, 0c6h, 0c6h, 07eh, 006h, 00ch, 078h, 000h, 000h, 0c6h
   387 00015F75 7E060C780000C6      <1>
   388 00015F7C C6386CC6C6C6C66C38- <1>     db  0c6h, 038h, 06ch, 0c6h, 0c6h, 0c6h, 0c6h, 06ch, 038h, 000h, 000h, 000h, 000h, 0c6h, 0c6h, 000h
   388 00015F85 00000000C6C600      <1>
   389 00015F8C C6C6C6C6C6C67C0000- <1>     db  0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 018h, 018h, 03ch, 066h, 060h
   389 00015F95 000018183C6660      <1>
   390 00015F9C 60663C181800000000- <1>     db  060h, 066h, 03ch, 018h, 018h, 000h, 000h, 000h, 000h, 038h, 06ch, 064h, 060h, 0f0h, 060h, 060h
   390 00015FA5 386C6460F06060      <1>
   391 00015FAC 60E6FC000000000066- <1>     db  060h, 0e6h, 0fch, 000h, 000h, 000h, 000h, 000h, 066h, 066h, 03ch, 018h, 07eh, 018h, 07eh, 018h
   391 00015FB5 663C187E187E18      <1>
   392 00015FBC 1800000000F8CCCCF8- <1>     db  018h, 000h, 000h, 000h, 000h, 0f8h, 0cch, 0cch, 0f8h, 0c4h, 0cch, 0deh, 0cch, 0cch, 0c6h, 000h
   392 00015FC5 C4CCDECCCCC600      <1>
   393 00015FCC 0000000E1B1818187E- <1>     db  000h, 000h, 000h, 00eh, 01bh, 018h, 018h, 018h, 07eh, 018h, 018h, 018h, 018h, 0d8h, 070h, 000h
   393 00015FD5 18181818D87000      <1>
   394 00015FDC 0018306000780C7CCC- <1>     db  000h, 018h, 030h, 060h, 000h, 078h, 00ch, 07ch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h, 00ch
   394 00015FE5 CC76000000000C      <1>
   395 00015FEC 18300038181818183C- <1>     db  018h, 030h, 000h, 038h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h, 018h, 030h, 060h
   395 00015FF5 00000000183060      <1>
   396 00015FFC 007CC6C6C6C67C0000- <1>     db  000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 018h, 030h, 060h, 000h, 0cch
   396 00016005 000018306000CC      <1>
   397 0001600C CCCCCCCC7600000000- <1>     db  0cch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h, 000h, 076h, 0dch, 000h, 0dch, 066h, 066h
   397 00016015 0076DC00DC6666      <1>
   398 0001601C 66666600000076DC00- <1>     db  066h, 066h, 066h, 000h, 000h, 000h, 076h, 0dch, 000h, 0c6h, 0e6h, 0f6h, 0feh, 0deh, 0ceh, 0c6h
   398 00016025 C6E6F6FEDECEC6      <1>
   399 0001602C C6000000003C6C6C3E- <1>     db  0c6h, 000h, 000h, 000h, 000h, 03ch, 06ch, 06ch, 03eh, 000h, 07eh, 000h, 000h, 000h, 000h, 000h
   399 00016035 007E0000000000      <1>
   400 0001603C 000000386C6C38007C- <1>     db  000h, 000h, 000h, 038h, 06ch, 06ch, 038h, 000h, 07ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   400 00016045 00000000000000      <1>
   401 0001604C 0000303000303060C6- <1>     db  000h, 000h, 030h, 030h, 000h, 030h, 030h, 060h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h, 000h
   401 00016055 C67C0000000000      <1>
   402 0001605C 00000000FEC0C0C000- <1>     db  000h, 000h, 000h, 000h, 0feh, 0c0h, 0c0h, 0c0h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   402 00016065 00000000000000      <1>
   403 0001606C 0000FE060606000000- <1>     db  000h, 000h, 0feh, 006h, 006h, 006h, 000h, 000h, 000h, 000h, 000h, 0c0h, 0c0h, 0c6h, 0cch, 0d8h
   403 00016075 0000C0C0C6CCD8      <1>
   404 0001607C 3060DC860C183E0000- <1>     db  030h, 060h, 0dch, 086h, 00ch, 018h, 03eh, 000h, 000h, 0c0h, 0c0h, 0c6h, 0cch, 0d8h, 030h, 066h
   404 00016085 C0C0C6CCD83066      <1>
   405 0001608C CE9E3E060600000018- <1>     db  0ceh, 09eh, 03eh, 006h, 006h, 000h, 000h, 000h, 018h, 018h, 000h, 018h, 018h, 03ch, 03ch, 03ch
   405 00016095 180018183C3C3C      <1>
   406 0001609C 180000000000000036- <1>     db  018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 036h, 06ch, 0d8h, 06ch, 036h, 000h, 000h, 000h
   406 000160A5 6CD86C36000000      <1>
   407 000160AC 000000000000D86C36- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 0d8h, 06ch, 036h, 06ch, 0d8h, 000h, 000h, 000h, 000h, 000h
   407 000160B5 6CD80000000000      <1>
   408 000160BC 114411441144114411- <1>     db  011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h, 055h, 0aah
   408 000160C5 441144114455AA      <1>
   409 000160CC 55AA55AA55AA55AA55- <1>     db  055h, 0aah, 055h, 0aah, 055h, 0aah, 055h, 0aah, 055h, 0aah, 055h, 0aah, 0ddh, 077h, 0ddh, 077h
   409 000160D5 AA55AADD77DD77      <1>
   410 000160DC DD77DD77DD77DD77DD- <1>     db  0ddh, 077h, 0ddh, 077h, 0ddh, 077h, 0ddh, 077h, 0ddh, 077h, 018h, 018h, 018h, 018h, 018h, 018h
   410 000160E5 77181818181818      <1>
   411 000160EC 181818181818181818- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 0f8h
   411 000160F5 181818181818F8      <1>
   412 000160FC 181818181818181818- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 0f8h, 018h, 0f8h, 018h, 018h
   412 00016105 1818F818F81818      <1>
   413 0001610C 181818183636363636- <1>     db  018h, 018h, 018h, 018h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 0f6h, 036h, 036h, 036h, 036h
   413 00016115 3636F636363636      <1>
   414 0001611C 363600000000000000- <1>     db  036h, 036h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0feh, 036h, 036h, 036h, 036h, 036h, 036h
   414 00016125 FE363636363636      <1>
   415 0001612C 0000000000F818F818- <1>     db  000h, 000h, 000h, 000h, 000h, 0f8h, 018h, 0f8h, 018h, 018h, 018h, 018h, 018h, 018h, 036h, 036h
   415 00016135 18181818183636      <1>
   416 0001613C 363636F606F6363636- <1>     db  036h, 036h, 036h, 0f6h, 006h, 0f6h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   416 00016145 36363636363636      <1>
   417 0001614C 363636363636363636- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h, 000h, 000h, 000h, 0feh
   417 00016155 360000000000FE      <1>
   418 0001615C 06F636363636363636- <1>     db  006h, 0f6h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 0f6h, 006h, 0feh
   418 00016165 36363636F606FE      <1>
   419 0001616C 000000000000363636- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 0feh, 000h, 000h
   419 00016175 36363636FE0000      <1>
   420 0001617C 000000001818181818- <1>     db  000h, 000h, 000h, 000h, 018h, 018h, 018h, 018h, 018h, 0f8h, 018h, 0f8h, 000h, 000h, 000h, 000h
   420 00016185 F818F800000000      <1>
   421 0001618C 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0f8h, 018h, 018h, 018h, 018h, 018h, 018h
   421 00016195 F8181818181818      <1>
   422 0001619C 181818181818181F00- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 01fh, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h
   422 000161A5 00000000001818      <1>
   423 000161AC 1818181818FF000000- <1>     db  018h, 018h, 018h, 018h, 018h, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   423 000161B5 00000000000000      <1>
   424 000161BC 000000FF1818181818- <1>     db  000h, 000h, 000h, 0ffh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   424 000161C5 18181818181818      <1>
   425 000161CC 181F18181818181800- <1>     db  018h, 01fh, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0ffh
   425 000161D5 000000000000FF      <1>
   426 000161DC 000000000000181818- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 0ffh, 018h, 018h
   426 000161E5 18181818FF1818      <1>
   427 000161EC 181818181818181818- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 01fh, 018h, 01fh, 018h, 018h, 018h, 018h
   427 000161F5 1F181F18181818      <1>
   428 000161FC 181836363636363636- <1>     db  018h, 018h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 037h, 036h, 036h, 036h, 036h, 036h, 036h
   428 00016205 37363636363636      <1>
   429 0001620C 363636363637303F00- <1>     db  036h, 036h, 036h, 036h, 036h, 037h, 030h, 03fh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   429 00016215 00000000000000      <1>
   430 0001621C 0000003F3037363636- <1>     db  000h, 000h, 000h, 03fh, 030h, 037h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   430 00016225 36363636363636      <1>
   431 0001622C 36F700FF0000000000- <1>     db  036h, 0f7h, 000h, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0ffh
   431 00016235 000000000000FF      <1>
   432 0001623C 00F736363636363636- <1>     db  000h, 0f7h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 037h, 030h, 037h
   432 00016245 36363636373037      <1>
   433 0001624C 363636363636000000- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h, 000h, 000h, 000h, 0ffh, 000h, 0ffh, 000h, 000h
   433 00016255 0000FF00FF0000      <1>
   434 0001625C 000000003636363636- <1>     db  000h, 000h, 000h, 000h, 036h, 036h, 036h, 036h, 036h, 0f7h, 000h, 0f7h, 036h, 036h, 036h, 036h
   434 00016265 F700F736363636      <1>
   435 0001626C 36361818181818FF00- <1>     db  036h, 036h, 018h, 018h, 018h, 018h, 018h, 0ffh, 000h, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h
   435 00016275 FF000000000000      <1>
   436 0001627C 36363636363636FF00- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 036h, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   436 00016285 00000000000000      <1>
   437 0001628C 000000FF00FF181818- <1>     db  000h, 000h, 000h, 0ffh, 000h, 0ffh, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h, 000h, 000h
   437 00016295 18181800000000      <1>
   438 0001629C 000000FF3636363636- <1>     db  000h, 000h, 000h, 0ffh, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   438 000162A5 36363636363636      <1>
   439 000162AC 363F00000000000018- <1>     db  036h, 03fh, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 018h, 018h, 018h, 01fh, 018h, 01fh
   439 000162B5 181818181F181F      <1>
   440 000162BC 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 01fh, 018h, 01fh, 018h, 018h
   440 000162C5 00001F181F1818      <1>
   441 000162CC 181818180000000000- <1>     db  018h, 018h, 018h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 03fh, 036h, 036h, 036h, 036h
   441 000162D5 00003F36363636      <1>
   442 000162DC 363636363636363636- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 0ffh, 036h, 036h, 036h, 036h, 036h, 036h
   442 000162E5 FF363636363636      <1>
   443 000162EC 1818181818FF18FF18- <1>     db  018h, 018h, 018h, 018h, 018h, 0ffh, 018h, 0ffh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   443 000162F5 18181818181818      <1>
   444 000162FC 1818181818F8000000- <1>     db  018h, 018h, 018h, 018h, 018h, 0f8h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   444 00016305 00000000000000      <1>
   445 0001630C 0000001F1818181818- <1>     db  000h, 000h, 000h, 01fh, 018h, 018h, 018h, 018h, 018h, 018h, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh
   445 00016315 18FFFFFFFFFFFF      <1>
   446 0001631C FFFFFFFFFFFFFFFF00- <1>     db  0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0ffh
   446 00016325 000000000000FF      <1>
   447 0001632C FFFFFFFFFFFFF0F0F0- <1>     db  0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h
   447 00016335 F0F0F0F0F0F0F0      <1>
   448 0001633C F0F0F0F00F0F0F0F0F- <1>     db  0f0h, 0f0h, 0f0h, 0f0h, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh
   448 00016345 0F0F0F0F0F0F0F      <1>
   449 0001634C 0F0FFFFFFFFFFFFFFF- <1>     db  00fh, 00fh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   449 00016355 00000000000000      <1>
   450 0001635C 000000000076DCD8D8- <1>     db  000h, 000h, 000h, 000h, 000h, 076h, 0dch, 0d8h, 0d8h, 0dch, 076h, 000h, 000h, 000h, 000h, 000h
   450 00016365 DC760000000000      <1>
   451 0001636C 00007CC6FCC6C6FCC0- <1>     db  000h, 000h, 07ch, 0c6h, 0fch, 0c6h, 0c6h, 0fch, 0c0h, 0c0h, 040h, 000h, 000h, 000h, 0feh, 0c6h
   451 00016375 C040000000FEC6      <1>
   452 0001637C C6C0C0C0C0C0C00000- <1>     db  0c6h, 0c0h, 0c0h, 0c0h, 0c0h, 0c0h, 0c0h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0feh, 06ch
   452 00016385 0000000000FE6C      <1>
   453 0001638C 6C6C6C6C6C00000000- <1>     db  06ch, 06ch, 06ch, 06ch, 06ch, 000h, 000h, 000h, 000h, 000h, 0feh, 0c6h, 060h, 030h, 018h, 030h
   453 00016395 00FEC660301830      <1>
   454 0001639C 60C6FE000000000000- <1>     db  060h, 0c6h, 0feh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 07eh, 0d8h, 0d8h, 0d8h, 0d8h
   454 000163A5 00007ED8D8D8D8      <1>
   455 000163AC 700000000000000066- <1>     db  070h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 066h, 066h, 066h, 066h, 07ch, 060h, 060h, 0c0h
   455 000163B5 6666667C6060C0      <1>
   456 000163BC 00000000000076DC18- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 076h, 0dch, 018h, 018h, 018h, 018h, 018h, 000h, 000h, 000h
   456 000163C5 18181818000000      <1>
   457 000163CC 00007E183C6666663C- <1>     db  000h, 000h, 07eh, 018h, 03ch, 066h, 066h, 066h, 03ch, 018h, 07eh, 000h, 000h, 000h, 000h, 000h
   457 000163D5 187E0000000000      <1>
   458 000163DC 386CC6C6FEC6C66C38- <1>     db  038h, 06ch, 0c6h, 0c6h, 0feh, 0c6h, 0c6h, 06ch, 038h, 000h, 000h, 000h, 000h, 000h, 038h, 06ch
   458 000163E5 0000000000386C      <1>
   459 000163EC C6C6C66C6C6CEE0000- <1>     db  0c6h, 0c6h, 0c6h, 06ch, 06ch, 06ch, 0eeh, 000h, 000h, 000h, 000h, 000h, 01eh, 030h, 018h, 00ch
   459 000163F5 0000001E30180C      <1>
   460 000163FC 3E6666663C00000000- <1>     db  03eh, 066h, 066h, 066h, 03ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 07eh, 0dbh, 0dbh
   460 00016405 000000007EDBDB      <1>
   461 0001640C 7E0000000000000003- <1>     db  07eh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 003h, 006h, 07eh, 0dbh, 0dbh, 0f3h, 07eh, 060h
   461 00016415 067EDBDBF37E60      <1>
   462 0001641C C000000000001C3060- <1>     db  0c0h, 000h, 000h, 000h, 000h, 000h, 01ch, 030h, 060h, 060h, 07ch, 060h, 060h, 030h, 01ch, 000h
   462 00016425 607C6060301C00      <1>
   463 0001642C 00000000007CC6C6C6- <1>     db  000h, 000h, 000h, 000h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 000h, 000h, 000h
   463 00016435 C6C6C6C6000000      <1>
   464 0001643C 000000FE0000FE0000- <1>     db  000h, 000h, 000h, 0feh, 000h, 000h, 0feh, 000h, 000h, 0feh, 000h, 000h, 000h, 000h, 000h, 000h
   464 00016445 FE000000000000      <1>
   465 0001644C 0018187E18180000FF- <1>     db  000h, 018h, 018h, 07eh, 018h, 018h, 000h, 000h, 0ffh, 000h, 000h, 000h, 000h, 000h, 030h, 018h
   465 00016455 00000000003018      <1>
   466 0001645C 0C060C1830007E0000- <1>     db  00ch, 006h, 00ch, 018h, 030h, 000h, 07eh, 000h, 000h, 000h, 000h, 000h, 00ch, 018h, 030h, 060h
   466 00016465 0000000C183060      <1>
   467 0001646C 30180C007E00000000- <1>     db  030h, 018h, 00ch, 000h, 07eh, 000h, 000h, 000h, 000h, 000h, 00eh, 01bh, 01bh, 018h, 018h, 018h
   467 00016475 000E1B1B181818      <1>
   468 0001647C 181818181818181818- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 0d8h, 0d8h
   468 00016485 1818181818D8D8      <1>
   469 0001648C 700000000000001818- <1>     db  070h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 000h, 07eh, 000h, 018h, 018h, 000h, 000h
   469 00016495 007E0018180000      <1>
   470 0001649C 00000000000076DC00- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 076h, 0dch, 000h, 076h, 0dch, 000h, 000h, 000h, 000h, 000h
   470 000164A5 76DC0000000000      <1>
   471 000164AC 00386C6C3800000000- <1>     db  000h, 038h, 06ch, 06ch, 038h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   471 000164B5 00000000000000      <1>
   472 000164BC 000000001818000000- <1>     db  000h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   472 000164C5 00000000000000      <1>
   473 000164CC 000000180000000000- <1>     db  000h, 000h, 000h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 00fh, 00ch, 00ch, 00ch, 00ch
   473 000164D5 00000F0C0C0C0C      <1>
   474 000164DC 0CEC6C3C1C00000000- <1>     db  00ch, 0ech, 06ch, 03ch, 01ch, 000h, 000h, 000h, 000h, 0d8h, 06ch, 06ch, 06ch, 06ch, 06ch, 000h
   474 000164E5 D86C6C6C6C6C00      <1>
   475 000164EC 0000000000000070D8- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 070h, 0d8h, 030h, 060h, 0c8h, 0f8h, 000h, 000h, 000h
   475 000164F5 3060C8F8000000      <1>
   476 000164FC 00000000000000007C- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 07ch, 07ch, 07ch, 07ch, 07ch, 07ch, 000h, 000h
   476 00016505 7C7C7C7C7C0000      <1>
   477 0001650C 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   477 00016515 00000000000000      <1>
   478                              <1> vgafont16:
   479 0001651C 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   479 00016525 00000000000000      <1>
   480 0001652C 00007E81A58181BD99- <1>     db  000h, 000h, 07eh, 081h, 0a5h, 081h, 081h, 0bdh, 099h, 081h, 081h, 07eh, 000h, 000h, 000h, 000h
   480 00016535 81817E00000000      <1>
   481 0001653C 00007EFFDBFFFFC3E7- <1>     db  000h, 000h, 07eh, 0ffh, 0dbh, 0ffh, 0ffh, 0c3h, 0e7h, 0ffh, 0ffh, 07eh, 000h, 000h, 000h, 000h
   481 00016545 FFFF7E00000000      <1>
   482 0001654C 000000006CFEFEFEFE- <1>     db  000h, 000h, 000h, 000h, 06ch, 0feh, 0feh, 0feh, 0feh, 07ch, 038h, 010h, 000h, 000h, 000h, 000h
   482 00016555 7C381000000000      <1>
   483 0001655C 0000000010387CFE7C- <1>     db  000h, 000h, 000h, 000h, 010h, 038h, 07ch, 0feh, 07ch, 038h, 010h, 000h, 000h, 000h, 000h, 000h
   483 00016565 38100000000000      <1>
   484 0001656C 000000183C3CE7E7E7- <1>     db  000h, 000h, 000h, 018h, 03ch, 03ch, 0e7h, 0e7h, 0e7h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h
   484 00016575 18183C00000000      <1>
   485 0001657C 000000183C7EFFFF7E- <1>     db  000h, 000h, 000h, 018h, 03ch, 07eh, 0ffh, 0ffh, 07eh, 018h, 018h, 03ch, 000h, 000h, 000h, 000h
   485 00016585 18183C00000000      <1>
   486 0001658C 000000000000183C3C- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 018h, 03ch, 03ch, 018h, 000h, 000h, 000h, 000h, 000h, 000h
   486 00016595 18000000000000      <1>
   487 0001659C FFFFFFFFFFFFE7C3C3- <1>     db  0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0e7h, 0c3h, 0c3h, 0e7h, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh
   487 000165A5 E7FFFFFFFFFFFF      <1>
   488 000165AC 00000000003C664242- <1>     db  000h, 000h, 000h, 000h, 000h, 03ch, 066h, 042h, 042h, 066h, 03ch, 000h, 000h, 000h, 000h, 000h
   488 000165B5 663C0000000000      <1>
   489 000165BC FFFFFFFFFFC399BDBD- <1>     db  0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0c3h, 099h, 0bdh, 0bdh, 099h, 0c3h, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh
   489 000165C5 99C3FFFFFFFFFF      <1>
   490 000165CC 00001E0E1A3278CCCC- <1>     db  000h, 000h, 01eh, 00eh, 01ah, 032h, 078h, 0cch, 0cch, 0cch, 0cch, 078h, 000h, 000h, 000h, 000h
   490 000165D5 CCCC7800000000      <1>
   491 000165DC 00003C666666663C18- <1>     db  000h, 000h, 03ch, 066h, 066h, 066h, 066h, 03ch, 018h, 07eh, 018h, 018h, 000h, 000h, 000h, 000h
   491 000165E5 7E181800000000      <1>
   492 000165EC 00003F333F30303030- <1>     db  000h, 000h, 03fh, 033h, 03fh, 030h, 030h, 030h, 030h, 070h, 0f0h, 0e0h, 000h, 000h, 000h, 000h
   492 000165F5 70F0E000000000      <1>
   493 000165FC 00007F637F63636363- <1>     db  000h, 000h, 07fh, 063h, 07fh, 063h, 063h, 063h, 063h, 067h, 0e7h, 0e6h, 0c0h, 000h, 000h, 000h
   493 00016605 67E7E6C0000000      <1>
   494 0001660C 0000001818DB3CE73C- <1>     db  000h, 000h, 000h, 018h, 018h, 0dbh, 03ch, 0e7h, 03ch, 0dbh, 018h, 018h, 000h, 000h, 000h, 000h
   494 00016615 DB181800000000      <1>
   495 0001661C 0080C0E0F0F8FEF8F0- <1>     db  000h, 080h, 0c0h, 0e0h, 0f0h, 0f8h, 0feh, 0f8h, 0f0h, 0e0h, 0c0h, 080h, 000h, 000h, 000h, 000h
   495 00016625 E0C08000000000      <1>
   496 0001662C 0002060E1E3EFE3E1E- <1>     db  000h, 002h, 006h, 00eh, 01eh, 03eh, 0feh, 03eh, 01eh, 00eh, 006h, 002h, 000h, 000h, 000h, 000h
   496 00016635 0E060200000000      <1>
   497 0001663C 0000183C7E1818187E- <1>     db  000h, 000h, 018h, 03ch, 07eh, 018h, 018h, 018h, 07eh, 03ch, 018h, 000h, 000h, 000h, 000h, 000h
   497 00016645 3C180000000000      <1>
   498 0001664C 000066666666666666- <1>     db  000h, 000h, 066h, 066h, 066h, 066h, 066h, 066h, 066h, 000h, 066h, 066h, 000h, 000h, 000h, 000h
   498 00016655 00666600000000      <1>
   499 0001665C 00007FDBDBDB7B1B1B- <1>     db  000h, 000h, 07fh, 0dbh, 0dbh, 0dbh, 07bh, 01bh, 01bh, 01bh, 01bh, 01bh, 000h, 000h, 000h, 000h
   499 00016665 1B1B1B00000000      <1>
   500 0001666C 007CC660386CC6C66C- <1>     db  000h, 07ch, 0c6h, 060h, 038h, 06ch, 0c6h, 0c6h, 06ch, 038h, 00ch, 0c6h, 07ch, 000h, 000h, 000h
   500 00016675 380CC67C000000      <1>
   501 0001667C 0000000000000000FE- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0feh, 0feh, 0feh, 0feh, 000h, 000h, 000h, 000h
   501 00016685 FEFEFE00000000      <1>
   502 0001668C 0000183C7E1818187E- <1>     db  000h, 000h, 018h, 03ch, 07eh, 018h, 018h, 018h, 07eh, 03ch, 018h, 07eh, 000h, 000h, 000h, 000h
   502 00016695 3C187E00000000      <1>
   503 0001669C 0000183C7E18181818- <1>     db  000h, 000h, 018h, 03ch, 07eh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h, 000h, 000h
   503 000166A5 18181800000000      <1>
   504 000166AC 000018181818181818- <1>     db  000h, 000h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 07eh, 03ch, 018h, 000h, 000h, 000h, 000h
   504 000166B5 7E3C1800000000      <1>
   505 000166BC 0000000000180CFE0C- <1>     db  000h, 000h, 000h, 000h, 000h, 018h, 00ch, 0feh, 00ch, 018h, 000h, 000h, 000h, 000h, 000h, 000h
   505 000166C5 18000000000000      <1>
   506 000166CC 00000000003060FE60- <1>     db  000h, 000h, 000h, 000h, 000h, 030h, 060h, 0feh, 060h, 030h, 000h, 000h, 000h, 000h, 000h, 000h
   506 000166D5 30000000000000      <1>
   507 000166DC 000000000000C0C0C0- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 0c0h, 0c0h, 0c0h, 0feh, 000h, 000h, 000h, 000h, 000h, 000h
   507 000166E5 FE000000000000      <1>
   508 000166EC 00000000002466FF66- <1>     db  000h, 000h, 000h, 000h, 000h, 024h, 066h, 0ffh, 066h, 024h, 000h, 000h, 000h, 000h, 000h, 000h
   508 000166F5 24000000000000      <1>
   509 000166FC 000000001038387C7C- <1>     db  000h, 000h, 000h, 000h, 010h, 038h, 038h, 07ch, 07ch, 0feh, 0feh, 000h, 000h, 000h, 000h, 000h
   509 00016705 FEFE0000000000      <1>
   510 0001670C 00000000FEFE7C7C38- <1>     db  000h, 000h, 000h, 000h, 0feh, 0feh, 07ch, 07ch, 038h, 038h, 010h, 000h, 000h, 000h, 000h, 000h
   510 00016715 38100000000000      <1>
   511 0001671C 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   511 00016725 00000000000000      <1>
   512 0001672C 0000183C3C3C181818- <1>     db  000h, 000h, 018h, 03ch, 03ch, 03ch, 018h, 018h, 018h, 000h, 018h, 018h, 000h, 000h, 000h, 000h
   512 00016735 00181800000000      <1>
   513 0001673C 006666662400000000- <1>     db  000h, 066h, 066h, 066h, 024h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   513 00016745 00000000000000      <1>
   514 0001674C 0000006C6CFE6C6C6C- <1>     db  000h, 000h, 000h, 06ch, 06ch, 0feh, 06ch, 06ch, 06ch, 0feh, 06ch, 06ch, 000h, 000h, 000h, 000h
   514 00016755 FE6C6C00000000      <1>
   515 0001675C 18187CC6C2C07C0606- <1>     db  018h, 018h, 07ch, 0c6h, 0c2h, 0c0h, 07ch, 006h, 006h, 086h, 0c6h, 07ch, 018h, 018h, 000h, 000h
   515 00016765 86C67C18180000      <1>
   516 0001676C 00000000C2C60C1830- <1>     db  000h, 000h, 000h, 000h, 0c2h, 0c6h, 00ch, 018h, 030h, 060h, 0c6h, 086h, 000h, 000h, 000h, 000h
   516 00016775 60C68600000000      <1>
   517 0001677C 0000386C6C3876DCCC- <1>     db  000h, 000h, 038h, 06ch, 06ch, 038h, 076h, 0dch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   517 00016785 CCCC7600000000      <1>
   518 0001678C 003030306000000000- <1>     db  000h, 030h, 030h, 030h, 060h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   518 00016795 00000000000000      <1>
   519 0001679C 00000C183030303030- <1>     db  000h, 000h, 00ch, 018h, 030h, 030h, 030h, 030h, 030h, 030h, 018h, 00ch, 000h, 000h, 000h, 000h
   519 000167A5 30180C00000000      <1>
   520 000167AC 000030180C0C0C0C0C- <1>     db  000h, 000h, 030h, 018h, 00ch, 00ch, 00ch, 00ch, 00ch, 00ch, 018h, 030h, 000h, 000h, 000h, 000h
   520 000167B5 0C183000000000      <1>
   521 000167BC 0000000000663CFF3C- <1>     db  000h, 000h, 000h, 000h, 000h, 066h, 03ch, 0ffh, 03ch, 066h, 000h, 000h, 000h, 000h, 000h, 000h
   521 000167C5 66000000000000      <1>
   522 000167CC 000000000018187E18- <1>     db  000h, 000h, 000h, 000h, 000h, 018h, 018h, 07eh, 018h, 018h, 000h, 000h, 000h, 000h, 000h, 000h
   522 000167D5 18000000000000      <1>
   523 000167DC 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 018h, 030h, 000h, 000h, 000h
   523 000167E5 18181830000000      <1>
   524 000167EC 00000000000000FE00- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 0feh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   524 000167F5 00000000000000      <1>
   525 000167FC 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 000h
   525 00016805 00181800000000      <1>
   526 0001680C 0000000002060C1830- <1>     db  000h, 000h, 000h, 000h, 002h, 006h, 00ch, 018h, 030h, 060h, 0c0h, 080h, 000h, 000h, 000h, 000h
   526 00016815 60C08000000000      <1>
   527 0001681C 00003C66C3C3DBDBC3- <1>     db  000h, 000h, 03ch, 066h, 0c3h, 0c3h, 0dbh, 0dbh, 0c3h, 0c3h, 066h, 03ch, 000h, 000h, 000h, 000h
   527 00016825 C3663C00000000      <1>
   528 0001682C 000018387818181818- <1>     db  000h, 000h, 018h, 038h, 078h, 018h, 018h, 018h, 018h, 018h, 018h, 07eh, 000h, 000h, 000h, 000h
   528 00016835 18187E00000000      <1>
   529 0001683C 00007CC6060C183060- <1>     db  000h, 000h, 07ch, 0c6h, 006h, 00ch, 018h, 030h, 060h, 0c0h, 0c6h, 0feh, 000h, 000h, 000h, 000h
   529 00016845 C0C6FE00000000      <1>
   530 0001684C 00007CC606063C0606- <1>     db  000h, 000h, 07ch, 0c6h, 006h, 006h, 03ch, 006h, 006h, 006h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   530 00016855 06C67C00000000      <1>
   531 0001685C 00000C1C3C6CCCFE0C- <1>     db  000h, 000h, 00ch, 01ch, 03ch, 06ch, 0cch, 0feh, 00ch, 00ch, 00ch, 01eh, 000h, 000h, 000h, 000h
   531 00016865 0C0C1E00000000      <1>
   532 0001686C 0000FEC0C0C0FC0606- <1>     db  000h, 000h, 0feh, 0c0h, 0c0h, 0c0h, 0fch, 006h, 006h, 006h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   532 00016875 06C67C00000000      <1>
   533 0001687C 00003860C0C0FCC6C6- <1>     db  000h, 000h, 038h, 060h, 0c0h, 0c0h, 0fch, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   533 00016885 C6C67C00000000      <1>
   534 0001688C 0000FEC606060C1830- <1>     db  000h, 000h, 0feh, 0c6h, 006h, 006h, 00ch, 018h, 030h, 030h, 030h, 030h, 000h, 000h, 000h, 000h
   534 00016895 30303000000000      <1>
   535 0001689C 00007CC6C6C67CC6C6- <1>     db  000h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   535 000168A5 C6C67C00000000      <1>
   536 000168AC 00007CC6C6C67E0606- <1>     db  000h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 07eh, 006h, 006h, 006h, 00ch, 078h, 000h, 000h, 000h, 000h
   536 000168B5 060C7800000000      <1>
   537 000168BC 000000001818000000- <1>     db  000h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 000h, 000h
   537 000168C5 18180000000000      <1>
   538 000168CC 000000001818000000- <1>     db  000h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 018h, 018h, 030h, 000h, 000h, 000h, 000h
   538 000168D5 18183000000000      <1>
   539 000168DC 000000060C18306030- <1>     db  000h, 000h, 000h, 006h, 00ch, 018h, 030h, 060h, 030h, 018h, 00ch, 006h, 000h, 000h, 000h, 000h
   539 000168E5 180C0600000000      <1>
   540 000168EC 00000000007E00007E- <1>     db  000h, 000h, 000h, 000h, 000h, 07eh, 000h, 000h, 07eh, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   540 000168F5 00000000000000      <1>
   541 000168FC 0000006030180C060C- <1>     db  000h, 000h, 000h, 060h, 030h, 018h, 00ch, 006h, 00ch, 018h, 030h, 060h, 000h, 000h, 000h, 000h
   541 00016905 18306000000000      <1>
   542 0001690C 00007CC6C60C181818- <1>     db  000h, 000h, 07ch, 0c6h, 0c6h, 00ch, 018h, 018h, 018h, 000h, 018h, 018h, 000h, 000h, 000h, 000h
   542 00016915 00181800000000      <1>
   543 0001691C 0000007CC6C6DEDEDE- <1>     db  000h, 000h, 000h, 07ch, 0c6h, 0c6h, 0deh, 0deh, 0deh, 0dch, 0c0h, 07ch, 000h, 000h, 000h, 000h
   543 00016925 DCC07C00000000      <1>
   544 0001692C 000010386CC6C6FEC6- <1>     db  000h, 000h, 010h, 038h, 06ch, 0c6h, 0c6h, 0feh, 0c6h, 0c6h, 0c6h, 0c6h, 000h, 000h, 000h, 000h
   544 00016935 C6C6C600000000      <1>
   545 0001693C 0000FC6666667C6666- <1>     db  000h, 000h, 0fch, 066h, 066h, 066h, 07ch, 066h, 066h, 066h, 066h, 0fch, 000h, 000h, 000h, 000h
   545 00016945 6666FC00000000      <1>
   546 0001694C 00003C66C2C0C0C0C0- <1>     db  000h, 000h, 03ch, 066h, 0c2h, 0c0h, 0c0h, 0c0h, 0c0h, 0c2h, 066h, 03ch, 000h, 000h, 000h, 000h
   546 00016955 C2663C00000000      <1>
   547 0001695C 0000F86C6666666666- <1>     db  000h, 000h, 0f8h, 06ch, 066h, 066h, 066h, 066h, 066h, 066h, 06ch, 0f8h, 000h, 000h, 000h, 000h
   547 00016965 666CF800000000      <1>
   548 0001696C 0000FE666268786860- <1>     db  000h, 000h, 0feh, 066h, 062h, 068h, 078h, 068h, 060h, 062h, 066h, 0feh, 000h, 000h, 000h, 000h
   548 00016975 6266FE00000000      <1>
   549 0001697C 0000FE666268786860- <1>     db  000h, 000h, 0feh, 066h, 062h, 068h, 078h, 068h, 060h, 060h, 060h, 0f0h, 000h, 000h, 000h, 000h
   549 00016985 6060F000000000      <1>
   550 0001698C 00003C66C2C0C0DEC6- <1>     db  000h, 000h, 03ch, 066h, 0c2h, 0c0h, 0c0h, 0deh, 0c6h, 0c6h, 066h, 03ah, 000h, 000h, 000h, 000h
   550 00016995 C6663A00000000      <1>
   551 0001699C 0000C6C6C6C6FEC6C6- <1>     db  000h, 000h, 0c6h, 0c6h, 0c6h, 0c6h, 0feh, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 000h, 000h, 000h, 000h
   551 000169A5 C6C6C600000000      <1>
   552 000169AC 00003C181818181818- <1>     db  000h, 000h, 03ch, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h
   552 000169B5 18183C00000000      <1>
   553 000169BC 00001E0C0C0C0C0CCC- <1>     db  000h, 000h, 01eh, 00ch, 00ch, 00ch, 00ch, 00ch, 0cch, 0cch, 0cch, 078h, 000h, 000h, 000h, 000h
   553 000169C5 CCCC7800000000      <1>
   554 000169CC 0000E666666C78786C- <1>     db  000h, 000h, 0e6h, 066h, 066h, 06ch, 078h, 078h, 06ch, 066h, 066h, 0e6h, 000h, 000h, 000h, 000h
   554 000169D5 6666E600000000      <1>
   555 000169DC 0000F0606060606060- <1>     db  000h, 000h, 0f0h, 060h, 060h, 060h, 060h, 060h, 060h, 062h, 066h, 0feh, 000h, 000h, 000h, 000h
   555 000169E5 6266FE00000000      <1>
   556 000169EC 0000C3E7FFFFDBC3C3- <1>     db  000h, 000h, 0c3h, 0e7h, 0ffh, 0ffh, 0dbh, 0c3h, 0c3h, 0c3h, 0c3h, 0c3h, 000h, 000h, 000h, 000h
   556 000169F5 C3C3C300000000      <1>
   557 000169FC 0000C6E6F6FEDECEC6- <1>     db  000h, 000h, 0c6h, 0e6h, 0f6h, 0feh, 0deh, 0ceh, 0c6h, 0c6h, 0c6h, 0c6h, 000h, 000h, 000h, 000h
   557 00016A05 C6C6C600000000      <1>
   558 00016A0C 00007CC6C6C6C6C6C6- <1>     db  000h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   558 00016A15 C6C67C00000000      <1>
   559 00016A1C 0000FC6666667C6060- <1>     db  000h, 000h, 0fch, 066h, 066h, 066h, 07ch, 060h, 060h, 060h, 060h, 0f0h, 000h, 000h, 000h, 000h
   559 00016A25 6060F000000000      <1>
   560 00016A2C 00007CC6C6C6C6C6C6- <1>     db  000h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0d6h, 0deh, 07ch, 00ch, 00eh, 000h, 000h
   560 00016A35 D6DE7C0C0E0000      <1>
   561 00016A3C 0000FC6666667C6C66- <1>     db  000h, 000h, 0fch, 066h, 066h, 066h, 07ch, 06ch, 066h, 066h, 066h, 0e6h, 000h, 000h, 000h, 000h
   561 00016A45 6666E600000000      <1>
   562 00016A4C 00007CC6C660380C06- <1>     db  000h, 000h, 07ch, 0c6h, 0c6h, 060h, 038h, 00ch, 006h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   562 00016A55 C6C67C00000000      <1>
   563 00016A5C 0000FFDB9918181818- <1>     db  000h, 000h, 0ffh, 0dbh, 099h, 018h, 018h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h
   563 00016A65 18183C00000000      <1>
   564 00016A6C 0000C6C6C6C6C6C6C6- <1>     db  000h, 000h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   564 00016A75 C6C67C00000000      <1>
   565 00016A7C 0000C3C3C3C3C3C3C3- <1>     db  000h, 000h, 0c3h, 0c3h, 0c3h, 0c3h, 0c3h, 0c3h, 0c3h, 066h, 03ch, 018h, 000h, 000h, 000h, 000h
   565 00016A85 663C1800000000      <1>
   566 00016A8C 0000C3C3C3C3C3DBDB- <1>     db  000h, 000h, 0c3h, 0c3h, 0c3h, 0c3h, 0c3h, 0dbh, 0dbh, 0ffh, 066h, 066h, 000h, 000h, 000h, 000h
   566 00016A95 FF666600000000      <1>
   567 00016A9C 0000C3C3663C18183C- <1>     db  000h, 000h, 0c3h, 0c3h, 066h, 03ch, 018h, 018h, 03ch, 066h, 0c3h, 0c3h, 000h, 000h, 000h, 000h
   567 00016AA5 66C3C300000000      <1>
   568 00016AAC 0000C3C3C3663C1818- <1>     db  000h, 000h, 0c3h, 0c3h, 0c3h, 066h, 03ch, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h
   568 00016AB5 18183C00000000      <1>
   569 00016ABC 0000FFC3860C183060- <1>     db  000h, 000h, 0ffh, 0c3h, 086h, 00ch, 018h, 030h, 060h, 0c1h, 0c3h, 0ffh, 000h, 000h, 000h, 000h
   569 00016AC5 C1C3FF00000000      <1>
   570 00016ACC 00003C303030303030- <1>     db  000h, 000h, 03ch, 030h, 030h, 030h, 030h, 030h, 030h, 030h, 030h, 03ch, 000h, 000h, 000h, 000h
   570 00016AD5 30303C00000000      <1>
   571 00016ADC 00000080C0E070381C- <1>     db  000h, 000h, 000h, 080h, 0c0h, 0e0h, 070h, 038h, 01ch, 00eh, 006h, 002h, 000h, 000h, 000h, 000h
   571 00016AE5 0E060200000000      <1>
   572 00016AEC 00003C0C0C0C0C0C0C- <1>     db  000h, 000h, 03ch, 00ch, 00ch, 00ch, 00ch, 00ch, 00ch, 00ch, 00ch, 03ch, 000h, 000h, 000h, 000h
   572 00016AF5 0C0C3C00000000      <1>
   573 00016AFC 10386CC60000000000- <1>     db  010h, 038h, 06ch, 0c6h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   573 00016B05 00000000000000      <1>
   574 00016B0C 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0ffh, 000h, 000h
   574 00016B15 00000000FF0000      <1>
   575 00016B1C 303018000000000000- <1>     db  030h, 030h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   575 00016B25 00000000000000      <1>
   576 00016B2C 0000000000780C7CCC- <1>     db  000h, 000h, 000h, 000h, 000h, 078h, 00ch, 07ch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   576 00016B35 CCCC7600000000      <1>
   577 00016B3C 0000E06060786C6666- <1>     db  000h, 000h, 0e0h, 060h, 060h, 078h, 06ch, 066h, 066h, 066h, 066h, 07ch, 000h, 000h, 000h, 000h
   577 00016B45 66667C00000000      <1>
   578 00016B4C 00000000007CC6C0C0- <1>     db  000h, 000h, 000h, 000h, 000h, 07ch, 0c6h, 0c0h, 0c0h, 0c0h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   578 00016B55 C0C67C00000000      <1>
   579 00016B5C 00001C0C0C3C6CCCCC- <1>     db  000h, 000h, 01ch, 00ch, 00ch, 03ch, 06ch, 0cch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   579 00016B65 CCCC7600000000      <1>
   580 00016B6C 00000000007CC6FEC0- <1>     db  000h, 000h, 000h, 000h, 000h, 07ch, 0c6h, 0feh, 0c0h, 0c0h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   580 00016B75 C0C67C00000000      <1>
   581 00016B7C 0000386C6460F06060- <1>     db  000h, 000h, 038h, 06ch, 064h, 060h, 0f0h, 060h, 060h, 060h, 060h, 0f0h, 000h, 000h, 000h, 000h
   581 00016B85 6060F000000000      <1>
   582 00016B8C 000000000076CCCCCC- <1>     db  000h, 000h, 000h, 000h, 000h, 076h, 0cch, 0cch, 0cch, 0cch, 0cch, 07ch, 00ch, 0cch, 078h, 000h
   582 00016B95 CCCC7C0CCC7800      <1>
   583 00016B9C 0000E060606C766666- <1>     db  000h, 000h, 0e0h, 060h, 060h, 06ch, 076h, 066h, 066h, 066h, 066h, 0e6h, 000h, 000h, 000h, 000h
   583 00016BA5 6666E600000000      <1>
   584 00016BAC 000018180038181818- <1>     db  000h, 000h, 018h, 018h, 000h, 038h, 018h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h
   584 00016BB5 18183C00000000      <1>
   585 00016BBC 00000606000E060606- <1>     db  000h, 000h, 006h, 006h, 000h, 00eh, 006h, 006h, 006h, 006h, 006h, 006h, 066h, 066h, 03ch, 000h
   585 00016BC5 06060666663C00      <1>
   586 00016BCC 0000E06060666C7878- <1>     db  000h, 000h, 0e0h, 060h, 060h, 066h, 06ch, 078h, 078h, 06ch, 066h, 0e6h, 000h, 000h, 000h, 000h
   586 00016BD5 6C66E600000000      <1>
   587 00016BDC 000038181818181818- <1>     db  000h, 000h, 038h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h
   587 00016BE5 18183C00000000      <1>
   588 00016BEC 0000000000E6FFDBDB- <1>     db  000h, 000h, 000h, 000h, 000h, 0e6h, 0ffh, 0dbh, 0dbh, 0dbh, 0dbh, 0dbh, 000h, 000h, 000h, 000h
   588 00016BF5 DBDBDB00000000      <1>
   589 00016BFC 0000000000DC666666- <1>     db  000h, 000h, 000h, 000h, 000h, 0dch, 066h, 066h, 066h, 066h, 066h, 066h, 000h, 000h, 000h, 000h
   589 00016C05 66666600000000      <1>
   590 00016C0C 00000000007CC6C6C6- <1>     db  000h, 000h, 000h, 000h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   590 00016C15 C6C67C00000000      <1>
   591 00016C1C 0000000000DC666666- <1>     db  000h, 000h, 000h, 000h, 000h, 0dch, 066h, 066h, 066h, 066h, 066h, 07ch, 060h, 060h, 0f0h, 000h
   591 00016C25 66667C6060F000      <1>
   592 00016C2C 000000000076CCCCCC- <1>     db  000h, 000h, 000h, 000h, 000h, 076h, 0cch, 0cch, 0cch, 0cch, 0cch, 07ch, 00ch, 00ch, 01eh, 000h
   592 00016C35 CCCC7C0C0C1E00      <1>
   593 00016C3C 0000000000DC766660- <1>     db  000h, 000h, 000h, 000h, 000h, 0dch, 076h, 066h, 060h, 060h, 060h, 0f0h, 000h, 000h, 000h, 000h
   593 00016C45 6060F000000000      <1>
   594 00016C4C 00000000007CC66038- <1>     db  000h, 000h, 000h, 000h, 000h, 07ch, 0c6h, 060h, 038h, 00ch, 0c6h, 07ch, 000h, 000h, 000h, 000h
   594 00016C55 0CC67C00000000      <1>
   595 00016C5C 0000103030FC303030- <1>     db  000h, 000h, 010h, 030h, 030h, 0fch, 030h, 030h, 030h, 030h, 036h, 01ch, 000h, 000h, 000h, 000h
   595 00016C65 30361C00000000      <1>
   596 00016C6C 0000000000CCCCCCCC- <1>     db  000h, 000h, 000h, 000h, 000h, 0cch, 0cch, 0cch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   596 00016C75 CCCC7600000000      <1>
   597 00016C7C 0000000000C3C3C3C3- <1>     db  000h, 000h, 000h, 000h, 000h, 0c3h, 0c3h, 0c3h, 0c3h, 066h, 03ch, 018h, 000h, 000h, 000h, 000h
   597 00016C85 663C1800000000      <1>
   598 00016C8C 0000000000C3C3C3DB- <1>     db  000h, 000h, 000h, 000h, 000h, 0c3h, 0c3h, 0c3h, 0dbh, 0dbh, 0ffh, 066h, 000h, 000h, 000h, 000h
   598 00016C95 DBFF6600000000      <1>
   599 00016C9C 0000000000C3663C18- <1>     db  000h, 000h, 000h, 000h, 000h, 0c3h, 066h, 03ch, 018h, 03ch, 066h, 0c3h, 000h, 000h, 000h, 000h
   599 00016CA5 3C66C300000000      <1>
   600 00016CAC 0000000000C6C6C6C6- <1>     db  000h, 000h, 000h, 000h, 000h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07eh, 006h, 00ch, 0f8h, 000h
   600 00016CB5 C6C67E060CF800      <1>
   601 00016CBC 0000000000FECC1830- <1>     db  000h, 000h, 000h, 000h, 000h, 0feh, 0cch, 018h, 030h, 060h, 0c6h, 0feh, 000h, 000h, 000h, 000h
   601 00016CC5 60C6FE00000000      <1>
   602 00016CCC 00000E181818701818- <1>     db  000h, 000h, 00eh, 018h, 018h, 018h, 070h, 018h, 018h, 018h, 018h, 00eh, 000h, 000h, 000h, 000h
   602 00016CD5 18180E00000000      <1>
   603 00016CDC 000018181818001818- <1>     db  000h, 000h, 018h, 018h, 018h, 018h, 000h, 018h, 018h, 018h, 018h, 018h, 000h, 000h, 000h, 000h
   603 00016CE5 18181800000000      <1>
   604 00016CEC 0000701818180E1818- <1>     db  000h, 000h, 070h, 018h, 018h, 018h, 00eh, 018h, 018h, 018h, 018h, 070h, 000h, 000h, 000h, 000h
   604 00016CF5 18187000000000      <1>
   605 00016CFC 000076DC0000000000- <1>     db  000h, 000h, 076h, 0dch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   605 00016D05 00000000000000      <1>
   606 00016D0C 0000000010386CC6C6- <1>     db  000h, 000h, 000h, 000h, 010h, 038h, 06ch, 0c6h, 0c6h, 0c6h, 0feh, 000h, 000h, 000h, 000h, 000h
   606 00016D15 C6FE0000000000      <1>
   607 00016D1C 00003C66C2C0C0C0C2- <1>     db  000h, 000h, 03ch, 066h, 0c2h, 0c0h, 0c0h, 0c0h, 0c2h, 066h, 03ch, 00ch, 006h, 07ch, 000h, 000h
   607 00016D25 663C0C067C0000      <1>
   608 00016D2C 0000CC0000CCCCCCCC- <1>     db  000h, 000h, 0cch, 000h, 000h, 0cch, 0cch, 0cch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   608 00016D35 CCCC7600000000      <1>
   609 00016D3C 000C1830007CC6FEC0- <1>     db  000h, 00ch, 018h, 030h, 000h, 07ch, 0c6h, 0feh, 0c0h, 0c0h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   609 00016D45 C0C67C00000000      <1>
   610 00016D4C 0010386C00780C7CCC- <1>     db  000h, 010h, 038h, 06ch, 000h, 078h, 00ch, 07ch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   610 00016D55 CCCC7600000000      <1>
   611 00016D5C 0000CC0000780C7CCC- <1>     db  000h, 000h, 0cch, 000h, 000h, 078h, 00ch, 07ch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   611 00016D65 CCCC7600000000      <1>
   612 00016D6C 0060301800780C7CCC- <1>     db  000h, 060h, 030h, 018h, 000h, 078h, 00ch, 07ch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   612 00016D75 CCCC7600000000      <1>
   613 00016D7C 00386C3800780C7CCC- <1>     db  000h, 038h, 06ch, 038h, 000h, 078h, 00ch, 07ch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   613 00016D85 CCCC7600000000      <1>
   614 00016D8C 000000003C66606066- <1>     db  000h, 000h, 000h, 000h, 03ch, 066h, 060h, 060h, 066h, 03ch, 00ch, 006h, 03ch, 000h, 000h, 000h
   614 00016D95 3C0C063C000000      <1>
   615 00016D9C 0010386C007CC6FEC0- <1>     db  000h, 010h, 038h, 06ch, 000h, 07ch, 0c6h, 0feh, 0c0h, 0c0h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   615 00016DA5 C0C67C00000000      <1>
   616 00016DAC 0000C600007CC6FEC0- <1>     db  000h, 000h, 0c6h, 000h, 000h, 07ch, 0c6h, 0feh, 0c0h, 0c0h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   616 00016DB5 C0C67C00000000      <1>
   617 00016DBC 00603018007CC6FEC0- <1>     db  000h, 060h, 030h, 018h, 000h, 07ch, 0c6h, 0feh, 0c0h, 0c0h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   617 00016DC5 C0C67C00000000      <1>
   618 00016DCC 000066000038181818- <1>     db  000h, 000h, 066h, 000h, 000h, 038h, 018h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h
   618 00016DD5 18183C00000000      <1>
   619 00016DDC 00183C660038181818- <1>     db  000h, 018h, 03ch, 066h, 000h, 038h, 018h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h
   619 00016DE5 18183C00000000      <1>
   620 00016DEC 006030180038181818- <1>     db  000h, 060h, 030h, 018h, 000h, 038h, 018h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h
   620 00016DF5 18183C00000000      <1>
   621 00016DFC 00C60010386CC6C6FE- <1>     db  000h, 0c6h, 000h, 010h, 038h, 06ch, 0c6h, 0c6h, 0feh, 0c6h, 0c6h, 0c6h, 000h, 000h, 000h, 000h
   621 00016E05 C6C6C600000000      <1>
   622 00016E0C 386C3800386CC6C6FE- <1>     db  038h, 06ch, 038h, 000h, 038h, 06ch, 0c6h, 0c6h, 0feh, 0c6h, 0c6h, 0c6h, 000h, 000h, 000h, 000h
   622 00016E15 C6C6C600000000      <1>
   623 00016E1C 18306000FE66607C60- <1>     db  018h, 030h, 060h, 000h, 0feh, 066h, 060h, 07ch, 060h, 060h, 066h, 0feh, 000h, 000h, 000h, 000h
   623 00016E25 6066FE00000000      <1>
   624 00016E2C 00000000006E3B1B7E- <1>     db  000h, 000h, 000h, 000h, 000h, 06eh, 03bh, 01bh, 07eh, 0d8h, 0dch, 077h, 000h, 000h, 000h, 000h
   624 00016E35 D8DC7700000000      <1>
   625 00016E3C 00003E6CCCCCFECCCC- <1>     db  000h, 000h, 03eh, 06ch, 0cch, 0cch, 0feh, 0cch, 0cch, 0cch, 0cch, 0ceh, 000h, 000h, 000h, 000h
   625 00016E45 CCCCCE00000000      <1>
   626 00016E4C 0010386C007CC6C6C6- <1>     db  000h, 010h, 038h, 06ch, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   626 00016E55 C6C67C00000000      <1>
   627 00016E5C 0000C600007CC6C6C6- <1>     db  000h, 000h, 0c6h, 000h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   627 00016E65 C6C67C00000000      <1>
   628 00016E6C 00603018007CC6C6C6- <1>     db  000h, 060h, 030h, 018h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   628 00016E75 C6C67C00000000      <1>
   629 00016E7C 003078CC00CCCCCCCC- <1>     db  000h, 030h, 078h, 0cch, 000h, 0cch, 0cch, 0cch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   629 00016E85 CCCC7600000000      <1>
   630 00016E8C 0060301800CCCCCCCC- <1>     db  000h, 060h, 030h, 018h, 000h, 0cch, 0cch, 0cch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   630 00016E95 CCCC7600000000      <1>
   631 00016E9C 0000C60000C6C6C6C6- <1>     db  000h, 000h, 0c6h, 000h, 000h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07eh, 006h, 00ch, 078h, 000h
   631 00016EA5 C6C67E060C7800      <1>
   632 00016EAC 00C6007CC6C6C6C6C6- <1>     db  000h, 0c6h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   632 00016EB5 C6C67C00000000      <1>
   633 00016EBC 00C600C6C6C6C6C6C6- <1>     db  000h, 0c6h, 000h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   633 00016EC5 C6C67C00000000      <1>
   634 00016ECC 0018187EC3C0C0C0C3- <1>     db  000h, 018h, 018h, 07eh, 0c3h, 0c0h, 0c0h, 0c0h, 0c3h, 07eh, 018h, 018h, 000h, 000h, 000h, 000h
   634 00016ED5 7E181800000000      <1>
   635 00016EDC 00386C6460F0606060- <1>     db  000h, 038h, 06ch, 064h, 060h, 0f0h, 060h, 060h, 060h, 060h, 0e6h, 0fch, 000h, 000h, 000h, 000h
   635 00016EE5 60E6FC00000000      <1>
   636 00016EEC 0000C3663C18FF18FF- <1>     db  000h, 000h, 0c3h, 066h, 03ch, 018h, 0ffh, 018h, 0ffh, 018h, 018h, 018h, 000h, 000h, 000h, 000h
   636 00016EF5 18181800000000      <1>
   637 00016EFC 00FC66667C62666F66- <1>     db  000h, 0fch, 066h, 066h, 07ch, 062h, 066h, 06fh, 066h, 066h, 066h, 0f3h, 000h, 000h, 000h, 000h
   637 00016F05 6666F300000000      <1>
   638 00016F0C 000E1B1818187E1818- <1>     db  000h, 00eh, 01bh, 018h, 018h, 018h, 07eh, 018h, 018h, 018h, 018h, 018h, 0d8h, 070h, 000h, 000h
   638 00016F15 181818D8700000      <1>
   639 00016F1C 0018306000780C7CCC- <1>     db  000h, 018h, 030h, 060h, 000h, 078h, 00ch, 07ch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   639 00016F25 CCCC7600000000      <1>
   640 00016F2C 000C18300038181818- <1>     db  000h, 00ch, 018h, 030h, 000h, 038h, 018h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h
   640 00016F35 18183C00000000      <1>
   641 00016F3C 00183060007CC6C6C6- <1>     db  000h, 018h, 030h, 060h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   641 00016F45 C6C67C00000000      <1>
   642 00016F4C 0018306000CCCCCCCC- <1>     db  000h, 018h, 030h, 060h, 000h, 0cch, 0cch, 0cch, 0cch, 0cch, 0cch, 076h, 000h, 000h, 000h, 000h
   642 00016F55 CCCC7600000000      <1>
   643 00016F5C 000076DC00DC666666- <1>     db  000h, 000h, 076h, 0dch, 000h, 0dch, 066h, 066h, 066h, 066h, 066h, 066h, 000h, 000h, 000h, 000h
   643 00016F65 66666600000000      <1>
   644 00016F6C 76DC00C6E6F6FEDECE- <1>     db  076h, 0dch, 000h, 0c6h, 0e6h, 0f6h, 0feh, 0deh, 0ceh, 0c6h, 0c6h, 0c6h, 000h, 000h, 000h, 000h
   644 00016F75 C6C6C600000000      <1>
   645 00016F7C 003C6C6C3E007E0000- <1>     db  000h, 03ch, 06ch, 06ch, 03eh, 000h, 07eh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   645 00016F85 00000000000000      <1>
   646 00016F8C 00386C6C38007C0000- <1>     db  000h, 038h, 06ch, 06ch, 038h, 000h, 07ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   646 00016F95 00000000000000      <1>
   647 00016F9C 0000303000303060C0- <1>     db  000h, 000h, 030h, 030h, 000h, 030h, 030h, 060h, 0c0h, 0c6h, 0c6h, 07ch, 000h, 000h, 000h, 000h
   647 00016FA5 C6C67C00000000      <1>
   648 00016FAC 000000000000FEC0C0- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 0feh, 0c0h, 0c0h, 0c0h, 0c0h, 000h, 000h, 000h, 000h, 000h
   648 00016FB5 C0C00000000000      <1>
   649 00016FBC 000000000000FE0606- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 0feh, 006h, 006h, 006h, 006h, 000h, 000h, 000h, 000h, 000h
   649 00016FC5 06060000000000      <1>
   650 00016FCC 00C0C0C2C6CC183060- <1>     db  000h, 0c0h, 0c0h, 0c2h, 0c6h, 0cch, 018h, 030h, 060h, 0ceh, 09bh, 006h, 00ch, 01fh, 000h, 000h
   650 00016FD5 CE9B060C1F0000      <1>
   651 00016FDC 00C0C0C2C6CC183066- <1>     db  000h, 0c0h, 0c0h, 0c2h, 0c6h, 0cch, 018h, 030h, 066h, 0ceh, 096h, 03eh, 006h, 006h, 000h, 000h
   651 00016FE5 CE963E06060000      <1>
   652 00016FEC 00001818001818183C- <1>     db  000h, 000h, 018h, 018h, 000h, 018h, 018h, 018h, 03ch, 03ch, 03ch, 018h, 000h, 000h, 000h, 000h
   652 00016FF5 3C3C1800000000      <1>
   653 00016FFC 0000000000366CD86C- <1>     db  000h, 000h, 000h, 000h, 000h, 036h, 06ch, 0d8h, 06ch, 036h, 000h, 000h, 000h, 000h, 000h, 000h
   653 00017005 36000000000000      <1>
   654 0001700C 0000000000D86C366C- <1>     db  000h, 000h, 000h, 000h, 000h, 0d8h, 06ch, 036h, 06ch, 0d8h, 000h, 000h, 000h, 000h, 000h, 000h
   654 00017015 D8000000000000      <1>
   655 0001701C 114411441144114411- <1>     db  011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h
   655 00017025 44114411441144      <1>
   656 0001702C 55AA55AA55AA55AA55- <1>     db  055h, 0aah, 055h, 0aah, 055h, 0aah, 055h, 0aah, 055h, 0aah, 055h, 0aah, 055h, 0aah, 055h, 0aah
   656 00017035 AA55AA55AA55AA      <1>
   657 0001703C DD77DD77DD77DD77DD- <1>     db  0ddh, 077h, 0ddh, 077h, 0ddh, 077h, 0ddh, 077h, 0ddh, 077h, 0ddh, 077h, 0ddh, 077h, 0ddh, 077h
   657 00017045 77DD77DD77DD77      <1>
   658 0001704C 181818181818181818- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   658 00017055 18181818181818      <1>
   659 0001705C 18181818181818F818- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 0f8h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   659 00017065 18181818181818      <1>
   660 0001706C 1818181818F818F818- <1>     db  018h, 018h, 018h, 018h, 018h, 0f8h, 018h, 0f8h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   660 00017075 18181818181818      <1>
   661 0001707C 36363636363636F636- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 036h, 0f6h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   661 00017085 36363636363636      <1>
   662 0001708C 00000000000000FE36- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 0feh, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   662 00017095 36363636363636      <1>
   663 0001709C 0000000000F818F818- <1>     db  000h, 000h, 000h, 000h, 000h, 0f8h, 018h, 0f8h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   663 000170A5 18181818181818      <1>
   664 000170AC 3636363636F606F636- <1>     db  036h, 036h, 036h, 036h, 036h, 0f6h, 006h, 0f6h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   664 000170B5 36363636363636      <1>
   665 000170BC 363636363636363636- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   665 000170C5 36363636363636      <1>
   666 000170CC 0000000000FE06F636- <1>     db  000h, 000h, 000h, 000h, 000h, 0feh, 006h, 0f6h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   666 000170D5 36363636363636      <1>
   667 000170DC 3636363636F606FE00- <1>     db  036h, 036h, 036h, 036h, 036h, 0f6h, 006h, 0feh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   667 000170E5 00000000000000      <1>
   668 000170EC 36363636363636FE00- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 036h, 0feh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   668 000170F5 00000000000000      <1>
   669 000170FC 1818181818F818F800- <1>     db  018h, 018h, 018h, 018h, 018h, 0f8h, 018h, 0f8h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   669 00017105 00000000000000      <1>
   670 0001710C 00000000000000F818- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 0f8h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   670 00017115 18181818181818      <1>
   671 0001711C 181818181818181F00- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 01fh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   671 00017125 00000000000000      <1>
   672 0001712C 18181818181818FF00- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   672 00017135 00000000000000      <1>
   673 0001713C 00000000000000FF18- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 0ffh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   673 00017145 18181818181818      <1>
   674 0001714C 181818181818181F18- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 01fh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   674 00017155 18181818181818      <1>
   675 0001715C 00000000000000FF00- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   675 00017165 00000000000000      <1>
   676 0001716C 18181818181818FF18- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 0ffh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   676 00017175 18181818181818      <1>
   677 0001717C 18181818181F181F18- <1>     db  018h, 018h, 018h, 018h, 018h, 01fh, 018h, 01fh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   677 00017185 18181818181818      <1>
   678 0001718C 363636363636363736- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 036h, 037h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   678 00017195 36363636363636      <1>
   679 0001719C 363636363637303F00- <1>     db  036h, 036h, 036h, 036h, 036h, 037h, 030h, 03fh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   679 000171A5 00000000000000      <1>
   680 000171AC 00000000003F303736- <1>     db  000h, 000h, 000h, 000h, 000h, 03fh, 030h, 037h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   680 000171B5 36363636363636      <1>
   681 000171BC 3636363636F700FF00- <1>     db  036h, 036h, 036h, 036h, 036h, 0f7h, 000h, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   681 000171C5 00000000000000      <1>
   682 000171CC 0000000000FF00F736- <1>     db  000h, 000h, 000h, 000h, 000h, 0ffh, 000h, 0f7h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   682 000171D5 36363636363636      <1>
   683 000171DC 363636363637303736- <1>     db  036h, 036h, 036h, 036h, 036h, 037h, 030h, 037h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   683 000171E5 36363636363636      <1>
   684 000171EC 0000000000FF00FF00- <1>     db  000h, 000h, 000h, 000h, 000h, 0ffh, 000h, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   684 000171F5 00000000000000      <1>
   685 000171FC 3636363636F700F736- <1>     db  036h, 036h, 036h, 036h, 036h, 0f7h, 000h, 0f7h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   685 00017205 36363636363636      <1>
   686 0001720C 1818181818FF00FF00- <1>     db  018h, 018h, 018h, 018h, 018h, 0ffh, 000h, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   686 00017215 00000000000000      <1>
   687 0001721C 36363636363636FF00- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 036h, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   687 00017225 00000000000000      <1>
   688 0001722C 0000000000FF00FF18- <1>     db  000h, 000h, 000h, 000h, 000h, 0ffh, 000h, 0ffh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   688 00017235 18181818181818      <1>
   689 0001723C 00000000000000FF36- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 0ffh, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   689 00017245 36363636363636      <1>
   690 0001724C 363636363636363F00- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 036h, 03fh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   690 00017255 00000000000000      <1>
   691 0001725C 18181818181F181F00- <1>     db  018h, 018h, 018h, 018h, 018h, 01fh, 018h, 01fh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   691 00017265 00000000000000      <1>
   692 0001726C 00000000001F181F18- <1>     db  000h, 000h, 000h, 000h, 000h, 01fh, 018h, 01fh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   692 00017275 18181818181818      <1>
   693 0001727C 000000000000003F36- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 03fh, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   693 00017285 36363636363636      <1>
   694 0001728C 36363636363636FF36- <1>     db  036h, 036h, 036h, 036h, 036h, 036h, 036h, 0ffh, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h
   694 00017295 36363636363636      <1>
   695 0001729C 1818181818FF18FF18- <1>     db  018h, 018h, 018h, 018h, 018h, 0ffh, 018h, 0ffh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   695 000172A5 18181818181818      <1>
   696 000172AC 18181818181818F800- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 0f8h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   696 000172B5 00000000000000      <1>
   697 000172BC 000000000000001F18- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 01fh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   697 000172C5 18181818181818      <1>
   698 000172CC FFFFFFFFFFFFFFFFFF- <1>     db  0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh
   698 000172D5 FFFFFFFFFFFFFF      <1>
   699 000172DC 00000000000000FFFF- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh
   699 000172E5 FFFFFFFFFFFFFF      <1>
   700 000172EC F0F0F0F0F0F0F0F0F0- <1>     db  0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h, 0f0h
   700 000172F5 F0F0F0F0F0F0F0      <1>
   701 000172FC 0F0F0F0F0F0F0F0F0F- <1>     db  00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 00fh
   701 00017305 0F0F0F0F0F0F0F      <1>
   702 0001730C FFFFFFFFFFFFFF0000- <1>     db  0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   702 00017315 00000000000000      <1>
   703 0001731C 000000000076DCD8D8- <1>     db  000h, 000h, 000h, 000h, 000h, 076h, 0dch, 0d8h, 0d8h, 0d8h, 0dch, 076h, 000h, 000h, 000h, 000h
   703 00017325 D8DC7600000000      <1>
   704 0001732C 000078CCCCCCD8CCC6- <1>     db  000h, 000h, 078h, 0cch, 0cch, 0cch, 0d8h, 0cch, 0c6h, 0c6h, 0c6h, 0cch, 000h, 000h, 000h, 000h
   704 00017335 C6C6CC00000000      <1>
   705 0001733C 0000FEC6C6C0C0C0C0- <1>     db  000h, 000h, 0feh, 0c6h, 0c6h, 0c0h, 0c0h, 0c0h, 0c0h, 0c0h, 0c0h, 0c0h, 000h, 000h, 000h, 000h
   705 00017345 C0C0C000000000      <1>
   706 0001734C 00000000FE6C6C6C6C- <1>     db  000h, 000h, 000h, 000h, 0feh, 06ch, 06ch, 06ch, 06ch, 06ch, 06ch, 06ch, 000h, 000h, 000h, 000h
   706 00017355 6C6C6C00000000      <1>
   707 0001735C 000000FEC660301830- <1>     db  000h, 000h, 000h, 0feh, 0c6h, 060h, 030h, 018h, 030h, 060h, 0c6h, 0feh, 000h, 000h, 000h, 000h
   707 00017365 60C6FE00000000      <1>
   708 0001736C 00000000007ED8D8D8- <1>     db  000h, 000h, 000h, 000h, 000h, 07eh, 0d8h, 0d8h, 0d8h, 0d8h, 0d8h, 070h, 000h, 000h, 000h, 000h
   708 00017375 D8D87000000000      <1>
   709 0001737C 000000006666666666- <1>     db  000h, 000h, 000h, 000h, 066h, 066h, 066h, 066h, 066h, 07ch, 060h, 060h, 0c0h, 000h, 000h, 000h
   709 00017385 7C6060C0000000      <1>
   710 0001738C 0000000076DC181818- <1>     db  000h, 000h, 000h, 000h, 076h, 0dch, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h, 000h, 000h
   710 00017395 18181800000000      <1>
   711 0001739C 0000007E183C666666- <1>     db  000h, 000h, 000h, 07eh, 018h, 03ch, 066h, 066h, 066h, 03ch, 018h, 07eh, 000h, 000h, 000h, 000h
   711 000173A5 3C187E00000000      <1>
   712 000173AC 000000386CC6C6FEC6- <1>     db  000h, 000h, 000h, 038h, 06ch, 0c6h, 0c6h, 0feh, 0c6h, 0c6h, 06ch, 038h, 000h, 000h, 000h, 000h
   712 000173B5 C66C3800000000      <1>
   713 000173BC 0000386CC6C6C66C6C- <1>     db  000h, 000h, 038h, 06ch, 0c6h, 0c6h, 0c6h, 06ch, 06ch, 06ch, 06ch, 0eeh, 000h, 000h, 000h, 000h
   713 000173C5 6C6CEE00000000      <1>
   714 000173CC 00001E30180C3E6666- <1>     db  000h, 000h, 01eh, 030h, 018h, 00ch, 03eh, 066h, 066h, 066h, 066h, 03ch, 000h, 000h, 000h, 000h
   714 000173D5 66663C00000000      <1>
   715 000173DC 00000000007EDBDBDB- <1>     db  000h, 000h, 000h, 000h, 000h, 07eh, 0dbh, 0dbh, 0dbh, 07eh, 000h, 000h, 000h, 000h, 000h, 000h
   715 000173E5 7E000000000000      <1>
   716 000173EC 00000003067EDBDBF3- <1>     db  000h, 000h, 000h, 003h, 006h, 07eh, 0dbh, 0dbh, 0f3h, 07eh, 060h, 0c0h, 000h, 000h, 000h, 000h
   716 000173F5 7E60C000000000      <1>
   717 000173FC 00001C3060607C6060- <1>     db  000h, 000h, 01ch, 030h, 060h, 060h, 07ch, 060h, 060h, 060h, 030h, 01ch, 000h, 000h, 000h, 000h
   717 00017405 60301C00000000      <1>
   718 0001740C 0000007CC6C6C6C6C6- <1>     db  000h, 000h, 000h, 07ch, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 0c6h, 000h, 000h, 000h, 000h
   718 00017415 C6C6C600000000      <1>
   719 0001741C 00000000FE0000FE00- <1>     db  000h, 000h, 000h, 000h, 0feh, 000h, 000h, 0feh, 000h, 000h, 0feh, 000h, 000h, 000h, 000h, 000h
   719 00017425 00FE0000000000      <1>
   720 0001742C 0000000018187E1818- <1>     db  000h, 000h, 000h, 000h, 018h, 018h, 07eh, 018h, 018h, 000h, 000h, 0ffh, 000h, 000h, 000h, 000h
   720 00017435 0000FF00000000      <1>
   721 0001743C 00000030180C060C18- <1>     db  000h, 000h, 000h, 030h, 018h, 00ch, 006h, 00ch, 018h, 030h, 000h, 07eh, 000h, 000h, 000h, 000h
   721 00017445 30007E00000000      <1>
   722 0001744C 0000000C1830603018- <1>     db  000h, 000h, 000h, 00ch, 018h, 030h, 060h, 030h, 018h, 00ch, 000h, 07eh, 000h, 000h, 000h, 000h
   722 00017455 0C007E00000000      <1>
   723 0001745C 00000E1B1B18181818- <1>     db  000h, 000h, 00eh, 01bh, 01bh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h
   723 00017465 18181818181818      <1>
   724 0001746C 1818181818181818D8- <1>     db  018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 0d8h, 0d8h, 0d8h, 070h, 000h, 000h, 000h, 000h
   724 00017475 D8D87000000000      <1>
   725 0001747C 000000001818007E00- <1>     db  000h, 000h, 000h, 000h, 018h, 018h, 000h, 07eh, 000h, 018h, 018h, 000h, 000h, 000h, 000h, 000h
   725 00017485 18180000000000      <1>
   726 0001748C 000000000076DC0076- <1>     db  000h, 000h, 000h, 000h, 000h, 076h, 0dch, 000h, 076h, 0dch, 000h, 000h, 000h, 000h, 000h, 000h
   726 00017495 DC000000000000      <1>
   727 0001749C 00386C6C3800000000- <1>     db  000h, 038h, 06ch, 06ch, 038h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   727 000174A5 00000000000000      <1>
   728 000174AC 000000000000001818- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   728 000174B5 00000000000000      <1>
   729 000174BC 000000000000000018- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   729 000174C5 00000000000000      <1>
   730 000174CC 000F0C0C0C0C0CEC6C- <1>     db  000h, 00fh, 00ch, 00ch, 00ch, 00ch, 00ch, 0ech, 06ch, 06ch, 03ch, 01ch, 000h, 000h, 000h, 000h
   730 000174D5 6C3C1C00000000      <1>
   731 000174DC 00D86C6C6C6C6C0000- <1>     db  000h, 0d8h, 06ch, 06ch, 06ch, 06ch, 06ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   731 000174E5 00000000000000      <1>
   732 000174EC 0070D83060C8F80000- <1>     db  000h, 070h, 0d8h, 030h, 060h, 0c8h, 0f8h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   732 000174F5 00000000000000      <1>
   733 000174FC 000000007C7C7C7C7C- <1>     db  000h, 000h, 000h, 000h, 07ch, 07ch, 07ch, 07ch, 07ch, 07ch, 07ch, 000h, 000h, 000h, 000h, 000h
   733 00017505 7C7C0000000000      <1>
   734 0001750C 000000000000000000- <1>     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
   734 00017515 00000000000000      <1>
   735                              <1> 
   736                              <1> ; 01/01/2021 (TRDOS 386 v2.0.3)
   737                              <1> 
   738                              <1> %if 0
   739                              <1> 
   740                              <1> vgafont14alt:
   741                              <1>     db  01dh, 000h, 000h, 000h, 000h, 024h, 066h, 0ffh, 066h, 024h, 000h, 000h, 000h, 000h, 000h, 022h
   742                              <1>     db  000h, 063h, 063h, 063h, 022h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 02bh, 000h
   743                              <1>     db  000h, 000h, 018h, 018h, 018h, 0ffh, 018h, 018h, 018h, 000h, 000h, 000h, 000h, 02dh, 000h, 000h
   744                              <1>     db  000h, 000h, 000h, 000h, 0ffh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 04dh, 000h, 000h, 0c3h
   745                              <1>     db  0e7h, 0ffh, 0dbh, 0c3h, 0c3h, 0c3h, 0c3h, 0c3h, 000h, 000h, 000h, 054h, 000h, 000h, 0ffh, 0dbh
   746                              <1>     db  099h, 018h, 018h, 018h, 018h, 018h, 03ch, 000h, 000h, 000h, 056h, 000h, 000h, 0c3h, 0c3h, 0c3h
   747                              <1>     db  0c3h, 0c3h, 0c3h, 066h, 03ch, 018h, 000h, 000h, 000h, 057h, 000h, 000h, 0c3h, 0c3h, 0c3h, 0c3h
   748                              <1>     db  0dbh, 0dbh, 0ffh, 066h, 066h, 000h, 000h, 000h, 058h, 000h, 000h, 0c3h, 0c3h, 066h, 03ch, 018h
   749                              <1>     db  03ch, 066h, 0c3h, 0c3h, 000h, 000h, 000h, 059h, 000h, 000h, 0c3h, 0c3h, 0c3h, 066h, 03ch, 018h
   750                              <1>     db  018h, 018h, 03ch, 000h, 000h, 000h, 05ah, 000h, 000h, 0ffh, 0c3h, 086h, 00ch, 018h, 030h, 061h
   751                              <1>     db  0c3h, 0ffh, 000h, 000h, 000h, 06dh, 000h, 000h, 000h, 000h, 000h, 0e6h, 0ffh, 0dbh, 0dbh, 0dbh
   752                              <1>     db  0dbh, 000h, 000h, 000h, 076h, 000h, 000h, 000h, 000h, 000h, 0c3h, 0c3h, 0c3h, 066h, 03ch, 018h
   753                              <1>     db  000h, 000h, 000h, 077h, 000h, 000h, 000h, 000h, 000h, 0c3h, 0c3h, 0dbh, 0dbh, 0ffh, 066h, 000h
   754                              <1>     db  000h, 000h, 091h, 000h, 000h, 000h, 000h, 06eh, 03bh, 01bh, 07eh, 0d8h, 0dch, 077h, 000h, 000h
   755                              <1>     db  000h, 09bh, 000h, 018h, 018h, 07eh, 0c3h, 0c0h, 0c0h, 0c3h, 07eh, 018h, 018h, 000h, 000h, 000h
   756                              <1>     db  09dh, 000h, 000h, 0c3h, 066h, 03ch, 018h, 0ffh, 018h, 0ffh, 018h, 018h, 000h, 000h, 000h, 09eh
   757                              <1>     db  000h, 0fch, 066h, 066h, 07ch, 062h, 066h, 06fh, 066h, 066h, 0f3h, 000h, 000h, 000h, 0f1h, 000h
   758                              <1>     db  000h, 018h, 018h, 018h, 0ffh, 018h, 018h, 018h, 000h, 0ffh, 000h, 000h, 000h, 0f6h, 000h, 000h
   759                              <1>     db  018h, 018h, 000h, 000h, 0ffh, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 000h
   760                              <1> vgafont16alt:
   761                              <1>     db  01dh, 000h, 000h, 000h, 000h, 000h, 024h, 066h, 0ffh, 066h, 024h, 000h, 000h, 000h, 000h, 000h
   762                              <1>     db  000h, 030h, 000h, 000h, 03ch, 066h, 0c3h, 0c3h, 0dbh, 0dbh, 0c3h, 0c3h, 066h, 03ch, 000h, 000h
   763                              <1>     db  000h, 000h, 04dh, 000h, 000h, 0c3h, 0e7h, 0ffh, 0ffh, 0dbh, 0c3h, 0c3h, 0c3h, 0c3h, 0c3h, 000h
   764                              <1>     db  000h, 000h, 000h, 054h, 000h, 000h, 0ffh, 0dbh, 099h, 018h, 018h, 018h, 018h, 018h, 018h, 03ch
   765                              <1>     db  000h, 000h, 000h, 000h, 056h, 000h, 000h, 0c3h, 0c3h, 0c3h, 0c3h, 0c3h, 0c3h, 0c3h, 066h, 03ch
   766                              <1>     db  018h, 000h, 000h, 000h, 000h, 057h, 000h, 000h, 0c3h, 0c3h, 0c3h, 0c3h, 0c3h, 0dbh, 0dbh, 0ffh
   767                              <1>     db  066h, 066h, 000h, 000h, 000h, 000h, 058h, 000h, 000h, 0c3h, 0c3h, 066h, 03ch, 018h, 018h, 03ch
   768                              <1>     db  066h, 0c3h, 0c3h, 000h, 000h, 000h, 000h, 059h, 000h, 000h, 0c3h, 0c3h, 0c3h, 066h, 03ch, 018h
   769                              <1>     db  018h, 018h, 018h, 03ch, 000h, 000h, 000h, 000h, 05ah, 000h, 000h, 0ffh, 0c3h, 086h, 00ch, 018h
   770                              <1>     db  030h, 060h, 0c1h, 0c3h, 0ffh, 000h, 000h, 000h, 000h, 06dh, 000h, 000h, 000h, 000h, 000h, 0e6h
   771                              <1>     db  0ffh, 0dbh, 0dbh, 0dbh, 0dbh, 0dbh, 000h, 000h, 000h, 000h, 076h, 000h, 000h, 000h, 000h, 000h
   772                              <1>     db  0c3h, 0c3h, 0c3h, 0c3h, 066h, 03ch, 018h, 000h, 000h, 000h, 000h, 077h, 000h, 000h, 000h, 000h
   773                              <1>     db  000h, 0c3h, 0c3h, 0c3h, 0dbh, 0dbh, 0ffh, 066h, 000h, 000h, 000h, 000h, 078h, 000h, 000h, 000h
   774                              <1>     db  000h, 000h, 0c3h, 066h, 03ch, 018h, 03ch, 066h, 0c3h, 000h, 000h, 000h, 000h, 091h, 000h, 000h
   775                              <1>     db  000h, 000h, 000h, 06eh, 03bh, 01bh, 07eh, 0d8h, 0dch, 077h, 000h, 000h, 000h, 000h, 09bh, 000h
   776                              <1>     db  018h, 018h, 07eh, 0c3h, 0c0h, 0c0h, 0c0h, 0c3h, 07eh, 018h, 018h, 000h, 000h, 000h, 000h, 09dh
   777                              <1>     db  000h, 000h, 0c3h, 066h, 03ch, 018h, 0ffh, 018h, 0ffh, 018h, 018h, 018h, 000h, 000h, 000h, 000h
   778                              <1>     db  09eh, 000h, 0fch, 066h, 066h, 07ch, 062h, 066h, 06fh, 066h, 066h, 066h, 0f3h, 000h, 000h, 000h
   779                              <1>     db  000h, 0abh, 000h, 0c0h, 0c0h, 0c2h, 0c6h, 0cch, 018h, 030h, 060h, 0ceh, 09bh, 006h, 00ch, 01fh
   780                              <1>     db  000h, 000h, 0ach, 000h, 0c0h, 0c0h, 0c2h, 0c6h, 0cch, 018h, 030h, 066h, 0ceh, 096h, 03eh, 006h
   781                              <1>     db  006h, 000h, 000h, 000h
   782                              <1> 
   783                              <1> %endif
  3780                                  
  3781                                  ; 20/11/2020
  3782                                  vbe2_bochs_vbios:
  3783                                  ;	db "BOCHS/QEMU"
  3784 0001751C 424F4348532F51454D-     	db "BOCHS/QEMU/VIRTUALBOX"  ; 26/11/2020
  3784 00017525 552F5649525455414C-
  3784 0001752E 424F58             
  3785                                  ;vbe_vnumber equ vbe2_bochs_vbios + 28 ; "3" or "2"
  3786                                  ; 26/11/2020
  3787                                  vbe_vnumber equ vbe2_bochs_vbios + 30 ; "3" or "2"
  3788                                  ; 15/11/2020
  3789                                  vesa_vbe3_bios_msg:
  3790                                  	;db " VESA VBE version 3 Video BIOS ..."
  3791 00017531 205645534120564245-     	db " VESA VBE3 Video BIOS ..." ; 26/11/2020
  3791 0001753A 3320566964656F2042-
  3791 00017543 494F53202E2E2E     
  3792 0001754A 0D0A0D0A00              	db 0Dh, 0Ah, 0Dh, 0Ah, 0
  3793                                  
  3794                                  ; 28/02/2021
  3795 0001754F 18                      truecolor: db 24
  3796                                  
  3797                                  align 2
  3798                                  
  3799                                  ; EPOCH Variables
  3800                                  ; 13/04/2015 - Retro UNIX 386 v1 Beginning
  3801                                  ; 09/04/2013 epoch variables
  3802                                  ; Retro UNIX 8086 v1 Prototype: UNIXCOPY.ASM, 10/03/2013
  3803                                  ;
  3804 00017550 B207                    year: 	dw 1970
  3805 00017552 0100                    month: 	dw 1
  3806 00017554 0100                    day: 	dw 1
  3807 00017556 0000                    hour: 	dw 0
  3808 00017558 0000                    minute: dw 0
  3809 0001755A 0000                    second: dw 0
  3810                                  
  3811                                  DMonth:
  3812 0001755C 0000                    	dw 0
  3813 0001755E 1F00                    	dw 31
  3814 00017560 3B00                    	dw 59
  3815 00017562 5A00                    	dw 90
  3816 00017564 7800                    	dw 120
  3817 00017566 9700                    	dw 151
  3818 00017568 B500                    	dw 181
  3819 0001756A D400                    	dw 212
  3820 0001756C F300                    	dw 243
  3821 0001756E 1101                    	dw 273
  3822 00017570 3001                    	dw 304
  3823 00017572 4E01                    	dw 334
  3824                                  
  3825                                  ; 15/11/2020
  3826 00017574 00                      db	0
  3827                                  kernel_version_msg: ; 17/04/2021
  3828                                  ;;;;db	"TRDOS (386) Kernel v2.0.4 by Erdogan Tan"
  3829                                  ;;;db	"TRDOS (386) Kernel v2.0.5 by Erdogan Tan" ; 11/08/2022
  3830                                  ;;db	"TRDOS (386) Kernel v2.0.6 by Erdogan Tan" ; 29/08/2023
  3831                                  ;db	"TRDOS (386) Kernel v2.0.7 by Erdogan Tan" ; 20/10/2023
  3832 00017575 5452444F5320283338-     db	"TRDOS (386) Kernel v2.0.8 by Erdogan Tan" ; 16/05/2024
  3832 0001757E 3629204B65726E656C-
  3832 00017587 2076322E302E382062-
  3832 00017590 79204572646F67616E-
  3832 00017599 2054616E           
  3833 0001759D 00                      db	0
  3834                                  
  3835                                  ; 20/02/2017
  3836                                  KERNELFSIZE  equ $  ; 04/07/2016
  3837                                  
  3838                                  bss_start:
  3839                                  
  3840                                  ABSOLUTE bss_start
  3841                                  
  3842 0001759E ????                    alignb 8 ; 25/12/2016
  3843                                  
  3844                                  	; 15/04/2016
  3845                                  	; TRDOS 386 (TRDOS v2.0)
  3846                                  	; 	80 interrupts 	
  3847                                  	; 11/03/2015
  3848                                  	; Interrupt Descriptor Table (20/08/2014)
  3849                                  idt:
  3850                                  	;resb	64*8 ; INT 0 to INT 3Fh
  3851                                  	; 15/04/2016
  3852 000175A0 <res 280h>              	resb	80*8 ; INT 0 to INT 4Fh
  3853                                  
  3854                                  idt_end:
  3855                                  
  3856                                  ;alignb 4
  3857                                  
  3858                                  task_state_segment:
  3859                                  	; 24/03/2015
  3860 00017820 ????                    tss.link:   resw 1
  3861 00017822 ????                    	    resw 1
  3862                                  ; tss offset 4	
  3863 00017824 ????????                tss.esp0:   resd 1
  3864 00017828 ????                    tss.ss0:    resw 1
  3865 0001782A ????                    	    resw 1	
  3866 0001782C ????????                tss.esp1:   resd 1
  3867 00017830 ????                    tss.ss1:    resw 1
  3868 00017832 ????                    	    resw 1 	
  3869 00017834 ????????                tss.esp2:   resd 1
  3870 00017838 ????                    tss.ss2:    resw 1
  3871 0001783A ????                    	    resw 1
  3872                                  ; tss offset 28
  3873 0001783C ????????                tss.CR3:    resd 1
  3874 00017840 ????????                tss.eip:    resd 1
  3875 00017844 ????????                tss.eflags: resd 1
  3876                                  ; tss offset 40
  3877 00017848 ????????                tss.eax:    resd 1		 		
  3878 0001784C ????????                tss.ecx:    resd 1
  3879 00017850 ????????                tss.edx:    resd 1
  3880 00017854 ????????                tss.ebx:    resd 1
  3881 00017858 ????????                tss.esp:    resd 1
  3882 0001785C ????????                tss.ebp:    resd 1
  3883 00017860 ????????                tss.esi:    resd 1
  3884 00017864 ????????                tss.edi:    resd 1
  3885                                  ; tss offset 72
  3886 00017868 ????                    tss.ES:     resw 1
  3887 0001786A ????                    	    resw 1	
  3888 0001786C ????                    tss.CS:	    resw 1
  3889 0001786E ????                    	    resw 1
  3890 00017870 ????                    tss.SS:	    resw 1
  3891 00017872 ????                    	    resw 1
  3892 00017874 ????                    tss.DS:	    resw 1
  3893 00017876 ????                    	    resw 1
  3894 00017878 ????                    tss.FS:	    resw 1
  3895 0001787A ????                    	    resw 1
  3896 0001787C ????                    tss.GS:	    resw 1
  3897 0001787E ????                    	    resw 1		
  3898 00017880 ????                    tss.LDTR:   resw 1
  3899 00017882 ????                    	    resw 1
  3900                                  ; tss offset 100		
  3901 00017884 ????                    	    resw 1		
  3902 00017886 ????                    tss.IOPB:   resw 1
  3903                                  ; tss offset 104 
  3904                                  tss_end:
  3905                                  
  3906 00017888 ????????                k_page_dir:  resd 1 ; Kernel's (System) Page Directory address
  3907                                  		    ; (Physical address = Virtual address)	 	
  3908 0001788C ????????                memory_size: resd 1 ; memory size in pages
  3909 00017890 ????????                free_pages:  resd 1 ; number of free pages		
  3910 00017894 ????????                next_page:   resd 1 ; offset value in M.A.T. for
  3911                                  		    ; first free page search
  3912 00017898 ????????                last_page:   resd 1 ; offset value in M.A.T. which
  3913                                  		    ; next free page search will be
  3914                                  		    ; stopped after it. (end of M.A.T.)
  3915 0001789C ????????                first_page:  resd 1 ; offset value in M.A.T. which
  3916                                  		    ; first free page search
  3917                                  		    ; will be started on it. (for user)
  3918 000178A0 ????????                mat_size:    resd 1 ; Memory Allocation Table size in pages
  3919                                  
  3920                                  ; 20/11/2020
  3921                                  ;vbe2bios:    resw 1 ; VBE2 video bios ID (bochs/qemu)
  3922                                  ;		    ; (0B0C4h or 0B0C5h for bochs/plex86 vgabios)				
  3923                                  
  3924                                  ; 02/09/2014 (Retro UNIX 386 v1)
  3925                                  ; 04/12/2013 (Retro UNIX 8086 v1)
  3926 000178A4 ????                    CRT_START:   resw 1 	  ; starting address in regen buffer
  3927                                  			  ; NOTE: active page only	
  3928 000178A6 <res 10h>               CURSOR_POSN: resw 8 ; cursor positions for video pages
  3929                                  ACTIVE_PAGE: 
  3930 000178B6 ??                      ptty: 	     resb 1 ; current tty
  3931                                  ; 01/07/2015 - 29/01/2016
  3932 000178B7 ??                      ccolor:	     resb 1 ; current color attribute
  3933                                  ; 26/10/2015
  3934                                  ; 07/09/2014
  3935 000178B8 <res 14h>               ttychr:      resw ntty+2 ; Character buffer (multiscreen)
  3936                                  
  3937                                  ; 18/05/2015 (03/06/2013 - Retro UNIX 8086 v1 feature only!)
  3938 000178CC ????????                p_time:      resd 1     ; present time (for systime & sysmdate)
  3939                                  
  3940                                  ; 18/05/2015 (16/08/2013 - Retro UNIX 8086 v1 feature only !)
  3941                                  ; (open mode locks for pseudo TTYs)
  3942                                  ; [ major tty locks (return error in any conflicts) ]
  3943 000178D0 <res 14h>               ttyl:        resw ntty+2 ; opening locks for TTYs.
  3944                                  
  3945                                  ; 15/04/2015 (Retro UNIX 386 v1)
  3946                                  ; 22/09/2013 (Retro UNIX 8086 v1)
  3947 000178E4 <res Ah>                wlist:       resb ntty+2 ; wait channel list (0 to 9 for TTYs)
  3948                                  ; 15/04/2015 (Retro UNIX 386 v1)
  3949                                  ;; 12/07/2014 -> sp_init set comm. parameters as 0E3h
  3950                                  ;; 0 means serial port is not available 
  3951                                  ;;comprm: ; 25/06/2014
  3952 000178EE ??                      com1p:       resb 1  ;;0E3h
  3953 000178EF ??                      com2p:       resb 1  ;;0E3h
  3954                                  
  3955                                  ; 17/11/2015
  3956                                  ; request for response (from the terminal)	
  3957 000178F0 ????                    req_resp:    resw 1 			
  3958                                  ; 07/11/2015
  3959 000178F2 ??                      ccomport:    resb 1 ; current COM (serial) port
  3960                                  		    ; (0= COM1, 1= COM2)
  3961                                  ; 09/11/2015
  3962 000178F3 ??                      comqr:	     resb 1 ; 'query or response' sign (u9.s, 'sndc')
  3963                                  ; 07/11/2015
  3964 000178F4 ????                    rchar:	     resw 1 ; last received char for COM 1 and COM 2		
  3965 000178F6 ????                    schar:	     resw 1 ; last sent char for COM 1 and COM 2
  3966                                  
  3967                                  ; 22/08/2014 (RTC)
  3968                                  ; (Packed BCD)
  3969 000178F8 ??                      time_seconds: resb 1
  3970 000178F9 ??                      time_minutes: resb 1
  3971 000178FA ??                      time_hours:   resb 1
  3972 000178FB ??                      date_wday:    resb 1
  3973 000178FC ??                      date_day:     resb 1
  3974 000178FD ??                      date_month:   resb 1			
  3975 000178FE ??                      date_year:    resb 1
  3976 000178FF ??                      date_century: resb 1
  3977                                  
  3978                                  ; 24/01/2016
  3979 00017900 ????????                RTC_LH:	       resd 1
  3980 00017904 ??                      RTC_WAIT_FLAG: resb 1
  3981 00017905 ??                      USER_FLAG:     resb 1
  3982                                  ; 19/05/2016
  3983                                  ;RTC_second:
  3984 00017906 ??                      RTC_2Hz:       resb 1 ;  from 2Hz interrupt to 1Hz timer event function	
  3985                                  
  3986                                  %include 'diskbss.s'	; UNINITIALIZED DISK (BIOS) DATA
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.5 - diskbss.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 06/08/2022 (Previous: 24/01/2016)
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 24/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.15 (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> ;	(Unitialized Disk Parameters Data section for 'DISKIO.INC') 
    22                              <1> 
    23 00017907 ??                  <1> alignb 2
    24                              <1> 
    25                              <1> ;----------------------------------------
    26                              <1> ;	TIMER DATA AREA 		:
    27                              <1> ;----------------------------------------
    28                              <1> 
    29                              <1> TIMER_LH:	; 16/02/2015
    30 00017908 ????                <1> TIMER_LOW:      resw	1               ; LOW WORD OF TIMER COUNT
    31 0001790A ????                <1> TIMER_HIGH:     resw	1               ; HIGH WORD OF TIMER COUNT
    32 0001790C ??                  <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 0001790D ??                  <1> SEEK_STATUS:	resb	1
    39 0001790E ??                  <1> MOTOR_STATUS:	resb	1
    40 0001790F ??                  <1> MOTOR_COUNT:	resb	1
    41 00017910 ??                  <1> DSKETTE_STATUS:	resb	1
    42 00017911 ??????????????      <1> NEC_STATUS:	resb	7
    43                              <1> 
    44                              <1> ;----------------------------------------
    45                              <1> ;	ADDITIONAL MEDIA DATA		:
    46                              <1> ;----------------------------------------
    47                              <1> 
    48 00017918 ??                  <1> LASTRATE:	resb 	1
    49 00017919 ??                  <1> HF_STATUS:	resb 	1
    50                              <1> ; 06/08/2022
    51                              <1> ;HF_ERROR:	resb 	1
    52 0001791A ??                  <1> HF_INT_FLAG:	resb 	1
    53                              <1> ; 06/08/2022
    54                              <1> ;HF_CNTRL:	resb 	1
    55                              <1> ;DSK_STATE:	resb 	4
    56                              <1> ; 06/08/2022
    57 0001791B ????                <1> DSK_STATE:	resb	2 	
    58 0001791D ????                <1> DSK_TRK:	resb 	2
    59                              <1> 
    60                              <1> ;----------------------------------------
    61                              <1> ;	FIXED DISK DATA AREAS		:
    62                              <1> ;----------------------------------------
    63                              <1> 
    64 0001791F ??                  <1> DISK_STATUS1:	resb 	1		; FIXED DISK STATUS
    65 00017920 ??                  <1> HF_NUM:		resb 	1		; COUNT OF FIXED DISK DRIVES
    66 00017921 ??                  <1> CONTROL_BYTE:	resb 	1		; HEAD CONTROL BYTE
    67                              <1> ;@PORT_OFF	resb	1		; RESERVED (PORT OFFSET)
    68                              <1> ;port1_off	resb	1		; Hard disk controller 1 - port offset
    69                              <1> ;port2_off	resb	1		; Hard disk controller 2 - port offset
    70                              <1> 
    71 00017922 ????                <1> alignb 4
    72                              <1> 
    73                              <1> ;HF_TBL_VEC:	resd	1 		; Primary master disk param. tbl. pointer
    74                              <1> ;HF1_TBL_VEC:	resd	1		; Primary slave disk param. tbl. pointer
    75                              <1> HF_TBL_VEC: ; 22/12/2014	
    76 00017924 ????????            <1> HDPM_TBL_VEC:	resd	1 		; Primary master disk param. tbl. pointer
    77 00017928 ????????            <1> HDPS_TBL_VEC:	resd	1		; Primary slave disk param. tbl. pointer
    78 0001792C ????????            <1> HDSM_TBL_VEC:	resd	1 		; Secondary master disk param. tbl. pointer
    79 00017930 ????????            <1> HDSS_TBL_VEC:	resd	1		; Secondary slave disk param. tbl. pointer
    80                              <1> 
    81                              <1> ; 03/01/2015
    82 00017934 ??                  <1> LBAMode:     	resb	1
    83                              <1> 
    84                              <1> ; *****************************************************************************
  3987                                  
  3988                                  ;;; Real Mode Data (10/07/2015 - BSS)
  3989                                  
  3990                                  ;alignb 2
  3991                                  
  3992                                  ; 10/01/2016
  3993                                  %include 'trdoskx.s'	; UNINITIALIZED KERNEL (Logical Drive & FS) DATA
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.8) - UNINITIALIZED DATA : trdoskx.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 22/05/2024 (Previous: 04/12/2023 - Kernel v2.0.7)
     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 00017935 ??????              <1> alignb 4
    20                              <1> 
    21                              <1> ; MAINPROG.ASM
    22 00017938 ????????            <1> MainProgCfg_FileSize:   resd 1 ; 14/04/2016
    23 0001793C ????????            <1> MainProgCfg_LineOffset: resd 1 ; 14/04/2016
    24                              <1> 
    25 00017940 ????????            <1> Current_VolSerial: resd 1
    26                              <1> 
    27 00017944 ????????            <1> Current_Dir_FCluster: resd 1
    28                              <1> 
    29 00017948 ??                  <1> Current_Dir_Level: resb 1
    30 00017949 ??                  <1> Current_FATType: resb 1
    31 0001794A ??                  <1> Current_Drv: resb 1
    32 0001794B ??                  <1> Current_Dir_Drv:   resb 1 ; '?'
    33 0001794C ??                  <1>                    resb 1 ; ':'
    34 0001794D ??                  <1> Current_Dir_Root:  resb 1 ; '/' 
    35 0001794E <res 5Ah>           <1> Current_Directory: resb 90
    36 000179A8 ??                  <1> End_Of_Current_Dir_Str: resb 1
    37 000179A9 ??                  <1> Current_Dir_StrLen: resb 1   
    38                              <1> 
    39 000179AA ??                  <1> CursorColumn: 	resb 1
    40 000179AB ??                  <1> CmdArgStart:    resb 1
    41                              <1> 
    42                              <1> ; 03/02/2016
    43 000179AC <res 4Eh>           <1> Remark:		resb 78
    44                              <1> 
    45 000179FA <res 50h>           <1> CommandBuffer: 	resb 80
    46                              <1> 
    47 00017A4A <res 100h>          <1> TextBuffer:	resb 256
    48                              <1> 
    49                              <1> MasterBootBuff:
    50 00017B4A <res 1BEh>          <1> MasterBootCode: resb 1BEh
    51 00017D08 <res 40h>           <1> PartitionTable: resb 64
    52 00017D48 ????                <1> MBIDCode: resw 1
    53                              <1> 
    54                              <1> PTable_Buffer:
    55 00017D4A <res 40h>           <1> PTable_hd0: resb 64
    56 00017D8A <res 40h>           <1> PTable_hd1: resb 64
    57 00017DCA <res 40h>           <1> PTable_hd2: resb 64
    58 00017E0A <res 40h>           <1> PTable_hd3: resb 64
    59                              <1> ; 15/07/2020
    60                              <1> ;PTable_ep0: resb 64
    61                              <1> ;PTable_ep1: resb 64
    62                              <1> ;PTable_ep2: resb 64
    63                              <1> ;PTable_ep3: resb 64
    64                              <1> 
    65                              <1> ; 22/05/2024
    66 00017E4A ????????            <1> HD_LBA_yes: resd 1
    67                              <1> ; 13/08/2020
    68 00017E4E ??                  <1> scount: resb 1 ; 16/05/2016 (diskio.s, 'int33h:')
    69                              <1> ; 22/05/2024
    70                              <1> 	;resb 1
    71                              <1> 	;resb 1
    72                              <1> 	;resb 1
    73                              <1> ;HD_LBA_yes: resb 1
    74 00017E4F ??                  <1> PP_Counter: resb 1
    75 00017E50 ??                  <1> EP_Counter: resb 1
    76                              <1> ; 13/08/2020
    77 00017E51 ??                  <1> LD_Counter: resb 1
    78                              <1> 
    79                              <1> ; 30/08/2020
    80 00017E52 ????????            <1> MBR_EP_StartSector: resd 1 
    81                              <1> 		; Extd partition start sector as in MBR
    82 00017E56 ????????            <1> EP_StartSector: resd 1 ; next extd partition start sector
    83                              <1> 	; 15/07/2020	
    84                              <1>                 ;resd 1
    85                              <1>                 ;resd 1
    86                              <1> 
    87                              <1> ; 20/07/2020
    88 00017E5A <res 200h>          <1> DOSBootSectorBuff: resb 512
    89                              <1> ; 15/07/2020
    90                              <1> ;DOSBootSectorBuff: resb 446 ; 1BEh
    91                              <1> ;MiniPartitionTable: resb 64 ;  40h
    92                              <1> ;MiniPartitionMagic: resw  1 ;  02h 		
    93                              <1> 
    94                              <1> FAT_BuffDescriptor:
    95 0001805A ????????            <1> FAT_CurrentCluster: resd 1
    96 0001805E ??                  <1> FAT_BuffValidData: resb 1
    97 0001805F ??                  <1> FAT_BuffDrvName: resb 1
    98 00018060 ????                <1> FAT_BuffOffset: resw 1
    99 00018062 ????????            <1> FAT_BuffSector: resd 1
   100                              <1> 
   101 00018066 ????????            <1> FAT_ClusterCounter: resd 1
   102 0001806A ????????            <1> LastCluster: resd 1
   103                              <1> 
   104                              <1> ; 16/05/2016
   105                              <1> ;; 18/03/2016 (TRDOS v2.0)
   106                              <1> ;ClusterBuffer_Valid: resb 1
   107                              <1> 
   108                              <1> ; 29/07/2022
   109                              <1> ;resb 1
   110                              <1> ; 02/12/2023
   111 0001806E ??                  <1> P_TIMER: resb 1 ; diskette change check (2 seconds)
   112                              <1> 
   113                              <1> Dir_BuffDescriptor:
   114 0001806F ??                  <1> DirBuff_DRV: resb 1
   115 00018070 ??                  <1> DirBuff_FATType: resb 1
   116 00018071 ??                  <1> DirBuff_ValidData: resb 1
   117 00018072 ????                <1> DirBuff_CurrentEntry: resw 1
   118 00018074 ????                <1> DirBuff_LastEntry: resw 1
   119 00018076 ????????            <1> DirBuff_Cluster: resd 1 
   120 0001807A ????                <1> DirBuffer_Size: resw 1
   121                              <1> ;DirBuff_EntryCounter: resw 1
   122                              <1> 
   123                              <1> ; 01/02/2016
   124                              <1> ; these are on (real mode) segment 8000h and later
   125                              <1> ; FAT_Buffer:	resb 1536 ; 3 sectors
   126                              <1> ; Dir_Buffer:	resb 512*32
   127                              <1> ; Logical_DOSDisks:  resb 6656 ; 26 * 256 bytes
   128                              <1> 
   129                              <1> ; 18/01/2016
   130                              <1> 
   131 0001807C ????????            <1> FreeClusterCount: resd 1
   132                              <1> 
   133 00018080 ????????            <1> VolSize_Unit1:   resd 1
   134 00018084 ????????            <1> VolSize_Unit2:   resd 1
   135                              <1> 
   136 00018088 ????????            <1> Vol_Tot_Sec_Str_Start:	    resd 1
   137 0001808C <res Ah>            <1> Vol_Tot_Sec_Str: 	    resb 10
   138 00018096 ??                  <1> Vol_Tot_Sec_Str_End:	    resb 1
   139 00018097 ??                  <1> resb 1
   140 00018098 ????????            <1> Vol_Free_Sectors_Str_Start: resd 1
   141 0001809C <res Ah>            <1> Vol_Free_Sectors_Str:	    resb 10				
   142 000180A6 ??                  <1> Vol_Free_Sectors_Str_End:   resb 1
   143                              <1> 
   144                              <1> ; 10/02/2016
   145 000180A7 ??                  <1> RUN_CDRV: resb 1 ; CMD_INTR.ASM  ; 09/11/2011
   146                              <1> 
   147                              <1> ; 24/01/2016
   148 000180A8 <res 80h>           <1> PATH_Array:     resb 128 ; DIR.ASM ; 09/10/2011
   149                              <1> ; 06/02/2016
   150 00018128 ????????            <1> CCD_DriveDT:	resd 1 ; DIR.ASM ; (word)
   151 0001812C ??                  <1> CCD_Level:	resb 1 ; DIR.ASM
   152 0001812D ??                  <1> Last_Dir_Level:	resb 1 ; DIR.ASM
   153                              <1> ;
   154 0001812E ????                <1> CDLF_AttributesMask: resw 1 ; DIR.ASM
   155 00018130 ????????            <1> CDLF_FNAddress:	resd 1 ; DIR.ASM (word)
   156 00018134 ????                <1> CDLF_DEType:	resw 1 ; DIR.ASM
   157                              <1> ;
   158 00018136 ??                  <1> CD_COMMAND:	resb 1 ; DIR.ASM
   159                              <1> 
   160 00018137 ??                  <1> alignb 4
   161                              <1> 
   162                              <1> ; 29/01/2016
   163 00018138 ??                  <1> Program_Exit:	resb 1 ; CMD_INTR.ASM  ; 09/11/2011
   164                              <1> 
   165                              <1> ;alignb 4
   166                              <1> ; 23/02/2016
   167 00018139 ??                  <1> disk_rw_op:	resb 1 ; 0 = disk read, 1 = disk write
   168                              <1> ;disk_rw_spt:	resb 1 ; sectors per track (<= 63) /// (<256)
   169                              <1> ; 31/01/2016
   170 0001813A ??                  <1> retry_count: 	resb 1 ; DISK_IO.ASM ; 20/07/2011 (CHS_RetryCount)
   171 0001813B ??                  <1> disk_rw_err: 	resb 1 ; DISK_IO.ASM ; (Disk_IO_err_code)
   172 0001813C ????????            <1> sector_count:	resd 1 ; DISK_IO.ASM ; (Disk_RW_SectorCount)
   173                              <1> 
   174                              <1> ; 06/02/2016 (long name)
   175 00018140 ????                <1> FDE_AttrMask:	   resw 1 ; DIR.ASM
   176 00018142 ????                <1> AmbiguousFileName: resw 1 ; DIR.ASM
   177 00018144 ??                  <1> PreviousAttr:	   resb 1 ; DIR.ASM
   178                              <1> ;	
   179 00018145 ??                  <1> LongNameFound:   resb 1	  ; DIR.ASM
   180 00018146 ??                  <1> LFN_EntryLength: resb 1   ; DIR.ASM
   181 00018147 ??                  <1> LFN_CheckSum:    resb 1   ; DIR.ASM
   182 00018148 <res 84h>           <1> LongFileName:    resb 132 ; DIR.ASM
   183                              <1> 
   184                              <1> ;PATH_Array_Ptr: resw 1 ; DIR.ASM
   185 000181CC ??                  <1> PATH_CDLevel:	 resb 1 ; DIR.ASM
   186 000181CD ??                  <1> PATH_Level:	 resb 1 ; DIR.ASM
   187                              <1> 
   188                              <1> ; 07/02/2016
   189 000181CE <res Dh>            <1> Dir_File_Name:	resb 13 ; DIR.ASM ; 09/10/2011
   190                              <1> 
   191                              <1> ; 10/02/2016
   192 000181DB <res Dh>            <1> Dir_Entry_Name:	resb 13 ; DIR.ASM
   193                              <1> 
   194                              <1> alignb 2
   195                              <1> 
   196 000181E8 ????                <1> AttributesMask: resw 1 ; CMD_INTR.ASM ; 09/11/2011
   197                              <1> 
   198                              <1> ; 10/02/2016 (128 bytes -> 126 bytes)
   199                              <1> ; 08/02/2016
   200                              <1> ;FFF Structure (128 bytes) ; DIR.ASM ; 09/10/2011
   201 000181EA ??                  <1> FindFile_Drv:		  resb 1
   202 000181EB <res 41h>           <1> FindFile_Directory:	  resb 65
   203 0001822C <res Dh>            <1> FindFile_Name:		  resb 13
   204                              <1> FindFile_LongNameEntryLength:
   205 00018239 ??                  <1> FindFile_LongNameYes: 	  resb 1 ; Sign for longname procedures
   206                              <1> ;Above 80 bytes form
   207                              <1> ;TR-DOS Source/Destination File FullName Format/Structure
   208 0001823A ????                <1> FindFile_AttributesMask:  resw 1
   209 0001823C <res 20h>           <1> FindFile_DirEntry:	  resb 32
   210 0001825C ????????            <1> FindFile_DirFirstCluster: resd 1
   211 00018260 ????????            <1> FindFile_DirCluster:	  resd 1
   212 00018264 ????                <1> FindFile_DirEntryNumber:  resw 1
   213 00018266 ????                <1> FindFile_MatchCounter:	  resw 1
   214 00018268 ????                <1> FindFile_Reserved:	  resw 1 ; 06/03/2016
   215                              <1> 
   216 0001826A ????????            <1> First_Path_Pos: resd 1	; DIR.ASM ; 09/10/2011
   217 0001826E ????????            <1> Last_Slash_Pos: resd 1	; DIR.ASM 
   218                              <1> 
   219                              <1> ; 10/02/2016
   220 00018272 ????                <1> File_Count:     resw 1 	; DIR.ASM ; 09/10/2011
   221 00018274 ????                <1> Dir_Count:      resw 1
   222 00018276 ????????            <1> Total_FSize:    resd 1
   223 0001827A ????????            <1> TFS_Dec_Begin:  resd 1
   224 0001827E <res Ah>            <1>                 resb 10
   225 00018288 ??                  <1> TFS_Dec_End:    resb 1
   226                              <1> 
   227 00018289 ??                  <1> PrintDir_RowCounter: resb 1
   228                              <1> 
   229 0001828A ????                <1> alignb 4
   230                              <1> ; 15/02/2015 ('show' command variables)
   231 0001828C ????????            <1> Show_FDT:	resd 1
   232 00018290 ????????            <1> Show_LDDDT:	resd 1
   233 00018294 ????????            <1> Show_Cluster:	resd 1
   234 00018298 ????????            <1> Show_FileSize:	resd 1
   235 0001829C ????????            <1> Show_FilePointer: resd 1
   236 000182A0 ????                <1> Show_ClusterPointer: resw 1
   237 000182A2 ????                <1> Show_ClusterSize: resw 1
   238 000182A4 ??                  <1> Show_RowCount:	resb 1
   239                              <1> 
   240 000182A5 ??????              <1> alignb 4
   241                              <1> ; 21/02/2016
   242 000182A8 ????????            <1> DelFile_FNPointer:	resd 1 ; ; CMD_INTR.ASM (word) ; 09/11/2011
   243                              <1> ; 27/02/2016
   244                              <1> ; DIR.ASM (09/10/2011)
   245 000182AC ????????            <1> DelFile_FCluster:	resd 1
   246 000182B0 ????                <1> DelFile_EntryCounter:	resw 1
   247 000182B2 ??                  <1> DelFile_LNEL:		resb 1
   248 000182B3 ??                  <1> resb 1
   249                              <1> 
   250                              <1> ; DIR.ASM
   251 000182B4 ????????            <1> mkdir_DirName_Offset: 	resd 1
   252 000182B8 ????????            <1> mkdir_FFCluster:	resd 1
   253 000182BC ????????            <1> mkdir_LastDirCluster:	resd 1
   254 000182C0 ????????            <1> mkdir_FreeSectors:	resd 1
   255 000182C4 ????                <1> mkdir_attrib:		resw 1 
   256 000182C6 ??                  <1> mkdir_SecPerClust:	resb 1
   257 000182C7 ??                  <1> mkdir_add_new_cluster:	resb 1
   258 000182C8 <res Dh>            <1> mkdir_Name:		resb 13
   259 000182D5 ????                <1> resw 1 ; 01/03/2016
   260                              <1> ; 27/02/2016
   261 000182D7 ??                  <1> RmDir_MultiClusters:	resb 1  
   262 000182D8 ????????            <1> RmDir_DirEntryOffset:	resd 1 ; 01/03/2016 (word -> dword)
   263 000182DC ????????            <1> RmDir_ParentDirCluster: resd 1
   264 000182E0 ????????            <1> RmDir_DirLastCluster:   resd 1
   265 000182E4 ????????            <1> RmDir_PreviousCluster:  resd 1
   266                              <1> ; 22/02/2016
   267 000182E8 ??                  <1> UPDLMDT_CDirLevel:	resb 1
   268 000182E9 ????????            <1> UPDLMDT_CDirFCluster:	resd 1
   269                              <1> 	
   270 000182ED ??????              <1> alignb 4
   271                              <1> ; DRV_FAT.ASM ; 21/08/2011
   272 000182F0 ????????            <1> gffc_next_free_cluster:  resd 1
   273 000182F4 ????????            <1> gffc_first_free_cluster: resd 1
   274 000182F8 ????????            <1> gffc_last_free_cluster:  resd 1
   275                              <1> 
   276                              <1> ;29/04/2016
   277                              <1> Cluster_Index: ; resd 1
   278                              <1> ; 22/02/2016
   279 000182FC ????????            <1> ClusterValue:	resd 1
   280                              <1> ; 04/03/2016
   281 00018300 ??                  <1> Attributes:	resb 1 
   282                              <1> ;;CFS_error:  resb 1 ;; 01/03/2016
   283 00018301 ??                  <1> resb 1
   284 00018302 ??                  <1> CFS_OPType: resb 1
   285 00018303 ??                  <1> CFS_Drv:    resb 1
   286 00018304 ????????            <1> CFS_CC:	    resd 1
   287 00018308 ????????            <1> CFS_FAT32FSINFOSEC: resd 1
   288 0001830C ????????            <1> CFS_FAT32FC: resd 1
   289                              <1> 
   290                              <1> ; 27/02/2016
   291                              <1> ;alignb 4
   292 00018310 ????????            <1> glc_prevcluster: resd 1 ; DRV_FAT.ASM (21/08/2011)
   293                              <1> ; 22/10/2016
   294 00018314 ????????            <1> glc_index:	 resd 1 ;  Last Cluster Index (22/10/2016)	
   295                              <1> 
   296                              <1> ; DIR.ASM
   297 00018318 ????                <1> DLN_EntryNumber: resw 1
   298 0001831A ??                  <1> DLN_40h:	 resb 1
   299                              <1> ; 28/02/2016
   300 0001831B ??                  <1> TCC_FATErr:	 resb 1 ; DRV_FAT.ASM
   301                              <1> 
   302                              <1> alignb 4
   303                              <1> ; DIR.ASM (09/10/2011)
   304 0001831C ????                <1> LCDE_EntryIndex: resw 1 ; LCDE_EntryOffset
   305 0001831E ????                <1> LCDE_ClusterSN:  resw 1
   306 00018320 ????????            <1> LCDE_Cluster: 	 resd 1
   307 00018324 ????????            <1> LCDE_ByteOffset: resd 1
   308                              <1> 
   309                              <1> ;alignb4
   310                              <1> ; 06/03/2016 (word -> dword)
   311                              <1> ; CMD_INTR.ASM (01/08/2010)
   312 00018328 ????????            <1> SourceFilePath:	     resd 1
   313 0001832C ????????            <1> DestinationFilePath: resd 1
   314                              <1> 
   315                              <1> ;alignb 4
   316                              <1> ; 06/03/2016
   317                              <1> ; FILE.ASM (09/10/2011)
   318                              <1> ;Source File Structure (same with 'Find File' Structure)
   319 00018330 ??                  <1> SourceFile_Drv:			resb 1
   320 00018331 <res 41h>           <1> SourceFile_Directory:		resb 65
   321 00018372 <res Dh>            <1> SourceFile_Name:		resb 13
   322                              <1> SourceFile_LongNameEntryLength: 
   323 0001837F ??                  <1> SourceFile_LongNameYes:		resb 1 ; Sign for longname procedures
   324                              <1> ;Above 80 bytes
   325                              <1> ;is TR-DOS Source File FullName Format/Structure
   326 00018380 ????                <1> SourceFile_AttributesMask:	resw 1
   327 00018382 <res 20h>           <1> SourceFile_DirEntry:		resb 32
   328 000183A2 ????????            <1> SourceFile_DirFirstCluster:	resd 1
   329 000183A6 ????????            <1> SourceFile_DirCluster:		resd 1
   330 000183AA ????                <1> SourceFile_DirEntryNumber:	resw 1
   331 000183AC ????                <1> SourceFile_MatchCounter:	resw 1
   332                              <1> ; 16/03/2016
   333 000183AE ??                  <1> SourceFile_SecPerClust:		resb 1
   334 000183AF ??                  <1> SourceFile_Reserved:		resb 1
   335                              <1> ; Above is 128 bytes
   336                              <1> 
   337                              <1> ;Destination File Structure (same with 'Find File' Structure)
   338 000183B0 ??                  <1> DestinationFile_Drv:		resb 1
   339 000183B1 <res 41h>           <1> DestinationFile_Directory: 	resb 65
   340 000183F2 <res Dh>            <1> DestinationFile_Name:		resb 13
   341                              <1> DestinationFile_LongNameEntryLength:
   342 000183FF ??                  <1> DestinationFile_LongNameYes:	resb 1 ; Sign for longname procedures
   343                              <1> ;Above 80 bytes
   344                              <1> ;is TR-DOS Destination File FullName Format/Structure
   345 00018400 ????                <1> DestinationFile_AttributesMask: resw 1
   346 00018402 <res 20h>           <1> DestinationFile_DirEntry:	resb 32
   347 00018422 ????????            <1> DestinationFile_DirFirstCluster: resd 1
   348 00018426 ????????            <1> DestinationFile_DirCluster:	resd 1
   349 0001842A ????                <1> DestinationFile_DirEntryNumber: resw 1
   350 0001842C ????                <1> DestinationFile_MatchCounter:	resw 1
   351                              <1> ; 16/03/2016
   352 0001842E ??                  <1> DestinationFile_SecPerClust:	resb 1
   353 0001842F ??                  <1> DestinationFile_Reserved:	resb 1
   354                              <1> ; Above is 128 bytes
   355                              <1> 
   356                              <1> ; 24/04/2016
   357 00018430 ????                <1> resw 1
   358                              <1> 
   359                              <1> ; 10/03/2016
   360                              <1> ; FILE.ASM
   361 00018432 ??                  <1> move_cmd_phase:	   resb 1
   362 00018433 ??                  <1> msftdf_sf_df_drv:  resb 1
   363 00018434 ????????            <1> msftdf_drv_offset: resd 1
   364                              <1> 
   365                              <1> ; 11/03/2016
   366                              <1> ; DRV_FAT.ASM (21/08/2011)
   367 00018438 ????????            <1> FAT_anc_LCluster:  resd 1
   368 0001843C ????????            <1> FAT_anc_FFCluster: resd 1
   369                              <1> 
   370                              <1> ;alignb 4
   371                              <1> 
   372                              <1> ; 14/03/2016
   373                              <1> ; TRDOS 386 = TRDOS v2.0 feature only !
   374                              <1> ; 'allocate_memory_block' in 'memory.s'
   375 00018440 ????????            <1> mem_ipg_count:	resd 1 ; page count (for contiguous allocation)
   376 00018444 ????????            <1> mem_pg_count:	resd 1 ; page count (for count down)
   377 00018448 ????????            <1> mem_aperture:	resd 1 ; contiguous free pages (current)
   378 0001844C ????????            <1> mem_max_aperture: resd 1 ; maximum value of contiguous free pages
   379 00018450 ????????            <1> mem_pg_pos:	resd 1 ; mem. position (page #) of current aperture
   380 00018454 ????????            <1> mem_max_pg_pos: resd 1 ; mem. position (page #) of max. aperture
   381                              <1> 
   382                              <1> ; 15/03/2016
   383                              <1> ; FILE.ASM ('copy_source_file_to_destination_file')
   384 00018458 ??                  <1> copy_cmd_phase:       resb 1
   385 00018459 ??                  <1> csftdf_rw_err:	      resb 1
   386 0001845A ??                  <1> DestinationFileFound: resb 1
   387 0001845B ??                  <1> csftdf_cdrv: 	      resb 1
   388 0001845C ????????            <1> csftdf_filesize:      resd 1
   389                              <1> ; TRDOS386 (TRDOS v2.0)
   390 00018460 ????????            <1> csftdf_sf_mem_addr:   resd 1
   391 00018464 ????????            <1> csftdf_sf_mem_bsize:  resd 1
   392                              <1> ;
   393                              <1> 
   394 00018468 ????????            <1> csftdf_sf_cluster:    resd 1 ; 16/03/2016
   395 0001846C ????????            <1> csftdf_df_cluster:    resd 1
   396                              <1> ; 16/03/2016
   397 00018470 ????????            <1> csftdf_r_size:        resd 1
   398 00018474 ????????            <1> csftdf_w_size:        resd 1
   399 00018478 ????????            <1> csftdf_sf_rbytes:     resd 1
   400 0001847C ????????            <1> csftdf_df_wbytes:     resd 1
   401 00018480 ??                  <1> csftdf_percentage:    resb 1
   402                              <1> ; 17/03/2016
   403 00018481 ??                  <1> csftdf_videopage:     resb 1
   404 00018482 ????                <1> csftdf_cursorpos:     resw 1
   405 00018484 ????????            <1> csftdf_sf_drv_dt:     resd 1
   406 00018488 ????????            <1> csftdf_df_drv_dt:     resd 1
   407                              <1> 
   408                              <1> ; 21/03/2016
   409                              <1> ; 20/03/2016
   410                              <1> ; FILE.ASM
   411 0001848C ????????            <1> createfile_Name_Offset:  resd 1
   412 00018490 ????????            <1> createfile_FreeSectors:  resd 1 
   413 00018494 ????????            <1> createfile_size:         resd 1
   414 00018498 ????????            <1> createfile_FFCluster:    resd 1 ; 11/03/2016
   415 0001849C ????????            <1> createfile_LastDirCluster: resd 1
   416 000184A0 ????????            <1> createfile_Cluster:      resd 1
   417 000184A4 ????????            <1> createfile_PCluster:     resd 1
   418 000184A8 ??                  <1> createfile_attrib:	 resb 1
   419 000184A9 ??                  <1> createfile_SecPerClust:  resb 1
   420 000184AA ????                <1> createfile_DirIndex:     resw 1
   421 000184AC ????????            <1> createfile_CCount:	 resd 1
   422 000184B0 ????                <1> createfile_BytesPerSec:	 resw 1 ; 23/03/2016
   423 000184B2 ??                  <1> createfile_wfc:	         resb 1
   424 000184B3 ??                  <1> createfile_UpdatePDir:	 resb 1 ; 31/03/2016
   425                              <1> 
   426                              <1> ;alignb 4
   427                              <1> 
   428                              <1> ; 11/04/2016
   429 000184B4 ????                <1> env_var_length:	resw 1
   430                              <1> 
   431 000184B6 ????                <1> alignb 4
   432                              <1> 
   433                              <1> ; 25/04/2016
   434 000184B8 ??                  <1> readi.valid:	resb 1 ; valid data (>0 = valid for readi)
   435 000184B9 ??                  <1> readi.drv:	resb 1 ; drive number (0, 1,2,3,4..)
   436 000184BA ??                  <1> readi.spc:	resb 1 ; sectors per cluster for 'readi' drive
   437 000184BB ??                  <1> readi.s_index:  resb 1 ; sector index in current cluster (buffer)
   438 000184BC ????????            <1> readi.sector:	resd 1 ; current disk sector
   439 000184C0 ????                <1> readi.bpc:	resw 1 ; bytes per cluster - 1
   440 000184C2 ????                <1> readi.offset:	resw 1 ; byte offset in cluster buffer
   441 000184C4 ????????            <1> readi.cluster:  resd 1 ; current cluster number
   442 000184C8 ????????            <1> readi.c_index:	resd 1 ; cluster index of the current cluster (0,1,2,3..)
   443 000184CC ????????            <1> readi.fclust:	resd 1 ; first cluster of the current cluster
   444 000184D0 ????????            <1> readi.fs_index: resd 1 ; sector index in disk/file section (for Singlix FS)
   445                              <1> ;readi.buffer:	resd 1 ; readi sector buffer address
   446                              <1> 
   447                              <1> ;alignb 4
   448                              <1> 
   449 000184D4 ??                  <1> writei.valid:	resb 1 ; valid data (>0 = valid for writei)
   450 000184D5 ??                  <1> writei.drv:	resb 1 ; drive number (0, 1,2,3,4..)
   451 000184D6 ??                  <1> writei.spc:	resb 1 ; sectors per cluster for 'writei' drive
   452 000184D7 ??                  <1> writei.s_index: resb 1 ; sector index in current cluster (buffer)
   453 000184D8 ????????            <1> writei.sector:	resd 1 ; current disk sector
   454 000184DC ????                <1> writei.bpc:	resw 1 ; bytes per cluster - 1
   455 000184DE ????                <1> writei.offset:	resw 1 ; byte offset in cluster buffer
   456 000184E0 ????????            <1> writei.cluster: resd 1 ; current cluster number
   457 000184E4 ????????            <1> writei.c_index:	resd 1 ; cluster index of the current cluster (0,1,2,3..)
   458 000184E8 ????????            <1> writei.fclust:  resd 1 ; first cluster of the current cluster
   459 000184EC ????????            <1> writei.fs_index: resd 1 ; sector index in disk/file section (for Singlix FS)
   460                              <1> ;writei.buffer:	resd 1 ; writei sector buffer address
   461 000184F0 ????????            <1> writei.lclust:	resd 1 ; writei last cluster (mget_w) ; 23/10/2016
   462 000184F4 ????????            <1> writei.l_index:	resd 1 ; writei last cluster index (mget_w) ; 23/10/2016
   463 000184F8 ??                  <1> writei.ofn:	resb 1 ; open file number (to be written) ; 23/10/2016
   464                              <1> 
   465 000184F9 ??????              <1> alignb 4
   466                              <1> 
   467                              <1> ; 29/04/2016
   468 000184FC ????????            <1> Run_CDirFC:	resd 1
   469 00018500 ??                  <1> Run_Auto_Path:	resb 1
   470 00018501 ??                  <1> Run_Manual_Path: resb 1 ; 0 -> auto path sequence needed
   471 00018502 ??                  <1> EXE_ID:		resb 1	
   472 00018503 ??                  <1> EXE_dot:	resb 1
   473                              <1> 
   474                              <1> ; 06/05/2016
   475 00018504 ????????            <1> mainprog_return_addr: resd 1
   476 00018508 ????????            <1> last_error:	resd 1  ; this will be used to return error code to MainProg
   477                              <1> 			; 'lasterror' keyword will be used later to get the
   478                              <1> 			; last error code/number/status.
   479                              <1> ; 12/05/2016
   480 0001850C ????????            <1> video_eax:	resd 1  ; eax return value of video function
   481                              <1> 
   482                              <1> ; 01/06/2016
   483 00018510 ????????            <1> user_buffer:	resd 1  ; 'diskio.s' (INT 33h, Function 08h, floppy disk type)
   484                              <1> 
   485                              <1> ; 21/05/2016 - TRDOS 386 ('swap/switch', 'rswap', [u.pri])
   486 00018514 ??                  <1> priority:	resb 1  ; running priority level of process (0,1,2)
   487                              <1> 			; (run queue which is process comes from)
   488                              <1> ; 22/05/2016 - TRDOS 386 ('set_run_sequence', 'rtc_int', 'u_timer')
   489 00018515 ??                  <1> p_change:	resb 1  ; process change status (for timer events)
   490                              <1> ; 23/05/2016 - TRDOS 386 ('clock')
   491 00018516 ??                  <1> multi_tasking:	resb 1   ; Multi Tasking status (0 = disabled, >0 = enabled)
   492                              <1> 			; (EBX will return with user buffer addr or disk type)
   493                              <1> ; 07/06/2016
   494 00018517 ??                  <1> timer_events:	resb 1  ; number of (active) timer events, <= 16		
   495                              <1> 
   496                              <1> ; 24/06/2016
   497 00018518 ??                  <1> w_str_cmd:	resb 1	; WRITE_STRING command (0,1,2,3) ; video.s
   498 00018519 ??                  <1> p_crt_mode:	resb 1  ; previous video mode (=3 or 0), backup mark/sign
   499                              <1> ; 26/06/2016
   500 0001851A ??                  <1> p_crt_page:	resb 1  ; previous active page (for 'set_mode')
   501                              <1> ; 04/07/2016
   502 0001851B ??                  <1> noclearmem:	resb 1  ; if set, 'SET MODE' (INT 31h) function (AH = 4)
   503                              <1> 			; will not clear the video memory
   504                              <1> 			; (usable for graphics modes only)
   505                              <1> alignb 2
   506 0001851C ????                <1> CRT_LEN:	resw 1  ; length of regen buffer in bytes
   507 0001851E <res 10h>           <1> cursor_pposn:	resw 8  ; cursor positions backup
   508                              <1> 
   509                              <1> ; 10/07/2016 ('VGA_FONT_SETUP', INT 43H address for x86 real mode bios)
   510 0001852E ????????            <1> VGA_INT43H:	resd 1	; 0 = default (not configured by user)
   511                              <1> 			; 0FFFFFFFFh = user defined fonts
   512                              <1> 			; address:
   513                              <1> 			; 	vgafont8
   514                              <1> 			; 	vgafont16
   515                              <1> 			; 	vgafont14
   516                              <1> 
   517                              <1> ; 25/07/2016
   518 00018532 ??                  <1> VGA_MTYPE:	resb 1  ; 0=CTEXT,1=MTEXT,2=CGA,3=PLANAR1,4=PLANAR4,5=LINEAR 
   519                              <1> 
   520                              <1> ; 23/10/2016
   521 00018533 ??                  <1> setfmod		resb 1	; update last modification date&time sign (if >0)
   522                              <1> 			; (it is Open File Number + 1, if > 0)
   523                              <1> alignb 4
   524                              <1> 
   525                              <1> ; 16/10/2016
   526 00018534 ????????            <1> FFF_UBuffer:	resd 1  ; User's buffer address for FFF & FNF system calls 
   527                              <1> ; 15/10/2016
   528 00018538 ??                  <1> FFF_Valid:	resb 1  ; Find First File Structure validation byte
   529                              <1> 			; 0  = invalid (Find Next File can't use FFF struct)
   530                              <1> 			; >0 = valid, return type for FFF and Find Next File
   531                              <1> 			; 24 = basic parameters, 24 bytes
   532                              <1> 			; 128 = entire FFF structure/table, 128 bytes
   533                              <1> ; 16/10/2016 (FFF_Attrib: resw 1)
   534 00018539 ??                  <1> FFF_Attrib:	resb 1	; Find First File attributes for Find Next File (LB)
   535 0001853A ??                  <1> FFF_RType:	resb 1  ; FFF return type (0 = Basic, >0 = complete) (HB)
   536                              <1> ; 16/10/2016 - 05/10/2016 (Set Working Path)
   537 0001853B ??                  <1> SWP_inv_fname:	resb 1	; Set Working Path - Invalid File Name
   538 0001853C ????                <1> SWP_Mode:	resw 1	; Set Working Path - Mode
   539 0001853E ??                  <1> SWP_DRV:	resb 1	; Set Working Path - Drive	
   540 0001853F ??                  <1> SWP_DRV_chg:	resb 1	; Set Working Path - Drive Change
   541                              <1> 
   542                              <1> ; 27/02/2017
   543 00018540 ??                  <1> fpready:	resb 1	; '80387 fpu is ready' flag	
   544                              <1> 
   545                              <1> ; 17/04/2021
   546                              <1> ; (DEVICE parameters is disabled as temporary)
   547                              <1> 
   548                              <1> ; 08/10/2016
   549                              <1> ;device_name:	resb 9  ; capitalized (and zero padded) device name
   550                              <1> 			; (example: "TTY0",0,0,0,0,0")
   551                              <1> 
   552 00018541 ??????              <1> alignb 4
   553                              <1> 
   554                              <1> ; 08/10/2016
   555                              <1> ; 07/10/2016
   556                              <1> ; Table of kernel devices (which do not use installable device drivers)
   557                              <1> ; has been coded into KERNEL (trdosk9.s) 
   558                              <1> ; 07/10/2016
   559                              <1> ; 8 installable device drivers available to install (NUMIDEV)
   560                              <1> ;IDEV_PGDIR: resd NUMIDEV
   561                              <1> 			; Page directories of installable device drivers
   562                              <1> 			;
   563                              <1> 			; Note: Virtual start address is always 400000h
   564                              <1> 			; (end of the 1st 4MB). [org 400000h]
   565                              <1> 			; Segments: KCODE, KDATA
   566                              <1> 			; Method: call 400000h (after changing page dir) 	
   567                              <1> 			; Query code located at the start (400000h).
   568                              <1> 			; Query code returns with
   569                              <1> 			;   eax = device type and driver version
   570                              <1> 			;         AL = Device Type minor
   571                              <1> 			;         AH = Device Type major
   572                              <1> 			;         Byte 16-23 : Version minor
   573                              <1> 			;	  Byte 24-31 : Version major - 1
   574                              <1> 			;		       (0:0 -> 1.0)
   575                              <1> 			;   ebx = initialization code address
   576                              <1> 			;   ecx = configuration table address
   577                              <1> 			;   edx = description table address
   578                              <1> 			;   esi = device (default) name address (ASCIIZ)
   579                              <1> 			;	 (name has "/DEV/" prefix)		
   580                              <1> 			;   edi = dispatch table address
   581                              <1> 			;        (for calling kernel-device functions)
   582                              <1> 			;   ebp = address table address
   583                              <1> 			; Initialization code returns with
   584                              <1> 			;   eax = open code address
   585                              <1> 			;   ecx = close code address 
   586                              <1> 			;   ebx = read code address
   587                              <1> 			;   edx = write code address 	
   588                              <1> 			;   esi = IOCTL code address
   589                              <1> 			;   edi = dispatch table address
   590                              <1> 			;   ebp = address table address
   591                              <1> 			; Address Table:
   592                              <1> 			;    Offset 0  : open code address
   593                              <1> 			;    Offset 4  : read code address
   594                              <1> 			;    Offset 8  : write code address
   595                              <1> 			;    Offset 12 : close code address
   596                              <1> 			;    Offset 16 : IOCTL code address
   597                              <1> 			;    Offset 20 : initialization code address
   598                              <1> 			;    Offset 24 : description table address
   599                              <1> 			;    Offset 28 : configuration table address
   600                              <1> 			;    Offset 32 : device name address
   601                              <1> 			;    Offset 36 : dispatch table address
   602                              <1> 			;          (for calling kernel-device functions)
   603                              <1> 
   604                              <1> ;IDEV_NAME:  resb 8*NUMIDEV 
   605                              <1> 			  ; 8 byte names of installable device drivers
   606                              <1> 
   607                              <1> ;IDEV_TYPE:  resb NUMIDEV ; Driver type of installable device drivers
   608                              <1> ;IDEV_FLAGS: resb NUMIDEV ; Device access parameters for installable
   609                              <1>                           ; device drivers (These values are set while
   610                              <1> 			  ; the device driver is being loaded.)
   611                              <1> ;IDEV_OADDR: resd NUMIDEV ; open function addr for installable dev driver
   612                              <1> ;IDEV_CADDR: resd NUMIDEV ; close function addr for installable dev driver
   613                              <1> ;IDEV_RADDR: resd NUMIDEV ; read function addr for installable dev driver
   614                              <1> ;IDEV_WADDR: resd NUMIDEV ; write function addr for installable dev driver
   615                              <1> 	
   616                              <1> ; 08/10/2016	
   617                              <1> ; 07/10/2016
   618                              <1> ; Device Open and Access parameters
   619                              <1> ;DEV_ACCESS:	resb NUMOFDEVICES    ; bit 0 = accessable by normal users
   620                              <1> 				     ; bit 1 = read access permission
   621                              <1> 				     ; bit 2 = write access permission
   622                              <1> 				     ; bit 3 = IOCTL permission to users
   623                              <1> 				     ; bit 4 = block device if it is set	
   624                              <1> 				     ; bit 5 = 16 bit or 1024 byte data
   625                              <1> 				     ; bit 6 = 32 bit or 2048 byte data
   626                              <1> 				     ; bit 7 = installable device driver
   627                              <1> ;DEV_R_OWNER:	resb NUMOFDEVICES    ; Reading owner no (u.uid) of devices		
   628                              <1> ;DEV_R_OPENCOUNT: resb NUMOFDEVICES  ; Reading open count 
   629                              <1> ;DEV_W_OWNER:	resb NUMOFDEVICES    ; Writing owner no (u.uid) of devices		
   630                              <1> ;DEV_W_OPENCOUNT: resb NUMOFDEVICES  ; Writing open count
   631                              <1> ;DEV_DRIVER:	resb NUMOFDEVICES    ; device driver number (1 to 7Fh)
   632                              <1> 				     ; *if bit 7 is set (80 to FFh)
   633                              <1> 				     ; *if it is installable device driver
   634                              <1> 				     ; *index (0 to 7Fh)
   635                              <1> 				     ; otherwise it is kernel device index
   636                              <1> ;DEV_OPENMODE:	resb NUMOFDEVICES    ; 1 = read mode
   637                              <1> 				     ; 2 = write mode
   638                              <1> 				     ; 3 = read & write 	  
   639                              <1> 				     ; 0 = not open (free)		
   640                              <1> ;DEV_NAME_PTR:	resd NUMOFDEVICES    ; pointers to name addresses of drivers
   641                              <1> 				     ; Address base: KDEV_NAME+		
   642                              <1> 				     ; or IDEV_NAME+
   643                              <1> ;DEV_R_POINTER:	resd NUMOFDEVICES    ; reading pointer, writing pointer	
   644                              <1> ;DEV_W_POINTER:	resd NUMOFDEVICES    ; sector number if block device
   645                              <1> 				     ; character offset if char device
   646                              <1> alignb 4
   647                              <1> 
   648                              <1> ; 06/10/2016
   649                              <1> ; Open File Parameters
   650 00018544 <res 80h>           <1> OF_FCLUSTER:	resd OPENFILES  ; First clusters of open files
   651 000185C4 <res 20h>           <1> OF_DRIVE:	resb OPENFILES  ; Logical DOS drive numbers of open files 
   652 000185E4 <res 20h>           <1> OF_MODE:	resb OPENFILES  ; Open mode (1 = read, 2 = write, 3 = r&w) 
   653 00018604 <res 20h>           <1> OF_STATUS:	resb OPENFILES  ; (bit 0 = read, bit 1 = write)
   654 00018624 <res 20h>           <1> OF_OPENCOUNT:	resb OPENFILES  ; Open counts of open files
   655 00018644 <res 80h>           <1> OF_POINTER:	resd OPENFILES	; File seek/read/write pointer
   656 000186C4 <res 80h>           <1> OF_SIZE:	resd OPENFILES	; File sizes of open files (in bytes)
   657 00018744 <res 80h>           <1> OF_DIRFCLUSTER:	resd OPENFILES  ; Directory First Clusters of open files
   658 000187C4 <res 80h>           <1> OF_DIRCLUSTER:	resd OPENFILES  ; Directory (Entry) Clusters of open files
   659 00018844 <res 80h>           <1> OF_VOLUMEID:	resd OPENFILES  ; Vol ID for removable drives of open files
   660 000188C4 <res 80h>           <1> OF_CCLUSTER:	resd OPENFILES  ; Current clusters of open files
   661 00018944 <res 80h>           <1> OF_CCINDEX:	resd OPENFILES  ; Cluster index numbers of current clusters
   662                              <1> ; 24/10/2016
   663 000189C4 <res 40h>           <1> OF_DIRENTRY:	resw OPENFILES  ; Directory entry index no. in dir cluster 
   664                              <1> 				; Sector index = entry index / 16
   665                              <1> ;alignb 2
   666                              <1> 
   667                              <1> DTA:		;resd 24	; Find First File data transfer area
   668 00018A04 <res 18h>           <1> 		resb 24		; 29/07/2022		
   669                              <1> 
   670                              <1> ; 19/12/2016
   671 00018A1C ??                  <1> tcallback:	resb 1		; Timer callback method flag for 'systimer'
   672 00018A1D ??                  <1> trtc:		resb 1		; Timer interrupt type flag for 'systimer'
   673                              <1> ; 20/02/2017
   674 00018A1E ??                  <1> no_page_swap:	resb 1		; Swap lock for Signal Response Byte pages 
   675                              <1> ;;15/01/2017
   676                              <1> ; 02/01/2017
   677                              <1> ;;intflg:	resb 1		; software interrupt in progress signal
   678                              <1> 				; (for timer interrupt)
   679 00018A1F ??                  <1> alignb 4
   680                              <1> ; 13/04/2017
   681                              <1> ;DEV_INTR:	resb NUMOFDEVICES ; Device Interrupt (IRQ) number + 1	
   682                              <1> 				; (0= not available, 1= IRQ 0, 16= IRQ 15)
   683 00018A20 <res 40h>           <1> DEV_INT_HNDLR:	resd 16		; Device Interrupt Handler addr, if > 0 	
   684                              <1> 
   685                              <1> ;alignb 4
   686                              <1> 
   687                              <1> ; 26/02/2017 ; IRQ Callback parameters ('syscalbac')
   688                              <1> ;Index: ; 0 to 8
   689                              <1> ;	0 = IRQ3, 1 = IRQ4, 2 = IRQ5, 3 = IRQ7
   690                              <1> ;	4 = IRQ9, 5 = IRQ10, 6 = IRQ11, 7 = IRQ12, 8 = IRQ13  
   691 00018A60 <res 9h>            <1> IRQ.owner:	resb 9		; owner, 0 = free, >0 = [u.uno]
   692 00018A69 <res 9h>            <1> IRQ.dev:	resb 9		; 0 = default/kernel, >0 = device number
   693 00018A72 <res 9h>            <1> IRQ.method:	resb 9 		; 0 = Signal Response Byte, 1 = Callback
   694 00018A7B <res 9h>            <1> IRQ.srb:	resb 9 		; Signal Response/Return Byte value
   695 00018A84 <res 24h>           <1> IRQ.addr:	resd 9		; Rignal Response Byte address (physical)
   696                              <1> 				; or Callback service address (virtual)
   697                              <1> ; 28/02/2017
   698 00018AA8 ????????            <1> IRQ_cr3:	resd 1		; for saving cr3 register in IRQ handler
   699 00018AAC ??                  <1> IRQnum:		resb 1		; IRQ number for IRQ handler (trdosk8.s)
   700                              <1> 
   701                              <1> ; 10/04/2017
   702                              <1> ; 03/04/2017
   703                              <1> ; UNINITIALIZED AUDIO DATA
   704 00018AAD ??????              <1> alignb 4
   705 00018AB0 ??                  <1> audio_pci:	resb 1
   706 00018AB1 ??                  <1> audio_device:	resb 1
   707                              <1> ;audio_mode:	resb 1
   708 00018AB2 ??                  <1> audio_intr:	resb 1
   709 00018AB3 ??                  <1> audio_busy:	resb 1  ; Busy flag for audio irq ; 21/04/2017
   710                              <1> ;audio_reserved: resb 1
   711                              <1> ; 20/11/2023
   712 00018AB4 ????                <1> NAMBAR:		resw 1	; Native Audio Mixer Base Address
   713                              <1> NABMBAR:	; 02/10/2023 (NABMBAR = audio_io_base)
   714 00018AB6 ????                <1> audio_io_base:	resw 1 	; Base I/O address of audio device
   715 00018AB8 ????????            <1> audio_dev_id:	resd 1	; BUS/DEV/FN ; 00000000BBBBBBBBDDDDDFFF00000000
   716 00018ABC ????????            <1> audio_vendor:	resd 1
   717 00018AC0 ????????            <1> audio_stats_cmd: resd 1
   718                              <1> ;
   719 00018AC4 ????????            <1> audio_buffer:	resd 1	; virtual address of user's audio buffer
   720 00018AC8 ????????            <1> audio_p_buffer:	resd 1	; Physical address of user's audio buffer
   721 00018ACC ????????            <1> audio_buff_size: resd 1 ; user's audio buffer size (half buffer size) 
   722 00018AD0 ????????            <1> audio_dma_buff: resd 1  ; dma buffer address
   723 00018AD4 ????????            <1> audio_dmabuff_size: resd 1 ; dma buffer size (2 * half buffer size)
   724 00018AD8 ??                  <1> audio_flag:	resb 1  ; dma buffer flag (1st half = 0, 2nd half = 1)
   725 00018AD9 ??                  <1> audio_user:	resb 1	; user number of the owner
   726 00018ADA ??                  <1> audio_cb_mode:	resb 1	; 0 = signal response byte method
   727                              <1> 			; 1 = callback method
   728                              <1> 			; 2 = s.r.b. method with auto increment
   729 00018ADB ??                  <1> audio_srb:	resb 1	; signal response byte value
   730 00018ADC ????????            <1> audio_cb_addr:	resd 1  ; callback service address or s.r.b. address
   731                              <1> 			; (s.r.b. addr is physical, cbs addr is virtual)
   732                              <1> 
   733 00018AE0 ??                  <1> audio_bps:	resb 1  ; selected mode: 8 bit, 16 bit
   734 00018AE1 ??                  <1> audio_stmo:	resb 1	; selected mode: mono /stereo
   735 00018AE2 ????                <1> audio_freq: 	resw 1	; sampling rate
   736                              <1> ; 20/11/2023
   737 00018AE4 ??                  <1> VRA:		resb 1
   738 00018AE5 ??                  <1> audio_mode:	resb 1
   739                              <1> 
   740                              <1> ; 21/04/2017
   741 00018AE6 ??                  <1> audio_play_cmd: resb 1  ; Play/Stop command (1 = play, 0 = stop)
   742                              <1> ; 21/11/2023
   743                              <1> ;audio_civ: ; 28/05/2017 ; Current Buffer Index (AC'97)
   744 00018AE7 ??                  <1> audio_flag_eol:	resb 1  ; End of Link status (vt8233, EOL/FLAG)
   745                              <1> 
   746                              <1> audio_master_volume:
   747 00018AE8 ??                  <1> audio_master_volume_l: resb 1 ; sound volume (lineout) left channel
   748 00018AE9 ??                  <1> audio_master_volume_r: resb 1 ; sound volume (lineout) right channel
   749                              <1> 
   750 00018AEA ????                <1> alignb 4
   751                              <1> 
   752                              <1> ; 20/11/2023
   753                              <1> ; 28/05/2017
   754                              <1> ; AC'97 Audio Controller Base Adress Registers
   755                              <1> ;NAMBAR:	resw 1	; Native Audio Mixer Base Address
   756                              <1> ;NABMBAR:	resw 1	; Native Audio Bus Mastering Base Address
   757                              <1> 	
   758                              <1> ;alignb 4
   759                              <1> ; 21/04/2017
   760 00018AEC <res 400h>          <1> audio_bdl_buff:	resd 32*8 ; VT8233 (AC97) BDL Buffer Size
   761                              <1> ; 12/05/2017
   762 00018EEC ????????            <1> base_addr:	resd 1	; 'direct_memory_access' (memory.s)
   763                              <1> 
   764                              <1> ; 28/08/2017
   765                              <1> ; 20/08/2017
   766 00018EF0 ??                  <1> 		resb 1  ;
   767 00018EF1 ??                  <1> dma_user:	resb 1	; user number for sysdma
   768 00018EF2 ??                  <1> dma_channel:	resb 1	; dma channel for sysdma
   769 00018EF3 ??                  <1> dma_mode:	resb 1  ; dma mode for sysdma	
   770 00018EF4 ????????            <1> dma_addr:	resd 1	; dma buffer physical addr for sysdma
   771 00018EF8 ????????            <1> dma_size:	resd 1  ; dma buffer size (in bytes) for sysdma
   772 00018EFC ????????            <1> dma_start:	resd 1  ; dma start address for sysdma
   773 00018F00 ????????            <1> dma_count:	resd 1  ; dma count (in bytes) for sysdma
   774                              <1> 
   775                              <1> ; 04/12/2023
   776                              <1> %if 0 
   777                              <1> 
   778                              <1> alignb 65536
   779                              <1> ; 09/08/2017
   780                              <1> ; 12/05/2017
   781                              <1> sb16_dma_buffer: resb 65536 ; DMA buffer for sb16 audio playing.
   782                              <1> 
   783                              <1> %endif
  3994                                  ; 24/01/2016
  3995                                  %include 'ubss.s'	; UNINITIALIZED KERNEL (USER) DATA
     1                              <1> ; ****************************************************************************
     2                              <1> ; TRDOS386.ASM (TRDOS 386 Kernel - v2.0.5) - UNINITIALIZED USER DATA : ubss.s
     3                              <1> ; ----------------------------------------------------------------------------
     4                              <1> ; Last Update: 07/08/2022  (Previous: 28/02/2017)
     5                              <1> ; ----------------------------------------------------------------------------
     6                              <1> ; Beginning: 24/01/2016
     7                              <1> ; ----------------------------------------------------------------------------
     8                              <1> ; Assembler: NASM version 2.15 (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> ; Ref: Retro UNIX 386 v1.2 Kernel (v0.2.2.3) - ux.s - 15/07/2022
    29                              <1> 
    30                              <1> alignb 2
    31                              <1> 
    32                              <1> %if 0
    33                              <1> 
    34                              <1> inode:
    35                              <1> 	;; 11/03/2013. 
    36                              <1> 	;;Derived from UNIX v1 source code 'inode' structure (ux).
    37                              <1> 	;;i.
    38                              <1> 	;
    39                              <1> 	;i.flgs: resw 1
    40                              <1> 	;i.nlks: resb 1
    41                              <1> 	;i.uid:	 resb 1
    42                              <1>         ;i.size: resw 1 ; size
    43                              <1> 	;i.dskp: resw 8 ; 16 bytes
    44                              <1> 	;i.ctim: resd 1
    45                              <1> 	;i.mtim: resd 1
    46                              <1> 	;i.rsvd: resw 1 ; Reserved (ZERO/Undefined word for UNIX v1)
    47                              <1> 
    48                              <1> 	; 26/01/2020
    49                              <1> 	; Retro UNIX 386 v2.0 - Modified UNIX v7 inode model
    50                              <1> 	;	(15/09/2029 .. 18/12/2019)
    51                              <1> 
    52                              <1> 	i.flgs:   resw 1	; /* mode and type of file */
    53                              <1> 	i.nlks:	  resw 1	; /* number of links to file */
    54                              <1> 	i.uid:	  resw 1	; /* owner's user id */  - 0 to 65535 -
    55                              <1> 	i.gid:	  resb 1	; /* owner's group id */ - o to 255 -
    56                              <1> 	i.size_h: resb 1	; /* number of bytes in file */ ; byte 5
    57                              <1> 	i.size:	  resd 1 ; size	; /* number of bytes in file */
    58                              <1> 	i.dskp:	  resd 10 ; 40 bytes ; /* disk block addresses */
    59                              <1> 	i.atim:	  resd 1	; /* time last accessed */
    60                              <1> 	i.mtim:	  resd 1	; /* time last modified */
    61                              <1> 	i.ctim:	  resd 1	; /* time created */
    62                              <1> 
    63                              <1> I_SIZE	equ $ - inode
    64                              <1> 
    65                              <1> %endif 
    66                              <1> 
    67                              <1> process:
    68                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5 
    69                              <1> 	; 27/02/2022
    70                              <1> 	; 12/01/2022 - Retro UNIX 386 v1.2 
    71                              <1> 	; 19/12/2016
    72                              <1> 	; 21/05/2016
    73                              <1> 	; 19/05/2016 - TRDOS 386 (TRDOS v2.0)
    74                              <1> 	; 06/05/2015 - Retro UNIX 386 v1
    75                              <1> 	; 11/03/2013 - 05/02/2014 (Retro UNIX 8086 v1)
    76                              <1> 	;Derived from UNIX v1 source code 'proc' structure (ux).
    77                              <1> 	;p.
    78                              <1> 	
    79 00018F04 <res 20h>           <1>         p.pid:   resw nproc
    80 00018F24 <res 20h>           <1>         p.ppid:  resw nproc
    81                              <1> 	;p.break: resw nproc ; 12/01/2022 (p.break is not used)
    82 00018F44 <res 10h>           <1>         p.ttyc:  resb nproc ; console tty in Retro UNIX 8086 v1.
    83                              <1> 	; 27/02/2022 (p.waitc is not used)
    84                              <1> 	;p.waitc: resb nproc ; waiting channel in Retro UNIX 8086 v1.
    85 00018F54 <res 10h>           <1> 	p.link:	 resb nproc
    86 00018F64 <res 10h>           <1> 	p.stat:	 resb nproc
    87                              <1> 
    88                              <1> 	; 06/05/2015 (Retro UNIX 386 v1 feature only !) 
    89 00018F74 <res 40h>           <1> 	p.upage: resd nproc ; Physical address of the process's
    90                              <1> 			    ; 'user' structure
    91                              <1> 	; 21/05/2016	
    92                              <1> 	; 19/05/2016 (TRDOS 386 feature only!)
    93 00018FB4 <res 10h>           <1> 	p.timer: resb nproc ; number of timer events of the processs
    94                              <1> 
    95                              <1> 	; 19/12/2016
    96 00018FC4 <res 40h>           <1> 	p.tcb:	resd nproc ; timer callback service address (if > 0)
    97                              <1> 			  		 			 	  
    98                              <1> P_SIZE	equ $ - process
    99                              <1> 
   100                              <1> ; fsp table (original UNIX v1)
   101                              <1> ;
   102                              <1> ;Entry
   103                              <1> ;          15                                      0
   104                              <1> ;  1     |---|---------------------------------------|
   105                              <1> ;        |r/w|       i-number of open file           |
   106                              <1> ;        |---|---------------------------------------| 
   107                              <1> ;        |               device number               |
   108                              <1> ;        |-------------------------------------------|
   109                              <1> ;    (*) | offset pointer, i.e., r/w pointer to file |
   110                              <1> ;        |-------------------------------------------| 
   111                              <1> ;        |  flag that says    | number of processes  |
   112                              <1> ;        |   file deleted     | that have file open  |
   113                              <1> ;        |-------------------------------------------| 
   114                              <1> ;  2     |                                           |
   115                              <1> ;        |-------------------------------------------| 
   116                              <1> ;        |                                           |
   117                              <1> ;        |-------------------------------------------|
   118                              <1> ;        |                                           |
   119                              <1> ;        |-------------------------------------------|
   120                              <1> ;        |                                           |
   121                              <1> ;        |-------------------------------------------| 
   122                              <1> ;  3     |                                           | 
   123                              <1> ;        |                                           |  
   124                              <1> ;
   125                              <1> ; (*) Retro UNIX 386 v1 modification: 32 bit offset pointer 
   126                              <1> 
   127                              <1> ; 27/03/2020 - Retro UNIX 386 v2 - FSP (OPEN FILES) TABLE 
   128                              <1> 
   129                              <1> ;Entry
   130                              <1> ;         15                    7                   0
   131                              <1> ;  1     |-------------------------------------------|
   132                              <1> ;        |   	     i-number of open file           |
   133                              <1> ;        |-------------------------------------------| 
   134                              <1> ;        |        high word of 32 bit i-number       |
   135                              <1> ;        |-------------------------------------------|
   136                              <1> ;        | open mode & status  |   device number     |
   137                              <1> ;        |-------------------------------------------|
   138                              <1> ;        |    reserved byte    |     open count      |
   139                              <1> ;        |-------------------------------------------| 
   140                              <1> ;        | offset pointer, i.e., r/w pointer to file |
   141                              <1> ;        |-------------------------------------------|
   142                              <1> ;        |   64 bit file offset pointer (bit 16-31)  | 
   143                              <1> ;        |-------------------------------------------|
   144                              <1> ;        |   64 bit file offset pointer (bit 32-47)  | 
   145                              <1> ;        |-------------------------------------------|
   146                              <1> ;        |   64 bit file offset pointer (bit 48-63)  | 
   147                              <1> ;        |-------------------------------------------|
   148                              <1> ;  2     |                                           |
   149                              <1> ;        |-------------------------------------------| 
   150                              <1> ;        |                                           |
   151                              <1> ;        |-------------------------------------------|
   152                              <1> ;        |                                           |
   153                              <1> ;        |-------------------------------------------|
   154                              <1> ;        |                                           |
   155                              <1> ;        |-------------------------------------------| 
   156                              <1> ;        |                                           | 
   157                              <1> 
   158                              <1> %if 0
   159                              <1> 
   160                              <1> ; (Retro UNIX 386 v1.2 - ux.s - 15/07/2022)
   161                              <1> ; 22/11/2021
   162                              <1> ; 21/07/2021 - Retro UNIX 386 v2 open file structure revision
   163                              <1> 
   164                              <1> struc file	; open files (fsp) structure ; (*)	
   165                              <1>   .inode:  resw 1  ; inode number of open file (32 bit)
   166                              <1>   .i32:	   resw 1  ; higher word of inode number (reserved)
   167                              <1>   .drive:  resb 1  ; logical drive (disk) number
   168                              <1>   .flags:  resb 1  ; open mode and status
   169                              <1>   .count:  resb 1  ; number of processes that have file open
   170                              <1>   ;.rsvd:  resb 1  ; reserved byte (for next versions)
   171                              <1>   .mnt:    resb 1  ; mnttab index+1 (0 = not mounted)
   172                              <1>   .offset: resd 1  ; file offset/pointer (64 bit) 
   173                              <1>   .o64:	   resd 1  ; higher 32 bit of file offset
   174                              <1>  .size:  ; = 16		
   175                              <1> endstruc 
   176                              <1> 
   177                              <1> %endif
   178                              <1> 
   179                              <1> ; 23/07/2022
   180                              <1> ;fsp:	resb nfiles * 16 ; (*)
   181                              <1> 
   182 00019004 ??                  <1> idev:	resb 1
   183 00019005 ??                  <1> cdev:	resb 1	
   184                              <1> 
   185                              <1> ; 15/04/2015
   186                              <1> ;fsp:	resb nfiles * 10 ; 11/05/2015 (8 -> 10)
   187                              <1> ;idev:	resw 1 ; device number is 1 byte in Retro UNIX 8086 v1 !
   188                              <1> ;cdev:	resw 1 ; device number is 1 byte in Retro UNIX 8086 v1 !
   189                              <1> 
   190                              <1> ; 18/05/2015
   191                              <1> ; 26/04/2013 device/drive parameters (Retro UNIX 8086 v1 feature only!)
   192                              <1> ; 'UNIX' device numbers (as in 'cdev' and 'u.cdrv')
   193                              <1> ;	0 -> root device (which has Retro UNIX 8086 v1 file system)
   194                              <1> ; 	1 -> mounted device (which has Retro UNIX 8086 v1 file system)
   195                              <1> ; 'Retro UNIX 8086 v1' device numbers: (for disk I/O procedures)
   196                              <1> ;	0 -> fd0 (physical drive, floppy disk 1), physical drive number = 0
   197                              <1> ;	1 -> fd1 (physical drive, floppy disk 2), physical drive number = 1
   198                              <1> ;	2 -> hd0 (physical drive, hard disk 1), physical drive number = 80h
   199                              <1> ;	3 -> hd1 (physical drive, hard disk 2), physical drive number = 81h
   200                              <1> ;	4 -> hd2 (physical drive, hard disk 3), physical drive number = 82h
   201                              <1> ;	5 -> hd3 (physical drive, hard disk 4), physical drive number = 83h
   202                              <1> 
   203 00019006 ??                  <1> rdev:	resb 1 ; root device number ; Retro UNIX 8086 v1 feature only!
   204                              <1> 	        ; as above, for physical drives numbers in following table
   205 00019007 ??                  <1> mdev:	resb 1 ; mounted device number ; Retro UNIX 8086 v1 feature only!
   206                              <1> 
   207                              <1> ; 23/07/2022
   208                              <1> ;; 15/04/2015
   209                              <1> ;active: resb 1 
   210                              <1> ;	 resb 1 ; 09/06/2015
   211                              <1> 
   212                              <1> ; 23/07/2022
   213                              <1> ;mnti:	 resw 1
   214                              <1> ; 07/08/2022
   215 00019008 ????                <1> mpid:	 resw 1
   216                              <1> ;rootdir: resw 1
   217 0001900A ????????            <1> rootdir: resd 1	
   218                              <1> 
   219                              <1> ; 21/05/2016 - TRDOS 386 (TRDOS v2.0) - priority levels, 3 run queues 
   220                              <1> runq:
   221 0001900E ????                <1> runq_event:	 resw 1 ; high priority, 'run for event'            ; 2
   222 00019010 ????                <1> runq_normal:	 resw 1 ; normal/regular priority, 'run as reqular' ; 1
   223 00019012 ????                <1> runq_background: resw 1 ; low priority, 'run on background'         ; 0
   224                              <1> ;
   225                              <1> ; 23/07/2022
   226                              <1> ;imod:	resb 1
   227                              <1> ;smod:	resb 1
   228                              <1> ;mmod:	resb 1
   229 00019014 ??                  <1> sysflg:	resb 1
   230 00019015 ??                  <1> 	resb 1	
   231                              <1> 
   232 00019016 ????                <1> alignb 4
   233                              <1> 
   234                              <1> user:
   235                              <1> 	; 23/07/2022 - TRDOS 386 Kernel v2.0.5
   236                              <1> 	; 04/12/2021 - Retro UNIX 386 v1.2
   237                              <1> 	; 13/01/2017
   238                              <1> 	; 19/12/2016
   239                              <1> 	; 21/05/2016 - TRDOS 386 (TRDOS v2.0) 
   240                              <1> 	; 	       [u.pri] usage method modification
   241                              <1> 	; 04/12/2015 
   242                              <1> 	; 18/10/2015
   243                              <1> 	; 12/10/2015
   244                              <1> 	; 21/09/2015
   245                              <1> 	; 24/07/2015
   246                              <1> 	; 16/06/2015
   247                              <1> 	; 09/06/2015
   248                              <1> 	; 11/05/2015
   249                              <1> 	; 16/04/2015 (Retro UNIX 386 v1 - 32 bit modifications)
   250                              <1> 	; 10/10/2013
   251                              <1> 	; 11/03/2013. 
   252                              <1> 	;Derived from UNIX v1 source code 'user' structure (ux).
   253                              <1> 	;u.
   254                              <1> 
   255 00019018 ????????            <1> 	u.sp:	  resd 1 ; esp (kernel stack at the beginning of 'sysent')
   256 0001901C ????????            <1> 	u.usp:	  resd 1 ; esp (kernel stack points to user's registers)
   257 00019020 ????????            <1> 	u.r0:	  resd 1 ; eax
   258 00019024 ????                <1> 	u.cdir:	  resw 1
   259 00019026 ????                <1> 		  resw 1 ; 23/07/2022
   260 00019028 ??                  <1> 	u.cdrv:	  resb 1 ; 23/07/2022
   261 00019029 ??                  <1> 		  resb 1				  	
   262 0001902A <res Ah>            <1> 	u.fp:	  resb 10
   263                              <1> 	;u.fp:	  resb OPENFILES ; 23/07/202
   264                              <1> 	u.fsp:	  ; 23/07/2022
   265 00019034 ????????            <1> 	u.fofp:	  resd 1
   266 00019038 ????????            <1> 	u.dirp:	  resd 1
   267 0001903C ????????            <1> 	u.namep:  resd 1
   268 00019040 ????????            <1> 	u.off:	  resd 1
   269                              <1> 	;	  resd 1 ; 23/07/2022 (64 bit fptr)
   270 00019044 ????????            <1> 	u.base:	  resd 1
   271 00019048 ????????            <1> 	u.count:  resd 1
   272 0001904C ????????            <1> 	u.nread:  resd 1
   273 00019050 ????????            <1> 	u.break:  resd 1 ; break
   274                              <1> 	; 10/01/2017 (TRDOS 386, relocation and dword alignment)
   275                              <1> 	; tty number (rtty, rcvt, wtty)
   276 00019054 ????                <1> 	u.ttyp:	  resw 1 
   277 00019056 ??                  <1> 	u.ttyn:	  resb 1 ; 28/07/2013 - Retro Unix 8086 v1 feature only !
   278 00019057 ??                  <1> 	u.mode:   resb 1 ; 23/07/2022
   279                              <1> 	;u.resb:  resb 1 ; 10/01/2017 (TRDOS 386, temporary)
   280 00019058 <res 10h>           <1> 	u.dirbuf: resb 16 ; 04/12/2015 (10 -> 16) 
   281                              <1> 	;u.pri:	  resw 1 ; 14/02/2014
   282 00019068 ??                  <1> 	u.quant:  resb 1 ; Retro UNIX 8086 v1 Feature only ! (uquant)
   283 00019069 ??                  <1> 		  resb 1 ; 23/07/2022
   284 0001906A ??                  <1> 	u.pri:	  resb 1 ; Modification: 21/05/2016 (priority levels: 0, 1, 2)
   285 0001906B ??                  <1> 		  resb 1 ; 23/07/2022	
   286 0001906C ????                <1> 	u.intr:	  resw 1
   287 0001906E ????                <1> 	u.quit:	  resw 1
   288                              <1> 	;u.emt:	  resw 1 ; 10/10/2013
   289                              <1> 	;u.ilgins: resw 1 ; 10/01/2017
   290                              <1> 	;u.cdrv:  resw 1 ; cdev
   291 00019070 ??                  <1> 	u.bsys:	  resb 1
   292 00019071 ??                  <1> 	u.uno:	  resb 1
   293                              <1> 	; 23/07/2022
   294                              <1> 	;u.uid:	  resw 1 ; uid	; 27/03/2021 - Retro UNIX 386 v2
   295                              <1> 	;u.ruid:  resw 1	; 16 bit uid
   296                              <1> 	;u.gid:	  resb 1 ; gid 	; 27/03/2021 - Retro UNIX 386 v2
   297                              <1> 	;u.rgid:  resb 1
   298                              <1> 	; 23/07/2022
   299                              <1> 	;u.procp: resd 1 ; /* pointer to proc structure */
   300 00019072 ??                  <1> 	u.uid:	  resb 1 ; uid
   301 00019073 ??                  <1> 	u.ruid:   resb 1
   302 00019074 ????????            <1>         u.upage:  resd 1 ; 16/04/2015 - Retro Unix 386 v1 feature only !
   303 00019078 ????????            <1> 	u.pgdir:  resd 1 ; 09/03/2015 (page dir addr of process)
   304 0001907C ????????            <1> 	u.ppgdir: resd 1 ; 06/05/2015 (page dir addr of the parent process)
   305 00019080 ????????            <1> 	u.pbase:  resd 1 ; 20/05/2015 (physical base/transfer address)
   306 00019084 ????                <1> 	u.pcount: resw 1 ; 20/05/2015 (byte -transfer- count for page)
   307                              <1> 	;u.pncount: resw 1 
   308                              <1> 		; 16/06/2015 (byte -transfer- count for page, 'namei', 'mkdir')
   309                              <1> 	;u.pnbase:  resd 1 
   310                              <1> 		; 16/06/2015 (physical base/transfer address, 'namei', 'mkdir')
   311                              <1> 			 ; 09/06/2015
   312 00019086 ??                  <1> 	u.kcall:  resb 1 ; The caller is 'namei' (dskr) or 'mkdir' (dskw) sign		
   313 00019087 ??                  <1> 	u.brwdev: resb 1 ; Block device number for direct I/O (bread & bwrite)
   314                              <1> 			 ; 24/07/2015 - 24/06/2015
   315                              <1> 	;u.args:  resd 1 ; arguments list (line) offset from start of [u.upage]
   316                              <1> 			 ; (arg list/line is from offset [u.args] to 4096 in [u.upage])
   317                              <1> 			 ; ([u.args] points to argument count -argc- address offset)
   318                              <1>  			 ; 24/06/2015	  	
   319                              <1> 	;u.core:  resd 1 ; physical start address of user's memory space (for sys exec)
   320                              <1> 	;u.ecore: resd 1 ; physical end address of user's memory space (for sys exec)
   321                              <1> 	; last error number
   322 00019088 ????????            <1> 	u.error:  resd 1 ; 28/07/2013 - 09/03/2015 
   323                              <1> 		         ; Retro UNIX 8086/386 v1 feature only!
   324                              <1> 			 ; 21/09/2015 (debugging - page fault analyze)
   325 0001908C ????????            <1> 	u.pfcount: resd 1 ; page fault count for (this) process (for sys geterr)
   326                              <1> 		; 19/12/2016 (TRDOS 386)	
   327 00019090 ????????            <1> 	u.tcb:	  resd 1 ; Timer callback address/flag which will be used by timer int
   328                              <1> 		; 13/01/2017 (TRDOS 386)
   329 00019094 ??                  <1> 	u.t_lock: resb 1 ; Timer interrupt (callback) lock (unlocked by 'sysrele')
   330 00019095 ??                  <1> 	u.t_mode: resb 1 ; running mode during timer interrupt (0= system, 0FFh= user)
   331                              <1> 		; 26/02/2017 (TRDOS 386)
   332 00019096 ??                  <1> 	u.irqc:	  resb 1  ; Count of IRQ callback services (IRQs in use)
   333                              <1> 		; 28/02/2017 (TRDOS 386) 
   334 00019097 ??                  <1> 	u.irqwait: resb 1 ; IRQ waiting for callback service flag (IRQ number, If > 0)
   335 00019098 ??                  <1> 	u.r_lock: resb 1 ; 'IRQ callback service is in progress' flag (IRQ lock)
   336 00019099 ??                  <1> 	u.r_mode: resb 1 ; running mode during hadware interrupt
   337                              <1> 	; 23/07/2022
   338 0001909A ??                  <1> 	u.exit:	  resb 1 ; exit code
   339                              <1> 	; 27/02/2017 (TRDOS 386) 
   340 0001909B ??                  <1> 	u.fpsave: resb 1 ; TRDOS 386, 'save/restore FPU registers' flag
   341                              <1> alignb 4
   342                              <1> 	; !! wrong sizing in TRDOS 386 v2.0.4 (in 'ubss.s', 28/02/2017) !! 
   343                              <1> 	;u.fpregs: resb 94 ; 94 byte area for saving and restoring FPU registers
   344                              <1> 	; 23/07/2022
   345 0001909C <res 6Ch>           <1> 	u.fpregs: resb 108 ; 108 byte area for saving and restoring FPU registers
   346                              <1> 
   347                              <1> alignb 4
   348                              <1> 
   349                              <1> U_SIZE	equ $ - user
   350                              <1> 
   351                              <1> ; 18/10/2015 - Retro UNIX 386 v1 (local variables for 'namei' and 'sysexec')
   352 00019108 ????????            <1> pcore:	resd 1  ; physical start address of user's memory space (for sys exec)
   353 0001910C ????????            <1> ecore:	resd 1  ; physical address of user's stack/last page (for sys exec)
   354 00019110 ????????            <1> nbase:	resd 1	; physical base address for 'namei' & 'sysexec'
   355                              <1> ; 23/07/202 - TRDOS 386 Kernel v2.0.5
   356                              <1> ;ncount: resw 1
   357 00019114 ????????            <1> ncount: resd 1	; remain byte count in page for 'namei' & 'sysexec'
   358                              <1> ;argc:	resw 1
   359 00019118 ????????            <1> argc:	resd 1	; argument count for 'sysexec'
   360 0001911C ????????            <1> argv:	resd 1	; argument list (recent) address for 'sysexec'
   361                              <1> 
   362                              <1> ; 03/06/2015 - Retro UNIX 386 v1 Beginning
   363                              <1> ; 07/04/2013 - 31/07/2013 - Retro UNIX 8086 v1
   364 00019120 ??                  <1> rw:	resb 1 ;; Read/Write sign (iget)
   365                              <1> ; 23/07/2022
   366 00019121 ??????              <1> 	resb 3	
   367                              <1> 
   368                              <1> alignb 4
   369                              <1> 
   370                              <1> ; 24/04/2016
   371 00019124 ????????            <1> ii:	resd 1 ; first cluster of the program file
   372 00019128 ????????            <1> i.size:	resd 1 ; size of the program file
  3996                                  
  3997                                  alignb 4
  3998                                  
  3999                                  ; 23/05/2016 (TRDOS 386)
  4000                                  ; 14/10/2015 (Retro UNIX 386 v1, 'unix386.s')
  4001 0001912C ????????                cr3reg:	 resd 1  ; cr3 register content at the beginning of the timer
  4002                                  		 ; (or RTC) interrupt handler.
  4003                                  
  4004                                  ; 10/12/2016 (callback)
  4005                                  ; 10/06/2016
  4006                                  ; 19/05/2016
  4007                                  ; 18/05/2016 - TRDOS 386 feature only !
  4008 00019130 <res 100h>              timer_set: resd 16*4   ; 256 bytes memory space for 16 timer events
  4009                                  	; Timer Event Structure: (max. 16 timer events, 16*16 bytes)
  4010                                  	;       Owner:	        resb 1 ; 0 = free
  4011                                  	;		  	       ;>0 = process number (u.uno)
  4012                                  	;	Callback:	resb 1 ; 0 = response byte address (phy)
  4013                                  	;				 1 = callback address (virtual)				
  4014                                  	;	Interrupt:      resb 1 ; 0 = Timer interrupt (or none)
  4015                                  	;		   	       ; 1 = Real Time Clock interrupt 
  4016                                  	;	Response:       resb 1 ; 0 to 255, signal return value
  4017                                  	;	Count Limit:	resd 1 ; count of ticks (total/set)
  4018                                  	;	Current Count: 	resd 1 ; count of ticks (current)
  4019                                  	;	Response Addr:  resd 1 ; response byte (pointer) address
  4020                                  	;			       ; (or callback -user service- address)	
  4021                                  
  4022                                  
  4023                                  ; 17/04/2021
  4024                                  ; (memory page swap parameters are disabled as temporary)
  4025                                  ;
  4026                                  ; Memory (swap) Data (11/03/2015)
  4027                                  ; 09/03/2015
  4028                                  ;swpq_count: resw 1 ; count of pages on the swap queue
  4029                                  ;swp_drv:    resd 1 ; logical drive description table address of the swap drive/disk
  4030                                  ;swpd_size:  resd 1 ; size of swap drive/disk (volume) in sectors (512 bytes). 		  				
  4031                                  ;swpd_free:  resd 1 ; free page blocks (4096 bytes) on swap disk/drive (logical)
  4032                                  ;swpd_next:  resd 1 ; next free page block
  4033                                  ;swpd_last:  resd 1 ; last swap page block	
  4034                                  
  4035                                  alignb 4
  4036                                  
  4037                                  ; 10/07/2015
  4038                                  ; 28/08/2014
  4039 00019230 ????????                error_code:	resd 1
  4040                                  ; 29/08/2014
  4041 00019234 ????????                FaultOffset: 	resd 1
  4042                                  ; 21/09/2015
  4043 00019238 ????????                PF_Count:	resd 1	; total page fault count
  4044                                  		       	; (for debugging - page fault analyze)
  4045                                  		 	; 'page_fault_handler' (memory.inc)
  4046                                  			; 'sysgeterr' (u9.s)
  4047                                  
  4048                                  ; 29/04/2016 (TRDOS 386 = TRDOS v2.0)
  4049                                  ; 22/08/2015 (Retro UNIX 386 v1)
  4050                                  buffer: 
  4051 0001923C ????????????????        	resb	8 
  4052                                  readi_buffer:
  4053 00019244 <res 200h>              	resb 	512
  4054 00019444 ????????????????        	resb	8
  4055                                  writei_buffer:
  4056 0001944C <res 200h>              	resb	512	
  4057                                  ; 24/10/2016
  4058 0001964C ????????????????        	resb	8 
  4059                                  rw_buffer:
  4060 00019654 <res 800h>              	resb 	2048  ; general purposed, r/w sector buffer
  4061                                  
  4062                                  %if 1
  4063                                  ; 17/01/2021
  4064 00019E54 <res 80h>               edid_info:	resb 128 ; VESA EDID (monitor capabilities) info	
  4065                                  ; 28/11/2020
  4066 00019ED4 ??                      pmi32:		resb 1	; (>0) use VESA VBE3 protected mode calls 
  4067 00019ED5 ??                      vbe_mode_x:	resb 1  ; VESA VBE3 video bios mode set options
  4068 00019ED6 ????                    video_mode:	resw 1	; VESA VBE3 video mode (with option flags)
  4069                                  ; 30/11/2020
  4070 00019ED8 ????????                vbe3bios_addr:	resd 1	; new (writable mem) address of VBE3 bios
  4071                                  ; 02/12/2020
  4072 00019EDC ????????                pmid_addr:	resd 1	; PMInfoBlock ('PMID') linear address
  4073                                  ; 14/01/2021
  4074                                  ; 06/12/2020		; VESA VBE 3 video state
  4075                                  ;vbe3stbufsize: resw 1	; video regs/dac/bios state buffer size
  4076                                  ;			; block size in bytes
  4077                                  ; 16/01/2021
  4078 00019EE0 ????                    vbe3stbsflags: resw 1	; video regs/dac/bios state buffer size
  4079                                  ;			; pointer flags for buffer state options
  4080                                  %endif
  4081                                  
  4082                                  %if 1
  4083                                  ; 10/12/2020
  4084                                  LFB_Info:
  4085 00019EE2 <res 10h>               		resb 16	; Linear Frame Buffer info block
  4086                                  
  4087                                  ;24/11/2020 - TRDOS 386 v2.0.3
  4088                                  ; BOCHS/PLEX86 VESA VBE3 MODE INFO extension to TRDOS 386 v2 kernel	
  4089                                  MODE_INFO_LIST:
  4090 00019EF2 <res 44h>               		resb 68	; mode + 66 byte VESA vbe3 mode info (4F01h) 
  4091                                  %endif
  4092                                  
  4093                                  ; 05/01/2021
  4094 00019F36 ??                      ufont:		resb 1	; (VGA graphics) user font flags
  4095                                  			; bit 7 - permission flag for int 31h
  4096                                  			; bit 4 - 8x16 user font ready/loaded flag  
  4097                                  			; bit 3 - 8x8 user font ready/loaded flag
  4098                                  			; bit 1 - select 8x16 user font (sysvideo)
  4099                                  			; bit 0 - select 8x8 user font (sysvideo)
  4100 00019F37 ??                      		resb 1	; 19/01/2021
  4101                                  ; 17/01/2021
  4102 00019F38 ??                      srvsf:		resb 1	; 'save restore video state' permission flag
  4103                                  ; 18/01/2021
  4104 00019F39 ??                      srvso:		resb 1	; video state buffer save/restore option
  4105 00019F3A ????????                VideoStateID:	resd 1	; used to verify state saved by same prog
  4106                                  ; 29/01/2021
  4107 00019F3E ????                    v_width:	resw 1	; screen (display page) width
  4108 00019F40 ??                      v_ops:		resb 1	; 'sysvideo' graphics data transfer option	
  4109 00019F41 ??                      v_bpp:		resb 1	; bits per pixels ('sysvideo')
  4110 00019F42 ????????                v_mem:		resd 1	; video memory ('sysvideo')	
  4111 00019F46 ????????                v_siz:		resd 1	; video page size ('sysvideo')
  4112 00019F4A ????????                v_str:		resd 1	; window start adress ('sysvideo')
  4113 00019F4E ????????                v_end:		resd 1	; window end (end+1) adress ('sysvideo')
  4114                                  ; 31/01/2021
  4115                                  ; 01/01/2021
  4116                                  ;maskbuff:     ;resd 1	; user's bitmask buffer addr ('sysvideo')
  4117 00019F52 ????????                maskcolor:	resd 1	; VGA/SVGA pixel mask color ('sysvideo')
  4118                                  ; 27/02/2021
  4119 00019F56 ????????                pixcount:	resd 1	; pixel count ('sysvideo' window ops) 
  4120                                  ; 02/02/2021
  4121 00019F5A ????????????????        buffer8:	resd 2	; 8 bytes small buffer for 'sysvideo'  
  4122                                  
  4123                                  bss_end:
  4124                                  
  4125                                  ; 27/12/2013
  4126                                  _end:  ; end of kernel code
